You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET MVC中实现定时自动通过Telegram Bot API发消息的方案咨询

Hey Mahdi, 我来给你几个实用的方案,帮你在ASP.NET MVC里实现无需登录就能自动定时发Telegram消息的功能——毕竟你现在只能即时发送,定时这块确实需要找个靠谱的后台调度方式:

方案1:Windows任务计划程序(适合简单固定日期场景)

这是最省心的入门方案,不需要和Web应用绑定,完全独立运行:

  • 核心思路:把发送Telegram消息的逻辑抽成一个独立的控制台程序,然后用Windows自带的任务计划,在指定日期触发这个程序执行。
  • 操作步骤
    1. 新建一个.NET控制台项目,把你现有的Telegram发送代码迁移过去(记得用Telegram.Bot NuGet包)。
    2. 编写代码判断当前时间是否匹配你指定的发送日期,匹配就发送消息。
    3. 打开Windows任务计划程序,新建任务:设置触发时间为你指定的2018/03/23、2018/03/28这些日期,操作选择启动你编译好的控制台程序。
  • 代码示例
using Telegram.Bot;
using Telegram.Bot.Types.Enums;

var botToken = "你的Telegram Bot Token";
var channelId = "@你的频道用户名";
var messageContent = "这是定时推送的消息内容";

// 可以把这些日期存在配置文件里,方便修改
var scheduledDates = new List<DateTime>
{
    new DateTime(2018, 3, 23, 9, 0, 0), // 比如指定早上9点发送
    new DateTime(2018, 3, 28, 15, 30, 0),
    new DateTime(2018, 4, 5, 10, 0, 0)
};

var now = DateTime.Now;
// 匹配到当天且时分一致就发送
if (scheduledDates.Any(date => date.Date == now.Date && date.Hour == now.Hour && date.Minute == now.Minute))
{
    var botClient = new TelegramBotClient(botToken);
    await botClient.SendTextMessageAsync(
        chatId: channelId,
        text: messageContent,
        parseMode: ParseMode.MarkdownV2
    );
}
  • 优缺点
    • 优点:零学习成本,实现快,不依赖Web应用,资源占用极低。
    • 缺点:如果后续要动态修改发送时间或者添加复杂调度逻辑,维护起来比较麻烦。

方案2:Hangfire(适合Web应用内管理任务)

如果你希望在ASP.NET MVC应用内就能管理定时任务,Hangfire是个绝佳选择——它是.NET生态里成熟的后台任务调度库,支持持久化任务,即使Web应用重启也不会丢任务:

  • 核心思路:在你的MVC项目中集成Hangfire,用它来调度发送消息的任务,Hangfire的后台服务会在Web应用启动时自动运行,不需要用户登录。
  • 操作步骤
    1. 安装Hangfire NuGet包:Install-Package Hangfire
    2. Global.asax.csApplication_Start里配置Hangfire(用SQL Server存储任务,也可以用Redis):
  • 代码示例
using Hangfire;
using Telegram.Bot;
using Telegram.Bot.Types.Enums;

protected void Application_Start()
{
    // 配置Hangfire连接到你的数据库
    GlobalConfiguration.Configuration.UseSqlServerStorage("你的数据库连接字符串");
    
    // 启动Hangfire后台服务和管理面板(访问/hangfire可以查看任务状态)
    app.UseHangfireDashboard();
    app.UseHangfireServer();
    
    // 批量添加指定日期的定时任务
    var scheduledDates = new List<DateTime>
    {
        new DateTime(2018, 3, 23, 9, 0, 0),
        new DateTime(2018, 3, 28, 15, 30, 0),
        new DateTime(2018, 4, 5, 10, 0, 0)
    };
    
    foreach (var sendTime in scheduledDates)
    {
        BackgroundJob.Schedule(() => SendTelegramMessage(), sendTime);
    }
}

// 封装发送消息的方法
private void SendTelegramMessage()
{
    var botClient = new TelegramBotClient("你的Bot Token");
    var channelId = "@你的频道用户名";
    
    botClient.SendTextMessageAsync(
        chatId: channelId,
        text: "这是Hangfire调度的定时消息",
        parseMode: ParseMode.MarkdownV2
    ).Wait();
}
  • 注意事项:要确保你的Web应用所在的IIS应用池设置了“自动启动”,避免服务器重启后应用没启动导致任务不执行。
  • 优缺点
    • 优点:支持动态添加/修改任务,有可视化管理面板,任务持久化,适合需要在Web应用内管理调度的场景。
    • 缺点:依赖Web应用的运行环境,如果应用池回收,需要等应用重启后Hangfire才会继续执行任务。

方案3:Windows服务(适合长期稳定运行的后台任务)

如果需要最高的稳定性,完全脱离Web应用的依赖,Windows服务是最优解——它会随系统启动自动运行,不受Web应用状态影响:

  • 核心思路:创建一个Windows服务项目,在服务内部用调度库(比如Quartz.NET)来管理定时任务,到点就触发Telegram消息发送。
  • 操作步骤
    1. 新建一个Windows服务项目(.NET Framework直接创建,.NET Core可以用Worker Service然后部署成Windows服务)。
    2. 安装Quartz.NET NuGet包:Install-Package Quartz
    3. 编写任务逻辑和调度配置,在服务启动时初始化任务。
  • 代码示例
using Quartz;
using Quartz.Impl;
using Telegram.Bot;
using Telegram.Bot.Types.Enums;

// 定义发送消息的任务
public class TelegramSendJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        var botClient = new TelegramBotClient("你的Bot Token");
        await botClient.SendTextMessageAsync(
            chatId: "@你的频道用户名",
            text: "这是Windows服务推送的定时消息",
            parseMode: ParseMode.MarkdownV2
        );
    }
}

// 在服务的OnStart方法中配置调度
protected override void OnStart(string[] args)
{
    var schedulerFactory = new StdSchedulerFactory();
    var scheduler = schedulerFactory.GetScheduler().Result;
    scheduler.Start();
    
    var scheduledDates = new List<DateTime>
    {
        new DateTime(2018, 3, 23, 9, 0, 0),
        new DateTime(2018, 3, 28, 15, 30, 0),
        new DateTime(2018, 4, 5, 10, 0, 0)
    };
    
    foreach (var sendTime in scheduledDates)
    {
        // 创建任务
        var job = JobBuilder.Create<TelegramSendJob>().Build();
        // 创建触发器,指定触发时间
        var trigger = TriggerBuilder.Create()
            .StartAt(sendTime)
            .Build();
        // 绑定任务和触发器到调度器
        scheduler.ScheduleJob(job, trigger).Wait();
    }
}

protected override void OnStop()
{
    // 服务停止时停止调度器
    var schedulerFactory = new StdSchedulerFactory();
    var scheduler = schedulerFactory.GetScheduler().Result;
    scheduler.Shutdown().Wait();
}
  • 部署注意:编译后用installutil命令或者PowerShell安装Windows服务,需要管理员权限。
  • 优缺点
    • 优点:完全独立,稳定性极高,随系统启动,不受Web应用池回收、服务器重启影响。
    • 缺点:开发和部署相对复杂,需要服务器管理员权限。

方案选择建议

  • 如果你只是一次性的几个固定日期发送,选Windows任务计划最省事;
  • 如果你需要在Web应用内管理任务、动态调整调度,选Hangfire
  • 如果你需要长期稳定运行,不依赖Web应用,选Windows服务

内容的提问来源于stack exchange,提问作者Mahdi

火山引擎 最新活动