Всем привет! Это вторая часть статьи, в которой я посвящу время запросам и серверам telegram. Если кто-то еще не видел первую часть, то рекомендую её почитать. В третьей части скорее всего будет описана работа с базами данных. Ну и если у вас опять возникли вопросы, то пишите мне в телеграм: dimagorovtsov
Наверное многие, кто писал бота по моей предыдущей статье задались вопросом, что такое message и почему к примеру, чтобы отправить сообщение мы должны указать message.chat.id в параметрах функции send_message? Для того, чтобы узнать это давайте выведем message в консоль:
Теперь когда мы вводим команду /start, наш бот присылает огромное кол-во информации. Все, что мы сейчас получили — это ответ в формате json. Json — это простой формат для хранения структурированных данных. Все выводится в формате: 'ключ': значение. Давайте посмотрим на то, что получил я:
К примеру из всей этой информации мы хотим получить id чата, из которого я отправлял сообщение. Для этого обратимся к ключу chat.
Запрос:
Ответ:
Смотрите, у ключа chat есть еще несколько ключей: first_name, last_name, username… и у каждого из них есть свои значения. Теперь обратимся к ключу id:
Как вы видите для того чтобы получить нужное значение необходимо просто записать название ключей через точку. А теперь смотрим на ответ от сервера:
Все идет как надо! Мы получили id чата, собственно как и хотели! А теперь получим имя отправителя. Тут, как вы заметили нужно использовать ключ from_user.
Запрос:
Ответ:
Теперь достанем значение у ключа first_name:
Ну вот и все! За пару секунд мы смогли получить id чата и мое имя в telegram. И еще раз, для тех кто не понял:
Чтобы получить значение ключа first_name, нам нужно сначала обратиться к ключу chat, а только потом уже к first_name!
Теперь смотрите, для того, чтобы отправить сообщение в какой-либо чат нам необходимо указать несколько параметров в функцию send_message. Первый параметр — это chat_id, собственно сам id чата. Второй — text, текст сообщения. И как вы догадались, вместо того, чтобы писать message.chat.id, мы можем написать свои данные! Вот так можно прислать сообщение самому себе, если указать в параметрах свой id:
Ну а когда мы пишем message.chat.id, мы подразумеваем, что бот отправит сообщение в чат, из которого его вызвали.
Ну а на этом всё! Надеюсь вы поняли как получать данные от сервера, обрабатывать их и использовать где нужно. Спасибо за внимание.
Что такое message?
Наверное многие, кто писал бота по моей предыдущей статье задались вопросом, что такое message и почему к примеру, чтобы отправить сообщение мы должны указать message.chat.id в параметрах функции send_message? Для того, чтобы узнать это давайте выведем message в консоль:
@bot.message_handler(commands=['start'])
def start(message):
print(message)
Теперь когда мы вводим команду /start, наш бот присылает огромное кол-во информации. Все, что мы сейчас получили — это ответ в формате json. Json — это простой формат для хранения структурированных данных. Все выводится в формате: 'ключ': значение. Давайте посмотрим на то, что получил я:
{
'content_type':'text',
'message_id':573,
'from_user':{
'id':687595402,
'is_bot':False,
'first_name':'Dmitry',
'username':'dimagorovtsov',
'last_name':'Gorovtsov',
'language_code':'ru'
},
'date':1565206363,
'chat':{
'type':'private',
'last_name':'Gorovtsov',
'first_name':'Dmitry',
'username':'dimagorovtsov',
'id':687595402,
'title':None,
'all_members_are_administrators':None,
'photo':None,
'description':None,
'invite_link':None,
'pinned_message':None,
'sticker_set_name':None,
'can_set_sticker_set':None
},
'forward_from_chat':None,
'forward_from':None,
'forward_date':None,
'reply_to_message':None,
'edit_date':None,
'media_group_id':None,
'author_signature':None,
'text':'/start',
'entities':[
<telebot.types.MessageEntity object at 0x03807F50>
],
'json':{
'message_id':573,
'from':{
'id':687595402,
'is_bot':False,
'first_name':'Dmitry',
'last_name':'Gorovtsov',
'username':'dimagorovtsov',
'language_code':'ru'
},
'chat':{
'id':687595402,
'first_name':'Dmitry',
'last_name':'Gorovtsov',
'username':'dimagorovtsov',
'type':'private'
},
'date':1565206363,
'text':'/start',
'entities':[
{
'offset':0,
'length':6,
'type':'bot_command'
}
]
}
}
К примеру из всей этой информации мы хотим получить id чата, из которого я отправлял сообщение. Для этого обратимся к ключу chat.
Запрос:
print(message.chat)
Ответ:
{'type': 'private', 'last_name': 'Gorovtsov', 'first_name': 'Dmitry', 'username': 'dimagorovtsov', 'id': 687595402, 'title': None, 'all_members_are_administrators': None, 'photo': None, 'description': None, 'invite_link': None, 'pinned_message': None, 'sticker_set_name': None, 'can_set_sticker_set': None}
Смотрите, у ключа chat есть еще несколько ключей: first_name, last_name, username… и у каждого из них есть свои значения. Теперь обратимся к ключу id:
print(message.chat.id)
Как вы видите для того чтобы получить нужное значение необходимо просто записать название ключей через точку. А теперь смотрим на ответ от сервера:
687595402
Все идет как надо! Мы получили id чата, собственно как и хотели! А теперь получим имя отправителя. Тут, как вы заметили нужно использовать ключ from_user.
Запрос:
print(message.from_user)
Ответ:
{'id': 687595402, 'is_bot': False, 'first_name': 'Dmitry', 'username': 'dimagorovtsov', 'last_name': 'Gorovtsov', 'language_code': 'ru'}
Теперь достанем значение у ключа first_name:
print(message.from_user.first_name)
Ну вот и все! За пару секунд мы смогли получить id чата и мое имя в telegram. И еще раз, для тех кто не понял:
Чтобы получить значение ключа first_name, нам нужно сначала обратиться к ключу chat, а только потом уже к first_name!
Теперь смотрите, для того, чтобы отправить сообщение в какой-либо чат нам необходимо указать несколько параметров в функцию send_message. Первый параметр — это chat_id, собственно сам id чата. Второй — text, текст сообщения. И как вы догадались, вместо того, чтобы писать message.chat.id, мы можем написать свои данные! Вот так можно прислать сообщение самому себе, если указать в параметрах свой id:
bot.send_message(<ваш id>, 'Текст сообщения')
Ну а когда мы пишем message.chat.id, мы подразумеваем, что бот отправит сообщение в чат, из которого его вызвали.
Заключение
Ну а на этом всё! Надеюсь вы поняли как получать данные от сервера, обрабатывать их и использовать где нужно. Спасибо за внимание.
Groosha
Это ни разу не следует из того, что выше JSON. Так-то pyTelegramBotAPI при получении сообщения создаёт различные объекты. Например, класс Message, поле Chat которого – внезапно, тоже класс, к полям которого можно обратиться через точку.
Разнообразие – это хорошо, поэтому оставлю тут ссылку на свой «учебник», который начал писать ещё в 2015 году (почти сразу после появления Bot API): https://mastergroosha.github.io/telegram-tutorial/
dimagorovtsov Автор
Спасибо за замечание!