Telegram-боты

0. PLAstic 258 30.08.17 16:26 Сейчас в теме
Описание теории, разбор архитектуры и пример реализации telegram-ботов.
Сразу скажу, со структурированием изложения мало что могу поделать. :)

редакция от 18.07.2018

Правки последней редакции выделены жирным.

Перейти к публикации

Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. zeltyr 04.09.17 11:09 Сейчас в теме
Эх, эту бы статью, да неделю назад, когда я только со всем этим начал разбираться.
Сейчас 90% статьи уже своим умом дошёл.
Но всё равно, большое спасибо вам за труд.
AnchoSt; NewLifeMan; +2 Ответить
26. user853472 26.02.18 11:39 Сейчас в теме
(1)

Доброго времени суток! Подскажите как отправить фото с клавиатурой inline_keyboard?

ддКартинка = Блюдо.Ссылка.ОсновноеИзображение.Хранилище.Получить().ПолучитьДвоичныеДанные();

времКаталог = КаталогВременныхФайлов();
времФайлКартинки = ПолучитьИмяВременногоФайла("jpg");
имяВремяФайла = СтрЗаменить(времФайлКартинки,времКаталог,"");

ддКартинка.Записать(времФайлКартинки);

СтрокаСоединения = "/bot" + Константы.Токен.Получить() + "/sendPhoto";

//Определяем массив для процедуры ОбъединитьФайлы
МассивФайловДляОбъединения = Новый Массив;

//Формируем начальный фрагмент файла POST-запроса
ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.UTF8);

//Формируем конечный фрагмент файла POST-запроса
ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
ФайлаОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.UTF8);

ТекстДляОтправки = "";

Boundary = "----" + Строка(Новый УникальныйИдентификатор());

// ЧАТ
ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""chat_id"""+ Символы.ПС + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Формат(Клиент.Код,"ЧГ=0")) + Символы.ПС;

// ПОДПИСЬ
Подпись = "Наименование: " + Блюдо.Ссылка.Наименование + Символы.ПС + "Цена: " + Блюдо.Ссылка.Цена;

ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""caption""" + Символы.ПС + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Подпись) + Символы.ПС;

// ФОТО
ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""photo""; filename=""" + имяВремяФайла + """" + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + "Content-Type: image/jpg" + Символы.ПС;

//КЛАВИАТУРА
клСтруктура = Новый Структура;
Строки = Новый Массив;
Кнопки = Новый Массив;
Кнопки.Добавить(Новый Структура("text, callback_data", "В корзину", Блюдо.Ссылка.Код));
Строки.Добавить(Кнопки);
клСтруктура.Вставить("inline_keyboard",Строки);

ЗаписьJSON = Новый ЗаписьJSON;
//ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.Нет)); //Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.СимволыВнеASCII)
ЗаписатьJSON(ЗаписьJSON,клСтруктура,,);
Клавиатура = ЗаписьJSON.Закрыть();

ТекстДляОтправки = ТекстДляОтправки + "--" + Boundary + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""reply_markup""" + Символы.ПС+ Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + СокрЛП(Клавиатура) + Символы.ПС;

ФайлОтправкиНачало.ЗаписатьСтроку(ТекстДляОтправки);
ФайлОтправкиНачало.Закрыть();

МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
МассивФайловДляОбъединения.Добавить(времФайлКартинки);

ТекстДляОтправки = "";
ТекстДляОтправки = ТекстДляОтправки + Символы.ПС + "--" + Boundary+"--";
ФайлаОтправкиКонец.ЗаписатьСтроку(ТекстДляОтправки);
ФайлаОтправкиКонец.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);

ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");

ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);

HTTPЗапрос = Новый HTTPЗапрос;
HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
HTTPЗапрос.АдресРесурса = СтрокаСоединения;

Результат = ОтправитьЗапросНаОбработкуВTelegramPOST(HTTPЗапрос);

Для Каждого Файл Из МассивФайловДляОбъединения Цикл
УдалитьФайлы(Файл);
КонецЦикла;
Показать


Если убрать блок который отвечает за клавиатуру, то картинку отправляет, а с клавиатурой сервер возвращает ответ "IMAGE_PROCESS_FAILED"
42. Hobbit_Jedi 06.07.19 01:45 Сейчас в теме
(26)
IMAGE_PROCESS_FAILED

Буквально сегодня с этим бодался. Помогло использование кодировки ANSI (без BOM) везде, где можно указать кодировку.
2. eskor 91 04.09.17 14:56 Сейчас в теме
+ Слежу за этим вопросом еще со времен первой публикации.
"Телега" единственный мессенджер с вменяемым API, поэтому в корпоративных проектах ему быть.
Мой "питомец" уже пару лет отчеты шлет :)
kamervan; +1 Ответить
3. V_V_V 05.09.17 11:12 Сейчас в теме
Адский поток сознания, а не статья... На разделы побить бы, что-ли.
Имею собственноручно созданного бота - вот ничем бы не помог этот набор слов.
GreenDragon; VachKirp; zzumma; dj_serega; +4 Ответить
4. PLAstic 258 05.09.17 13:05 Сейчас в теме
Друзья, кто скачал конфигурацию, в неё закралась ошибка. Я выложил новую версию конфигурации, но вы можете устранить ошибку и вручную: в РС "ЗапросыБоту" реквизит "ТипСообщения" должен иметь тип "Перечисление.ТипыСообщения".

Для оперативной связи моя телега.
5. imedeev 3 06.09.17 09:34 Сейчас в теме
Тяжело читать - сплошной текст, но тема интересная.
Когда то сам делал - для вечерней отправки отчета по ОРП для босса
6. volodya82 1 06.09.17 09:41 Сейчас в теме
{ОбщийМодуль.Боты.Модуль(72)}: Метод объекта не обнаружен (ПриПолученииСообщения)
7. PLAstic 258 06.09.17 09:56 Сейчас в теме
(6) Спасибо, закомментировал. Этот кусок кода относился к ботам, которым нужна дополнительная обработка при получении апдейтов. Поскольку фича мало интересная, я не стал её описывать и удалил упоминание.
8. more 07.09.17 21:19 Сейчас в теме
Хорошая информация, для первичного погружения очень хорошо.
9. flyer 232 26.09.17 13:12 Сейчас в теме
подскажите почему возникает ошибка для getUpdates : Conflict: can't use getUpdates method while webhook is active?
10. PLAstic 258 26.09.17 14:15 Сейчас в теме
(9) У вас был установлен вебхук для получения апдейтов. В апи подробно про это было сказано: https://core.telegram.org/bots/api#making-requests-when-getting-updates
Если его надо выключить, то надо отправить deleteWebhook.
11. flyer 232 28.09.17 13:14 Сейчас в теме
(10) с этим разобрался спасибо!
еще подскажите такая ситуация. а то что то видимо делаю не так. добавил бота. test_123456789_bot я с телефона пишу ему и на компьютере вижу сообщение. попросил другого пользователя найти этого бота и ему написать но его сообщения не появляются у меня.
12. sdwggg 05.10.17 15:33 Сейчас в теме
кто-нибудь знает, как реализовать следующее?
Бот должен ожидать от пользователя ввода даты. При этом на самом устройстве (в данном случае на iPhone) должна появиться клавиатура выбора даты, а не обычная текстовая и не циферная, чтобы в конечном итоге боту была отправлена команда вида "ДД.ММ.ГГГГ"
13. PLAstic 258 05.10.17 23:51 Сейчас в теме
(137) Виды клавиатур я уже описывал. Для данного случая подходит только инлайн, но делать клавиатуру для ввода времени - это весьма забавно, имхо.
14. Lyolik 8 31.10.17 11:44 Сейчас в теме
Интересно, а как к кнопке добавить картину - для наглядности. На пример, как на скрине...
Прикрепленные файлы:
15. botokash 255 01.11.17 13:52 Сейчас в теме
(14) Это эмоджи, добавляйте просто в текст кнопки
16. Lyolik 8 02.11.17 11:04 Сейчас в теме
(15) Что, именно, нужно добавить? У эмоджи есть какое-то текстовое представление или код? Если да, то где можна это посмотреть? Спасибо.
17. botokash 255 02.11.17 11:50 Сейчас в теме
(16) Эмоджи это текст. Заходишь например на emojipedia.org, находишь понравившееся, и копипастом добавляешь себе.
21. Kabz 76 08.11.17 14:50 Сейчас в теме
(17) что не все вставляеться.
29. GlebBR 10 03.07.18 21:28 Сейчас в теме
(21) решил проблему с эмоджи так. Захожу на https://apps.timwhitlock.info/emoji/tables/unicode. Беру столбец Bytes. Пример: \xF0\x9F\x93\x9E и заменяю на %F0%9F%93%9E и вставляю в текст ,в telegram отображается эмоджи. Может кто то знает как это гуманно сделать средствами 1с, я делаю Стрзаменить.
maksa2005; +1 Ответить
18. guy_septimiy 02.11.17 13:44 Сейчас в теме
Доходил аналогично автору тестовым путем в июне.
В целом, хорошая статья, проясняющая для новичка не в теме, многие моменты.
Автору респект
NewLifeMan; PLAstic; +2 Ответить
19. Master598 07.11.17 14:42 Сейчас в теме
кто может потерпеть мои вопросы новичка? в личном чате. а то запутался.
хочу сделать бота в группе и чтобы через 1с туда напоминала и люди уже не могли отмазаться, что Почты много, затерялось письмо, или в 1с не заходил уже 3 дня.

п.с. не халявщик, сижу читаю ваши коды, и пробую понять как это все мне под себя прикрутить.
20. PLAstic 258 08.11.17 09:04 Сейчас в теме
Вполне можешь задавать здесь. Ответы на вопросы могут быть полезны и остальным.
NewLifeMan; +1 Ответить
22. taishy 52 21.12.17 16:29 Сейчас в теме
Кто знает, можно ли подключаться из 1С к телеграм от имени клиента?(не бота)
23. PLAstic 258 22.12.17 11:31 Сейчас в теме
(22) Теоретически это возможно. Где-то на гитхабе есть исходники tgmcli (или как-то так). Это библиотека для работы от имени пользователя телеги. Сам не сталкивался, только слышал. Думаю, ваши шансы всё равно стремятся к нулю, но удачи.
25. taishy 52 22.12.17 11:48 Сейчас в теме
(23) Есть бредовая идея сделать обмен на базе телеграма. В качестве бота думал сделать главный узел, а в удаленных - в режиме клиента (для инициирования диалога с ботом и отправки запросов)
24. Alexey_ 24 22.12.17 11:44 Сейчас в теме
27. GlebBR 10 01.07.18 10:35 Сейчас в теме
полезная статья, кто нибудь решал такую проблему: режим обмена через webhook, задаю вопрос пользователю он быстро набирает много сообщений пока я не ответил. Как мне отсекать ответы пользователя которые лишние. Пример: Я задал вопрос , пользователь набрал быстро 3 ответа. Бот должен отработать только один ответ(самый первый.).Как только ответит бот, общение продолжается.
28. PLAstic 258 01.07.18 14:14 Сейчас в теме
(27) если ты будешь делать сессии по сообщениям с клавиатурой, то после получения ответа я их удаляю обычно. Т.е. все последующие запросы не найдут сессии и не будут обработаны.
31. GlebBR 10 04.07.18 11:54 Сейчас в теме
решил проблему с эмоджи так. Захожу на https://apps.timwhitlock.info/emoji/tables/unicode. Беру столбец Bytes. Пример: \xF0\x9F\x93\x9E и заменяю на %F0%9F%93%9E и вставляю в текст ,в telegram отображается эмоджи. Может кто то знает как это гуманно сделать средствами 1с, я делаю Стрзаменить.
32. PLAstic 258 18.07.18 12:47 Сейчас в теме
Статья обновлена, жирным выделены дополнения.
33. ROM_1C 683 15.09.18 00:52 Сейчас в теме
34. slavik_s 12.10.18 18:27 Сейчас в теме
Скачал конфигурацию, а в ней почти ничего нет. Очень интересует вопрос как решить перенос кнопок на другую строку, чтобы кнопки выстроились одна под другой?
36. PLAstic 258 12.10.18 18:45 Сейчас в теме
(34) в статье про кнопки написано.
37. slavik_s 13.10.18 01:31 Сейчас в теме
(36) По этому коду
{
"inline_keyboard":
[
[
{"text":"Разрешить","callback_data":"%1"},
{"text":"Отклонить","callback_data":"%2"}
]
]
}
Кнопки выстраиваются в одну строку [Разрешить] [Отклонить] а надо чтобы друг под другом
[Разрешить]
[Отклонить]
На моем примере это так:
{
"inline_keyboard": [
[
{
"text": "08:10 - Сидоров",
"callback_data": "1539327600;000000002292"
},
{
"text": "10:10 - Иванов",
"callback_data": "1539334800;000000003398"
},
{
"text": "10:10 - Петров",
"callback_data": "1539336600;000000003404"
},
{
"text": "12:10 - Голубев",
"callback_data": "1539343800;000000003397"
}
]
]
}

На каждой кнопке Время и Фамилия пациента получающего услугу в указанное на кнопке время и они должны размещаться одна под другой иначе их просто не видно если в одну строку.
35. slavik_s 12.10.18 18:31 Сейчас в теме
еще интересует как отправлять кнопки ReplyKeyboard ? В сообщении?
38. stako8 18.01.19 08:21 Сейчас в теме
Может кто сталкивался: отправляю клавиатуру "bot******/sendMessage?chat_id=******&text=Меню&reply_markup={"inline_keyboard":[[{"text":"1","callback_data":"1"},{"text":"2","callback_data":"2"}]]}", она приходит пользователю, тот нажимает на не, но через "getUpdates" не приходит ответ что он нажал. Куда копать?
39. slavik_s 18.02.19 13:59 Сейчас в теме
(38)Через getUpdates ответ обязательно приходит, вопрос лишь в том какой ответ и кому. Может придти ошибка соединения, тогда нужно копать прокси. В ответе в реквизите Код Состояния при успешном исходе приходит код = 200. Когда пользователь нажал кнопку, то через getUpdates не ему а ВАМ (то есть БОТу) приходит КАКУЮ КНОПКУ ОН НАЖАЛ. На каком компьютере запрашиваете через getUpdates туда и приходит информация о нажатой кнопке. В вашем случает ответ будет 2 или 1. Далее вы программно обрабатываете какой ответ послать пользователю на телефон в зависимости от того какую кнопку 1 или 2 он нажал и отправляете ему ответ сформированный вашей программой или Ботом.
40. stako8 18.02.19 14:07 Сейчас в теме
(39) Это понятно, в getUpdates должно прийти CallbackQuery, но не приходит. Сообщения корректно приходят. Я вот думаю просто клавиатуру не правильно передаю. Кто то писал про кодировку и что туда передаётся какой то лишний символ и типо из-за него может telegram не понимать что отправить обратно боту в CallbackQuery(ответ от клавиатуры).
41. slavik_s 01.03.19 17:11 Сейчас в теме
(40) Пример кнопок, когда я писал календарь для выбора и отправки даты боту
Функция ЗаписатьJS(СтруктураJS) Экспорт

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто,,,ЭкранированиеСимволовJSON.СимволыВнеASCII));
ЗаписатьJSON(ЗаписьJSON,СтруктураJS);
Возврат ЗаписьJSON.Закрыть();

КонецФункции // ЗаписатьJS()

Процедура ОтредактироватьНаборКнопокДляВыбранногоМесяца(chat_id,message_id,ДатаВремя)
ПараметрыСоедин = ПолучитьПараметры();
HTTPСоединение = Telegram_Сервер.HTTPСоединениеTelegram(ПараметрыСоедин);
Назв = СимволЮникодаВУрл(128309);
Строки = Новый Массив;
ДеньСтарта = НачалоМесяца(ДатаВремя);
Завтра = ТекущаяДата() +86400;
ДеньСтарта = ?(Завтра > ДеньСтарта,Завтра,ДеньСтарта);
unixtime = Формат(ДатаВремя - Дата(1970,1,1,1,0,0),"ЧГ=0");
Ответ = "ВM;"+unixtime+"";
НазвМесяца = Формат(ДатаВремя,"ДФ= ""ММММ гггг 'г'""");
ГалкаЗеленая = КодироватьСтроку(Символ(9989), СпособКодированияСтроки.КодировкаURL);
Кнопка = Новый Массив;
InlineKeyboardButton = Новый Структура;
InlineKeyboardButton.Вставить("text",ГалкаЗеленая+" "+НазвМесяца);
InlineKeyboardButton.Вставить("callback_data",Ответ);
Кнопка.Добавить(InlineKeyboardButton); //новая кнопка в массив клавиатуры в строке
Строки.Добавить(Кнопка);
Кнопки = Новый Массив;
// строка дней недели
Для НомерДняНедели = 1 По 7 Цикл
Если НомерДняНедели = 1 Тогда
НазвКнопки = "пн";
ИначеЕсли НомерДняНедели = 2 Тогда
НазвКнопки = "вт";
ИначеЕсли НомерДняНедели = 3 Тогда
НазвКнопки = "ср";
ИначеЕсли НомерДняНедели = 4 Тогда
НазвКнопки = "чт";
ИначеЕсли НомерДняНедели = 5 Тогда
НазвКнопки = "пт";
ИначеЕсли НомерДняНедели = 6 Тогда
НазвКнопки = "сб";
ИначеЕсли НомерДняНедели = 7 Тогда
НазвКнопки = "вс";
КонецЕсли;
InlineKeyboardButton = Новый Структура;
InlineKeyboardButton.Вставить("text",НазвКнопки);
InlineKeyboardButton.Вставить("callback_data",НазвКнопки);
Кнопки.Добавить(InlineKeyboardButton); //новая кнопка в массив клавиатуры в строке
КонецЦикла;
Строки.Добавить(Кнопки); // добавили ряд кнопок с названиями дней недели
////////////////////////////////////////////////////////////­//////////////////////////
ТекДата = ДеньСтарта;
ПервыйПонедельник = ТекДата - (ДеньНедели(ТекДата)-1)*86400;
НомерМесяца = Месяц(ДатаВремя);
ТекДата = ПервыйПонедельник;
Для НомерСтрокиНедели = 1 По 6 Цикл
Кнопки = Новый Массив; //массив из 7 кнопок в ряд
КолВоКнопокСцифройВряду = 0;
Для НомерДняНедели = 1 По 7 Цикл
unixtime = Формат(ТекДата - Дата(1970,1,1,1,0,0),"ЧГ=0");
ТекНомерДняНедели = ДеньНедели(ТекДата);
ТекНомерМесяца = Месяц(ТекДата);
Если (ТекНомерМесяца = НомерМесяца) И (ТекДата >= Завтра) Тогда
НазвКнопки = День(ТекДата);
КолВоКнопокСцифройВряду = КолВоКнопокСцифройВряду + 1;
Иначе
НазвКнопки = " ";
КонецЕсли;
InlineKeyboardButton = Новый Структура;
InlineKeyboardButton.Вставить("text",НазвКнопки);
InlineKeyboardButton.Вставить("callback_data",unixtime);
Кнопки.Добавить(InlineKeyboardButton); //новая кнопка в массив клавиатуры в строке
ТекДата = ТекДата + 86400;
КонецЦикла;
Если КолВоКнопокСцифройВряду > 0 тогда
Строки.Добавить(Кнопки);
КонецЕсли;
КонецЦикла;

InlineKeyboardMarkup = Новый Структура;
InlineKeyboardMarkup.Вставить("inline_keyboard",Строки);
КнопкиJs = Telegram_Сервер.ЗаписатьJS(InlineKeyboardMarkup);
СтрокаСоединения = "bot" + ПараметрыСоедин.token + "/editMessageText?chat_id=" + chat_id +"&message_id=" + message_id+ "&text=Теперь выберите дату, когда Вы планируете приехать? Можете вернутся и к выбору "+ГалкаЗеленая+" месяца&reply_markup="+КнопкиJs+"&parse_mode=Markdown";
HTTPЗапрос = Telegram_Сервер.HTTPЗапросTelegram(СтрокаСоединения);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния <> 200 Тогда
Данные = Telegram_Сервер.ДесериализоватьJSON(HTTPОтвет.ПолучитьТелоКакСтроку());
Сообщить("редактор кнопок3 = "+Данные.description+"");
Возврат;
КонецЕсли;


КонецПроцедуры
43. Hobbit_Jedi 06.07.19 01:53 Сейчас в теме
А можно как-то сделать так, чтобы бот сам регистрировал свои команды у БотФазера?
А то тупо получается - их нужно и в исходном коде и в чате БотФазера дважды прописывать. И следить за синхронностью этих списков.
44. Hobbit_Jedi 06.07.19 12:39 Сейчас в теме
(43) Решил в полуавтоматическом режиме.
Боту включил (в настройках у БотФазера) режим инлайн-бота, и добавил (уже в коде бота) обработку инлайн запроса, в ответ на который бот выбрасывает текст с описанием своих команд, в виде, пригодном для БотФазера.
Получилось, что к БотФазеру нужно стучаться вручную. Вручную же набирать команду /setcommands. Вручную же указать имя бота, для которого устанавливаются команды. А потом делаем инлайн-запрос к нашему боту и он отдает список своих команд.
В любом случае удобнее, чем вручную все это молотить.
45. user775441 07.10.19 16:50 Сейчас в теме
Добрый день! Два вопроса:
1. Почему при нажатии на кнопку в боте он думает около 15 секунд - начинает крутиться колесико на кнопке. Хотя если дернуть данные сразу же, то оказывается, что ответ уже получен. То есть по факту ответ отправлен быстро, а пользователю кажется, что бот сильно тормозит. В чем может быть проблема?
2. Почему делаете интервал обновления регзадания 3 секунды, а не 1? Так ведь бот быстрее реагирует. Есть какие то ограничения?
46. PLAstic 258 07.10.19 16:53 Сейчас в теме
(45) Если честно, я вообще не думал, что бот будет использоваться в режиме getUpdates. С вебхуком реакция бота сводится к малозаметному минимуму.
Там механизм построен так, что одно рег.задание, общее для всех ботов, получает для всех сообщения, а другое - это задание самогО бота, которое анализирует наличие новых сообщений и обрабатывает их. Вроде так.
Соответственно, разница во времени между выполнением первого и второго - это и есть 15 секунд.
Ограничений нет на интервал, но я бы поставил тогда секунду именно паузой между выполнениями рег.заданий, чтобы при большой загрузке не было нахлёста заданий друг на друга. Не могу сформулировать, приведёт ли это к ошибкам, просто для гарантии поставил бы.
47. Rollam 06.11.19 13:58 Сейчас в теме
Добрый день!
Реализовал отправку сообщения с привязанной к нему Inline-клавиатурой. Ответы получаю через getUpdates.
Всё работает, за исключением одного нюанса: ответ на нажатие (callback_query) "живёт" ровно 2 минуты с момента нажатия пользователем (засекал), после чего исчезает, даже если не вызывать getUpdates до истечения 2-х минут.
Вам что-нибудь об этом известно? Информации по этому таймауту нигде нет.
48. Rollam 07.11.19 10:00 Сейчас в теме
(47) Пока что меня пытаются убедить в том, что такого не может быть и мне кажется.
49. PLAstic 258 07.11.19 10:44 Сейчас в теме
(47) Т.е. у клиента нет проблем с отправкой сообщений, он нажимает пункт, происходит регистрация на серверах телеги, но когда спустя 2 минуты мы делаем getupdates, то тычка там нет? А попробуйте нажать сначала один пункт клавиатуры, а спустя полторы минуты другой. И ещё спустя минуту проверить getupdates. В ответе будет только второй тычок или оба?
50. Rollam 07.11.19 11:12 Сейчас в теме
(49) Проверил. В ответе был лишь один "тычок", последний. Кажется, это "незадокументированная особенность".
51. Rollam 07.11.19 11:12 Сейчас в теме
(50) При этом простые текстовые сообщения, созданные менее 24 часов назад, возвращаются, как и ожидалось.
52. PLAstic 258 07.11.19 11:14 Сейчас в теме
(51) Да, скорее всего, есть TTL у callback_query, потому что они сами по себе не несут смысловой нагрузки и телега решила, что двух минут достаточно для получения. Иначе, если их хранить относительно долго, то весить они будут много.
53. rinik88 28 02.03.20 08:23 Сейчас в теме
Добрый день, вопрос, при отправке /comment приходит ответ, если ответить то заново приходит тот же ответ, не совсем понятно как он без записи в регистры понял что это именно та сессия или он не понял? в процедуре где оставить коммент запись в регистр закомментированы.
54. vit59 25 11.06.20 11:29 Сейчас в теме
Добрый день,

Спасибо за статью и небольшое дополнение

"Как описывалось выше, в случае со способом получения апдейтов getUpdates мы заинтересованы в как можно более стремительной реакции бота. Исходя из этого следует, что соединение с сервером телеги должно устанавливаться один раз и общение бота будет происходить в рамках этого соединения. Нюанс в том, что рег.задание создаёт фоновое задание каждые 3 секунды и новое фоновое задание создаётся в новой среде, которая не знает, что соединение уже установлено. Способ передачи HTTPСоединения между фоновыми заданиями я пока не нашёл. Создавал на форуме уже две темы и получал неприемлемые ответы. Поэтому пока могу предложить колхоз – установку соединения каждым фоновым заданием."

В рамках одного регл задания, можно использовать keep-alive и "вечный цикл", в цикле использовать одно и тоже HTTPСоединения,
установить условия выхода из цикла и может понадобиться искусственная пауза если в цикле нет данных для обработки,
т.е если данные есть, тогда данные обрабатываются в цикле, если после нескольких попыток или интервала времени данных нет, тогда выход из цикла и повторный запуск регл задания.
55. PLAstic 258 11.06.20 11:33 Сейчас в теме
(54) Это один из неприемлемых ответов. :)
На самом деле установка соединения не является значимой по времени, чтобы заморачиваться об этом. С getUpdates в принципе невозможно достичь нулевого отклика от бота.
56. user775441 02.09.20 15:11 Сейчас в теме
Добрый день! Система выдает ошибку "{"ok":false,"error_code":409,"description":"Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first"}" - подскажите, как это исправить?
57. PLAstic 258 02.09.20 16:40 Сейчас в теме
Так там же всё написано. Вариантов получения обновлений два. У вас установлен вебхук, поэтому гетапдейтс вы использовать не можете. Удалите сначала вебхук.
58. schanya 9 23.09.20 17:02 Сейчас в теме
Добрый день! А как удалить кнопку из чата? Как правильно использовать ReplyKeyboardRemove?
59. schanya 9 24.09.20 16:42 Сейчас в теме
60. maksa2005 322 25.09.20 15:05 Сейчас в теме
Случайно не знаете как передать в
 {
            "keyboard": [[
                 {
                       "text": "Список задач",
                       "callback_data": "/g1"            
                   }, 
                   {
                       "text": "Создать задачу",
                       "callback_data": "/g2"            
                   }],[{
                       "text": "Главное меню",
                       "callback_data": "/g3"            
                   }]
            ]
        }
Показать

callback_data - передать json. По умолчанию string и длина 100 (вроде)
Суть такова чтобы отправить js и его получить в составе сообщения.
Оставьте свое сообщение
Вопросы с вознаграждением