Рубрики
Без рубрики

Создание чата с помощью телеграммы и питона (часть 1)

В этом уроке мы пройдем построение простого бота телеграммы, используя Python. Сначала наш бот будет просто отговорить любое сообщение, которое мы отправляем его, но тогда мы продлим его, чтобы добавить базу данных и сохранить информацию по всему сессию в чате.

Автор оригинала: Gareth Dwyer.

Chatbots – это ярость на данный момент, с Некоторые прогнозирующие что они будут больше, чем мобильные приложения. Основная идея Chatbots заключается в том, что вместо того, чтобы выкопать сквозь неловкие мобильные меню и Узнайте УИС Вы просто поговорите с ботом по знакомому Интерфейс мгновенных сообщений. Если вы хотите заказать пиццу, вы начнете разговор с Домино пицца бот И иметь тот же разговор с этим, что у вас может быть с человеком.

Есть несколько разных платформ, которые позволяют создать свой собственный четко. Одним из них, что, возможно, самое простые в использовании и также становится неуклонно популярностью, является Телеграмма Отказ

В этом уроке мы пройдем построение простого бота телеграммы, используя Python. Сначала наш бот будет просто отговорить любое сообщение, которое мы отправляем его, но тогда мы продлим его, чтобы добавить базу данных и сохранить информацию по всему сессию в чате.

Мы будем использовать Python, чтобы включить наш бот и SQLite для постоянного хранения информации на сессиях. Таким образом, это учебная серия, которая будет:

  • Покажите, как написать простой эхо-бот с нуля с помощью Python и Telegram Bot API (часть 1)
  • Продлить эхо-бот в бот менеджера списка TodDo, поддерживаемый SQLite База данных (часть 2)
  • Покажите, как запустить наш бот из VPS и позвольте ему масштабировать для большего количества пользователей (часть 3).

Хотя создание эхо-бота достаточно просто, и вы можете найти различные сценарии и рамки онлайн, которые дадут вам в качестве отправной точки – мы сделаем все с нуля и объясните каждый кусок кода. Мы также посмотрим на некоторые тонкости в телеграмме API и поговорим о том, что это означает для нас как разработчики. Если вы просто хотите создать бот телеграммы как можно быстрее, это учебное пособие, вероятно, не то, что вы ищете, но если вы хотите получить более глубокое понимание того, как работают Chatbots, и как построить один с нуля, то вы в нужном месте.

Что вам нужно

Вам нужно будет иметь:

  • Некоторые Основные знания Python Чтобы следовать этому руководству
  • Вам должно быть комфортно с запущенными командами в оболочке Linux, клемма MacOS или командной строки Windows
  • Вы должны быть в состоянии установить пакеты Python, используя диспетчер пакетов PIP (или CONDA, если вам удобнее с этим)
  • В идеале вы должны были написать хотя бы базовое заявление SQL ранее, но это не является строго необходимым (и будет иметь отношение только в части 2).

Весь код предназначен для Python 3.5, но его следует легко адаптировать к другим версиям Python.

Почему python?

Вы можете написать бот Telegram Chat на любом языке, который вы хотите. Некоторые из основных вариантов, кроме Python, будут Java, PHP или Ruby. Если вы более знакомы с другим языком программирования высокого уровня, вы можете предпочесть использовать это вместо этого, но Python – хороший выбор по нескольким причинам:

  • Python может сделать запросы HTTP очень кратко и просто через модуль запросов. Получение контента от URL (как мы будем контролировать нашу телеграмму BOT), потребуется еще много линий Java, чем эквивалент Python.
  • Python является самым популярным языком для обработки натурального языка и обучения машине: хотя мы не будем использовать любой из них для нашего простого бота, оба они будут необходимы для более продвинутого бота. Таким образом, если вы хотите продлить бот, приятно садиться на Python.
  • Python имеет хорошую поддержку для обслуживания веб-контента: когда мы хотим расширить наш бот, чтобы позволить ему получить много сообщений в секунду, Python имеет зрелые технологии, такие как WSGI для достижения «веб-масштаба».
  • Python Portable – мы можем легко запускать один и тот же код на Linux, MacOS или Windows.

Установка

Почти все, что мы делаем, будет достигнуто, используя только стандартные библиотеки Python, но мы также будем использовать стороннюю Запросы Модуль, который предоставляет ряд улучшений для Python’s Урлыб И позволяет нам делать HTTP-запросы очень просто и кратко. Установите это через PIP, используя команду, аналогичную следующему (вам может потребоваться использовать PIP вместо PIP3 и/или добавить флаг --user flag, основанный на том, как вы обычно устанавливаете Python Библиотеки).

pip3 install requests

Если вы обычно используете виртуальную среду для новых проектов Python, затем сначала установите один из них и установите запросы внутри этого.

Создание бота телеграммы

Первый шаг – сказать телеграмму, которую вы хотите создать новый бот. Все сообщения, которые наш бот отправляет и получает, пройдет через инфраструктуру телеграммы. Наш код периодически сделает запрос на получение всех новых сообщений на наш бот из серверов Telegram и затем отправит ответы на каждое сообщение по мере необходимости. Для того, чтобы зарегистрировать бот с телеграммой, вам сначала нужно создать личную учетную запись телеграммы. Посетить web.telegram.org и введите свой номер телефона. Telegram отправит вам текстовое сообщение (SMS), и затем вы можете создать учетную запись, следуя инструкциям на экране. Если у вас уже есть учетная запись Telegram, вы можете просто использовать это, и вы также можете использовать любой из настольных компьютеров Telegram и мобильных приложений, доступных из Telegram.org, вместо веб-приложения мы будем использовать для всех примеров в Это руководство.

После того, как у вас есть учетная запись Telegram, вы можете зарегистрировать новую телеграмму BOT с помощью отца BOT. Посетить Telegram.me/botfather Начать разговор с ботом телеграммы, который создает другие боты. Телеграмма боты могут получить Сообщения или Команды Отказ Первые – это просто текст, который вы отправляете, как если бы вы отправили сообщение другому человеку, в то время как последние префиксированы с помощью / персонаж. Чтобы создать новый бот, отправьте следующую команду для бота отца в чате (точно так же, как будто вы разговаривали с другим человеком на телеграмме).

/newbot.

Вы должны получить ответ мгновенно, который просит вас выбрать имя для своего бота. Мы позвоним нашему боту Сделать бот Потому что к концу этого учебника он будет функционировать как простой список «делать». Отправьте следующее сообщение для бота Отца, когда он предложит вам имя:

Сделать бот

Бот отец теперь попросит вас выбрать имя пользователя для своего бота. Это имя пользователя должно закончиться бот и быть во всем мире уникальным. Когда телеграмма стала более популярной, она стала сложнее найти краткое и соответствующее имя пользователя для вашего бота. В этом руководстве мы будем использовать ExampletoDo_bot , но для остальной части этого учебника мы укажем имя пользователя BOT с <Ваш-бот-имя пользователя> Итак, вам придется заменить выбранное имя пользователя там, где нет необходимости. Отправьте выбранное имя пользователя на Бот Отец:

<Ваш-бот-имя пользователя>

Теперь бот отец отправит вам сообщение «поздравления», которое будет включать токен. Токен должен выглядеть что-то подобное:

2483457814: aahrlcx234_vskzwejdwjtsdfuwejhyu5mi.

Для остальной части этого учебника мы укажем, где вам нужно поставить свой токен, используя <Ваш-боттон> Отказ

Обратите внимание на токен, так как нам понадобится в код, который мы собираемся написать.

Взаимодействуя с нашим ботом через ваш веб-браузер

Мы можем контролировать наш бот, отправив HTTPS-запросы на телеграмму. Это означает, что самый простой способ взаимодействовать с нашим ботом через веб-браузер. Посещая разные URL-адреса, мы отправляем разные команды нашу бот. SimpleSt Command – это то, где мы получаем информацию о нашем боте. Посетите следующий URL в вашем браузере (подставляя токен бота, который вы получили раньше)

https://api.telegram.org/bot/getme

Первая часть URL указывает, что мы хотим общаться с Telegram API (API.TELEGRAMAM.ORG). Мы следуем это с /бот Чтобы сказать, что мы хотим отправить команду нашему боту, и сразу после того, как мы добавим наш токен, чтобы определить, какой бот мы хотим отправить команду и доказать, что у нас есть. Наконец, мы указываем команду, которую мы хотим отправить ( /getme ), которая в этом случае только что возвращает базовую информацию о нашем боте, используя JSON. Ответ должен выглядеть похоже на следующее:

{"ok":true,"result":{"id":248718785,"first_name":"To Do Bot","username":"exampletodo_bot"}}

Получение сообщений, отправленных на наш бот

Самый простой способ для нас для получения сообщений, отправленных на наш бот, проходит через getupdates вызов. Если вы посетите https://api.telegram.org/bot/getupdates , вы получите ответ JSON всех новых сообщений, отправленных на ваш бот. Наш бот – совершенно новый и, вероятно, еще не получил никаких сообщений, поэтому, если вы сейчас посетите это, вы должны увидеть пустой ответ.

Telegram Bots не могут говорить с пользователями, пока пользователь сначала не инициирует разговор (это уменьшить спам). Для того, чтобы попробовать getupdates Звоните, мы сначала отправлю сообщение на наш бот из нашей собственной учетной записи Telegram. Посетить telegram.me/ Чтобы открыть разговор с вашим ботом в веб-клиенте (или найти @ в любой из клиентов Telegram). Вы должны увидеть ваш бот, отображаемый с /start . кнопка в нижней части экрана. Нажмите эту кнопку, чтобы начать общаться со своим ботом. Отправьте свой бот короткое сообщение, например «Hello».

Теперь посетите https://api.telegram.org/bot/getupdates URL снова, и вы должны увидеть ответ JSON, показывающую сообщения, которые получили ваш бот (включая один из при нажатии кнопки «Пуск»). Давайте посмотрим на пример этого и выделите данные импорта, которые мы будем писать код для извлечения в следующем разделе.

{"ok":true,"result":[{"update_id":625407400,
"message":{"message_id":1,"from":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits"},"chat":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits","type":"private"},"date":1478087433,"text":"\/start","entities":[{"type":"bot_command","offset":0,"length":6}]}},{"update_id":625407401,
"message":{"message_id":2,"from":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits"},"chat":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits","type":"private"},"date":1478087624,"text":"test"}}]}

Результат Раздел JSON – список обновлений, которые мы еще не подтвердили (мы поговорим о том, как подтвердить обновления позже). В этом примере наш бот имеет два новых сообщения. Каждое сообщение содержит кучу данных о том, кто его отправил, какой чат он является частью, и содержимое сообщения. Две детали информации, на которой мы сосредоточимся на данный момент, – это идентификатор чата, который позволит нам отправить ответное сообщение и текст сообщения, который содержит текст сообщения. В следующем разделе мы увидим, как извлечь эти две части данных с помощью Python.

Отправка сообщения от нашего бота

Окончательный вызов API, который мы попробуем в нашем браузере, которое используется для отправки сообщения. Для этого нам нужен идентификатор чата для чата, где мы хотим отправить сообщение. Есть куча разных идентификаторов в ответе JSON от getupdates Позвоните, так что убедитесь, что вы получите правильный. Это ID поле, которое находится внутри Чат поле (24860000 в примере выше, но ваши будут разные). Как только у вас есть этот идентификатор, посетите следующий URL в вашем браузере, подставляя <Чат-ID> для вашего идентификатора чата.

https://api.telegram.org/bot/sendMessage?chat_id=&text=TestReply

После того, как вы посетили этот URL, вы должны увидеть сообщение от вашего бота, отправленного на ваш, который говорит «Testreply».

Теперь, когда мы знаем, как отправлять и получать сообщения, используя API Telegram, мы можем перейти с автоматическим использованием этого процесса, написав несколько логики в Python.

Написание кода Python для нашего бота

Теперь мы можем добраться до написания Python. Создать файл эхобот.пи и добавьте следующий код:

import json 
import requests

TOKEN = ""
URL = "https://api.telegram.org/bot{}/".format(TOKEN)


def get_url(url):
    response = requests.get(url)
    content = response.content.decode("utf8")
    return content


def get_json_from_url(url):
    content = get_url(url)
    js = json.loads(content)
    return js


def get_updates():
    url = URL + "getUpdates"
    js = get_json_from_url(url)
    return js


def get_last_chat_id_and_text(updates):
    num_updates = len(updates["result"])
    last_update = num_updates - 1
    text = updates["result"][last_update]["message"]["text"]
    chat_id = updates["result"][last_update]["message"]["chat"]["id"]
    return (text, chat_id)


def send_message(text, chat_id):
    url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
    get_url(url)
    

text, chat = get_last_chat_id_and_text(get_updates())
send_message(text, chat)

Давайте потянемся, что делает этот код:

  • В строках 1 и 2 мы импортируем Запросы и JSON модули. Первый – сделать веб-запросы с помощью Python, и мы будем использовать его для взаимодействия с API Telegram (аналогично тому, что мы использовали наш веб-браузер для более раннего). Мы будем использовать модуль JSON для анализа ответов JSON от Telegram в словари Python, чтобы мы могли извлечь кусочки данных, которые нам нужны.

  • Следующие две строки являются глобальными переменными, где мы определяем токен нашего бота, который нам нужно аутентифицироваться с API Telegram, и мы создаем основной URL-адрес, который мы будем использовать во всех наших запросах на API.

  • get_url Функция Просто загружает контент с URL и дает нам строку. Мы добавляем .DeCode («UTF8») Часть для дополнительной совместимости, поскольку это необходимо для некоторых версий Python на некоторых платформах. Обычно мы проводим некоторое заправка с исключением здесь, так как этот запрос может потерпеть неудачу, если на нашем интернет-соединении сокращаются, если бы служба телеграммы не появилась, или если бы возникла проблема с нашим токеном. Однако для простоты здесь мы просто предполагаем, что все всегда работает (TM).

  • get_json_from_url Функция получает строковый ответ, как указано выше и анализирует это в словаре Python, используя json.loads () ( Нагрузки коротко для загрузки строки). Мы всегда будем использовать этот, поскольку Telegram всегда даст нам ответ JSON.

  • get_uppdates Вызывает одну и ту же команду API, которую мы использовали в нашем браузере ранее, и извлекает список «обновлений» (сообщения, отправленные на наш бот).

  • get_last_chat_id_and_text Предоставляет простой, но нецелентный способ получить идентификатор чата и текст сообщения самого последнего сообщения, отправленного на наш бот. Поскольку Get_Updates всегда будет отправлять все сообщения, которые были недавно отправлены на наш бот, это не идеально, так как мы всегда будем загружать целую кучу сообщений, когда мы хотим только последнего. Мы обсудим позже более подробно, как сделать это более элегантно. На данный момент эта функция возвращает кортеж Chat_id который определяет конкретный чат между нашим ботом и человеком, который отправил сообщение, и текст , что сам сообщение.

  • send_message Принимает текст сообщения, который мы хотим отправить ( Text ) и ID чата чата, где мы хотим отправить сообщение ( Chat_id ). Затем он называет SendMessage Команда API, передавая как текст, так и идентификатор чата в качестве параметров URL-адреса, что просит телеграмму отправить сообщение в этот чат.

Последние две линии приносят все, что мы написали вместе, чтобы на самом деле получать и отправить сообщение. Во-первых, мы получаем текст и идентификатор чата от самого последнего сообщения, отправленного на наш бот. Тогда мы называем send_message Используя тот же текст, который мы только что получили, эффективно «эхом» последнее сообщение обратно пользователю.

На данный момент наш сценарий не слушает новые сообщения и немедленно ответить. Вместо этого, когда мы запустим его, наш бот будет получать только самое последнее сообщение, отправленное на это и echo. Мы можем проверить его, отправив нашу бот сообщение, а затем запустить скрипт. Дайте этому!

Недостатки с нашим ботом

Самая очевидная проблема с нашим ботом в том, что мы должны запустить сценарий Python вручную каждый раз, когда мы хотим взаимодействовать с ним. Также, как уже упоминалось ранее, мы всегда загружаем всю историю сообщений, которую предлагает Telegram. Это как неэффективно, так и ненадежный, как мы не хотим, чтобы не заплачали все историю сообщений, если мы хотим только одно сообщение, и потому что Telegram поддерживает только этот список обновлений в течение 24 часов. Другой вопрос заключается в том, что мы передаем наше сообщение как строку, но потому что это преобразуется в URL перед отправкой в Telegram, вы заметите, что некоторые неожиданные вещи происходят, если вы отправляете сообщения на бот со специальными символами (например, + Символ исчезнет из всех эховых сообщений). Наконец, бот бросает ошибку индекса, если мы стараемся запустить его, когда нет новых сообщений для получения.

Теперь мы обновим наш бот:

  • Постоянно слушать новые сообщения и ответить на каждый.
  • Подтвердите каждое сообщение, поскольку он получает его и сообщает Telegram не отправлять нам это сообщение снова.
  • Используйте длительный опрос, чтобы мы не должны были сделать слишком много запросов.
  • Правильно кодируйте наши сообщения для учета форматирования URL.

Прослушивание новых сообщений

Мы не хотим вручную начать наш бот каждый раз, когда мы хотим, чтобы он ответил на последнее сообщение, поэтому первое, что нужно сделать, это обернуть наш код, который получает новые сообщения и откроет их обратно в петлю. Мы также поставим это в Главная Функция и использовать Pythonic Если __name__ Заявление, чтобы мы могли импортировать наши функции в другой скрипт, не делая ничего. Мы не хотим просить новых обновлений как можно быстрее, поэтому мы также поместим небольшую задержку между запросами (это добрее для серверов Telegram и лучше для наших собственных сетевых ресурсов).

В верхней части файла добавьте новый импорт для Python время модуль

import time

И изменить последние две строки файла, чтобы прочитать следующим образом:

def main():
    last_textchat = (None, None)
    while True:
        text, chat = get_last_chat_id_and_text(get_updates())
        if (text, chat) != last_textchat:
            send_message(text, chat)
            last_textchat = (text, chat)
        time.sleep(0.5)


if __name__ == '__main__':
    main()

Этот код теперь получает самые последние сообщения от телеграммы каждой полторы. Теперь нам также нужно вспомнить самое последнее сообщение, на которое мы ответили (мы сохраняем это в переменме last_textChat ), чтобы мы не продолжали отправлять эховые эховые сообщения каждую секунду к сообщениям, которые мы уже обработали. Это опять же очень грубый способ достижения того, что мы хотим (например, если мы отправим одно и то же сообщение на наш бот дважды подряд, он не ответит на второй), но мы увидим более элегантный способ достичь этого ниже. На данный момент вы можете запустить этот код, а теперь вместо скрипта завершается, вы увидите, что он продолжает работать. Теперь вы можете отправить свой бот серию сообщений и (если вы не отправляете более одного за полторы), вы увидите, как каждый из них снова откровенен.

Признавая сообщения, которые мы уже видели

Вместо того, чтобы просить телеграммы для всех наших недавних сообщений с каждым вызовом, а затем пытаться понять, какие из них нас интересуют, мы можем сказать телеграмме, что мы уже обработали определенные сообщения, и что мы хотим прекратить получать их как часть getupdates звонки. Каждое обновление имеет update_id поле, и это инкрементные (более поздние сообщения имеют более высокие числа). Когда мы делаем getupdates API Call, мы можем необязательно пройти Смещение аргумент и дать update_id как значение. Это говорит о телеграмме, которую мы уже видели и обработали это сообщение и что мы не хотим этого снова. Это также означает, что телеграмма никогда не отправит нам никаких предыдущих сообщений (сообщения с более низким update_id ), поэтому мы должны убедиться, что мы действительно закончили всеми сообщениями, прежде чем делать это.

Измените наш бот следующим образом:

  • Добавьте дополнительное Смещение Параметр на нашу функцию getupdate. Если это указано, мы передадим его на API Telegram, чтобы указать, что мы не хотим получать сообщения с меньшими идентификаторами, чем это. Модифицированная функция должна выглядеть так:
def get_updates(offset=None):
    url = URL + "getUpdates"
    if offset:
        url += "?offset={}".format(offset)
    js = get_json_from_url(url)
    return js
  • Добавьте функцию, которая рассчитывает наивысший идентификатор всех обновлений, которые мы получаем от GetUpDates. Это должно выглядеть следующим образом.
def get_last_update_id(updates):
    update_ids = []
    for update in updates["result"]:
        update_ids.append(int(update["update_id"]))
    return max(update_ids)

Это просто циклирует каждый из обновлений, которые мы получаем от Telegram, а затем возвращает самый большой идентификатор. Нам нужно это так, чтобы мы могли назвать getupdate S снова, передавая этот идентификатор и укажите, какие сообщения мы уже видели.

  • Добавьте функцию, чтобы отправить ответ Echo для каждого сообщения, которое мы получаем. Это должно выглядеть следующим образом:
def echo_all(updates):
    for update in updates["result"]:
        try:
            text = update["message"]["text"]
            chat = update["message"]["chat"]["id"]
            send_message(text, chat)
        except Exception as e:
            print(e)
  • Обновите код в Главная () Так что это выглядит так:
def main():
    last_update_id = None
    while True:
        updates = get_updates(last_update_id)
        if len(updates["result"]) > 0:
            last_update_id = get_last_update_id(updates) + 1
            echo_all(updates)
        time.sleep(0.5)

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

Обратите внимание, что мы должны проверить, есть ли новые обновления (которые мы делаем на третьей строке Main () ), и что мы должны всегда отправлять идентификатор обновления, который является одним из них, как предыдущий, который мы видел (т.е. мы на самом деле говорим телеграмму, которую ID мы ожидаем, а не какой мы видели).

Попробуйте изменения, перезапустив скрипт Python и отправку некоторых сообщений на свой бот – вы должны увидеть, что он работает как раньше, но теперь это не имеет значения, если вы отправляете дубликаты сообщений или отправляете сообщения слишком быстро, оба из которых являются большие улучшения Отказ

Используя длинный опрос

Последняя серьезная проблема с нашим ботом Echo – это то, что он должен сделать веб-запрос каждые 0,5 секунды. Это не отлично подходит для серверов Telegram (они явно просят людей не делать это вне тестирующих сценариев) и не отлично подходит для наших ресурсов. Длительное опрос использует тот факт, что большую часть времени мы получаем «пустые» ответы. Поскольку наш бот, вероятно, не будет получать сообщения каждой полторы, большую часть времени, когда мы просим обновления, нет. С длинным опросом, вместо телеграммы говорят нам, что нет обновлений, он просто держит соединение, пока нет обновлений, а затем отправляет их в открытую трубу. Конечно, нецелесообразно держать соединение открыть навсегда, поэтому мы можем указать количество секунд, пока мы хотим ждать. Это делается путем прохождения другого дополнительного аргумента для getupdates Звоните, а именно Тайм-аут Отказ

Чтобы наш код использовать длинный опрос, просто обновите наши get_uppdates Способ следующим образом:

def get_updates(offset=None):
    url = URL + "getUpdates?timeout=100"
    if offset:
        url += "&offset={}".format(offset)
    js = get_json_from_url(url)
    return js

Теперь мы всегда проходим вдоль Тайм-аут аргумент Потому что у нас сейчас есть два аргумента, нам также нужно менять, где мы ранее имели ? Offset = {} к & Offset = {} (В URL-адресах мы указываем, что список аргументов начинается с A ? Но дальнейшие аргументы разделены с & ).

Запустите бот снова, и он должен работать точно так же, но теперь он будет делать гораздо меньше запросов и использовать меньше ресурсов вашего компьютера. Если вы хотите проверить, что это работает, просто добавьте строку, как Печать («Получение обновлений») прямо под Пока правда В Главная функция и запустить бот с и без Тайм-аут аргумент, который мы только что добавили. Без ожидания времени вы увидите, что бот проверяет обновления каждые 0,5 секунды. В то время как с таймаутом он будет инициировать только новую проверку каждые 100 секунд, или когда получено новое сообщение.

Правильно кодировать наш текст сообщения

Окончательная проблема нашего ECHO BOT состоит в том, что она действует странно, если мы отправим его сообщения, содержащие специальные символы. Например, все + знаки исчезают из наших сообщений, и весь текст после того, как и знак исчезает тоже. Это вызвано этими символами, имеющими специальные значения в контексте URL. Чтобы исправить это, нам нужно кодировать любые специальные символы в нашем сообщении. К счастью, стандартный Python Урлыб Имеет функцию, которая обрабатывает это для нас, поэтому нам нужно только импортировать это, и добавить одну строку кода.

Добавьте следующую строку в верхней части вашего файла .py

import urllib

И теперь измените send_message Функция для чтения следующим образом:

def send_message(text, chat_id):
    text = urllib.parse.quote_plus(text)
    url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
    get_url(url)

Перезапустите бот еще раз и отправьте ему некоторые сообщения, которые были проблематичными ранее, такие как:

+
Hello+
Hello&test

Теперь он должен быть в состоянии ответить на все эти сообщения (и в значительной степени все остальное, что вы бросаете на него, в том числе emoji) безупречно.

Конец части 1

Это приводит нас к концу первой части этого учебника. Мы построили простой эхо-бот, используя API Telegram Bot с нуля и внедрили некоторые более продвинутые функции, такие как отслеживание того, какие сообщения, которые мы уже обрабатывали, используя длительный опрос и правильно кодируют наши сообщения для URL. В следующей части мы добавим базу данных и повернув наш бот в чем-то более полезной-A, чтобы сделать список.

Окончательный список кодов для представленного здесь Echo Bot можно найти в https://github.com/sixhobbits/python-telegramam-tutorial Отказ

Часть 2 этого учебника можно найти здесь.

Часть 3 этого учебника была живая демо того, как развернуть бот до VPS.