Телеграм боты и отправка сообщений в Telegram

Как настроить бота Telegram 

Создаем Бота в Telegram 

1. Находим бота BotFather -> команда /newbot -> даем ему описание, имя (заканчивается на Bot) и картинку. (подробнее - http://aftamat4ik.ru/pishem-bota-telegram-na-c/). В итоге получаем token

2. В web.config / AppSettings настраиваем следующие параметры: 

    1. proxyUrl - указываем прокси для Телеграма в таком виде http://45.89.19.84:11498 (если прокси не нужен, то просто оставляем пустыми поля)
    2. proxyUser, proxyPassword - указываем пользователя и пароль прокси. 
    3. telegramToken - указываем токен, который мы получили при создании бота в Телеграм (в botFather).
    4. telegramOnlyTextMessages - если 1, то в обработку бота будут попадать только текстовые сообщения.

3. В таблице as_users добавляем 2 поля:

IF COL_LENGTH( 'as_users', 'telegram') IS NULL BEGIN
	ALTER TABLE as_users ADD telegram nvarchar ( 128 )  NULL
END

IF COL_LENGTH( 'as_users', 'telegramChatID') IS NULL
BEGIN
   ALTER TABLE as_users ADD telegramChatID int NULL
END

4. Создаем хранимую процедуру такого вида (в разделе Системный SQL / Telegram Bot): 

ALTER PROCEDURE [dbo].[telegram_bot_action]

@parameters DictionaryParameter READONLY,  -- входящие параметры для внутренней
                                              обработки
@text nvarchar(max),
@messageID int,
@chatID int,
@messageType nvarchar(128),
@updateType nvarchar(128),
@telegramUsername nvarchar(256),
@firstName nvarchar(256)

AS
BEGIN
-- select 1 - результат
    -- select 2 - команда  select  'sendMessage' [Type], @response [Text], @chatID ChatId, @messageID ReplyToMessageId,	0 DisableNotification
    -- select 3 - кнопки дополнительные  select '' Text, '' Url, '' CallbackData



DECLARE @userID int
SELECT @userID = id FROM as_users WHERE telegram = @telegramUsername and telegramChatID IS NULL

if(@userID is not null) BEGIN

UPDATE as_users SET telegramChatID = @chatID
WHERE id= @userID

END


if(lower(@text)='/tablecount') BEGIN

SELECT 1 Result, '' Msg
SELECT   'sendMessage' [Type], '123' [Text], @chatID ChatId, 
         @messageID ReplyToMessageId,0 DisableNotification
RETURN
END

if(lower(@text)='/hello') BEGIN

SELECT 1 Result, '' Msg
SELECT 'sendMessage' [Type], 'Привет ' + @telegramUsername+ ' / '+ @firstName [Text], 
       @chatID ChatId,@messageID ReplyToMessageId, 0 DisableNotification
RETURN
END


if(lower(@text)='/start') BEGIN

SELECT 1 Result, '' Msg
SELECT 'sendMessage' [Type], 'Привет ' + @telegramUsername+ ' / '+ @firstName [Text], 
       @chatID ChatId, @messageID ReplyToMessageId, 0 DisableNotification
RETURN
END

SELECT 0 Result, '' Msg
END

На входе: 

  • @parameters - различные доп параметры (будут впоследствии расширяться)
  • @text - текст от пользователя телеграм
  • @messageID - идентификатор сообщения от пользователя (можно использовать для указания reply)
  • @chatID - ID чата, в который мы потом отправим ответ.
  • @messageType - тип сообщения
  • @updateType - тип пришедшего обновления от хука бота
  • @telegramUsername - логин юзера в телеграм (для нас это  идентификатор)
  • @firstName - имя пользователя

На выходе: 

  • SELECT 1  - Result и Msg 
  • SELECT 2 - набор команд для telegram (актуально если SELECT1.Result=1).  Type, Text, ChatID, replyMessageID, DisableNotification, Channel, IsReplyButtons
  • SELECT 3 - набор кнопок Text, Url, CallbackData
select  'sendMessage' [Type],  -- тип команды

'Привет ' + @telegramUsername+ ' / '+ @firstName   [Text], -- текст команды

@chatID ChatId, -- в какую комнату отправить

@messageID ReplyToMessageId, -- если не NULL, то на какое сообщение отвечает

0 DisableNotification, -- Уведомлять или нет пользователя. 

'' channel -- если нужно отправлять в некий канал, то пишем сюда. 

5. Проверяем, что работает бот. Подписываемся на него в telegram и выполняем /start (при этом мы получим отклик Привет. ). Если нет отклика, значит бот не запущен. Попробуйте его перезапустить в разделе Системный SQL (Старт телеграм бот).

6. Чтобы подписать пользователя на некие действия, необходимо сначала чтобы он указал свой телеграм в профиле (поле as_users.telegram). Затем он должен сделать любую команду в телеграме, отправив боту к примеру /start

Хранение привязки чата к пользователю системы

В as_users есть 2 поля: telegram и telegramChatID. При первом обращении, система через хранимую процедуру обновит поле telegramChatID для соответствующего пользователя с заданным telegram. После этого он сможет получать сообщения от telegram. 

Примечание: 

  1. Для прокси можно использовать IPv4 и IPv6 
  2. Прокси можно купить здесь - https://proxy.market/
  3. В as_users добавлены 2 поля telegram и telegramChatID, а также добавлена хранимая процедура [as_user_getUser] (проверьте, что они есть в вашей базе). 
  4. Чтобы работало внешнее действие типа telegram в системе должна быть хранимая процедура  as_user_getUser
Create PROCEDURE [dbo].[as_user_getUser]
  @username nvarchar(32)
AS
BEGIN
  select top 1 * from as_users where username = @username
END

Использование бота

  • В телеграм находим бота (например, наш бот FalconSpaceBot)
  • Пишем ему /start для инициализации (осуществляется привязка вашего пользователя к чату). 
  • Выполняем различные команды, например /getupdates - если команда прописана в чате, то она будет обработана и выдан ответ. 

Включение/выключение бота.

Бот включается при запуске всего веб приложения (Global.asax/app_start). 

Чтобы его выключить в вручную можно из-под админа использовать команду (перейти на URL) /Controls/Stuff/StopTelegramBot

Для включения  - /Controls/Stuff/StartTelegramBot

Детали реализации бота

Реализован в виде отдельного потока, который крутится бесконечно и ожидает приема от бота обновлений. Если есть обновление, то запускает для него процедуру обработки этого обновления (сообщения в нем)

Примечания: 

  • Для перевода строки в сообщении бота используйте Char(10);

Проблемы с ботом Telegram 

Не работает бот

  1. Проверьте что прокси прописан в web.config
  2. Проверьте что прокси не просрочен
  3. Проверьте что бот в целом отвечает.на ваши команды в телеграм (если не отвечает)
  4. Попробуйте запустить заново бота /Controls/Stuff/StartTelegramBot (либо перезапустите пул приложения в IIS)
  5. Проверьте as_trace (коды TG и Exception). В нем пишутся ошибки и инициализация и завершение потока бота. 
  6. Сделать as_print в процедуре и посмотреть попадает ли туда бот. 
  7. Бот может остановиться если вы запущена локальная отладка (в этом случае возникает конфликт обновлений, поэтому необходимо отключать бота при локальном запуске - в web.config убирать токен).
  8. Бот может падать если выключается автоматически пул IIS. Необходимо его настроить так, чтобы он не отключался при простое. 

Как отправить сообщение пользователю в Телеграм

Для этого используем Внешнее действие (в формах и др элементах) с кодом telegram. 

Пример: 

select 'telegram' type, 'admin' [to], 'Некий текст сообщения' [text]

Также сообщение можно отправлять через уведомления (если включено Немедленное уведомление). 

У пользователя должны быть корректно проставлены поля telegram (заносится сначала вручную для пользователя его логин) и telegramChatID(проставляется автоматически при первом обращении юзера к боту через Телеграм)  в as_users 

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

Для этого используем Внешнее действие (в формах и др элементах) с кодом telegram. 

Пример: 

select 'telegram' type, '' [to], 'falconspace' channel, 'Некий текст сообщения' [text]

Бот должен быть добавлен администратором в канал при этом. 

Как сделать рассылку пользователям при сохранении формы.

Указываем всех пользователей в SELECT 2 + связываем с настройками показа данного сообщения (т.е. показываем тем. кто разрашил отправку на этот тип уведомлений. Поля настроек могут меняться). Пример: 

select 'telegram' type, username [to],
    	'Обновление Falcon Space: ' + isnull(@fieldname, '')
    	+ char(10) + isnull(@fielddesc, '') [text]
    from as_users where telegram in (select telegram from tg_settings where sendUpdates=1)

Как работать с кнопками Телеграм

Указываем всех пользователей в SELECT 2 + связываем с настройками показа данного сообщения (т.е. показываем тем. кто разрашил отправку на этот тип уведомлений. Поля

Кнопки могут быть либо Inline (в чате при ответе), либо Reply(внизу под чатом). Это задается через параметр IsReplyButtons в SELECT 2 Бота. 

Кнопки передаются в SELECT 3 Бота: 

  • Text - название кнопки. 
  • CallbackData - данные для передачи в процедуру
  • Url - если указан, то кнопка будет открывать указанный адрес. 

Для reply кнопок будет использоваться только text. 

В процедуру для инлайн кнопок будет передаваться как команда поле callbackData, а для reply кнопок - поле text.

Дополнительная информация о кнопках Телеграм: 

https://groosha.gitbook.io/telegram-bot-lessons/chapter8

https://aftamat4ik.ru/pishem-bota-telegram-na-c/#toc-inline-8

Примечание