独立开发者的‘发电’秘籍:用Afdian.Sdk + Telegram Bot打造自动化赞助通知系统
2026/6/8 15:27:28 网站建设 项目流程

独立开发者的‘发电’秘籍:用Afdian.Sdk + Telegram Bot打造自动化赞助通知系统

在数字创作和开源项目的世界里,持续获得用户赞助是维持项目活力的关键。但很多独立开发者都会遇到这样的困境:赞助者付出了支持,却因为缺乏即时反馈机制,导致双方互动断裂。本文将带你用Afdian.SdkTelegram Bot搭建一个轻量级自动化系统,实时捕捉每一笔赞助,让创作者与支持者之间形成正向循环。

这个方案特别适合以下场景:

  • 个人开发者维护的开源项目
  • 技术博客或教程作者
  • 独立游戏开发者
  • 数字内容创作者

系统核心优势在于:

  • 完全自动化运行,无需人工干预
  • 即时通知,赞助到账秒级响应
  • 低成本部署,甚至可以在树莓派上运行
  • 高度可定制,能根据需求扩展功能

1. 系统架构设计

整套系统的数据流向非常清晰:当爱发电平台有新的赞助进入时,会通过Webhook触发我们的服务,经过处理后通过Telegram Bot推送到指定聊天。整个流程可以在500ms内完成。

核心组件交互图

[爱发电平台] → [Webhook] → [.NET处理服务] → [Telegram Bot API] → [开发者设备]

选择.NET作为后端技术栈主要考虑:

  • Afdian.Sdk原生支持.NET生态
  • 高性能和低资源占用
  • 跨平台部署能力
  • 丰富的库生态系统

2. 环境准备与基础配置

2.1 爱发电Webhook配置

首先需要在爱发电开发者后台启用Webhook功能:

  1. 登录爱发电开放平台
  2. 进入"应用管理"→"Webhook配置"
  3. 填写回调地址(暂留空,部署服务后补充)
  4. 生成并保存API Token

关键参数说明:

参数项示例值说明
用户ID5f9d7a...在个人中心可见
API Tokenafd03x...32位随机字符串
回调URLhttps://yourdomain.com/webhook需支持HTTPS

提示:本地开发时可使用ngrok等工具生成临时HTTPS地址进行测试

2.2 创建Telegram Bot

通过BotFather创建通知机器人:

/start /newbot 输入机器人名称(如:AfdianNotifier) 输入机器人用户名(必须以bot结尾,如AfdianNotifier_bot) 获取并保存API Token /setprivacy 设置为Disable以接收所有消息

记录两个关键信息:

  • Bot Token:123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
  • 接收通知的Chat ID(可通过发送消息给@userinfobot获取)

3. 核心服务实现

3.1 项目初始化

使用.NET CLI创建最小API项目:

dotnet new web -n AfdianNotifier cd AfdianNotifier dotnet add package Afdian.Sdk dotnet add package Telegram.Bot

基础项目结构:

AfdianNotifier/ ├── Program.cs # 主入口 ├── Models/ # 数据模型 │ └── Notification.cs ├── Services/ # 服务层 │ ├── AfdianService.cs │ └── TelegramService.cs └── appsettings.json # 配置文件

3.2 Webhook处理器实现

在Program.cs中设置端点:

var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton<AfdianService>(); builder.Services.AddSingleton<TelegramService>(); var app = builder.Build(); app.MapPost("/webhook", async (HttpContext context, AfdianService afdian) => { using var reader = new StreamReader(context.Request.Body); var json = await reader.ReadToEndAsync(); var isValid = afdian.VerifySignature(json, context.Request.Headers["x-afdian-sign"]); if (!isValid) return Results.Unauthorized(); var notification = afdian.ParseNotification(json); var telegram = context.RequestServices.GetRequiredService<TelegramService>(); await telegram.SendNotification(notification); return Results.Ok(); }); app.Run();

3.3 爱发电服务封装

AfdianService.cs核心逻辑:

public class AfdianService { private readonly AfdianClient _client; private readonly string _secret; public AfdianService(IConfiguration config) { _client = new AfdianClient( config["Afdian:UserId"], config["Afdian:Token"]); _secret = config["Afdian:Secret"]; } public bool VerifySignature(string rawData, string signature) { using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(_secret)); var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(rawData)); var computed = BitConverter.ToString(hash).Replace("-", "").ToLower(); return computed == signature; } public Notification ParseNotification(string json) { var data = JsonSerializer.Deserialize<AfdianWebhook>(json); return new Notification { Sponsor = data.Order.BuyerName, Amount = data.Order.TotalAmount, Message = data.Order.Remark, Time = DateTime.Parse(data.Order.CreateTime) }; } }

4. 进阶功能扩展

4.1 数据持久化分析

添加SQLite支持记录历史赞助:

// 在Program.cs中添加 builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlite("Data Source=sponsors.db")); // 新增数据模型 public class SponsorRecord { public int Id { get; set; } public string SponsorId { get; set; } public string Name { get; set; } public decimal Amount { get; set; } public DateTimeOffset Time { get; set; } public string Message { get; set; } } // 在通知处理时保存记录 var db = context.RequestServices.GetRequiredService<AppDbContext>(); db.SponsorRecords.Add(new SponsorRecord { SponsorId = notification.UserId, Name = notification.Sponsor, Amount = notification.Amount, Time = notification.Time, Message = notification.Message }); await db.SaveChangesAsync();

4.2 生成赞助周报

利用Hangfire定时任务生成周报:

// 每周一上午9点发送 RecurringJob.AddOrUpdate<TelegramService>("weekly-report", s => s.SendWeeklyReport(), "0 9 * * 1", TimeZoneInfo.Local); // 在TelegramService中添加 public async Task SendWeeklyReport() { var now = DateTime.Now; var start = now.AddDays(-7); var records = await _db.SponsorRecords .Where(x => x.Time >= start && x.Time <= now) .ToListAsync(); var total = records.Sum(x => x.Amount); var topSponsors = records .GroupBy(x => x.Name) .OrderByDescending(g => g.Sum(x => x.Amount)) .Take(3) .Select(g => $"{g.Key}: {g.Sum(x => x.Amount)}元"); var message = $"【赞助周报】\n" + $"时间: {start:yyyy-MM-dd} ~ {now:yyyy-MM-dd}\n" + $"总赞助: {total}元\n" + $"赞助次数: {records.Count}\n" + $"Top赞助者:\n{string.Join("\n", topSponsors)}"; await _botClient.SendTextMessageAsync(_chatId, message); }

5. 部署与优化建议

5.1 服务器部署选项

几种常见的部署方案对比:

方案成本难度适合场景
云函数简单轻量级使用
容器服务中等需要扩展性
虚拟机复杂已有基础设施
本地NAS中等24小时开机设备

推荐使用Azure Container Apps或AWS Lambda部署,月成本可控制在$5以内。

5.2 性能优化技巧

  1. 缓存爱发电用户信息:避免频繁API调用

    MemoryCacheEntryOptions options = new() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1) }; _cache.Set(userId, userInfo, options);
  2. 批量发送通知:当短时间内有多个赞助时合并发送

    var batch = new List<Notification>(); // 收集10秒内的通知 await _batchChannel.Reader.ReadAsync().AsTask() .WaitAsync(TimeSpan.FromSeconds(10)); // 合并发送
  3. 实现重试机制:处理网络波动

    var policy = Policy<Message> .Handle<Exception>() .WaitAndRetryAsync(3, retry => TimeSpan.FromSeconds(Math.Pow(2, retry)));

6. 故障排查与监控

建立健康检查端点:

app.MapGet("/health", () => { var status = new { Status = "Healthy", LastChecked = DateTime.UtcNow, Uptime = DateTime.UtcNow - Process.GetCurrentProcess().StartTime.ToUniversalTime() }; return Results.Json(status); });

关键监控指标建议:

  • Webhook接收成功率:应保持在99.9%以上
  • 通知延迟:从接收到发送的时延应<1s
  • API调用次数:避免达到爱发电接口限制

可以使用Application Insights或Prometheus收集这些指标:

builder.Services.AddApplicationInsightsTelemetry(); // 在关键位置记录指标 _telemetryClient.TrackMetric("NotificationDelay", delayMs); _telemetryClient.TrackEvent("SponsorReceived");

当系统运行一段时间后,可以考虑添加赞助者分级通知功能,比如对大额赞助者发送特别感谢信息,或者为长期赞助者提供专属更新频道。这些个性化互动能显著提升赞助者的参与感和忠诚度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询