понедельник, 3 февраля 2020 г.

Передача сообщения в telegram через vbs

Думаю получится большая статья, потому что постараюсь расписать поподробнее из нескольких частей. Начнем, пожалуй с самого начала

1. Настройка передачи сообщения используя api.telegram.org

Для этого нужно создать бота, который будет присылать вам, передаваемые ему сообщения через обычную адресную строку
Чтобы создать бота в телеграме ищем отца ботов: BotFather, отправляем ему команду /start, потом /newbot, отец ботов попросит дать название боту, придумываем его так чтобы оно заканчивалось на bot, и после этого он выдаст нам токен - довольно длинный набор цифр и букв.

Этот токен копируется при нажатии на него, и уже почти сразу мы можем использовать нашего бота. Находим его по имени, опять же открываем диалог и отправляем команду /start. Можно сразу написать ему какую-нибудь фигню, чтобы потом проще было распознать id чата, с вами.
Что для этого нужно сделать? А нужно всего лишь открыть браузер и в нем в адресной строке ввести https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-то_есть_ваш_токен/getUpdates




Вот эти полученные Айди чата пригодятся для того чтобы бот смог отправлять вам сообщения.

2. Передача сообщения и обход блокировки телеграм

Следующая картинка будет сразу 2 в одном - показывает как работает пересылка сообщения, и как обойти блокировку телеграм. Дело в том что в России даже с выполнением верхней команды может возникнуть затруднение по причине блокировки. Решить это можно разными способами, но поскольку у меня имеется платных хостинг для одного небольшого сайта, я решил использовать его. Для этого нужно настроить на нем прокси для api телеграма. Делаться это может разными способами, можно сделать поддомен, а можно просто как папку сделать. На самом деле эту работу делала поддержка в хостере, и я не совсем знаю как это правильно делается, но в инете нашел такую конструкцию (на моем хостинге она не пошла кстати):

 location /telegramapi {
            proxy_set_header Host api.telegram.org;
            proxy_pass https://api.telegram.org;
            client_max_body_size 100M;
 }

Зеркало api телеграма конфигурация для nginx. Папка https://sample.com/telegramapi/ будет заменять адрес https://api.telegram.org

Ну а теперь к отправке сообщения, картинка:


Структура запроса такая же: https://api.telegram.org/ (здесь он заменен на прокси на моем домене) дальше идет слово /bot (без него будет ошибка) потом ваш токен/ и потом конструкция /sendMessage?chat_id=-399тут ID чата &text=ваш текст.

На этом скрине уже другой ID чата потому что добавил бота в группу, и групповые ID идут с минусом. Узнал его так же командой get Updates

3. Передача сообщения через vbs

Ну вот и подошли мы к самому интересному. Передача сообщений в телеграм через vbs интересна тем что не нужно запускать браузер для запроса, метод GET передает все что нужно скриптом vbs.
 Конструкция легко гуглится 
Dim objHTTP
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
Call objHTTP.Open("GET", "https://api.telegram.org/bot969.....4/sendMessage?chat_id=70...8&text=mytext", False)
Call objHTTP.Send
'MsgBox(objHTTP.ResponseText)

МСГбокс может выдавать ответ от сервера, но тут он отключен: для проверки работы скрипта лучше раскомментить

Теперь интересно сделать так чтобы, отсылалось именно то что вводится в отдельное поле, и делается это так:

inp = InputBox("Введи текст для передачи")
Function URLEncode(Data)
Dim CharPosition, CharCode, oScript
Set oScript = CreateObject("ScriptControl") ' New MSScriptControl.ScriptControl
oScript.Language = "JavaScript"
URLEncode = ""
Data = Replace(Data, "&", "&")
For CharPosition = 1 To Len(Data)
 CharCode = AscW(Mid(Data, CharPosition, 1))
 URLEncode = URLEncode & oScript.Eval("encodeURIComponent(String.fromCharCode(" & CharCode & "))")
Next
end function

Все так сложно по той простой причине что передавать русские буквы нужно в кодировке UTF-8 и для это используется javascrip функция encodeURIComponent, и эта сложная функция делает эти преобразования. Потом просто нужно добавить &URLEncode(inp) чтобы передать введенный текст

4 комментария:

  1. $apiToken = "my_bot_api_token";

    $data = [
    'chat_id' => '@my_channel_name',
    'text' => 'Hello world!'
    ];

    $response = file_get_contents("https://api.telegram.org/bot$apiToken/sendMessage?" . http_build_query($data) );

    ОтветитьУдалить

  2. var xhr = new XMLHttpRequest();

    xhr.open('GET', 'url', true);

    xhr.send();

    xhr.onreadystatechange = function() {
    if (this.readyState != 4) return;

    // по окончании запроса доступны:
    // status, statusText
    // responseText, responseXML (при content-type: text/xml)

    if (this.status != 200) {
    // обработать ошибку
    alert( 'ошибка: ' + (this.status ? this.statusText : 'запрос не удался') );
    return;
    }

    // alert (this.responseText); // получить результат из this.responseText или this.responseXML
    }

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить