Найти тему
Ilya Engineer

C# + telegram bot. Прием сообщений, получение ID отправителя, отправка сообщений

Телеграм бот удобное средство оповещения о штатных и нештатных режимах работы программы.

Минимум теории:

  1. telegram bot такой же собеседник как и любой ваш товарищ из списка друзей, но за ним нет реального человека.
  2. у telegram botа есть идентификатор, и зная его, Вы можете от его имени отправлять кому угодно сообщения.
  3. чтобы пользователь получил сообщение, надо знать id пользователя
  4. если пользователь получил сообщение, он может взять из него id отправителя и далее отправлять пользователю сообщения.

Приступаем к настройке и написанию программы:

1. Регистрируем telegramBot:

  • Нам нужен главный бот, отец всех ботов, именно с помощью него создаются все боты. Добавляем его себе.
  • далее в нем создает бота по следующему правилу, например mytest_bot в следующей последовательности:

/newbot

мой маленький и нежный бот вот такой

@MyLittleForOnlyMeBot

Что здесь есть - имя бота и его идентификатор

В ответ мы получаем информацию о созданном боте:

-2

вот такой результат из которого нас интересует только token:

5340152478:AAFKdiyVRNqy35DljffEBEs7NRf5uNJzhK0

именно от его имени будем отправлять сообщения.

приступаем к программе:

главная форма. ПО нажатию кнопки будем отправлять сообщение из текстового поля нашему боту

Через NuGet добавляем вот этот компонент:

-3

(проект -> управление пакетами nuget)

Добавляем обязательно:

using Telegram.Bot;

using System.ComponentModel;

Вот тело основной программы:

namespace telegram1
{
public partial class Form1 : Form
{
public static TelegramBotClient botClient;
public static BackgroundWorker bw;
public Form1()
{
InitializeComponent();
botClient = new TelegramBotClient("5340152478:AAFKdiyVRNqy35DljffEBEs7NRf5uNJzhK0") // вот и наш токен бота
{ Timeout = TimeSpan.FromSeconds(21) };
bw = new BackgroundWorker();
bw.DoWork += tg.bw_DoWork;
}
private void Button1_Click(object sender, EventArgs e)
{
tg.sendMsg(textBox1.Text);
}
}
}

Далее класс отлова и отправки сообщений:

using System;
using System.ComponentModel;
using Telegram.Bot;
namespace telegram1
{
class tg
{
public static long idchatMy = 0;
public static async void bw_DoWork(object sender, DoWorkEventArgs e)
{
try // обязательно перепроверяем ошибки
{
try
{
await Form1.botClient.SetWebhookAsync("");
}
catch (Exception ex)
{ Console.WriteLine("Соединение с интернетом не установлено"); }
int offset = 0;
try
{
while (true)
{
var updates = await Form1.botClient.GetUpdatesAsync(offset);
// получаем массив обновлений
foreach (var update in updates)
// Перебираем все обновления
{
var message = update.Message;
// ловим сообщение
if (message.Type == Telegram.Bot.Types.Enums.MessageType.Text)
{
if (message.Text == "/start")
// если получили /start
{
// в ответ на команду /saysomething выводим сообщение
Console.WriteLine(message.Chat.Id);
await Form1.botClient.SendTextMessageAsync(message.Chat.Id, "тест",
replyToMessageId: message.MessageId);
// на ID с которого получено сообщение отправлчяем сообщение "тест"
// но главное здесь то что мы получили ID а дальше можем его сохранить
// и когда угодно слать на него что угодно, все что нам надо чтобы слать на него сообщения
// это только ID (message.Chat.Id)
idchatMy = message.Chat.Id;
// вот мы его запомнили и сообщения будем слать ему
}
}
offset = update.Id + 1;
}
}
}
catch (Exception ex)
{ Console.WriteLine("Соединение с интернетом не установлено"); }
}
catch (Telegram.Bot.Exceptions.ApiRequestException ex)
{
Console.WriteLine(ex.Message); // если ключ не подошел - пишем об этом в консоль отладки
}
}
public static void sendMsg(String txt)
{
Form1.botClient.SendTextMessageAsync(chatId: idchatMy, text: txt);
if (Form1.bw.IsBusy != true) // если не запущен
{
Form1.bw.RunWorkerAsync(); // запускаем
}
}
}
}

Таким образом, если запустить эту программу, потом из вашего телеграмма отправить /start то мы не только получим слов "тест" но и запомним ID пользователя, который отправил сообщение. И потом все сообщения будем отправлять ему. Разумеется до закрытия программы или получения нового сообщения /start от другого пользователя.

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

Пишите свои вопросы, подписывайтесь на мои статьи.

Надеюсь они будут Вам полезны