Zireael |
Отправлено: 07 Февраля, 2021 - 20:22:03
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Попробуйте этот код.
В нём хендлы не там закрываются, хотя на работоспособность не влияет. И format возвращает весь массив, т. к. InternetReadFile не дописывает 0.
Исправленный код, добавил вывод ошибок:
code (Отобразить)CODE:#define NULL 0
#define FALSE 0
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_DEFAULT_HTTPS_PORT 443
#define INTERNET_SERVICE_HTTP 3
#define INTERNET_FLAG_SECURE 8388608
#define INTERNET_FLAG_NO_CACHE_WRITE 67108864
external(INT, "InternetOpen", "InternetOpenA", "Wininet.dll");
external(INT, "InternetConnect", "InternetConnectA", "Wininet.dll");
external(INT, "HttpOpenRequest", "HttpOpenRequestA", "Wininet.dll");
external(INT, "HttpSendRequest", "HttpSendRequestA", "Wininet.dll");
external(INT, "InternetReadFile", "InternetReadFile", "Wininet.dll");
external(INT, "InternetCloseHandle", "InternetCloseHandle", "Wininet.dll");
string ServerName = "api.telegram.org";
string ObjectName = "botТУТ ТОКЕН/getMe"; // ввести токен
int hInternet = InternetOpen("My bot",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if (hInternet != NULL) // открываем HTTP сессию
{
int hConnect = InternetConnect(hInternet,ServerName,INTERNET_DEFAULT_HTTPS_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1);
if (hConnect != NULL)
{
int hRequest = HttpOpenRequest(hConnect, "POST", ObjectName, NULL,NULL, 0, INTERNET_FLAG_SECURE | INTERNET_FLAG_NO_CACHE_WRITE,1);
if (hRequest != NULL) // посылаем запрос
{
int bSend = HttpSendRequest(hRequest,NULL,0,NULL, 0);
string fr="";
char szData[1024];
int dwBytesRead;
wwwww1:;
int bRead = InternetReadFile(hRequest, address(#szData[0]), sizearray(szData)-1, address(#dwBytesRead));
if (bRead == FALSE)messagebox("InternetReadFile error");
fr=fr+format(#szData[0], dwBytesRead);
if (bRead == FALSE || dwBytesRead == 0) goto Fs;
goto wwwww1;
Fs:;
messagebox (fr);
InternetCloseHandle(hRequest);// закрываем запрос
}
else messagebox("HttpOpenRequest error");
InternetCloseHandle(hConnect);// закрываем сессию
}
else messagebox("InternetConnect error");
InternetCloseHandle(hInternet);// закрываем WinInet
}
else messagebox("InternetOpen error");
|
|
|
Brumo |
Отправлено: 07 Февраля, 2021 - 20:53:53
|
Наблюдатель
Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2020
Репутация: 7
|
Zireael пишет: Исправленный код
...вчера пытался уже с прошлой версией кода...
не работает:
Отладчик (Отобразить)
external ( INT , " InternetOpen " , " InternetOpenA " , " Wininet.dll " )
external ( INT , " InternetConnect " , " InternetConnectA " , " Wininet.dll " )
external ( INT , " HttpOpenRequest " , " HttpOpenRequestA " , " Wininet.dll " )
external ( INT , " HttpSendRequest " , " HttpSendRequestA " , " Wininet.dll " )
external ( INT , " InternetReadFile " , " InternetReadFile " , " Wininet.dll " )
external ( INT , " InternetCloseHandle " , " InternetCloseHandle " , " Wininet.dll " )
string ServerName = " api.telegram.org "
string ObjectName = " botТУТ ТОКЕН/getMe "
int hInternet = InternetOpen ( " My bot " , INTERNET_OPEN_TYPE_PRECONFIG , NULL , NULL , 0 )
if ( hInternet'13369348' != NULL )
int hConnect = InternetConnect ( hInternet'13369348' , ServerName'api.telegram.org' , INTERNET_DEFAULT_HTTPS_PORT , NULL , NULL , INTERNET_SERVICE_HTTP , 0 , 1 )
if ( hConnect'13369352' != NULL )
int hRequest = HttpOpenRequest ( hConnect'13369352' , " POST " , ObjectName'botТУТ ТОКЕН/getMe' , NULL , NULL , 0 , INTERNET_FLAG_SECURE + INTERNET_FLAG_NO_CACHE_WRITE , 1 )
if ( hRequest'13369356' != NULL )
int bSend = HttpSendRequest ( hRequest'13369356' , NULL , 0 , NULL , 0 )
string fr = " "
int bRead = InternetReadFile ( hRequest'13369356' , address ( # szData'Н' [ 0 ] ) , sizearray ( szData ) - 1 , address ( # dwBytesRead'-842150451' ) )
if ( bRead'1' == FALSE )
fr = fr'' + format ( # szData'Н' [ 0 ] , dwBytesRead'0' )
if ( bRead'1' == FALSE || dwBytesRead'0' == 0 )
messagebox ( fr'' )
Отладчик (+Analyzer) (Отобразить)
external ( INT , " InternetOpen " , " InternetOpenA " , " Wininet.dll " )
external ( INT , " InternetConnect " , " InternetConnectA " , " Wininet.dll " )
external ( INT , " HttpOpenRequest " , " HttpOpenRequestA " , " Wininet.dll " )
external ( INT , " HttpSendRequest " , " HttpSendRequestA " , " Wininet.dll " )
external ( INT , " InternetReadFile " , " InternetReadFile " , " Wininet.dll " )
external ( INT , " InternetCloseHandle " , " InternetCloseHandle " , " Wininet.dll " )
string ServerName = " api.telegram.org "
string ObjectName = " botТУТ ТОКЕН/getMe "
int hInternet = InternetOpen ( " My bot " , INTERNET_OPEN_TYPE_PRECONFIG , NULL , NULL , 0 )
if ( hInternet'13369348' != NULL )
int hConnect = InternetConnect ( hInternet'13369348' , ServerName'api.telegram.org' , INTERNET_DEFAULT_HTTPS_PORT , NULL , NULL , INTERNET_SERVICE_HTTP , 0 , 1 )
if ( hConnect'13369352' != NULL )
int hRequest = HttpOpenRequest ( hConnect'13369352' , " POST " , ObjectName'botТУТ ТОКЕН/getMe' , NULL , NULL , 0 , INTERNET_FLAG_SECURE + INTERNET_FLAG_NO_CACHE_WRITE , 1 )
if ( hRequest'13369356' != NULL )
int bSend = HttpSendRequest ( hRequest'13369356' , NULL , 0 , NULL , 0 )
string fr = " "
int bRead = InternetReadFile ( hRequest'13369356' , address ( # szData'Н' [ 0 ] ) , sizearray ( szData ) - 1 , address ( # dwBytesRead'-842150451' ) )
if ( bRead'1' == FALSE )
fr = fr'' + format ( # szData'{' [ 0 ] , dwBytesRead'55' )
if ( bRead'1' == FALSE || dwBytesRead'55' == 0 )
int bRead = InternetReadFile ( hRequest'13369356' , address ( # szData'{' [ 0 ] ) , sizearray ( szData ) - 1 , address ( # dwBytesRead'55' ) )
if ( bRead'1' == FALSE )
fr = fr'{"ok":false,"error_co ... ription":"Not Found"}' + format ( # szData'{' [ 0 ] , dwBytesRead'0' )
if ( bRead'1' == FALSE || dwBytesRead'0' == 0 )
messagebox ( fr'{"ok":false,"error_co ... ription":"Not Found"}' )
InternetCloseHandle ( hRequest'13369356' )
InternetCloseHandle ( hConnect'13369352' )
InternetCloseHandle ( hInternet'13369348' )
(Отредактировано автором: 07 Февраля, 2021 - 21:11:55) |
|
|
Zireael |
Отправлено: 08 Февраля, 2021 - 01:40:53
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Можно через curl отправить запрос. В win10 уже присутствует, для других надо устанавливать.
CODE:external(INT, "sprintf_s", "sprintf_s", "msvcrt.dll");
string token = "1539763694:AAFaOKzATphrB3toJJykMjB2LoOEqadQn9o"; // токен (ввести нужный, этот не действителен)
string chat_id = "1581039684"; // id чата (ввести нужный)
string text = "Hello qwerty"; // сообщение
char buf[9999];
sprintf_s(address(#buf[0]), sizearray(buf), "%s%s%s%s%s%s%c", "curl ^"https:/^/api.telegram.org/bot", token,
"/sendMessage?chat_id=", chat_id, "&text=", text, 34);
//messagebox(format(#buf[0]));
if (createpipeprocess("cmd.exe"))
{
sendpipe(format(#buf[0])+"^n");
waitpipe();//Ждем пока отработает и появятся данные
sleep(500);//для надежности
int C;
string S;
getpipe(#S);//Читаем
messagebox (S);
closepipeprocess();//Завершим процесс и закрываем канал
}
Текст должен быть utf-8, нужно конвертировать если оправлять что-то кроме латиницы.
(Добавление)
Отправка сообщения в чат телеграмма через python:
CODE:external(INT, "sprintf_s", "sprintf_s", "msvcrt.dll");
string token = "1539763694:AAFaOKzATphrB3toJJykMjB2LoOEqadQn9o"; // токен (ввести нужный, этот не действителен)
string chat_id = "1581039684"; // id чата (ввести нужный)
string text = "Hello qwerty"; // сообщение
if (runpython()==0){messagebox ("Не удалось запустить Python"); goto er;}
//enableconsolepython(1, 1, 50, 50, 800, 600);
char buf[9999];
sprintf_s(address(#buf[0]), sizearray(buf), "%s%s%s%s%s%s%c%c", "requests.post(r^"https:/^/api.telegram.org/bot", token,
"/sendMessage?chat_id=", chat_id, "&text=", text, 34, ')');
//messagebox(format(#buf[0]));
sendgetpython("import requests^n"); // загрузка модуля
sendgetpython(format(#buf[0])+"^n"); // отправка запроса
closepython();
er:; |
|
|
Brumo |
Отправлено: 08 Февраля, 2021 - 17:35:41
|
Наблюдатель
Покинул форум
Сообщений всего: 28
Дата рег-ции: Февр. 2020
Репутация: 7
|
Zireael , Спасибо огромное.
Zireael пишет: Отправка сообщения в чат телеграмма через python:
За это отдельное спасибо, как раз думал как прикрутить API client Telegram в код для управления, теперь есть отправная точка.
...в справке не нашел, но оказалось что можно в sendgetpython, подставить значение string таким способом:
Цитата: sendgetpython("response = requests.post(^'https:/^/api.telegram.org/botТУТ ТОКЕН/sendMessage^', params = ^x7B^'chat_id^':^'ТУТ CHAT_ID^', ^'text^':^'"+text_value+"^'^x7D)");
CODE:string text_value="Hello qwerty";// сообщение
runpython();
//enableconsolepython(1, 1, 50, 50, 800, 600);
sendgetpython("import requests");
sendgetpython("response = requests.post(^'https:/^/api.telegram.org/botТУТ ТОКЕН/sendMessage^', params = ^x7B^'chat_id^':^'ТУТ CHAT_ID^', ^'text^':^'"+text_value+"^'^x7D)");
messagebox (sendgetpython("print(response.json())"));
closepython();
не уверен что это правильно, но код работает. |
|
|
Zireael |
Отправлено: 11 Июня, 2021 - 03:15:03
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Подскажите, как отправить скрин в телеграм ?
Создать бота в телеграмм, отправить ему картинку.
Для win10:
CODE:external(INT, "sprintf_s", "sprintf_s", "msvcrt.dll");
char buf[9999];
initialarray(#buf[0], 0);
string token = "1539763694:AAFaFKzAEphrB7toNJykMjB0LoOKqadQn5o"; // токен (ввести нужный, этот не действителен)
string chat_id = "1583009384"; // id чата (ввести нужный)
string path_to_file = "C:/screen3.jpeg"; // путь к картинке
sprintf_s(address(#buf[0]), sizearray(buf), "%s%c%s%c%s%s%s%s", "curl -F document=@", 34, path_to_file, 34,
" https:/^/api.telegram.org/bot", token, "/sendDocument?chat_id=", chat_id);
//messagebox(format(#buf[0]));
if (createpipeprocess("cmd.exe"))
{
sendpipe(format(#buf[0])+"^n");
waitpipe();
sleep(500);
string S;
getpipe(#S);
//messagebox (S);
closepipeprocess();
} |
|
|
Kibor |
Отправлено: 15 Февраля, 2022 - 20:47:00
|
Эксперт
Просматривает форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Доработка sendgetweb
Не обязательным последним параметром можно указать время в милисекундах, после которого функция завершает работу при нерабочем подключение.
Данная функция надолго зависнет при нерабочем подключение.
Цитата: string T;
sendgetweb(#T, "Бот", "GET", "https:/^/kibor-bot.com", "forum");
Данная функция через 3 секунды завершит работу при нерабочем подключение.
Цитата: string T;
sendgetweb(#T, "Бот", "GET", "https:/^/kibor-bot.com", "forum", 3000); |
|
|
|