Всем привет! Это вторая часть статьи, в которой я посвящу время запросам и серверам telegram. Если кто-то еще не видел первую часть, то рекомендую её почитать. В третьей части скорее всего будет описана работа с базами данных. Ну и если у вас опять возникли вопросы, то пишите мне в телеграм: dimagorovtsov

Что такое 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, мы подразумеваем, что бот отправит сообщение в чат, из которого его вызвали.

Заключение


Ну а на этом всё! Надеюсь вы поняли как получать данные от сервера, обрабатывать их и использовать где нужно. Спасибо за внимание.

Комментарии (2)


  1. Groosha
    08.08.2019 01:06

    Как вы видите для того чтобы получить нужное значение необходимо просто записать название ключей через точку

    Это ни разу не следует из того, что выше JSON. Так-то pyTelegramBotAPI при получении сообщения создаёт различные объекты. Например, класс Message, поле Chat которого – внезапно, тоже класс, к полям которого можно обратиться через точку.
    Разнообразие – это хорошо, поэтому оставлю тут ссылку на свой «учебник», который начал писать ещё в 2015 году (почти сразу после появления Bot API): https://mastergroosha.github.io/telegram-tutorial/


    1. dimagorovtsov Автор
      08.08.2019 10:10

      Спасибо за замечание!