Як створити Телеграм бота з допомогою WCF сервісу

Здрастуй, Хабр. Як-то з'явилася необхідність зробити бота-помічника, але з двома умовами — використовувати WCF сервіс та Телеграм. Так як довелося витратити достатню кількість часу на реалізацію, вирішив написати статтю, можливо комусь буде корисно.

Створити власного бота дуже просто — заходимо в телеграм, знаходимо спеціального бота @BotFather, пишемо йому команду /newbot і слідуємо його інструкціям, в результаті отримуємо токен нашого бота.

image

Тепер треба визначитися, яким чином ми будемо отримувати оновлення від бота. Telegram передбачає два способи — тягнути самим за допомогою методу getUpdates, або використовувати Webhook. З першим способом все зрозуміло, нам цікавіший другий варіант. Використовуючи метод setWebhook можна задати URL вебхука, тим самим ви як би повідомляєте серверів Telegram, куди вони повинні відправляти всі оновлення. У ролі вебхука як раз буде виступати наш WCF сервіс

Створимо новий проект «додаток служби WCF» і назвемо його «WcfBot». В документації Telegram сказано, що в оновленнях ми отримаємо об'єкт Update, сериализованный в JSON, тому створимо клас цього об'єкта в новому файлі. У цьому нам допоміг json2charp.

Update.cs
namespace WcfBot
{
public class From
{
public long id { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string username { get; set; }
}

public class Chat
{
public long id { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string username { get; set; }
}

public class ForwardFrom
{
public long id { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string username { get; set; }
}

public class Audio
{
public string file_id { get; set; }
public long duration { get; set; }
public string performer { get; set; }
public string title { get; set; }
public string mime_type { get; set; }
public long file_size { get; set; }
}

public class Thumb
{
public string file_id { get; set; }
public long width { get; set; }
public long height { get; set; }
public long file_size { get; set; }
}

public class Document
{
public string file_id { get; set; }
public Thumb thumb { get; set; }
public string file_name { get; set; }
public string mime_type { get; set; }
public long file_size { get; set; }
}

public class Photo
{
public string file_id { get; set; }
public long width { get; set; }
public long height { get; set; }
public long file_size { get; set; }
}

public class Sticker
{
public string file_id { get; set; }
public string width { get; set; }
public string height { get; set; }
public Thumb thumb { get; set; }
public long file_size { get; set; }
}

public class Video
{
public string file_id { get; set; }
public long width { get; set; }
public long height { get; set; }
public long duration { get; set; }
public Thumb thumb { get; set; }
public string mime_type { get; set; }
public long file_size { get; set; }
}

public class Voice
{
public string file_id { get; set; }
public long duration { get; set; }
public string mime_type { get; set; }
public long file_size { get; set; }
}

public class Contact
{
public string phone_number { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public long user_id { get; set; }
}

public class Location
{
public double longitude { get; set; }
public double latitude { get; set; }
}

public class NewChatParticipant
{
public long id { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string username { get; set; }
}

public class LeftChatParticipant
{
public long id { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public string username { get; set; }
}

public class NewChatPhoto
{
public string file_id { get; set; }
public long width { get; set; }
public long height { get; set; }
public long file_size { get; set; }
}

public class ReplyToMessage
{
public long message_id { get; set; }
public From from { get; set; }
public long date { get; set; }
public Чат chat { get; set; }
public ForwardFrom forward_from { get; set; }
public long forward_date { get; set; }
public object reply_to_message { get; set; }
public string text { get; set; }
public Audio audio { get; set; }
public Document document { get; set; }
public IList<Photo> photo { get; set; }
public Sticker sticker { get; set; }
public Video video { get; set; }
public Voice voice { get; set; }
public string caption { get; set; }
public Contact contact { get; set; }
public Location location { get; set; }
public NewChatParticipant new_chat_participant { get; set; }
public LeftChatParticipant left_chat_participant { get; set; }
public string new_chat_title { get; set; }
public IList<NewChatPhoto> new_chat_photo { get; set; }
public bool delete_chat_photo { get; set; }
public bool group_chat_created { get; set; }
}

public class Message
{
public long message_id { get; set; }
public From from { get; set; }
public long date { get; set; }
public Чат chat { get; set; }
public ForwardFrom forward_from { get; set; }
public long forward_date { get; set; }
public ReplyToMessage reply_to_message { get; set; }
public string text { get; set; }
public Audio audio { get; set; }
public Document document { get; set; }
public IList<Photo> photo { get; set; }
public Sticker sticker { get; set; }
public Video video { get; set; }
public Voice voice { get; set; }
public string caption { get; set; }
public Contact contact { get; set; }
public Location location { get; set; }
public NewChatParticipant new_chat_participant { get; set; }
public LeftChatParticipant left_chat_participant { get; set; }
public string new_chat_title { get; set; }
public IList<NewChatPhoto> new_chat_photo { get; set; }
public bool delete_chat_photo { get; set; }
public bool group_chat_created { get; set; }
}

public class Update
{
public long update_id { get; set; }
public Message message { get; set; }
}
}


Тепер відкриємо файл IService1.cs, в якому знаходиться інтерфейс IService1 з атрибутом ServiceContract — це є контракт служби. Додамо в нього операцію служби і до цієї операції допишемо атрибут WebInvoke, який визначає, на якій HTTP метод реагує операція служби, якого формату дані і отримує за яким URL звертатися до неї.

IService1.cs
namespace WcfBot
{
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = @"/Update")]
void GetUpdate(Update update);
}
}

Далі відкриємо файл Service1.svc.cs і допишемо реалізацію нашої операції в класі Service1.

Service1.svc.cs
namespace WcfBot
{
public class Service1 : IService1
{
public void GetUpdate(Update update)
{

}
}
}

Тепер нам потрібно надсилати відповідь на повідомлення від особи бота. В цьому нам допоможе бібліотека Telegram.Bot. Щоб її встановити, заходимо в консоль диспетчера пакетів (Сервіс -> Диспетчер пакетів NuGet -> Консоль диспетчера пакетів) і пишемо:

Install-Package Telegram.Bot
 

Тепер у методі ініціалізуємо об'єкт Telegram.Bot.Api, використовуючи наш token, який нам видали при створенні бота в телеграмі, і реалізуємо відповідь на повідомлення «Привіт».

Service1.svc.cs
namespace WcfBot
{
public class Service1 : IService1
{
public void GetUpdate(Update update)
{
var Bot = new Telegram.Bot.Api("<token>");
if(update.message.text == "Привіт")
{
Bot.SendTextMessage(update.message.chat.id "Привіт" + update.message.from.first_name);
}
}
}
}

Залишилося відредагувати файл конфігурації Web.config, додавши в behaviors:
<endpointBehaviors>
<behavior name="web">
<webHttp />
</behavior>
</endpointBehaviors>

і в system.serviceModel:
<services>
<service name="WcfBot.Service1">
<endpoint binding="webHttpBinding" contract="WcfBot.IService1" behaviorConfiguration="web"></endpoint>
</service>
</services>

Тепер можна тестувати. Запускаємо сервіс, заходимо в трей, знаходимо IIS Express, клацаємо правою кнопкою миші натискаємо «Показати всі програми», знаходимо свій сервіс, дивимося з якого порту він включився
image

Для того, щоб сервер телеграм мали доступ до вашого сервісу, потрібно розшарити localhost. Для цих цілей підійде ngrok.

Викачуємо ngrok, розпаковуємо, запускаємо ngrok.exe і вводимо команду:

ngrok http <b>1234</b> -host-header="localhost:<b>1234</b>
 

Замість 1234 — порт нашого сервісу.

В результаті ngrok видасть нам URL на наш сервіс.

image

Важливо скопіювати https-версію посилання, так як Telegram підтримує тільки захищений протокол HTTPS. Тепер залишилося лише сказати нашому боту адреса, куди надсилати повідомлення. Для цього в адресному рядку браузера вбиваємо посилання:

https://api.telegram.org/bot<b><token></b>/setWebhook?url=<b><url></b>/Service1.svc/Update
 

Все, тепер можна написати боту і переконатися, що він дійсно відповідає.

image

[ Джерело ]
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.