C# 实现 B 站动态抽奖组件:bilibili-api 鉴权与自动参与实战

发布时间:2026/10/23 15:03:11

C# 实现 B 站动态抽奖组件:bilibili-api 鉴权与自动参与实战 简介BiliRaffle 是一款面向 C# 开发者与 B 站工具爱好者的动态抽奖组件基于 bilibili-api 与 bilibili-tool 生态构建用于在 B 站动态场景中实现抽奖逻辑的快速集成与二次开发。资源包共 32 个文件以 12 个 cs 源码文件与 4 个 xaml 界面文件为核心辅以 config、xml、dll、sln、csproj 等工程配置与依赖文件另有 png、ico、resx 等资源素材整体压缩包约 60KB结构紧凑、便于直接编译运行。项目采用 .NET Framework 4.5 及以上版本依赖项版本明确解压后运行 BiliRaffle.exe 即可启动登录窗口、主窗口与 ViewModel、Raffle 抽奖逻辑、Converter 转换器等模块划分清晰适合学习 MVVM 架构在桌面抽奖工具中的落地方式。目前已有 697 人学习下载可作为 B 站抽奖功能开发、C# 桌面应用练手与代码复用的参考素材。1. 抽奖动态刷到眼花聊聊这个 C# 写的 B 站动态抽奖组件刷到一条抽奖动态点进去发现要转发、要关注、要 好友一套操作下来三分钟没了。更别提有些账号一天发十几条抽奖手动参与根本不现实。BiliRaffle 就是冲着这个场景来的——一个用 C# 写的 B 站动态抽奖组件核心逻辑是调用 bilibili-api 完成动态的自动扫描、条件匹配和参与动作。它适合两类人一是想批量参与动态抽奖但不想写脚本的普通用户二是想拿它当 bilibili-tool 二次开发底座的开发者。整个项目围绕 bilibili-raffle 这个场景做了模块拆分不是那种一把梭的野路子脚本。下面从环境搭建到参数调优把我在实际拆解过程中摸到的门道摊开讲。2. 环境准备与 bilibili-api 鉴权链路从零把项目跑起来2.1 运行环境与依赖清单BiliRaffle 是 C# 项目跑起来之前得先把运行时和依赖理清楚。我一般会先确认三件事.NET 版本、NuGet 包还原情况、以及 bilibili-api 的引用方式。项目本身没有绑定特定 IDE用 Visual Studio 或者 Rider 都行命令行dotnet也能跑。组件建议版本说明.NET SDK6.0 或以上低于 6.0 部分异步 API 会报错bilibili-api 库以项目 csproj 引用为准核心鉴权与动态接口封装Newtonsoft.Json13.x部分响应解析依赖操作系统Windows / Linux / macOS跨平台可跑但 Cookie 路径写法有差异还原依赖的命令很直接# 进入项目根目录后执行 dotnet restore # 确认所有包都拉下来了没有报 NU1101 之类的错误 dotnet build --no-restoredotnet restore会根据 csproj 里的 PackageReference 去 NuGet 源拉包。如果公司网络有限制提前配好nuget.config里的镜像源。dotnet build --no-restore是验证还原结果最快的方式编译过了说明依赖链路没问题。这里有个细节如果 bilibili-api 是以子模块或本地 dll 形式引入的restore 不会报错但 build 会挂得手动检查引用路径。2.2 Cookie 与鉴权参数怎么填bilibili-api 的大部分动态接口都需要登录态BiliRaffle 也不例外。核心鉴权信息是 SESSDATA、bili_jct 和 DedeUserID 这三个 Cookie 字段。我一般从浏览器开发者工具里复制完整 Cookie 字符串然后按项目要求的格式拆进去。// 典型的鉴权配置写法字段名以项目实际定义为准 var cookieConfig new CookieConfig { SESSDATA 你的SESSDATA值, BiliJct 你的bili_jct值, DedeUserID 你的UID, // 部分接口还需要 buvid3建议一并带上 Buvid3 你的buvid3值 }; // 初始化 bilibili-api 客户端 var client new BilibiliClient(cookieConfig);SESSDATA 是身份凭证泄露等于账号被操作千万别提交到公开仓库。bili_jct 是 CSRF 校验用的参与抽奖这类写操作必须带。DedeUserID 就是你的 UID部分接口用它做用户维度校验。buvid3 是设备标识不带的话某些动态接口会返回风控错误。我一般会把这几个值放到本地appsettings.local.json里然后在.gitignore里排除掉避免手滑 push 上去。2.3 首次运行与最小验证配置填完之后别急着开抽奖模式。先跑一次只读的动态拉取确认鉴权链路通了。// 最小验证拉取自己关注流的第一页动态 var dynamics await client.GetDynamicFeedAsync(page: 1, pageSize: 10); foreach (var item in dynamics.Items) { Console.WriteLine($动态ID: {item.DynamicId}); Console.WriteLine($类型: {item.Type}); Console.WriteLine($是否含抽奖: {item.HasLottery}); }GetDynamicFeedAsync的 page 和 pageSize 控制分页pageSize 一般不超过 20再大容易被截断。HasLottery是项目封装的判断字段底层逻辑是扫描动态正文里的抽奖关键词和话题标签。如果这一步能正常打印出动态列表说明 Cookie 有效、bilibili-api 调用链没问题。如果返回空列表或者 403先检查 SESSDATA 是不是过期了再确认 buvid3 有没有带上。这一步过了后面才有得玩。3. 抽奖逻辑拆解动态扫描、条件匹配与参与动作3.1 动态扫描的轮询策略BiliRaffle 的扫描逻辑本质是定时轮询关注流或指定用户的动态列表。轮询间隔是个关键参数设太短容易触发风控设太长会漏掉短时间内的抽奖动态。我一般会把间隔设在 30 到 60 秒之间具体看关注列表的活跃度。// 轮询扫描配置 var scanOptions new ScanOptions { // 轮询间隔单位秒建议 30-60 IntervalSeconds 45, // 每次拉取的动态条数 PageSize 20, // 是否只扫描含抽奖关键词的动态 OnlyLottery true, // 扫描范围关注流 / 指定用户 Scope ScanScope.Following }; var scanner new DynamicScanner(client, scanOptions); await scanner.StartAsync();IntervalSeconds是核心参数45 秒是个比较稳的折中值。PageSize设 20 是因为 bilibili-api 单页返回上限大概在这个量级再大需要翻页。OnlyLottery打开后扫描器会先用关键词过滤一遍减少无效请求。Scope决定扫描范围Following 是关注流指定用户模式需要额外传 UID 列表。这里有个容易翻车的点轮询间隔如果低于 15 秒连续跑十几分钟大概率会收到风控提示轻则限流重则临时封禁接口权限。3.2 抽奖条件匹配关键词、话题与 好友扫到动态之后下一步是判断这条动态的参与条件。BiliRaffle 把条件拆成了几个维度关键词命中、话题标签匹配、是否需要 好友、是否要求关注。这些条件在配置里可以组合。// 抽奖条件配置 var matchRules new MatchRules { // 必须命中的关键词多个用逗号分隔 Keywords new[] { 抽奖, 转发, 福利 }, // 必须包含的话题标签 Topics new[] { #抽奖#, #转发抽奖# }, // 是否要求 好友 RequireAtFriend true, // 好友数量 AtFriendCount 1, // 是否要求已关注 RequireFollow true }; var matcher new LotteryMatcher(matchRules); var matched matcher.Match(dynamicItem);Keywords是或关系命中任意一个就算过。Topics同理。RequireAtFriend和AtFriendCount控制 好友的行为有些抽奖要求 一位好友有些要求 三位配置里得跟动态要求对齐否则参与了也不符合条件。RequireFollow打开后匹配器会先查一下你有没有关注发起者没关注的话要么自动关注要么跳过。我一般会把RequireFollow设为 true 并开启自动关注但自动关注有频率限制短时间内关注太多也会触发风控。3.3 参与动作的执行与重试匹配通过之后就是执行参与动作转发动态、 好友、附带话题。BiliRaffle 把这部分封装成了可重试的任务。// 执行参与动作 var action new ParticipateAction(client) { // 转发时附带的文案 RepostText 参与抽奖, // 是否自动 好友 AutoAtFriend true, // 失败重试次数 MaxRetries 3, // 重试间隔单位毫秒 RetryDelayMs 2000 }; var result await action.ExecuteAsync(matchedItem); if (result.Success) { Console.WriteLine($参与成功动态ID: {matchedItem.DynamicId}); } else { Console.WriteLine($参与失败: {result.ErrorMessage}); }RepostText是转发时带的文案有些抽奖要求特定文案配置里得对上。AutoAtFriend打开后会自动从好友列表里挑人 如果好友列表为空或者接口拿不到这一步会失败。MaxRetries设 3 次是经验值再多意义不大因为失败原因通常是风控或参数错误重试解决不了。RetryDelayMs设 2000 毫秒是给接口留缓冲太短容易连续触发限流。执行结果里的ErrorMessage会带上具体原因比如“频率限制”“已参与过”“条件不满足”排错时先看这个字段。4. 避坑与排查那些让我半夜爬起来改配置的坑4.1 现象扫描正常但参与全部失败返回 403原因SESSDATA 过期或者 bili_jct 缺失。bilibili-api 的读接口对鉴权要求松写接口要求严所以会出现“能扫不能抽”的情况。解决重新从浏览器拉一次完整 Cookie确认 SESSDATA、bili_jct、DedeUserID 三个字段都在。如果用的是本地配置文件检查有没有被.gitignore误伤导致没加载。4.2 现象轮询跑了一小时账号被限流接口返回“请求过于频繁”原因IntervalSeconds设得太短或者PageSize太大导致单次请求量过高。风控系统对高频请求的容忍度比想象中低。解决把间隔调到 45 秒以上PageSize降到 20 以内。如果已经被限流停跑半小时再试别硬刚。4.3 现象 好友失败提示“好友列表为空”原因bilibili-api 获取好友列表的接口需要额外权限或者当前账号没有互关好友。AutoAtFriend打开后拿不到人就会卡住。解决要么手动在配置里指定 的 UID 列表要么关掉AutoAtFriend改成手动填文案。我一般会在配置里留一个AtFriendUids数组兜底用。4.4 现象同一条动态被重复参与触发“已参与过”错误原因扫描器没有做去重轮询到同一条动态时重复执行了参与动作。DynamicId没有落库或者落内存缓存。解决在DynamicScanner里加一层已处理 ID 的缓存可以用HashSetstring存内存也可以落本地 SQLite。项目如果没内置去重自己补一个不复杂。4.5 现象转发成功但没带上话题标签抽奖资格无效原因RepostText里没有拼话题标签或者话题标签格式不对比如用了中文井号。解决确认RepostText里拼的是英文#加话题名比如#抽奖#。有些抽奖要求话题放在文案开头配置时得跟动态要求对齐。5. 进阶调优把参与成功率拉上去的几个参数技巧跑通基础流程之后真正影响成功率的是参数调优和策略选择。我一般会从三个维度下手扫描时机、条件匹配精度、以及参与动作的节奏控制。先说扫描时机。B 站抽奖动态的发布高峰集中在晚上八点到十一点这个时间段可以把IntervalSeconds适当调低到 30 秒其他时段放宽到 60 秒甚至 90 秒。BiliRaffle 本身没有内置分时段配置但可以在外层包一个定时任务按时间段切换ScanOptions。我一般会写一个简单的TimeBasedScanScheduler根据当前小时数返回不同的间隔值。// 分时段扫描间隔 public int GetIntervalByHour(int hour) { // 晚高峰加密扫描 if (hour 20 hour 23) return 30; // 白天常规扫描 if (hour 8 hour 19) return 45; // 凌晨放宽 return 90; }这个逻辑不复杂但效果明显。晚高峰抽奖动态密集30 秒间隔能多抓到不少凌晨动态少放宽间隔省请求也降风控风险。再说条件匹配精度。Keywords设太宽会匹配到一堆非抽奖动态浪费参与次数设太窄会漏掉变体写法。我的做法是维护一个关键词库把常见变体都收进去比如“抽奖”“抽”“福利”“转发”“白嫖”“送”这些。同时用Topics做二次过滤话题标签的准确率比正文关键词高。如果项目支持正则可以把Keywords换成正则表达式匹配能力更强。// 用正则做关键词匹配 var matchRules new MatchRules { KeywordPattern (抽奖|抽|福利|转发|白嫖|送), Topics new[] { #抽奖#, #转发抽奖# }, RequireAtFriend true, AtFriendCount 1 };正则的好处是能覆盖更多变体但要注意别写太宽比如单独一个“送”字会匹配到“送外卖”之类的无关动态。我一般会加上边界或者组合条件比如(抽奖|转发抽奖|福利抽)这种。最后是参与动作的节奏控制。MaxRetries和RetryDelayMs前面提过这里补充一个点如果连续多条动态参与失败别让程序继续硬跑加一个熔断逻辑。比如连续 5 次失败就暂停 10 分钟避免在风控边缘反复试探。// 简单熔断连续失败达到阈值就暂停 private int _consecutiveFailures 0; private const int FailureThreshold 5; public async Task ExecuteWithCircuitBreakerAsync(MatchedItem item) { if (_consecutiveFailures FailureThreshold) { Console.WriteLine(连续失败过多暂停10分钟); await Task.Delay(TimeSpan.FromMinutes(10)); _consecutiveFailures 0; } var result await action.ExecuteAsync(item); if (result.Success) _consecutiveFailures 0; else _consecutiveFailures; }这个熔断逻辑不复杂但能避免账号在风控边缘反复横跳。从那以后我每次跑抽奖脚本都强制走一遍熔断检查宁可少参与几条也别把账号搭进去。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/23 14:58:08

50M Linux虚拟机QEMU/KVM部署、网络与扩容避坑指南

简介:面向希望在Windows环境中零安装体验Linux的初学者、教学演示者与轻量测试用户,这套Qume迷你虚拟机把精简虚拟机程序与LiveCD系统映像打包在一起,解压后运行启动脚本即可进入图形桌面,不必安装也无需重启,适合快速…

2026/10/23 14:58:08

keepalived 1.2.13 编译安装与 VIP 漂移验证

简介:Keepalived 1.2.13 源码压缩包面向具备 Linux 基础的运维工程师、网络架构学习者以及需要构建高可用服务的技术人员,尤其适合初中级读者,围绕 VRRP 虚拟路由冗余与 LVS 负载均衡场景,提供源码研读与配置实践的基础素材。压缩…

2026/10/23 14:58:08

C# MES系统源码拆解:从工单下发到追溯闭环的落地经验

简介:一份基于C#的MES(制造执行系统)源码资料包,定位于.NET开发人员、工业信息化工程师及MES二次开发学习者。资料围绕C#实现MES的核心环节展开,涵盖三层架构、实体类数据模型、数据库访问、实时数据采集、工作流引擎、…

2026/10/23 16:04:09

50M Linux虚拟机Qume:冷启动、网络互通与瘦身避坑

简介:这份Qume绿色版Linux虚拟机合辑面向想在Windows环境中低成本体验Linux、做轻量系统实验的初学者与教学使用者,核心是免安装、解压即用的虚拟机方案,通过批处理入口快速启动内置的极简Linux LiveCD,解决传统虚拟机配置繁琐、占…

2026/10/23 16:04:09

AdminLTE 3.1.0 实战指南:从构建裁剪到避坑的完整流程

简介:AdminLTE-3.1.0 前端框架资源包,面向需要快速搭建后台管理界面的 Web 开发者与前端学习者,尤其适合希望基于 Bootstrap 构建响应式管理系统的初中级工程师。压缩包为 rar 格式,整体约 22.89MB,文件总数与类型明细…

2026/10/23 16:04:09

Tomcat 8+Java 7+ExtJS WebSocket 聊天室实现

简介:面向Java Web初学者与希望实践实时通信的开发者,这套源码工具包以Tomcat8、Java7和ExtJS为基础,实现了一个可运行的WebSocket聊天室,可用于理解JSR 356服务端端点、连接生命周期、消息广播及前端界面集成的完整链路&#xff…

2026/10/23 16:04:09

MFC哈夫曼压缩器源码解析:从建树到位流写入的完整实现

简介:这份资源是一个基于哈夫曼编码实现的文件压缩与解压工具,面向学习数据结构、算法课程设计或C桌面开发的学生与开发者,帮助理解哈夫曼树构造、编码生成及二进制文件读写的完整流程。压缩包共53个文件,约109.76MB,包…

2026/10/23 15:59:07

从正则到DFA:词法分析器构造、最长匹配与工程避坑

简介:这是一份面向高校编译原理课程学习者与编译器前端入门者的词法分析器实验包,围绕北京邮电大学课程实验场景,提供从词法规则定义到分词逻辑实现的练习素材,可用于理解扫描器如何将字符流切分为标识符、关键字、常量与运算符等…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑