Вы находитесь на странице: 1из 20

Урок № 7

Создание
чата-мессенджера

СОДЕРЖАНИЕ
Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Регистрация бота. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Написание кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Материалы к уроку прикреплены к данному PDF-файлу.


Д ля доступа к материалам необходимо открыть урок
в программе Adobe Acrobat Reader.
Создание чата-мессенджера

Введение
Telegram – один из самых популярных мессен-
джеров.
Однако его функционал не ограничивается только
звонками и отправкой сообщений.
Интересной особенностью Telegram является
множество ботов.
Следует понимать, что боты далеко не всегда пред-
ставляют собой только «автоответчики». Существует
множество примеров автоматизации различных серви-
сов и инструментов. Кроме того, есть даже игры, реали-
зованные с помощью ботов.
Давайте создадим простого Telegram-бота на
Python, используя API от разработчиков (рис. 1).

Рисунок 1

3
Урок № 7

Регистрация бота
Прежде чем приступить к написанию кода, давай-
те зарегистрируем нашего будущего бота в Telegram.
Для этого разработчики создали специального бота-
отца, который доступен по адресу @BotFather. К нему
мы и обратимся (рис. 2).

Рисунок 2

Для начала работы с ним, как и в случае со всеми


остальными ботами, нужно нажать кнопку START. По-
сле этого бот-отец предоставит список всех доступных
команд (рис. 3).
Чтобы вызвать команду, можно нажать на нее, или
же ввести ее вручную и отправить, как обычное сооб-
щение.

4
Создание чата-мессенджера

Рисунок 3

В данном случае нам следует воспользоваться ко-


мандой /newbot. После ее вызова необходимо будет ука-
зать имя нашего бота и желаемый юзернейм, который
будет использоваться в качестве адреса и должен закан-
чиваться на bot.
Обратите внимание, юзернейм бота должен быть
уникален, как и юзернейм пользователя. Если вы выбе-
рете тот, который окажется уже занят, то бот-отец сооб-
щит вам об этом и предложит выбрать другой (см. рис.
4 на стр. 6).

5
Урок № 7

Рисунок 4

В сообщении об успешной регистрации находится


специальный токен. Он нужен для получения досту-
па к API, и его нельзя никому сообщать, поскольку он
дает возможность контролировать бота. В нашем слу-
чае он выглядит так:
821585857:AAGHv692aJwhy9pT3fRwBPQ1mo8uT8L6LsY
Давайте попробуем поздороваться с нашим ботом и
напишем ему любое сообщение. Сейчас он не имеет ни-
какого функционала, но уже работает. Убедиться в этом
можно также с помощью API. Давайте отправим запрос
для получения обновлений:
https://api.telegram.org/bot<токен>/getUpdates
Где <токен> нужно заменить на токен создаваемого
бота.
6
Создание чата-мессенджера

Теперь эту ссылку можно открыть в браузере и по-


лучить ответ в формате JSON.
JSON – это текстовый формат для обмена данны-
ми, который хранит их в виде "ключ":"значение".
Он будет выглядеть следующим образом:
{
"ok":true,
"result":[{
"update_id":657354343,
"message":{
"message_id":1,
"from":{
"id":12345,
"first_name":"YourName"
},
"chat":{
"id":12345,
"first_name":"YourName",
"type":"private"
},
"date":1573242365,
"text":"Hello"
}
}]
}

7
Урок № 7

С помощью API можно, например, дать боту ко-


манду отправить сообщение пользователю.
Для этого следует использовать метод /sendMessage.
Давайте ознакомимся с его описанием на официальном
сайте (рис. 5). Весь API доступен по ссылке: https://core.
telegram.org/bots/api.

Рисунок 5

Как видно на изображении выше, метод имеет два


обязательных параметра – chat_id и text.
В chat_id необходимо передать идентификатор
пользователя, которому нужно отправить сообщение.
Для этого воспользуйтесь своим идентификатором из
предыдущего запроса (в примере идентификатор ука-
зан как 12345).
8
Создание чата-мессенджера

Параметр text должен содержать текст желаемого


сообщения.
Мы уже отправляли сегодня запрос к API через
адресную строку, но как же передать параметры? На са-
мом деле, очень просто. Первый параметр указывается
в конце запроса через ?, а все последующие – через &. То
есть запрос будет выглядеть таким образом:
https://api.telegram.org/bot821585857:
AAGHv692aJwhy9pT3fRwBPQ1mo8uT8L6LsY/sendMessage?
chat_id=12345&text=Hi!
Где вместо 12345, будет ваш ID, а вместо Hi! – жела-
емый текст.
Открываем запрос в адресной строке и получаем со-
общение от бота. Именно отправку таких запросов мы
и собираемся автоматизировать с помощью кода.

Написание кода
Теперь, когда мы ознакомились с работой с API,
перейдем к написанию кода для нашего бота.
Создадим новый проект Python. В этот раз нам
понадобится установить пакет requests для работы с
HTTP-запросами. Сделать это можно через запрос в
консоли или интерфейс PyCharm.
В первом случае нужно просто открыть терминал и
ввести:
pip install requests
Во втором случае в PyCharm переходим File > Settings
и в открывшемся окне открываем Project  >  Project
9
Урок № 7

Interpreter. Здесь вы можете увидеть список уже уста-


новленных в проект пакетов (рис. 6).
Нажимаем на + и в открывшемся окне находим
requests. Выбираем его и нажимаем Install Package
(рис. 7).

Рисунок 6

Рисунок 7

10
Создание чата-мессенджера

Теперь пропишем код, который позволит получать


последние обновления. 'getUpdates' возвращает все
обновления за последние сутки, поэтому будем брать из
нее только самое новое.
Напишем следующий код:
import requests

url = "https://api.telegram.org/
bot821585857:AAGHv692aJwhy9pT3fRwBPQ1mo8uT8L6LsY/"
#don't forget to change the token!

def last_update(request):
response = requests.get(request + 'getUpdates')
response = response.json()
results = response['result']
total_updates = len(results) - 1
return results[total_updates]

Не забудьте изменить токен в коде!


Сейчас мы импортировали добавленный ранее па-
кет requests, добавили для удобства ссылку на API бота
в переменную url и объявили функцию last_update,
которая будет принимать запрос, отправлять его на сер-
вер API Telegram, получать ответ и выбирать из него са-
мое свежее обновление.

11
Урок № 7

Давайте рассмотрим эту функцию подробнее:


response = requests.get(request + 'getUpdates')
response = response.json()

Первая строчка отправляет запрос к API через функ-


цию .get() из библиотеки requests, которая нужна
нам для упрощения работы с HTTP-запросами. Вторая
строчка приводит полученный из запроса результат к
формату JSON.
https://api.telegram.org/bot821585857:
AAGHv692aJwhy9pT3fRwBPQ1mo8uT8L6LsY/getUpdates

results = response['result']
total_updates = len(results) - 1

Как мы уже узнали, JSON представляет собой струк-


туру из пар ключей и значений. При этом значениями
могут быть другие структуры. В переменную results
записываем структуру, которая имеет ключ result.
В переменную total_updates мы записываем коли-
чество значений в этой структуре и уменьшаем его на
один. Таким образом, у нас есть индекс последнего об-
новления.
return results[total_updates]

Как результат работы функции, мы возвращаем зна-


чение из структуры results с последним индексом.

12
Создание чата-мессенджера

Давайте добавим функцию, которая позволит из-


влекать из последнего обновления id отправителя. Та-
ким образом бот будет знать, какому пользователю от-
вечать.
Функция будет выглядеть следующим образом:
def get_chat_id(update):
chat_id = update['message']['chat']['id']
return chat_id

Мы будем передавать в эту функцию результат ра-


боты last_update. Затем с помощью ключей JSON по-
лучим значение id, которое находится в структуре chat.
А структура chat, в свою очередь, находится в message.
Наглядно это можно представить следующим образом:
– Message
– – Chat
– – – Id
По аналогии создадим функцию, которая вытаски-
вает из обновления текст, который прислали боту в со-
общении:
def get_message_text(update):
message_text = update['message']['text']
return message_text

13
Урок № 7

Добавим нашему боту возможность отправлять со-


общения. Для этого создадим соответствующую функ-
цию:
def send_message(chat, text):
params = {'chat_id': chat, 'text': text}
response = requests.post(url + 'sendMessage',
data=params)
return response

Рассмотрим принципы ее работы.


Мы уже использовали метод requests.get(), ко-
торый позволяет отправить HTTP GET запрос. Соот-
ветственно, метод requests.post() позволяет пере-
дать HTTP POST запрос. Разница между ними в том,
что GET используется, когда данные нужно получить, а
POST, когда их нужно передать.
Мы создали переменную params, и присвоили
ей структуру, которая содержит параметры в форма-
те «ключ : значение». Эта переменная передается в ме-
тод requests.post. Обратите внимание на синтак-
сис, передать переменную с параметрами нужно через
data=. Получается, что строка requests.post(url
+ 'sendMessage', data=params) – это то же самое,
что и запрос:
https://api.telegram.org/bot821585857:
AAGHv692aJwhy9pT3fRwBPQ1mo8uT8L6LsY/
sendMessage?chat_id=12345&text=text

14
Создание чата-мессенджера

Все готово! Теперь наш бот готов выполнять по-


ставленные перед ним задачи.
Давайте научим его здороваться и, например, бро-
сать игральные кости (рис. 8).

Рисунок 8

Для этого подключим библиотеку random и напи-


шем функцию main:
import random

def main():
update_id = last_update(url)['update_id']
while True:
update = last_update(url)
if update_id == update['update_id']:

15
Урок № 7

if get_message_text(update).lower() == 'hi' or
get_message_text(update).lower() == 'hello' or
get_message_text(update).lower() == 'hey':
send_message(get_chat_id(update),
'Greetings! Type "Dice" to roll the
dice!')
elif get_message_text(update).lower()
== 'dice':
_1 = random.randint(1, 6)
_2 = random.randint(1, 6)
send_message(get_chat_id(update),
'You have ' + str(_1) + ' and ' + str(_2) +
'!\nYour result is ' + str(_1+_2) + '!')
update_id += 1

Подробно рассмотрим ее.


С циклами while и конструкцией elif вы уже зна-
комы. Переменной update_id мы присваиваем ID по-
следнего обновления. Затем проверяем в цикле, актуаль-
но ли текущее обновление, и, в случае положительного
результата, начинаем проверку сообщения.
Если в сообщении присутствуют слова hi, hello
или hey, то бот приветствует пользователя. При этом
мы указываем .lower(), чтобы регистр сообщения не
играл роли. Если пользователь написал боту dice, то бот
генерирует два рандомных числа от 1 до 6 и передает их
пользователю.
Важно отметить, что использовать такой цикл мож-
но лишь в целях тестирования, так как он не имеет тайм-
16
Создание чата-мессенджера

аутов и создавал бы повышенную нагрузку на серверы


Telegram, если бы бот работал на постоянной основе.
Кроме того, можно добавить условие else, чтобы у
бота была возможность сообщить пользователю о том,
что он его не понимает:
else:
send_message(get_chat_id(update), 'Sorry, I
don\'t understand you :(')

Давайте проверим, все ли работает, и попробуем на-


писать боту (рис. 9):

Рисунок 9

Мы создали бота, который может помочь пользо-


вателям в игре в кости!
17
Урок № 7

Обратите внимание, бот функционирует, пока у


вас выполняется скрипт в среде разработки. Чтобы бот
работал в постоянном режиме, нужно либо постоянно
держать компьютер включенным, либо купить сервер.
Для обучающих целей будет достаточно запуска скрипта
на компьютере для проверки работоспособности кода.
Созданный чат-бот – это лишь малая часть того, на
что способны боты в Telegram. Существует множество
примеров успешных игровых ботов, которые порой
не уступают играм для мобильных устройств.
Рассмотрим примеры таких игр:
■■ Village Game (@villagegamebot) (рис. 10).
Полноценная стратегия в мессенджере. В ней реали-
зованы квесты, сражение, сбор ресурсов и многое дру-
гое.

Рисунок 10

18
Создание чата-мессенджера

■■ Flags Quiz (@country_bot) (рис. 11).


Викторина, где игроку нужно угадать, флаг какой
страны прислал ему бот.

Рисунок 11

19
Урок № 7
Создание чата-мессенджера

© Компьютерная Академия ШАГ


www.itstep.org

Все права на охраняемые авторским правом фото-, аудио- и видеопроизведения,


фрагменты которых использованы в материале, принадлежат их законным владель-
цам. Фрагменты произведений используются в иллюстративных целях в объёме,
оправданном поставленной задачей, в рамках учебного процесса и в учебных целях,
в соответствии со ст. 1274 ч. 4 ГК РФ и ст. 21 и 23 Закона Украины «Про авторське
право і суміжні права». Объём и способ цитируемых произведений соответствует
принятым нормам, не наносит ущерба нормальному использованию объектов
авторского права и не ущемляет законные интересы автора и правообладателей.
Цитируемые фрагменты произведений на момент использования не могут быть
заменены альтернативными, не охраняемыми авторским правом аналогами, и
как таковые соответствуют критериям добросовестного использования и честного
использования.
Все права защищены. Полное или частичное копирование материалов запрещено.
Согласование использования произведений или их фрагментов производится
с авторами и правообладателями. Согласованное использование материалов
возможно только при указании источника.
Ответственность за несанкционированное копирование и коммерческое исполь-
зование материалов определяется действующим законодательством Украины.

Вам также может понравиться