Как сделать таблицу в сообщении Телеграм

Всем привет! Спасибо за интерес к предыдущим постам (раз и два), а сегодня продолжаем дополнять нашего бота функционалом. Сохраним ответы из телеграма от пользователей в гугл таблицу.

Полезное отступление

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

Например, мое сообщение /start отправляет HTTP POST запрос к веб-приложению (веб-приложение это наш скрипт). Скрипт, в свою очередь, с помощью Simple trigger doPost(e) вернет пакет как в снипете ниже

e в doPost(e) означает event. Далее обращаемся к документации и изучаем методы для event. Находим e.postData.contents и используем его для парсинга json-пакета. Функция парсинга у нас уже есть

function doPost(e) < const update = JSON.parse(e.postData.contents); let msgData = <>if (update.hasOwnProperty(‘message’)) < msgData = < id : update.message.message_id, chat_id : update.message.chat.id, user_name : update.message.from.username, text : update.message.text, is_msg : true >; > sendQuestions(msgData.chat_id); >

Помимо свойства message могут быть callback_data, edited_message, forwarded_message и так далее. При этом возвращаемый пакет будет содержать разные ключи и вложенность и, соответственно, в парсинге необходимо предусматривать все кейсы, которые нас интересуют.

Сбор данных из телеграм в таблицу

У нас есть кейс с кнопками, нажатие на какую-либо из них возвращает пакет вида

Очевидно, что пакеты различаются и порядок парсинга тоже изменится. Дополним функцию doPost(e) обработкой нажатия кнопки

function doPost(e) < const update = JSON.parse(e.postData.contents); let msgData = <>if (update.hasOwnProperty(‘message’)) < msgData = < id : update.message.message_id, chat_id : update.message.chat.id, user_name : update.message.from.username, text : update.message.text, date : (update.message.date/86400)+25569.125, is_msg : true >; > else if (update.hasOwnProperty(‘callback_query’)) < msgData = < id : update.callback_query.message.message_id, chat_id : update.callback_query.message.chat.id, user_name : update.callback_query.from.username, first_name : update.callback_query.from.first_name, text : update.callback_query.message.text, data : update.callback_query.data, is_button : true >//sendQuestions(msgData.chat_id); >

Сам объект msgData можно дополнять любыми необходимыми вам значениями. В моем примере, помимо некоторых данных из пакета, я добавила идентификаторы is_msg и is_button.

Надеюсь, что в этой части я привела достаточные вводные как работать с пакетами и парсингом.

План минимум

Функцию doPost(e) я оставлю только для парсинга и вызову в ней в последней строке новую функцию dataHandler(msgData). Обозначим ее пока приблизительно, проверив какое событие (event) вернулось — сообщение или кнопка.

Отправка сообщений из Google таблиц в телеграм + БОНУС!!!


function dataHandler(msgData) < if (msgData.is_msg) < sendQuestions(msgData.chat_id); >else if (msgData.is_button) < saveData(msgData) >>

Если бот получил сообщение, отправляем вопросы, если кнопку, сохраняем ответы. Структура таблицы для сохранения ответов следующая

Функция сохранения ответов saveData(msgData)

function saveData(msgData)

В переменную vals я записываю сохраняемые данные в том порядке, в котором они будут выведены в таблице. На лист usersSheet вставляю новую строку с помощью метода appendRow() и указанием вставляемого массива. Результат выполнения функции приведен на скрине выше во второй строке таблицы.

Еще по теме:  Как дать человеку Телеграмм без телефона

Далее будем проверять правильность ответов и возвращать пользователю результат. Здесь нам нужно сопоставить сообщение с вопросом из таблицы, затем вопрос из таблицы — с ответами из таблицы Answers и проверить выбранный из 4 вариантов ответ на корректность.

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

В функции sendQuestions(chat_id) вместо строки send(e[1], chat_id, keyboard) напишу две следующие

const question = e[0]+’/’+questionsArr.length+’: ‘+e[1] send(question, chat_id, keyboard)

Таким образом, в объекте msgData после нажатия кнопки мы можем спарсить ид вопроса и записать его в таблицу с ответами, изменив функцию saveData(msgData)

function saveData(msgData)

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

*Если дата записана в виде магических чисел, измените формат ячеек в соответствующей колонке.

Теперь добавим интерактивности нашему боту и дадим пользователю понять, верный ли он дал ответ или нет. Пример ниже

После ответа бот показывает правильность ответов в тексте кнопок, а в тексте сообщения выводит ответ пользователя и корректность данного ответа.

Для начала обозначим функцию, которая редактирует уже отправленное сообщение

function editMsg(msg, chat_id, msg_id, keyboard) < const payload = < ‘method’: ‘editMessageText’, ‘chat_id’: String(chat_id), ‘message_id’: String(msg_id), ‘text’: msg, ‘parse_mode’: ‘HTML’ >if (keyboard) payload.reply_markup = JSON.stringify(keyboard) const data =

Функция использует метод editMessageText, обязательными параметрами являются text, chat_id и message_id. Дополнительно мы можем указать другие параметры, в том числе клавиатуру.

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

Далее создам еще одну функцию editMessage(msgData), в которой нам нужно сравнить ответ пользователя с вариантами ответов из таблицы, и в зависимости от правильности ответа внести соответствующие правки в текст.

Начнем с ответов из таблицы, записав их в переменную answersArr, что мы уже делали в функции отправки вопросов.

function editMessage(msgData)

Воспользуюсь методом массива .filter(), оставив варианты ответа только для текущего вопроса

const answersArr = answersSheet.getDataRange().getValues().filter(e => e[0] == msgData.text[0]);

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

Сохраним в переменную curAnswerArr строку из таблицы с ответами, которая соответствует данному пользователем ответу

const curAnswerArr = answersArr.find(e => e[1] == msgData.data);

Здесь в уже отфильтрованном массиве из 4х вариантов ответов я выбираю один, текст которого равен тексту в кнопке.

Далее отредактирую сам текст сообщения в зависимости от того, правильный был ответ или нет

let newText = new String(); if (curAnswerArr[2]) newText = msgData.text + ‘nn✅WownТвой ответ: ‘+msgData.data; else newText = msgData.text + ‘nn❌NopenТвой ответ: ‘+msgData.data;

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

Еще по теме:  Как в приложении Телеграмм найти свою ссылку на канал

И наконец прописываем строку с вызовом функции editMsg() и передаем новый текст сообщения, ид чата, ид сообщения и null для клавиатуры.

editMsg(newText,msgData.chat_id,msgData.id,null);

Вся функция saveData(msgData) представлена ниже

function editMessage(msgData) < const answersArr = answersSheet.getDataRange().getValues().filter(e =>e[0] == msgData.text[0]); const curAnswerArr = answersArr.find(e => e[1] == msgData.data); let newText = new String(); if (curAnswerArr[2]) newText = msgData.text + ‘nn✅WownТвой ответ: ‘+msgData.data; else newText = msgData.text + ‘nn❌NopenТвой ответ: ‘+msgData.data; editMsg(newText,msgData.chat_id,msgData.id, null); >

На этом этапе деплоим и проверяем, что все работает

Клавиатура под сообщением пропала, т.к. в editMsg вместо клавиатуры мы передали null.

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

Источник: temofeev.ru

Как в telebot отправить сообщение в виде таблицы?

627696e19cf21228060291.png

Таким циклом в консоли выводится так

Но когда пытаюсь отправить в сообщении, каждая строка уходит отдельным сообщением.
Как отправить это все 1 целым сообщением?

  • Вопрос задан более года назад
  • 417 просмотров

Решения вопроса 1

Очевидно, что если в цикле вызывать send_message, то будет отправлено столько сообщений, сколько итераций цикла. Надо собрать сообщение в одну переменную и затем одной операцией send_message его отправить. Примерно так:

message_text = «» for res in cursor.fetchall(): message_text += » «.format(res[0], res[1])) bot.send_message(. message_text)

Ответ написан более года назад

Источник: qna.habr.com

Создаем для Телеграм таблицу рекламных закупов

Боты — это модно. Нина Белая специально для Нетологии выбрала 45 полезных ботов для Telegram.

Эти телеграм-боты помогут решать задачи быстро и с пользой.

Хранить и обмениваться файлами

Найти и скачать

курс

Интернет-маркетолог

Узнать больше

  • Освойте одну из самых востребованных digital-профессий
  • Познакомьтесь с основными инструментами интернет-маркетинга
  • Изучите теорию и отработайте практические навыки на реальных проектах

Почта

Языки

Текст

Для работы в Telegram

Читать также

4814.jpg

10 каналов для копирайтеров, журналистов и редакторов в Telegram

В городе и в мире

Спорт

Читать также

4353.jpg

11 чатов в Telegram для маркетологов

Прочие

Хотите написать колонку для Нетологии? Читайте наши условия публикации. Чтобы быть в курсе всех новостей и читать новые статьи, присоединяйтесь к Телеграм-каналу Нетологии.

Читать также

4) настройки публикации должны быть такими (email будет ваш)

Строим загрузочный док

Нам нужен URL приложения, чтобы получать данные из Telegram. К счастью, у Google очень простая публикация веб-приложений через редактор сценариев. Когда мы опубликуем скрипт, то получим уникальный адрес веб-приложения. Нажимайте Publish в редакторе скриптов Google Spreadsheet. Пожалуйста, обратите внимание на варианты на изображении ниже.

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

И теперь у нас есть адрес веб-приложения! ?

Сохраните все ссылки в переменных

Теперь, когда у нас есть пропуск и загрузочный док, давайте создадим веб-хук — наш крючок. Согласно документации Telegram API, все запросы к API (App Programming Interface) должны быть такими: https://api.telegram.org/bot/METHOD_NAME . Похоже, нам будет очень часто нужна эта ссылка. Давайте сохраним все нужные ссылки в переменных, чтобы мы могли легко писать их позже:

Еще по теме:  Как отключить микрофон в Телеграмме на компьютере

Настройка веб-хука

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

Когда вы публикуете (или развёртываете) свой код, вам могут предложить авторизовать свое собственное приложение для доступа к вашим данным в Google:

Авторизуйте приложение: жизнь слишком коротка, чтобы прожить её в безопасности:

Настройка обмена сообщениями

Есть две вещи, которые наш бот должен знать, прежде чем сможет отправить кому-то сообщение:

  1. Кому сообщение? Идентификатор чата.
  2. Что напишем? Текст сообщения.

Запишем эти требования как параметры функции. Не стесняйтесь копировать и вставлять код:

Настройка запроса POST

По словам разработчиков Telegram, все запросы к API должны идти по HTTPS. Они также упомянули, что поддерживают только запросы GET и POST . GET означает, что кто-то пытается получить данные. POST означает, что кто-то пытается их отправить. Это единственная концепция в учебнике, которую я ещё не освоила, поэтому я перестану притворяться, что знаю, о чем говорю, и просто покажу вам эту статью, которая помогла мне лучше понять принцип.

В любом случае, важно знать, что вы должны написать функцию, которая может отправлять POST -запрос в Telegram, чтобы вы могли отправлять сообщение каждый раз, когда человек общается с вашим ботом. Не стесняйтесь копировать и вставлять этот код. Я объясню, что он делает, в ближайшее время:

Нам нужна эта функция, потому что она — наш способ отправки данных в Telegram и сам Google требует, чтобы его пользователи сценариев приложений — то есть мы — включали либо функцию doGet , либо doPost , когда публикуем веб-приложение. Вот документация об этом. В этом документе Google объясняет, что означает аргумент ( e ) в функции.

Он представляет собой данные из события, созданного человеком внутри приложения, к которому подключен наш веб-хук. В нашем случае аргумент e содержит все данные, генерируемые всякий раз, когда человек отправляет сообщение Telegram-боту. И именно в аргументе мы получим идентификатор чата пользователя. В конце концов, все предыдущие бредни оправдались ? (может быть).

Итак, вот история нашего бота:

  1. Когда пользователь общается с нашим ботом Telegram, происходит событие. Оно генерирует данные, получаемые нами из e .
  2. Веб-хук автоматически отправляет e на URL-адрес веб-приложения.
  3. Как только e попадёт в URL-адрес веб-приложения, оно захочет отправить запрос POST в Telegram. Он запросит Telegram об отправке сообщения пользователю.
  4. Однако он не может отправить запрос с неполными требованиями. Нам нужен идентификатор чата человека и сообщение, которое мы хотим отправить в Telegram. Функция doPost переносит сообщение внутри переменной text .
  5. doPost также обрабатывает идентификатор chat , но сначала ей нужно проанализировать e , чтобы найти его.
  6. После обнаружения она передаёт параметры в Telegram с помощью функции sendMessage . Всё: сообщение передаётся пользователю. Запрос завершен. И вот — работающий бот:

Читайте нас в Telegram, VK и Яндекс.Дзен

Перевод статьи Mars Escobin: Seven Easy Steps to Create a Telegram Bot Using Webhooks

Источник: geopressa.ru

Рейтинг
( Пока оценок нет )
Загрузка ...