基于 .NET7.0 开发Telegram 机器人(入门)

时间:2023-01-24 18:03:48

Telegram(非正式简称TG、电报)是跨平台的即时通信软件,其客户端是*及开放源代码软件,但服务端是专有软件。用户可以相互交换加密与自毁消息,发送照片、视频等所有类型文件。官方提供手机版(Android、iOS、Windows Phone)、桌面版(Windows、macOS、Linux)和网页版[8]等多种平台客户端;同时官方开放应用程序接口(API),因此拥有许多第三方的客户端可供选择。2022年6月,Telegram推出了付费的Telegram Premium,标价4.99美元每月。订阅Telegram Premium后可以使用高级贴纸,频道中不会显示赞助广告,最多加入频道数量相较未订阅数量翻倍,更快的下载速度等额外功能。*

Telegram 机器人

在2015年6月,Telegram开放了机器人API,更在2017年5月支持了付款功能。机器人是Telegram上以程序运作的账号,可以回复人类的指令、消息,视开发者设置而异。另一种功能称为内联机器人,支持快速发送相关的GIF动图、图片,其来自网络、YouTube视频、*的文章,等等。*

电报机器人的功能非常强大,它几乎可以实现你想做的任何事情。开发者社区提供了多种机器人开发类库/框架,包括但不限于Python,Java,Go,Rust等。详情

本教程使用 .NET7.0

机器人申请

开发电报机器人首先要通过 @BotFather 申请一个机器人,按 @BotFather 的提示操作即可。网上也有很多机器人申请教程,可以自行搜索。申请后会有一个类似:1234567:4TT8bAc8GHUspu3ERYn-KGcvsvGB9u_n4ddy的 Token 要保存好,拥有这个 Token 就意味着拥有操作这个机器人的权限。注意,申请机器人的时会要求输入机器人的usernameusername必须以bot结尾,然后根据这个username可以搜索到我们创建的机器人。

创建项目

使用 vs2022 创建一个 ASP.NET CORE Web API 项目,选择.NET 7.0 框架。添加 NuGet 包:Install-Package Telegram.Bot

创建一个实现了 IHostedService 接口的类 TgBotHost,代码如下:

点击查看代码
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;

namespace TgBotDemo;

public class TgBotHost : IHostedService
{
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        var botClient = new TelegramBotClient("5430277375:AAGjk_oaoXCA755V018K******"); // 使用申请的 Token 创建机器人
        var receiverOptions = new ReceiverOptions
        {
            AllowedUpdates = Array.Empty<UpdateType>() // receive all update types
        };
        botClient.StartReceiving(
            updateHandler: HandleUpdateAsync,
            pollingErrorHandler: HandlePollingErrorAsync,
            receiverOptions: receiverOptions
        );
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }
    /// <summary>
    /// 消息处理方法
    /// </summary>
    /// <param name="botClient"></param>
    /// <param name="update"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
    {
        // 消息的类型有多种,最常见的是文本型 UpdateType.Message
        switch (update.Type)
        {
            case UpdateType.Unknown:
                break;
            case UpdateType.Message:
                Console.WriteLine(update.Message.Text); // 将受到的文本消息输出到控制台
                // 将收到的文本消息,发送至对话框
                await botClient.SendTextMessageAsync(
                        chatId: update.Message.Chat.Id,
                        text: $"_您输入的文本是:{update.Message.Text}_",
                        parseMode: ParseMode.MarkdownV2);
                break;
            case UpdateType.InlineQuery:
                break;
            case UpdateType.ChosenInlineResult:
                break;
            case UpdateType.CallbackQuery:
                break;
            case UpdateType.EditedMessage:
                break;
            case UpdateType.ChannelPost:
                break;
            case UpdateType.EditedChannelPost:
                break;
            case UpdateType.ShippingQuery:
                break;
            case UpdateType.PreCheckoutQuery:
                break;
            case UpdateType.Poll:
                break;
            case UpdateType.PollAnswer:
                break;
            case UpdateType.MyChatMember:
                break;
            case UpdateType.ChatMember:
                break;
            case UpdateType.ChatJoinRequest:
                break;
            default:
                break;
        }
    }

    /// <summary>
    /// 异常处理方法
    /// </summary>
    /// <param name="botClient"></param>
    /// <param name="exception"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task HandlePollingErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
    {
        var ErrorMessage = exception switch
        {
            ApiRequestException apiRequestException
                => $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
            _ => exception.ToString()
        };
        Console.WriteLine(ErrorMessage);
        return Task.CompletedTask;
    }
}

然后将TgBotHost添加到服务当中,Program.cs 的代码如下:

点击查看代码

namespace TgBotDemo;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddHostedService<TgBotHost>();

        var app = builder.Build();
        app.Run();
    }
}

打开launchsettings.json文件,将所有launchBrowser节点的值改为false,这样可以避免程序启动时运行浏览器。

接下来,运行程序。当前机器人的功能是,根据输入的文本内容,返回相应的文本。根据之前申请机器人时输入的username搜索到机器人,然后向机器人发送消息,结果如下图所示:

基于 .NET7.0 开发Telegram 机器人(入门)

至此,我们的机器人demo开发完成。