独立开发者的‘发电’秘籍用Afdian.Sdk Telegram Bot打造自动化赞助通知系统在数字创作和开源项目的世界里持续获得用户赞助是维持项目活力的关键。但很多独立开发者都会遇到这样的困境赞助者付出了支持却因为缺乏即时反馈机制导致双方互动断裂。本文将带你用Afdian.Sdk和Telegram Bot搭建一个轻量级自动化系统实时捕捉每一笔赞助让创作者与支持者之间形成正向循环。这个方案特别适合以下场景个人开发者维护的开源项目技术博客或教程作者独立游戏开发者数字内容创作者系统核心优势在于完全自动化运行无需人工干预即时通知赞助到账秒级响应低成本部署甚至可以在树莓派上运行高度可定制能根据需求扩展功能1. 系统架构设计整套系统的数据流向非常清晰当爱发电平台有新的赞助进入时会通过Webhook触发我们的服务经过处理后通过Telegram Bot推送到指定聊天。整个流程可以在500ms内完成。核心组件交互图[爱发电平台] → [Webhook] → [.NET处理服务] → [Telegram Bot API] → [开发者设备]选择.NET作为后端技术栈主要考虑Afdian.Sdk原生支持.NET生态高性能和低资源占用跨平台部署能力丰富的库生态系统2. 环境准备与基础配置2.1 爱发电Webhook配置首先需要在爱发电开发者后台启用Webhook功能登录爱发电开放平台进入应用管理→Webhook配置填写回调地址暂留空部署服务后补充生成并保存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 Token123456: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.AddSingletonAfdianService(); builder.Services.AddSingletonTelegramService(); 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.GetRequiredServiceTelegramService(); 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.DeserializeAfdianWebhook(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.AddDbContextAppDbContext(options options.UseSqlite(Data Sourcesponsors.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.GetRequiredServiceAppDbContext(); 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.AddOrUpdateTelegramService(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 性能优化技巧缓存爱发电用户信息避免频繁API调用MemoryCacheEntryOptions options new() { AbsoluteExpirationRelativeToNow TimeSpan.FromHours(1) }; _cache.Set(userId, userInfo, options);批量发送通知当短时间内有多个赞助时合并发送var batch new ListNotification(); // 收集10秒内的通知 await _batchChannel.Reader.ReadAsync().AsTask() .WaitAsync(TimeSpan.FromSeconds(10)); // 合并发送实现重试机制处理网络波动var policy PolicyMessage .HandleException() .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%以上通知延迟从接收到发送的时延应1sAPI调用次数避免达到爱发电接口限制可以使用Application Insights或Prometheus收集这些指标builder.Services.AddApplicationInsightsTelemetry(); // 在关键位置记录指标 _telemetryClient.TrackMetric(NotificationDelay, delayMs); _telemetryClient.TrackEvent(SponsorReceived);当系统运行一段时间后可以考虑添加赞助者分级通知功能比如对大额赞助者发送特别感谢信息或者为长期赞助者提供专属更新频道。这些个性化互动能显著提升赞助者的参与感和忠诚度。