Getupdates telegram не работает
Отправка запросов
Для начала разберём, что мы можем сделать и получить пользуясь только браузером на любом устройстве , даже со смартфона.
-Большая часть взята из документации по Telegram Bot API .
Допускаются GET и POST запросы.
Для передачи параметров в Bot API доступны 4 способа:
- Запрос в URL
- application/x-www-form-urlencoded
- application/json (не подходит для загрузки файлов)
- multipart/form-data (для загрузки файлов)
Подробнее об этом вы можете прочитать в официальной документации ,
а сейчас приступим к практике GET запроса.
GET запросы: getMe, getupdates
Метод " getMe" позволит нам получить основную информацию о боте.
Открываем браузер и в адресной строке пишем:
Но вместо <token> пишем токен полученный от BotFather.
Как в примере выше.
Отправляем данный запрос и смотрим, что мы получим.
В результате мы видим, вкратце, что наш бот работает ,
его first_name , username и дополнительные сведения ,
что они значат вы можете догадаться просто переведя их.
Теперь получим обновления нашего бота,
перейдём в диалог к нашему боту в Telegram и напишем ему " /start ",
также в адресную строку браузера напишем вместо команды
И посмотрим, что на этот раз мы получим.
-поместил в кадре 2 окна, для вашего удобства,
чтобы не засорять всю статью скринами.
Метод " getupdates " позволяет получать нам информацию поступающую на нашего бота.
в интернете их полно.
Воспользуемся методом " sendmessage".
Пишем от имени бота через адресную строку, метод "sendmessage"
Для начала скопируем и сохраним chat_id, именно, нашего диалога.
В данном примере " 974446490 " вам следует сменить на id вашего диалога.
Как отправлять фотографии или видео ,
мы с вами разберём в следующих статьях,
но в браузере это делать нет смысла, так как за нас всё будет делать наш код.
Не будем с этим затягивать.
лично мне данная функция пригодилась, разве что, для розыгрышей,
но для этого приходилось следить за тем, что пишут мои друзья(как же им не дать протестировать бота), затем конвертировать с utf-8 русский текст и после уже отвечать.
Переходим к ЯП Python .
Первый код, эхо-бот
Для удобства, вы можете скачать PyCharm .
-Но видите ли на мою 7-ку он не встал, т.к. она 32-разрядная, так что в примерах будет самый обычный Python IDLE(Python 3.8.3 shell), результату это не помешает.
У кого также не получится скачать PyCharm, советую скачать notepad++, он удобно подстраивается почти под каждый язык, но выполнен в стиле обычного блокнота.
Для начала без объяснения.
Создаём текстовый документ( лучше в отдельной папке ) c именем << config.py >>, с текстом:
Теперь создаём в той же папке текстовый документ с любым названием, главное чтобы расширение было " .py " Я назову его как и бота << Moon.py >>.
Пишем в нём следующий текст, после расскажу, что он значит.
import telebot
def welcome(message):
-Просто не знал что придумать простенькое и решил сделать как во многих самоучителях, написать эхо-бота.
- import telebot - импорт библиотеки telebot, чтобы наш бот работал😁
import config подключаем наш файл config.py, чтобы взять от туда ТОКЕН.
Проще было бы написать << bot = telebot.TeleBot(" ВАШ_ТОКЕН "),
В нашем примере он пишет: "Привет, ИМЯ_ПОЛЬЗОВАТЕЛЯ!".
Чтобы запустить нашего бота в Python shell, достаточно нажать F5.
Этот способ предпочтительнее для недолгого включения .
А если на длительный промежуток времени , лучше воспользоваться python.exe или py.exe, их вы можете найти если наш файл открыть с помощью. В таком случае py.exe изображен с ракетой, а python.exe c чёрным фоном, в результате запуска, вы увидите, что разницы в них нет, но нам же надо всё рассмотреть.
Я тогда давно написал статью про создание Telegram бота, и обещал дополнить её описанием настройки работы через webhook, но так и не дополнил. Вот только сейчас дошли руки.
Как пишут в документации, общаться с серверами Telegram бот может двумя способами:
Разницу можно изобразить следующим образом:
Что нужно сделать:
Сертификат
С доменом и сертификатом просто. Домен у меня уже был, а сертификат я получил по этой инструкции.
Вариант с самоподписанным сертификатом на прямой IP адрес я оставляю вам на самостоятельное изучение.
Серверная часть
Ставим необходимые пакеты:
И сокращённо код бота теперь такой:
Обратите также внимание на отличия от стандартного примера из репозитория:
- в качестве файла сертификата указан fullchain.pem , а не cert.pem ;
- удалён код снятия и установки webhook’а.
Так как бота я запускаю не из-под root’а, сервис начал валиться с такой ошибкой:
То есть, у пользователя, из-под которого выполняется скрипт, нет доступа к /etc/letsencrypt/ , чтобы открыть файл сертификата. Я попытался дать доступ к каталогу для новой группы, включив в неё этого пользователя:
Но он один фиг не мог открыть файлы оттуда, даже простой ls выдавал ошибку доступа. В общем, или мои познания Linux полный отстой, или одно из двух. Пришлось тупо назначить его владельцем:
Тогда сервис запустился нормально.
Теперь осталось самое, как оказалось, сложное - зарегистрировать endpoint бота в Telegram. Сложности возникли потому, что я сначала неправильно понял принцип составления endpoint’а, а также из-за проблем с проверкой сертификата.
Пока я экспериментировал и разбирался с форматом endpoint’а, Telegram возвращал мне нормальный результат:
Но потом я его видимо задолбал, и он стал возвращать мне следующее:
Но оказалось, что это ни на что не влияет, и webhook нормально устанавливается, так что можно даже не дожидаться таймаута, а просто отменять запрос через пару секунд.
Проверить статус webhook’а можно таким запросом:
Если всё нормально, должно вернуть такое:
Как видим, в поле url стоит наш endpoint.
Однако, мне оно сейчас возвращает такое:
Что указывает на некие проблемы с сертификатом. При этом бот работает нормально, то есть эта ошибка ни на что не влияет. Однако, если вместо fullchain.pem оставить cert.pem (как было указано в примере), то бот работать перестанет.
Ну и всё, не так уж и сложно. Если бы в документации (и сторонних манулах из интернетов) была указана такая простая вещь, что для webhook’а всего-то нужен лишь веб-сервер на стороне бота, я бы это сделал уже сто лет назад. Конечно, продвинутым чувакам это скорее всего было очевидно сразу, но мнe - нет.
Хоть и с большим запозданием, публикую шпаргалку по telegram bot api, может, будет полезна.
Прикладываю официальную документацию, и готовый набор методов для работы с telegram. Обработку тестировал на 8.3.15.1747.
В тексте я буду давать ссылки на вторую документацию т.к. для ее просмотра не нужны премудрости для обхода блокировок.
В клиенте telegram ищем бота BotFather
Далее отправляем ему команды
/start
/newbot
Представление имени моего бота
unikalnoe_imya_bot
После этого бот выдаст нам данные для подключения, а именно токен вида 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
Скринами
Соединение
В документации написано:
Код создания соединения :
Прокси
Есть огромное количество сайтов предоставляющий список таких бесплатных прокси, я использую getMe
Я специально буду повторять блоки кода, дабы Вы копировали сразу рабочий вариант, конечно это все нужно обернуть в функции и процедуры
Метод getMe вернет в теле ответа JSON структуру
"ok":true - Означает, что авторизация прошла успешно и Ваш токен валидный.
Short polling - это классическая схема, когда отправляя запрос мы сразу получаем результат его выполнения.
т.е. вы заводите РС с обработанными update_id и каждый раз анализируете - обработан полученный id или нет. Можно завести константу с последним обработанным update_id и сравнивать ее на < или > с полученным
Для работы в такой схеме необходимо договориться с сервером - какой таймаут считать допустимым, для этого у метода
Для переключения режима обмена на вебхуки существует метод InlineKeyboardMarkup
Загрузка полученных файлов
Для этого существует GET-метод
Ответ сервиса getFile
При этом запросе сервер ответит, что все Ок
Показ привью отправленной ссылки можно отключить с помощью параметра disable_web_page_preview
Для этого нужно к запросу добавить строку &disable_web_page_preview=true
Кнопки (клавиатуры)
У метода sendMessage есть еще один очень интересный параметр - reply_markup, который отвечает за быстрые ответы.
Кнопка - это объект InlineKeyboardButton, у которого только одно обязательное поле - text
Есть еще ряд полей, основное из которых - callback_data. Это данные, которые будут отправлены после нажатия кнопки пользователем. Сюда можно записывать идентификаторы из 1С (документа или справочника), числа и т.д. для последующей обработки.
Второй полезный параметр - url, в котором указывается ссылка, которая будет открыта при нажатии на кнопку
Пример JSON-описания клавиатуры
KeyboardButton с основным полем text, данный объект можно не использовать и сразу формировать массив строк.
Еще один важный параметр клавиатуры, но не обязательным, является resize_keyboard, который отвечает за "авто высоту" кнопок.
По умолчанию данный параметр установлен в false и клавиатура растягивается на высоту основной клавиатуры, что выглядит громоздко (см. скрин в примере).
Еще один опциональный параметр - one_time_keyboard, который при установке в true скрывает клавиатуру после нажатия кнопки.
ReplyKeyboardHide - Своего рода команда управления видимостью для клавиатуры
Отправка контактов
Метод похож на sendMessage за исключением нескольких обязательных полей:
phone_number - строковое представление телефонного номера
first_name - Имя контакта
Отправка документов (файлов)
За отправку файлов отвечает POST-метод
Со строковыми значениями вопросов не возникает - делаем СтрЗаменить и все, но есть еще и содержимое файла, которое нужно в итоговый запрос подсунуть.
Для решения этой проблемы у 1С есть метод ОбъединитьФайлы, который объединяет переданный в него массив файлов в один.
Разделим шаблон на части - певая это текст до %СодержимоеФайла%, а вторая это текст после %СодержимоеФайла%. Запишем эти 2 текста в файлы и используем ОбъединитьФайлы подсунув между текстовиками отправляемый файл.
Я тогда давно написал статью про создание Telegram бота, и обещал дополнить её описанием настройки работы через webhook, но так и не дополнил. Вот только сейчас дошли руки.
Как пишут в документации, общаться с серверами Telegram бот может двумя способами:
Разницу можно изобразить следующим образом:
Что нужно сделать:
Сертификат
С доменом и сертификатом просто. Домен у меня уже был, а сертификат я получил по этой инструкции.
Вариант с самоподписанным сертификатом на прямой IP адрес я оставляю вам на самостоятельное изучение.
Серверная часть
Ставим необходимые пакеты:
И сокращённо код бота теперь такой:
Обратите также внимание на отличия от стандартного примера из репозитория:
- в качестве файла сертификата указан fullchain.pem , а не cert.pem ;
- удалён код снятия и установки webhook’а.
Так как бота я запускаю не из-под root’а, сервис начал валиться с такой ошибкой:
То есть, у пользователя, из-под которого выполняется скрипт, нет доступа к /etc/letsencrypt/ , чтобы открыть файл сертификата. Я попытался дать доступ к каталогу для новой группы, включив в неё этого пользователя:
Но он один фиг не мог открыть файлы оттуда, даже простой ls выдавал ошибку доступа. В общем, или мои познания Linux полный отстой, или одно из двух. Пришлось тупо назначить его владельцем:
Тогда сервис запустился нормально.
Теперь осталось самое, как оказалось, сложное - зарегистрировать endpoint бота в Telegram. Сложности возникли потому, что я сначала неправильно понял принцип составления endpoint’а, а также из-за проблем с проверкой сертификата.
Пока я экспериментировал и разбирался с форматом endpoint’а, Telegram возвращал мне нормальный результат:
Но потом я его видимо задолбал, и он стал возвращать мне следующее:
Но оказалось, что это ни на что не влияет, и webhook нормально устанавливается, так что можно даже не дожидаться таймаута, а просто отменять запрос через пару секунд.
Проверить статус webhook’а можно таким запросом:
Если всё нормально, должно вернуть такое:
Как видим, в поле url стоит наш endpoint.
Однако, мне оно сейчас возвращает такое:
Что указывает на некие проблемы с сертификатом. При этом бот работает нормально, то есть эта ошибка ни на что не влияет. Однако, если вместо fullchain.pem оставить cert.pem (как было указано в примере), то бот работать перестанет.
Ну и всё, не так уж и сложно. Если бы в документации (и сторонних манулах из интернетов) была указана такая простая вещь, что для webhook’а всего-то нужен лишь веб-сервер на стороне бота, я бы это сделал уже сто лет назад. Конечно, продвинутым чувакам это скорее всего было очевидно сразу, но мнe - нет.
Задача:
Создать телеграм бота и научится работать с ним в «1С:Предприятие 8», через long polling и webhooks, используя Telegram bot API.
В результате, будет сформирован токен доступа, который необходимо сохранить и держать в секрете, а созданного бота добавить себе в приложение «Телеграм».
2. Два способа работы с телеграм ботом.
При помощи «Telegram Bot API», есть два взаимоисключающих способа работы с телеграм ботом:
- Метод «getUpdates» – самостоятельно, выполняем запрос получения новых обновлений.
- Использование «Webhooks» – обновления приходят автоматически от сервера, на указанный URL-адрес.
Ответ приходит в виде JSON, не обработанные обновления хранятся на сервере до тех пор, пока бот их не получит, но они не будут храниться дольше 24 часов.
3. Подготовка конфигурации.
3.2 Создаем пустую (вспомогательную) конфигурацию и выполняем «Загрузить конфигурацию из файлов…», используя папку «src» (см. п. 3.1):
Коннектор: Загрузка конфигурации
Перенос общего модуля
4. Метод «getUpdates».
Из 1С, самостоятельно, периодически обращаемся к методу API «getUpdates», для получения 100 самых ранних неподтвержденных (не полученных ранее) обновлений, в виде JSON объекта «Update».
Для нашего примера, будет заполнен только параметр offset равным 0, для того чтобы получить все не обработанные обновления. Процедура обработки команды «Обновить» на клиенте:
Методы «ОбновитьНаСервере» и «ОбработатьОбновление»:
5. Использование «Webhooks»
Их нужно сохранить в шаблоне «C:\OpenServer\userdata\config\Apache_2.4-PHP_7.2-7.4_server.conf», для того чтобы при следующем запуске «Open Server» они не затерлись.
Для проверки воспользуемся приложением «Postman»:
В результате, внутренние локальные сервисы, станут доступны для внешнего взаимодействия:
Postman test ngrok
Для эксперимента, попробуем это сделать через «Postman»:
Для удаление webhook и переход на метод «getUpdates», достаточно вызвать метод «deleteWebhook»:
Читайте также: