From 3387cc45d1e89d1c8da7820cb4dcfb9e069341d8 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Wed, 28 Feb 2024 23:20:58 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E8=B4=AD=E9=A1=B5=E9=9D=A2=E4=B8=8E=E8=A7=82?= =?UTF-8?q?=E7=9C=8B=E6=AD=A3=E7=89=87=E5=86=85=E5=AE=B9=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20(#641)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 实现浏览会员购页面 * 实现浏览正片内容的功能 * 观看正片任务运行两次以获取全部大积分 * 更新文档 * 修复专栏投币中导致提前结束的逻辑错误 * 修改大积分中相关api调用的错误 * 修复错误 * 修复专栏投币出现权限不足的问题 * 恢复默认配置 --- docs/configuration.md | 31 ++ .../Article/SearchArticlesByUpIdFullFto.cs | 12 +- .../Dtos/UploadVideoHeartbeatRequest.cs | 9 + .../Dtos/Video/GetBangumiBySsidResponse.cs | 45 +++ .../Dtos/ViewMall/ViewvipMallRequest.cs | 7 + .../BiliBiliAgent/Interfaces/IVideoApi.cs | 11 +- .../Interfaces/IVipBigPointApi.cs | 18 +- .../BiliBiliAgent/Interfaces/IVipMallApi.cs | 13 + .../Extensions/ServiceCollectionExtension.cs | 1 + .../IVipBigPointAppService.cs | 4 + ....BiliBiliTool.Application.Contracts.csproj | 4 + .../DailyTaskAppService.cs | 3 - .../VipBigPointAppService.cs | 271 +++++++++++++++--- .../Extensions/ServiceCollectionExtension.cs | 1 + .../Options/VipBigPointOptions.cs | 28 ++ src/Ray.BiliBiliTool.Console/appsettings.json | 3 +- .../ArticleDomainService.cs | 44 +-- test/AppServiceTest/VipServiceTest.cs | 11 + test/BiliAgentTest/VideoApiTest.cs | 15 +- test/BiliAgentTest/VipApiTest.cs | 48 ++++ 20 files changed, 509 insertions(+), 70 deletions(-) create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/GetBangumiBySsidResponse.cs create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/ViewMall/ViewvipMallRequest.cs create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs create mode 100644 src/Ray.BiliBiliTool.Config/Options/VipBigPointOptions.cs diff --git a/docs/configuration.md b/docs/configuration.md index 31b9f0116..1c72fe6fe 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -31,6 +31,7 @@ - [3.3.8. 每月几号自动领取会员权益](#338-每月几号自动领取会员权益) - [3.3.9. 每月几号进行直播中心银瓜子兑换硬币](#339-每月几号进行直播中心银瓜子兑换硬币) - [3.3.10. Lv6后开启硬币白嫖模式](#3310-lv6后开启硬币白嫖模式) + - [3.3.11. 是否开启专栏投币](#3311-是否开启专栏投币) - [3.4. 天选时刻抽奖相关](#34-天选时刻抽奖相关) - [3.4.1. 根据关键字排除奖品](#341-根据关键字排除奖品) - [3.4.2. 根据关键字指定奖品](#342-根据关键字指定奖品) @@ -75,6 +76,8 @@ - [3.7.3. 定时任务相关](#373-定时任务相关) - [3.7.4. 定时任务](#374-定时任务) - [3.7.5. Crontab](#375-crontab) + - [3.8. 大积分相关](#38-大积分相关) + - [3.8.1. 自定义观看番剧](#381-自定义观看番剧) @@ -314,6 +317,8 @@ export Ray_Serilog__WriteTo__9__Args__token="abcde" #### 3.3.1. 是否开启观看视频任务 +当该配置被设置为`false`时会导致大积分任务中的签到领额外10点经验的任务不能自动完成。 + | TITLE | CONTENT | | ---------- | -------------- | | 配置Key | `DailyTaskConfig:IsWatchVideo` | @@ -437,6 +442,18 @@ export Ray_Serilog__WriteTo__9__Args__token="abcde" | 环境变量 | `Ray_DailyTaskConfig__SaveCoinsWhenLv6` | | GitHub Secrets | | + +#### 3.3.11. 是否开启专栏投币 + +| TITLE | CONTENT | +| ---------- | -------------- | +| 配置Key | `DailyTaskConfig:IsDonateCoinForArticle` | +| 值域 | [true,false]| +| 默认值 | false | +| 环境变量 | `Ray_DailyTaskConfig__IsDonateCoinForArticle` | +| GitHub Secrets | | + + ### 3.4. 天选时刻抽奖相关 @@ -896,3 +913,17 @@ environment: 0 15 * * * dotnet /app/Ray.BiliBiliTool.Console.dll --runTasks=Daily >> /var/log/cron.log 0 22 * * * dotnet /app/Ray.BiliBiliTool.Console.dll --runTasks=LiveLottery >> /var/log/cron.log ``` + + +### 3.8. 大积分相关 + + +#### 3.8.1. 自定义观看番剧 + +| TITLE | CONTENT | +| ---------- | -------------- | +| 配置Key | `VipBigPointConfig:ViewBangumis` | +| 值域 | 番剧的ssid(season_id) | +| 默认值 | `33378`(名侦探柯南) | +| 环境变量 | `Ray_VipBigPointConfig__ViewBangumis` | +| GitHub Secrets | | diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs index e4cae3b9b..8d646ffbd 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs @@ -2,13 +2,17 @@ public class SearchArticlesByUpIdDto { - public long Mid { get; set; } + public long mid { get; set; } - public int Pn { get; set; } = 1; + public int pn { get; set; } = 1; - public int Ps { get; set; } = 30; + public int ps { get; set; } = 12; - public string Sort { get; set; } = "publish_time"; + public string sort { get; set; } = "publish_time"; + + public long web_location { get; set; } = 1550101; + + public string platform { get; set; } = "web"; } public class SearchArticlesByUpIdFullDto : SearchArticlesByUpIdDto diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UploadVideoHeartbeatRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UploadVideoHeartbeatRequest.cs index a8b50b652..0612801c1 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UploadVideoHeartbeatRequest.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UploadVideoHeartbeatRequest.cs @@ -17,6 +17,10 @@ public class UploadVideoHeartbeatRequest public string Bvid { get; set; } + public long? Epid { get; set; } + + public long? Sid { get; set; } + /// /// 当前用户UID /// @@ -49,6 +53,11 @@ public class UploadVideoHeartbeatRequest /// public int Type { get; set; } = 3; + /// + /// 剧集副类型 + /// + public int? Sub_type { get; set; } + /// /// 2 /// diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/GetBangumiBySsidResponse.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/GetBangumiBySsidResponse.cs new file mode 100644 index 000000000..b59c58c7a --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/GetBangumiBySsidResponse.cs @@ -0,0 +1,45 @@ +using static System.Collections.Specialized.BitVector32; +using System.Collections.Generic; +using System.Diagnostics; +using System.Xml.Linq; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video; + +public class GetBangumiBySsidResponse +{ + public int Code { get; set; } = int.MinValue; + + public string Message { get; set; } + + public Result Result { get; set; } +} + +public class Result +{ + public List episodes { get; set; } +} + + +public class Episode +{ + public int aid { get; set; } + + public string bvid { get; set; } + + public int cid { get; set; } + + public int duration { get; set; } + + public int ep_id { get; set; } + + public int id { get; set; } + + public string long_title { get; set; } + + public string share_copy { get; set; } + + public int status { get; set; } + + + +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/ViewMall/ViewvipMallRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/ViewMall/ViewvipMallRequest.cs new file mode 100644 index 000000000..186351056 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/ViewMall/ViewvipMallRequest.cs @@ -0,0 +1,7 @@ +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall; + +public class ViewVipMallRequest +{ + public string Csrf { get; set; } + public string EventId { get; set; } = "hevent_oy4b7h3epeb"; +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs index 3c19f92f3..7f4093496 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs @@ -73,7 +73,16 @@ public interface IVideoApi : IBiliBiliApi //[HttpGet("/x/space/wbi/arc/search?mid={upId}&ps={pageSize}&tid=0&pn={pageNumber}&keyword={keyword}&order=pubdate&platform=web&web_location=1550101&order_avoided=true&w_rid=5df06b1c48e2be86a96e9d0f99bf06f4&wts=1684854929")] [HttpGet("/x/space/wbi/arc/search")] Task> SearchVideosByUpId([PathQuery] SearchVideosByUpIdFullDto request); - + + /// + /// 通过ssid获取番剧的具体信息 + /// + /// + /// + [HttpGet("/pgc/view/web/season?season_id={ssid}")] + Task GetBangumiBySsid(long ssid); + + } /// diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs index f83122d74..d1743803c 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs @@ -12,31 +12,45 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces /// 大会员大积分 /// [Header("Host", "api.bilibili.com")] - [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [LogFilter] public interface IVipBigPointApi { + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] + [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpGet("/x/vip_point/task/combine")] Task> GetTaskList(); + + [Header("Referer", "https://www.bilibili.com")] [HttpPost("/pgc/activity/score/task/sign")] Task Sign([FormContent] SignRequest request); + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] + [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpPost("/pgc/activity/score/task/receive")] Task Receive([JsonContent] ReceiveOrCompleteTaskRequest request); + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] + [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpPost("/pgc/activity/score/task/complete")] Task Complete([JsonContent] ReceiveOrCompleteTaskRequest request); + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] + [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpPost("/pgc/activity/deliver/task/complete")] Task ViewComplete([FormContent] ViewRequest request); + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] + [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpGet("/x/vip/privilege/my")] Task> GetVouchersInfo(); + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] + [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [Header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")] [HttpPost("/x/vip/experience/add")] Task GetVipExperience([FormContent] VipExperienceRequest request); + + } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs new file mode 100644 index 000000000..f5f2d5933 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs @@ -0,0 +1,13 @@ +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using System.Threading.Tasks; +using WebApiClientCore.Attributes; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; + +[Header("Host", "show.bilibili.com")] +public interface IVipMallApi +{ + [HttpPost("/api/activity/fire/common/event/dispatch")] + Task ViewVipMall([JsonContent] ViewVipMallRequest request); +} diff --git a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs index 92b8831c4..3ace74915 100644 --- a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs +++ b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs @@ -75,6 +75,7 @@ public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection se // 添加注入 services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("https://show.bilibili.com"); //qinglong var qinglongHost = configuration["QL_URL"] ?? "http://localhost:5600"; diff --git a/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs index f78097ef3..db57c0539 100644 --- a/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using System.Text; using System.Threading.Tasks; +using Ray.BiliBiliTool.DomainService.Dtos; namespace Ray.BiliBiliTool.Application.Contracts { @@ -14,5 +15,8 @@ namespace Ray.BiliBiliTool.Application.Contracts public interface IVipBigPointAppService : IAppService { Task VipExpress(); + Task WatchBangumi(); } + + } diff --git a/src/Ray.BiliBiliTool.Application.Contracts/Ray.BiliBiliTool.Application.Contracts.csproj b/src/Ray.BiliBiliTool.Application.Contracts/Ray.BiliBiliTool.Application.Contracts.csproj index 3f9985f28..90b5e4c9b 100644 --- a/src/Ray.BiliBiliTool.Application.Contracts/Ray.BiliBiliTool.Application.Contracts.csproj +++ b/src/Ray.BiliBiliTool.Application.Contracts/Ray.BiliBiliTool.Application.Contracts.csproj @@ -8,4 +8,8 @@ + + + + diff --git a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs index db2ee02f9..f7e6ccc84 100644 --- a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs @@ -95,9 +95,6 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) await ReceiveVipPrivilege(userInfo); await ReceiveMangaVipReward(userInfo); - //TODO 大会员领经验 - - await Charge(userInfo); } diff --git a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs index 7d3d038ee..d8de26c41 100644 --- a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs @@ -4,12 +4,17 @@ using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Ray.BiliBiliTool.Agent; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; +using Ray.BiliBiliTool.Config.Options; +using Ray.BiliBiliTool.DomainService.Dtos; using Ray.BiliBiliTool.DomainService.Interfaces; namespace Ray.BiliBiliTool.Application @@ -23,6 +28,9 @@ public class VipBigPointAppService : AppService, IVipBigPointAppService private readonly IVideoDomainService _videoDomainService; private readonly IAccountDomainService _accountDomainService; private readonly BiliCookie _biliCookie; + private readonly IVipMallApi _vipMallApi; + private readonly IVideoApi _videoApi; + private readonly VipBigPointOptions _vipBigPointOptions; public VipBigPointAppService( IConfiguration configuration, @@ -30,7 +38,11 @@ public VipBigPointAppService( IVipBigPointApi vipApi, IAccountDomainService loginDomainService, IVideoDomainService videoDomainService, - BiliCookie biliCookie, IAccountDomainService accountDomainService) + BiliCookie biliCookie, + IAccountDomainService accountDomainService, + IVipMallApi vipMallApi, + IVideoApi videoApi, + IOptionsMonitor vipBigPointOptions) { _configuration = configuration; _logger = logger; @@ -39,6 +51,9 @@ public VipBigPointAppService( _videoDomainService = videoDomainService; _biliCookie = biliCookie; _accountDomainService = accountDomainService; + _vipMallApi = vipMallApi; + _videoApi = videoApi; + _vipBigPointOptions = vipBigPointOptions.CurrentValue; } public async Task VipExpress() @@ -92,8 +107,6 @@ public async Task VipExpress() [TaskInterceptor("大会员大积分", TaskLevel.One)] public override async Task DoTaskAsync(CancellationToken cancellationToken) { - await VipExpress(); - // TODO 解决taskInfo在一个任务出错后,后续的任务均会报空引用错误 var ui = await GetUserInfo(); @@ -110,6 +123,8 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) VipTaskInfo taskInfo = re.Data; taskInfo.LogInfo(_logger); + await VipExpress(); + //签到 taskInfo = await Sign(taskInfo); @@ -128,11 +143,16 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) // taskInfo = await ViewFilmChannel(taskInfo); //浏览会员购页面10秒 - taskInfo = ViewVipMall(taskInfo); + taskInfo = await ViewVipMall(taskInfo); + + //浏览装扮商城 + taskInfo = await ViewDressMall(taskInfo); //观看任意正片内容 taskInfo = await ViewVideo(taskInfo); + + //领取购买任务 taskInfo = await BuyVipVideo(taskInfo); // taskInfo = await BuyVipProduct(taskInfo); @@ -284,7 +304,7 @@ private async Task ViewAnimate(VipTaskInfo info) _logger.LogInformation("开始领取任务"); await TryReceive(targetTask.task_code); } - + _logger.LogInformation("开始完成任务"); var re = await CompleteView(code); @@ -309,11 +329,9 @@ CommonTaskItem GetTarget(VipTaskInfo info) return info; } - [TaskInterceptor("浏览影视频道页10秒", TaskLevel.Two, false)] - private async Task ViewFilmChannel(VipTaskInfo info) + [TaskInterceptor("浏览会员购页面10秒", TaskLevel.Two, false)] + private async Task ViewVipMall(VipTaskInfo info) { - var code = "tv_channel"; - CommonTaskItem targetTask = GetTarget(info); //如果状态不等于3,则做 @@ -331,10 +349,14 @@ private async Task ViewFilmChannel(VipTaskInfo info) } _logger.LogInformation("开始完成任务"); - var re = await CompleteView(code); + var re = await _vipMallApi.ViewVipMall(new ViewVipMallRequest() + { + Csrf = _biliCookie.BiliJct + }); + if (re.Code != 0) throw new Exception(re.ToJsonStr()); //确认 - if (re) + if (re.Code == 0) { var infoResult = await _vipApi.GetTaskList(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); @@ -348,17 +370,8 @@ CommonTaskItem GetTarget(VipTaskInfo info) { return info.Task_info.Modules.First(x => x.module_title == "日常任务") .common_task_item - .First(x => x.task_code == "filmtab"); + .First(x => x.task_code == "vipmallview"); } - - return info; - } - - [TaskInterceptor("浏览会员购页面10秒", TaskLevel.Two, false)] - private VipTaskInfo ViewVipMall(VipTaskInfo info) - { - //todo - _logger.LogInformation("待实现..."); return info; } @@ -367,12 +380,12 @@ private async Task ViewVideo(VipTaskInfo info) { CommonTaskItem targetTask = GetTarget(info); - //如果状态不等于3,则做 - if (targetTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } + // 如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); + return info; + } //0需要领取 if (targetTask.state == 0) @@ -382,7 +395,16 @@ private async Task ViewVideo(VipTaskInfo info) } _logger.LogInformation("开始完成任务"); - _logger.LogInformation("待开发...");//todo + _logger.LogInformation("观看第一个正片内容"); + + await WatchBangumi(); + + _logger.LogInformation("观看第二个正片内容"); + + //等待40s + await Task.Delay(TimeSpan.FromSeconds(40)); + + await WatchBangumi(); CommonTaskItem GetTarget(VipTaskInfo info) { @@ -423,8 +445,8 @@ CommonTaskItem GetTarget(VipTaskInfo info) } } - [TaskInterceptor("购买指定大会员产品(仅领取)", TaskLevel.Two, false)] - private async Task BuyVipProduct(VipTaskInfo info) + [TaskInterceptor("购买指定会员购商品(仅领取)", TaskLevel.Two, false)] + private async Task BuyVipMall(VipTaskInfo info) { CommonTaskItem targetTask = GetTarget(info); @@ -448,19 +470,21 @@ CommonTaskItem GetTarget(VipTaskInfo info) { return info.Task_info.Modules.First(x => x.module_title == "日常任务") .common_task_item - .First(x => x.task_code == "subscribe"); + .First(x => x.task_code == "vipmallbuy"); } } - [TaskInterceptor("购买指定会员购商品(仅领取)", TaskLevel.Two, false)] - private async Task BuyVipMall(VipTaskInfo info) + [TaskInterceptor("浏览装扮商城主页", TaskLevel.Two, false)] + private async Task ViewDressMall(VipTaskInfo info) { + var code = "dress-view"; + CommonTaskItem targetTask = GetTarget(info); - if (targetTask.state is 3 or 1) + //如果状态不等于3,则做 + if (targetTask.state == 3) { - var re = targetTask.state == 1 ? "已领取" : "已完成"; - _logger.LogInformation("{re},跳过", re); + _logger.LogInformation("已完成,跳过"); return info; } @@ -471,16 +495,31 @@ private async Task BuyVipMall(VipTaskInfo info) await TryReceive(targetTask.task_code); } - return info; + _logger.LogInformation("开始完成任务"); + var re = await Complete(code); + + //确认 + if (re) + { + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; + targetTask = GetTarget(info); + + _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); + } CommonTaskItem GetTarget(VipTaskInfo info) { return info.Task_info.Modules.First(x => x.module_title == "日常任务") .common_task_item - .First(x => x.task_code == "vipmallbuy"); + .First(x => x.task_code == "dress-view"); } + + return info; } + /// /// 领取任务 /// @@ -539,5 +578,161 @@ private async Task CompleteView(string code) return false; } } + + public async Task WatchBangumi() + { + if (_vipBigPointOptions.ViewBangumiList == null ||_vipBigPointOptions.ViewBangumiList.Count == 0) + return false; + + long randomSsid = _vipBigPointOptions.ViewBangumiList[new Random().Next(0,_vipBigPointOptions.ViewBangumiList.Count)]; + + var res = await GetBangumi(randomSsid); + if (res is null) + { + return false; + } + + var videoInfo = res.Value.Item1; + + // 随机播放时间 + int playedTime = new Random().Next(905, 1800); + // 观看该视频 + var request = new UploadVideoHeartbeatRequest() + { + Aid = long.Parse(videoInfo.Aid), + Bvid = videoInfo.Bvid, + Cid = videoInfo.Cid, + Mid = long.Parse(_biliCookie.UserId), + Sid = randomSsid, + Epid = res.Value.Item2, + Csrf = _biliCookie.BiliJct, + Type = 4, + Sub_type = 1, + Start_ts = DateTime.Now.ToTimeStamp() - playedTime, + Played_time = playedTime, + Realtime = playedTime, + Real_played_time = playedTime + }; + BiliApiResponse apiResponse = await _videoApi.UploadVideoHeartbeat(request); + if (apiResponse.Code == 0) + { + return true; + } + + return false; + } + + /// + /// 从自定义的番剧ssid中选择其中的一部中的一集 + /// + /// 番剧ssid + /// + private async Task<(VideoInfoDto,long)?> GetBangumi(long randomSsid) + { + try + { + if (randomSsid is 0 or long.MinValue) + return null; + var bangumiInfo = await _videoApi.GetBangumiBySsid(randomSsid); + + // 从获取的剧集中随机获得其中的一集 + + var bangumi = bangumiInfo.Result.episodes[new Random().Next(0, bangumiInfo.Result.episodes.Count)]; + var videoInfo = new VideoInfoDto() + { + Bvid = bangumi.bvid, + Aid = bangumi.aid.ToString(), + Cid = bangumi.cid, + Copyright = 1, + Duration = bangumi.duration, + Title = bangumi.share_copy + }; + _logger.LogInformation("本次播放的正片为:{title}",bangumi.share_copy); + return (videoInfo, bangumi.ep_id); + } + catch (Exception e) + { + _logger.LogError(e.Message); + } + return null; + } + #region deprecated + [TaskInterceptor("浏览影视频道页10秒", TaskLevel.Two, false)] + private async Task ViewFilmChannel(VipTaskInfo info) + { + var code = "tv_channel"; + + CommonTaskItem targetTask = GetTarget(info); + + //如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); + return info; + } + + //0需要领取 + if (targetTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); + } + + _logger.LogInformation("开始完成任务"); + var re = await CompleteView(code); + + //确认 + if (re) + { + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; + targetTask = GetTarget(info); + + _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); + } + + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "filmtab"); + } + + return info; + } + + [TaskInterceptor("购买指定大会员产品(仅领取)", TaskLevel.Two, false)] + private async Task BuyVipProduct(VipTaskInfo info) + { + CommonTaskItem targetTask = GetTarget(info); + + if (targetTask.state is 3 or 1) + { + var re = targetTask.state == 1 ? "已领取" : "已完成"; + _logger.LogInformation("{re},跳过", re); + return info; + } + + //0需要领取 + if (targetTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); + } + + return info; + + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "subscribe"); + } + } + + + #endregion + } } diff --git a/src/Ray.BiliBiliTool.Config/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Config/Extensions/ServiceCollectionExtension.cs index 5ba063782..ddd953779 100644 --- a/src/Ray.BiliBiliTool.Config/Extensions/ServiceCollectionExtension.cs +++ b/src/Ray.BiliBiliTool.Config/Extensions/ServiceCollectionExtension.cs @@ -23,6 +23,7 @@ public static IServiceCollection AddBiliBiliConfigs(this IServiceCollection serv .Configure(configuration.GetSection("DailyTaskConfig")) .Configure(configuration.GetSection("LiveLotteryTaskConfig")) .Configure(configuration.GetSection("UnfollowBatchedTaskConfig")) + .Configure(configuration.GetSection("VipBigPointConfig")) .Configure(configuration.GetSection("Security")) .Configure(configuration.GetSection("ReceiveVipPrivilegeConfig")) .Configure(configuration.GetSection("LiveFansMedalTaskOptions")) diff --git a/src/Ray.BiliBiliTool.Config/Options/VipBigPointOptions.cs b/src/Ray.BiliBiliTool.Config/Options/VipBigPointOptions.cs new file mode 100644 index 000000000..ff142ab9a --- /dev/null +++ b/src/Ray.BiliBiliTool.Config/Options/VipBigPointOptions.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace Ray.BiliBiliTool.Config.Options; + +public class VipBigPointOptions +{ + public string ViewBangumis { get; set; } + + public List ViewBangumiList + { + get + { + List re = new(); + if (string.IsNullOrWhiteSpace(ViewBangumis) | ViewBangumis == "-1") + return re; + + string[] array = ViewBangumis.Split(','); + foreach (string item in array) + { + if (long.TryParse(item.Trim(), out long upId)) + re.Add(upId); + else + re.Add(long.MinValue); + } + return re; + } + } +} diff --git a/src/Ray.BiliBiliTool.Console/appsettings.json b/src/Ray.BiliBiliTool.Console/appsettings.json index d92fc1e05..d0af4e8e2 100644 --- a/src/Ray.BiliBiliTool.Console/appsettings.json +++ b/src/Ray.BiliBiliTool.Console/appsettings.json @@ -38,7 +38,8 @@ }, "VipBigPointConfig": { - "Cron": "7 1 * * *" + "Cron": "7 1 * * *", + "ViewBangumis": "33378" // 自定义番剧的ssid,若不清楚含义请勿修改(默认为名侦探柯南) }, "LiveFansMedalTaskConfig": { diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index bda778dba..2ff253492 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -54,7 +54,6 @@ public ArticleDomainService( } - public async Task LikeArticle(long cvid) { await _articleApi.Like(cvid, _biliCookie.BiliJct); @@ -66,7 +65,6 @@ public async Task LikeArticle(long cvid) /// public async Task AddCoinForArticles() { - var donateCoinsCounts = await CalculateDonateCoinsCounts(); if (donateCoinsCounts == 0) @@ -84,11 +82,17 @@ public async Task AddCoinForArticles() _logger.LogDebug("开始尝试第{num}次", i); var upId = GetUpFromConfigUps(); + if (upId == 0) + { + _logger.LogDebug("未能成功选择支持的Up主"); + continue; + } + // 当upId不符合时,会直接报错,需要将两者的判断分隔开 var cvid = await GetRandomArticleFromUp(upId); - if (upId == 0 || cvid == 0) + if (cvid == 0) { - _logger.LogInformation("未添加支持的Up主,任务跳过"); - return false; + _logger.LogDebug("第{num}次尝试,未能成功选择合适的专栏",i); + continue; } if (await AddCoinForArticle(cvid, upId)) @@ -97,12 +101,11 @@ public async Task AddCoinForArticles() if (_dailyTaskOptions.SelectLike) { await LikeArticle(cvid); - _logger.LogInformation("文章点赞成功"); + _logger.LogInformation("专栏点赞成功"); } + success++; } - - } if (success == donateCoinsCounts) @@ -112,14 +115,14 @@ public async Task AddCoinForArticles() _logger.LogInformation("投币尝试超过10次,已终止"); return false; } - + _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0); return true; } - + /// /// 给某一篇专栏投币 /// @@ -176,17 +179,17 @@ private async Task GetRandomArticleFromUp(long mid) var req = new SearchArticlesByUpIdDto() { - Mid = mid, - Ps = 1, - Pn = new Random().Next(1, articleCount + 1) + mid = mid, + ps = 1, + pn = new Random().Next(1, articleCount + 1) }; var w_ridDto = await _wbiDomainService.GetWridAsync(req); var fullDto = new SearchArticlesByUpIdFullDto() { - Mid = mid, - Ps = req.Ps, - Pn = req.Pn, + mid = mid, + ps = req.ps, + pn = req.pn, w_rid = w_ridDto.w_rid, wts = w_ridDto.wts }; @@ -200,7 +203,7 @@ private async Task GetRandomArticleFromUp(long mid) ArticleInfo articleInfo = re.Data.Articles.FirstOrDefault(); - _logger.LogDebug("获取到的专栏{cvid}({title})", articleInfo.Id, articleInfo.Title); + _logger.LogInformation("获取到的专栏{cvid}({title})", articleInfo.Id, articleInfo.Title); // 检查是否可投 if (!await IsCanDonate(articleInfo.Id)) @@ -236,7 +239,8 @@ private long GetUpFromConfigUps() _logger.LogDebug("不能为自己投币"); return 0; } - _logger.LogDebug("挑选出的up主为{UpId}",randomUpId); + + _logger.LogDebug("挑选出的up主为{UpId}", randomUpId); return randomUpId; } catch (Exception e) @@ -257,14 +261,14 @@ private async Task GetArticleCountOfUp(long mid) { var req = new SearchArticlesByUpIdDto() { - Mid = mid + mid = mid }; var w_ridDto = await _wbiDomainService.GetWridAsync(req); var fullDto = new SearchArticlesByUpIdFullDto() { - Mid = mid, + mid = mid, w_rid = w_ridDto.w_rid, wts = w_ridDto.wts }; diff --git a/test/AppServiceTest/VipServiceTest.cs b/test/AppServiceTest/VipServiceTest.cs index f50bafe0d..437ed4260 100644 --- a/test/AppServiceTest/VipServiceTest.cs +++ b/test/AppServiceTest/VipServiceTest.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Ray.BiliBiliTool.Application.Contracts; +using Ray.BiliBiliTool.DomainService.Dtos; using Ray.BiliBiliTool.Infrastructure; namespace AppServiceTest; @@ -18,4 +19,14 @@ public async Task VipExpressTest() var appService = scope.ServiceProvider.GetRequiredService(); await appService.VipExpress(); } + + [Fact] + public async Task WatchVideo() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var appService = scope.ServiceProvider.GetRequiredService(); + var res = await appService.WatchBangumi(); + Assert.True(res); + + } } diff --git a/test/BiliAgentTest/VideoApiTest.cs b/test/BiliAgentTest/VideoApiTest.cs index 7ee21588c..bb4248e33 100644 --- a/test/BiliAgentTest/VideoApiTest.cs +++ b/test/BiliAgentTest/VideoApiTest.cs @@ -17,7 +17,7 @@ public class VideoApiTest { public VideoApiTest() { - Program.CreateHost(new[] { "--ENVIRONMENT=Development" });//ĬPrdָΪDev󣬿Զȡû + Program.CreateHost(new[] { "--ENVIRONMENT=Development" });//Ĭ��Prd����������ָ��ΪDev�󣬿��Զ�ȡ���û��������� } [Fact] @@ -40,5 +40,18 @@ public void GetLiveWalletStatus_Normal_Success() Assert.False(re.Code != 0); } } + + [Fact] + public async Task GetBangumiTest() + { + + using var scope = Global.ServiceProviderRoot.CreateScope(); + + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + var req = await api.GetBangumiBySsid(46508); + + Assert.Equal(0,req.Code); + } } } diff --git a/test/BiliAgentTest/VipApiTest.cs b/test/BiliAgentTest/VipApiTest.cs index 3e540a0a2..793fa0531 100644 --- a/test/BiliAgentTest/VipApiTest.cs +++ b/test/BiliAgentTest/VipApiTest.cs @@ -7,6 +7,9 @@ using Ray.BiliBiliTool.Infrastructure; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; using Xunit.Abstractions; +using System; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall; + namespace BiliAgentTest; public class VipApiTest @@ -18,6 +21,22 @@ public VipApiTest(ITestOutputHelper output) Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); } + [Fact] + public async Task SignTaskTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + + var re = await api.Sign(new SignRequest() + { + // Csrf = ck.BiliJct + }); + _output.WriteLine(re.ToJsonStr()); + Assert.Equal(0, re.Code); + } + [Fact] public async Task VipInfoTest() { @@ -56,4 +75,33 @@ public async Task GetVipExperienceTest() _output.WriteLine(re.Message); } + + [Fact] + public async Task ViewVipMallTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + // var test = await api.ViewvipMall("{\r\n\"csrf\":\"33e5d4564b6b69cb4ed829bc404158cb\",\r\n\"eventId\":\"hevent_oy4b7h3epeb\"\r\n}"); + var re = await api.ViewVipMall(new ViewVipMallRequest() + { + Csrf = ck.BiliJct, + EventId = "hevent_oy4b7h3epeb" + }); + _output.WriteLine(re.Message); + + } + + [Fact] + public async Task DressViewTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + var re = await api.Complete(new ReceiveOrCompleteTaskRequest( + "dress-view")); + _output.WriteLine(re.Message); + } } From 9e217f72bb2f2860b2753002c9af479a517ac1ce Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sun, 21 Apr 2024 03:35:56 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=A4=A7=E7=A7=AF=E5=88=86=E5=8A=9F=E8=83=BD=20(#685)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 根据api进行修改,等待测试 * 待实现:观看剧集内容 --- .../Interfaces/IVipBigPointApi.cs | 28 +- .../VipBigPointAppService.cs | 1072 ++++++++--------- test/AppServiceTest/VipServiceTest.cs | 22 +- 3 files changed, 537 insertions(+), 585 deletions(-) diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs index d1743803c..3e762e179 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.Attributes; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; @@ -12,45 +10,49 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces /// 大会员大积分 /// [Header("Host", "api.bilibili.com")] + [Header("User-Agent", + "Mozilla/5.0 (Linux; Android 9; SM-N9700 Build/PQ3A.190605.04081832; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Safari/537.36 Mobile os/android model/SM-N9700 build/7300400 osVer/9 sdkInt/28 network/2 BiliApp/7300400 mobi_app/android channel/alifenfa Buvid/XY77D6C72ECDC63147110C5C8D1DA34D38CD1 sessionID/9795ed5c innerVer/7300400 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 7.30.0 os/android model/SM-N9700 mobi_app/android build/7300400 channel/alifenfa innerVer/7300400 osVer/9 network/2")] [LogFilter] public interface IVipBigPointApi { [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpGet("/x/vip_point/task/combine")] Task> GetTaskList(); - + [Header("Referer", "https://www.bilibili.com")] [HttpPost("/pgc/activity/score/task/sign")] Task Sign([FormContent] SignRequest request); [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpPost("/pgc/activity/score/task/receive")] Task Receive([JsonContent] ReceiveOrCompleteTaskRequest request); [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] + [HttpPost("/pgc/activity/score/task/receive/v2")] + Task ReceiveV2([FormContent] ReceiveOrCompleteTaskRequest request); + + + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpPost("/pgc/activity/score/task/complete")] Task Complete([JsonContent] ReceiveOrCompleteTaskRequest request); [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] + [HttpPost("/pgc/activity/score/task/complete/v2")] + Task CompleteV2([FormContent] ReceiveOrCompleteTaskRequest request); + + + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpPost("/pgc/activity/deliver/task/complete")] Task ViewComplete([FormContent] ViewRequest request); [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] [HttpGet("/x/vip/privilege/my")] Task> GetVouchersInfo(); [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - [Header("User-Agent", "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 os/android model/MuMu build/6720300 osVer/6.0.1 sdkInt/23 network/2 BiliApp/6720300 mobi_app/android channel/html5_search_baidu Buvid/XZFC135F5263B6897C8A4BE7AEB125BBF10F8 sessionID/72d3f4c9 innerVer/6720310 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 6.72.0 os/android model/MuMu mobi_app/android build/6720300 channel/html5_search_baidu innerVer/6720310 osVer/6.0.1 network/2")] - [Header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")] + // [Header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")] [HttpPost("/x/vip/experience/add")] Task GetVipExperience([FormContent] VipExperienceRequest request); - - } } diff --git a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs index d8de26c41..6d4f63c81 100644 --- a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs @@ -17,722 +17,652 @@ using Ray.BiliBiliTool.DomainService.Dtos; using Ray.BiliBiliTool.DomainService.Interfaces; -namespace Ray.BiliBiliTool.Application +namespace Ray.BiliBiliTool.Application; + +public class VipBigPointAppService : AppService, IVipBigPointAppService { - public class VipBigPointAppService : AppService, IVipBigPointAppService + private readonly ILogger _logger; + private readonly IConfiguration _configuration; + private readonly IVipBigPointApi _vipApi; + private readonly IAccountDomainService _loginDomainService; + private readonly IVideoDomainService _videoDomainService; + private readonly IAccountDomainService _accountDomainService; + private readonly BiliCookie _biliCookie; + private readonly IVipMallApi _vipMallApi; + private readonly IVideoApi _videoApi; + private readonly VipBigPointOptions _vipBigPointOptions; + + public VipBigPointAppService( + IConfiguration configuration, + ILogger logger, + IVipBigPointApi vipApi, + IAccountDomainService loginDomainService, + IVideoDomainService videoDomainService, + BiliCookie biliCookie, + IAccountDomainService accountDomainService, + IVipMallApi vipMallApi, + IVideoApi videoApi, + IOptionsMonitor vipBigPointOptions) { - private readonly ILogger _logger; - private readonly IConfiguration _configuration; - private readonly IVipBigPointApi _vipApi; - private readonly IAccountDomainService _loginDomainService; - private readonly IVideoDomainService _videoDomainService; - private readonly IAccountDomainService _accountDomainService; - private readonly BiliCookie _biliCookie; - private readonly IVipMallApi _vipMallApi; - private readonly IVideoApi _videoApi; - private readonly VipBigPointOptions _vipBigPointOptions; - - public VipBigPointAppService( - IConfiguration configuration, - ILogger logger, - IVipBigPointApi vipApi, - IAccountDomainService loginDomainService, - IVideoDomainService videoDomainService, - BiliCookie biliCookie, - IAccountDomainService accountDomainService, - IVipMallApi vipMallApi, - IVideoApi videoApi, - IOptionsMonitor vipBigPointOptions) - { - _configuration = configuration; - _logger = logger; - _vipApi = vipApi; - _loginDomainService = loginDomainService; - _videoDomainService = videoDomainService; - _biliCookie = biliCookie; - _accountDomainService = accountDomainService; - _vipMallApi = vipMallApi; - _videoApi = videoApi; - _vipBigPointOptions = vipBigPointOptions.CurrentValue; - } - - public async Task VipExpress() - { - _logger.LogInformation("大会员经验领取任务开始"); - var re = await _vipApi.GetVouchersInfo(); - if (re.Code == 0) - { - var state = re.Data.List.Find(x => x.Type == 9).State; - - switch (state) - { - case 2: - _logger.LogInformation("大会员经验观看任务未完成"); - _logger.LogInformation("开始观看视频"); - // 观看视频,暂时没有好办法解决,先这样使着 - DailyTaskInfo dailyTaskInfo = await _accountDomainService.GetDailyTaskStatus(); - await _videoDomainService.WatchAndShareVideo(dailyTaskInfo); - // 跳转到未兑换,执行兑换任务 - goto case 0; - - case 1: - _logger.LogInformation("大会员经验已兑换"); - break; + _configuration = configuration; + _logger = logger; + _vipApi = vipApi; + _loginDomainService = loginDomainService; + _videoDomainService = videoDomainService; + _biliCookie = biliCookie; + _accountDomainService = accountDomainService; + _vipMallApi = vipMallApi; + _videoApi = videoApi; + _vipBigPointOptions = vipBigPointOptions.CurrentValue; + } - case 0: - _logger.LogInformation("大会员经验未兑换"); - //兑换api - var response = await _vipApi.GetVipExperience(new VipExperienceRequest() - { - csrf = _biliCookie.BiliJct - }); - if (response.Code != 0) - { - _logger.LogInformation("大会员经验领取失败,错误信息:{message}", response.Message); - break; - } - _logger.LogInformation("领取成功,经验+10 √"); + /// + /// 领取大会员专属经验包 + /// + public async Task VipExpress() + { + _logger.LogInformation("大会员经验领取任务开始"); + var re = await _vipApi.GetVouchersInfo(); + if (re.Code == 0) + { + var state = re.Data.List.Find(x => x.Type == 9).State; + + switch (state) + { + case 2: + _logger.LogInformation("大会员经验观看任务未完成"); + _logger.LogInformation("开始观看视频"); + // 观看视频,暂时没有好办法解决,先这样使着 + DailyTaskInfo dailyTaskInfo = await _accountDomainService.GetDailyTaskStatus(); + await _videoDomainService.WatchAndShareVideo(dailyTaskInfo); + // 跳转到未兑换,执行兑换任务 + goto case 0; + + case 1: + _logger.LogInformation("大会员经验已兑换"); + break; + + case 0: + _logger.LogInformation("大会员经验未兑换"); + //兑换api + var response = await _vipApi.GetVipExperience(new VipExperienceRequest() + { + csrf = _biliCookie.BiliJct + }); + if (response.Code != 0) + { + _logger.LogInformation("大会员经验领取失败,错误信息:{message}", response.Message); break; + } - default: - _logger.LogDebug("大会员经验领取失败,未知错误"); - break; - } + _logger.LogInformation("领取成功,经验+10 √"); + break; + default: + _logger.LogDebug("大会员经验领取失败,未知错误"); + break; } - } + } - [TaskInterceptor("大会员大积分", TaskLevel.One)] - public override async Task DoTaskAsync(CancellationToken cancellationToken) - { - // TODO 解决taskInfo在一个任务出错后,后续的任务均会报空引用错误 - var ui = await GetUserInfo(); + [TaskInterceptor("大会员大积分", TaskLevel.One)] + public override async Task DoTaskAsync(CancellationToken cancellationToken) + { + // TODO 解决taskInfo在一个任务出错后,后续的任务均会报空引用错误 + var ui = await GetUserInfo(); - if (ui.GetVipType() == VipType.None) - { - _logger.LogInformation("当前不是大会员或已过期,跳过任务"); - return; - } + if (ui.GetVipType() == VipType.None) + { + _logger.LogInformation("当前不是大会员或已过期,跳过任务"); + return; + } - var re = await _vipApi.GetTaskList(); + var re = await _vipApi.GetTaskList(); - if (re.Code != 0) throw new Exception(re.ToJsonStr()); + if (re.Code != 0) throw new Exception(re.ToJsonStr()); - VipTaskInfo taskInfo = re.Data; - taskInfo.LogInfo(_logger); + VipTaskInfo taskInfo = re.Data; + taskInfo.LogInfo(_logger); - await VipExpress(); + await VipExpress(); - //签到 - taskInfo = await Sign(taskInfo); + //签到 + taskInfo = await Sign(taskInfo); - //福利任务 - taskInfo = await Bonus(taskInfo); + //福利任务 + taskInfo = await Bonus(taskInfo); - //体验任务 - taskInfo = await Privilege(taskInfo); + //体验任务 + taskInfo = await Privilege(taskInfo); - //日常任务 + //日常任务 - //浏览追番频道页10秒 - taskInfo = await ViewAnimate(taskInfo); + //浏览追番频道页10秒 + taskInfo = await ViewAnimate(taskInfo); - //浏览影视频道页10秒 - // taskInfo = await ViewFilmChannel(taskInfo); + //浏览会员购页面10秒 + taskInfo = await ViewVipMall(taskInfo); - //浏览会员购页面10秒 - taskInfo = await ViewVipMall(taskInfo); + //浏览装扮商城 + taskInfo = await ViewDressMall(taskInfo); - //浏览装扮商城 - taskInfo = await ViewDressMall(taskInfo); + //观看剧集内容 + taskInfo = await ViewVideo(taskInfo); - //观看任意正片内容 - taskInfo = await ViewVideo(taskInfo); + //领取购买任务 + taskInfo = await BuyVipVideo(taskInfo); + taskInfo = await BuyVipMall(taskInfo); - + taskInfo.LogInfo(_logger); + } - //领取购买任务 - taskInfo = await BuyVipVideo(taskInfo); - // taskInfo = await BuyVipProduct(taskInfo); - taskInfo = await BuyVipMall(taskInfo); - - taskInfo.LogInfo(_logger); + [TaskInterceptor("测试Cookie")] + private async Task GetUserInfo() + { + UserInfo userInfo = await _loginDomainService.LoginByCookie(); + if (userInfo == null) throw new Exception("登录失败,请检查Cookie"); //终止流程 - - } + return userInfo; + } - [TaskInterceptor("测试Cookie")] - private async Task GetUserInfo() + [TaskInterceptor("签到", TaskLevel.Two, false)] + private async Task Sign(VipTaskInfo info) + { + if (info.Task_info.Sing_task_item.IsTodaySigned) { - UserInfo userInfo = await _loginDomainService.LoginByCookie(); - if (userInfo == null) throw new Exception("登录失败,请检查Cookie");//终止流程 - - return userInfo; + _logger.LogInformation("已完成,跳过"); + _logger.LogInformation("今日获得签到积分:{score}", info.Task_info.Sing_task_item.TodayHistory?.Score); + _logger.LogInformation("累计签到{count}天", info.Task_info.Sing_task_item.Count); + return info; } - [TaskInterceptor("签到", TaskLevel.Two, false)] - private async Task Sign(VipTaskInfo info) - { - if (info.Task_info.Sing_task_item.IsTodaySigned) - { - _logger.LogInformation("已完成,跳过"); - _logger.LogInformation("今日获得签到积分:{score}", info.Task_info.Sing_task_item.TodayHistory?.Score); - _logger.LogInformation("累计签到{count}天", info.Task_info.Sing_task_item.Count); - return info; - } + var re = await _vipApi.Sign(new SignRequest()); + if (re.Code != 0) throw new Exception(re.ToJsonStr()); - var re = await _vipApi.Sign(new SignRequest()); - if (re.Code != 0) throw new Exception(re.ToJsonStr()); + //确认 + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; - //确认 - var infoResult = await _vipApi.GetTaskList(); - if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); - info = infoResult.Data; + _logger.LogInformation("今日可获得签到积分:{score}", info.Task_info.Sing_task_item.TodayHistory?.Score); + _logger.LogInformation(info.Task_info.Sing_task_item.IsTodaySigned ? "签到成功" : "签到失败"); + _logger.LogInformation("累计签到{count}天", info.Task_info.Sing_task_item.Count); - _logger.LogInformation("今日可获得签到积分:{score}", info.Task_info.Sing_task_item.TodayHistory?.Score); - _logger.LogInformation(info.Task_info.Sing_task_item.IsTodaySigned ? "签到成功" : "签到失败"); - _logger.LogInformation("累计签到{count}天", info.Task_info.Sing_task_item.Count); + return info; + } + + [TaskInterceptor("福利任务", TaskLevel.Two, false)] + private async Task Bonus(VipTaskInfo info) + { + var bonusTask = GetTarget(info); + //如果状态不等于3,则做 + if (bonusTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); return info; } - [TaskInterceptor("福利任务", TaskLevel.Two, false)] - private async Task Bonus(VipTaskInfo info) + //0需要领取 + if (bonusTask.state == 0) { - var bonusTask = GetTarget(info); + _logger.LogInformation("开始领取任务"); + await TryReceive(bonusTask.task_code); + } - //如果状态不等于3,则做 - if (bonusTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } + _logger.LogInformation("开始完成任务"); + var re = await Complete(bonusTask.task_code); - //0需要领取 - if (bonusTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(bonusTask.task_code); - } + //确认 + if (re) + { + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; + bonusTask = GetTarget(info); - _logger.LogInformation("开始完成任务"); - var re = await Complete(bonusTask.task_code); + _logger.LogInformation("确认:{re}", bonusTask.state == 3 && bonusTask.complete_times >= 1); + } - //确认 - if (re) - { - var infoResult = await _vipApi.GetTaskList(); - if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); - info = infoResult.Data; - bonusTask = GetTarget(info); + return info; - _logger.LogInformation("确认:{re}", bonusTask.state == 3 && bonusTask.complete_times >= 1); - } + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "福利任务") + .common_task_item + .First(x => x.task_code == "bonus"); + } + } - return info; + [TaskInterceptor("体验任务", TaskLevel.Two, false)] + private async Task Privilege(VipTaskInfo info) + { + var privilegeTask = GetTarget(info); - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "福利任务") - .common_task_item - .First(x => x.task_code == "bonus"); - } + //如果状态不等于3,则做 + if (privilegeTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); + return info; } - [TaskInterceptor("体验任务", TaskLevel.Two, false)] - private async Task Privilege(VipTaskInfo info) + //0需要领取 + if (privilegeTask.state == 0) { - var privilegeTask = GetTarget(info); + _logger.LogInformation("开始领取任务"); + await TryReceive(privilegeTask.task_code); + } - //如果状态不等于3,则做 - if (privilegeTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } + _logger.LogInformation("开始完成任务"); + var re = await Complete(privilegeTask.task_code); - //0需要领取 - if (privilegeTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(privilegeTask.task_code); - } + //确认 + if (re) + { + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; + privilegeTask = GetTarget(info); - _logger.LogInformation("开始完成任务"); - var re = await Complete(privilegeTask.task_code); + _logger.LogInformation("确认:{re}", privilegeTask.state == 3 && privilegeTask.complete_times >= 1); + } - //确认 - if (re) - { - var infoResult = await _vipApi.GetTaskList(); - if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); - info = infoResult.Data; - privilegeTask = GetTarget(info); + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "体验任务") + .common_task_item + .First(x => x.task_code == "privilege"); + } - _logger.LogInformation("确认:{re}", privilegeTask.state == 3 && privilegeTask.complete_times >= 1); - } + return info; + } - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "体验任务") - .common_task_item - .First(x => x.task_code == "privilege"); - } + [TaskInterceptor("浏览追番频道页10秒", TaskLevel.Two, false)] + private async Task ViewAnimate(VipTaskInfo info) + { + var code = "jp_channel"; + CommonTaskItem targetTask = GetTarget(info); + + //如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); return info; } - [TaskInterceptor("浏览追番频道页10秒", TaskLevel.Two, false)] - private async Task ViewAnimate(VipTaskInfo info) + //0需要领取 + if (targetTask.state == 0) { - var code = "jp_channel"; + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); + } - CommonTaskItem targetTask = GetTarget(info); + _logger.LogInformation("开始完成任务"); + var re = await CompleteView(code); - //如果状态不等于3,则做 - if (targetTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } + //确认 + if (re) + { + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; + targetTask = GetTarget(info); - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } - - _logger.LogInformation("开始完成任务"); - var re = await CompleteView(code); + _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); + } - //确认 - if (re) - { - var infoResult = await _vipApi.GetTaskList(); - if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); - info = infoResult.Data; - targetTask = GetTarget(info); + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "animatetab"); + } - _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); - } + return info; + } - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "animatetab"); - } + [TaskInterceptor("浏览会员购页面10秒", TaskLevel.Two, false)] + private async Task ViewVipMall(VipTaskInfo info) + { + CommonTaskItem targetTask = GetTarget(info); + //如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); return info; } - [TaskInterceptor("浏览会员购页面10秒", TaskLevel.Two, false)] - private async Task ViewVipMall(VipTaskInfo info) + //0需要领取 + if (targetTask.state == 0) { - CommonTaskItem targetTask = GetTarget(info); + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); + } - //如果状态不等于3,则做 - if (targetTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } + _logger.LogInformation("开始完成任务"); + var re = await _vipMallApi.ViewVipMall(new ViewVipMallRequest() + { + Csrf = _biliCookie.BiliJct + }); + if (re.Code != 0) throw new Exception(re.ToJsonStr()); - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } + //确认 + if (re.Code == 0) + { + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; + targetTask = GetTarget(info); - _logger.LogInformation("开始完成任务"); - var re = await _vipMallApi.ViewVipMall(new ViewVipMallRequest() - { - Csrf = _biliCookie.BiliJct - }); - if (re.Code != 0) throw new Exception(re.ToJsonStr()); + _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); + } - //确认 - if (re.Code == 0) - { - var infoResult = await _vipApi.GetTaskList(); - if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); - info = infoResult.Data; - targetTask = GetTarget(info); + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "vipmallview"); + } - _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); - } + return info; + } - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "vipmallview"); - } + [TaskInterceptor("观看剧集内容", TaskLevel.Two, false)] + private async Task ViewVideo(VipTaskInfo info) + { + CommonTaskItem targetTask = GetTarget(info); + + // 如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); return info; } - [TaskInterceptor("观看任意正片内容", TaskLevel.Two, false)] - private async Task ViewVideo(VipTaskInfo info) + //0需要领取 + if (targetTask.state == 0) { - CommonTaskItem targetTask = GetTarget(info); - - // 如果状态不等于3,则做 - if (targetTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } - - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } - - _logger.LogInformation("开始完成任务"); - _logger.LogInformation("观看第一个正片内容"); + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); + } - await WatchBangumi(); + _logger.LogInformation("开始完成任务"); - _logger.LogInformation("观看第二个正片内容"); + // 观看剧集内容 + _logger.LogInformation("api变更,暂未实现"); - //等待40s - await Task.Delay(TimeSpan.FromSeconds(40)); + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "ogvwatchnew"); + } - await WatchBangumi(); + return info; + } - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "ogvwatch"); - } + [TaskInterceptor("购买单点付费影片(仅领取)", TaskLevel.Two, false)] + private async Task BuyVipVideo(VipTaskInfo info) + { + CommonTaskItem targetTask = GetTarget(info); + if (targetTask.state is 3 or 1) + { + var re = targetTask.state == 1 ? "已领取" : "已完成"; + _logger.LogInformation("{re},跳过", re); return info; } - [TaskInterceptor("购买单点付费影片(仅领取)", TaskLevel.Two, false)] - private async Task BuyVipVideo(VipTaskInfo info) + //0需要领取 + if (targetTask.state == 0) { - CommonTaskItem targetTask = GetTarget(info); - - if (targetTask.state is 3 or 1) - { - var re = targetTask.state == 1 ? "已领取" : "已完成"; - _logger.LogInformation("{re},跳过", re); - return info; - } - - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } - - return info; - - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "tvodbuy"); - } + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); } - [TaskInterceptor("购买指定会员购商品(仅领取)", TaskLevel.Two, false)] - private async Task BuyVipMall(VipTaskInfo info) - { - CommonTaskItem targetTask = GetTarget(info); + return info; - if (targetTask.state is 3 or 1) - { - var re = targetTask.state == 1 ? "已领取" : "已完成"; - _logger.LogInformation("{re},跳过", re); - return info; - } + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "tvodbuy"); + } + } - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } + [TaskInterceptor("购买指定会员购商品(仅领取)", TaskLevel.Two, false)] + private async Task BuyVipMall(VipTaskInfo info) + { + CommonTaskItem targetTask = GetTarget(info); + if (targetTask.state is 3 or 1) + { + var re = targetTask.state == 1 ? "已领取" : "已完成"; + _logger.LogInformation("{re},跳过", re); return info; - - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "vipmallbuy"); - } } - [TaskInterceptor("浏览装扮商城主页", TaskLevel.Two, false)] - private async Task ViewDressMall(VipTaskInfo info) + //0需要领取 + if (targetTask.state == 0) { - var code = "dress-view"; - - CommonTaskItem targetTask = GetTarget(info); - - //如果状态不等于3,则做 - if (targetTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); + } - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } + return info; - _logger.LogInformation("开始完成任务"); - var re = await Complete(code); + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "vipmallbuy"); + } + } - //确认 - if (re) - { - var infoResult = await _vipApi.GetTaskList(); - if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); - info = infoResult.Data; - targetTask = GetTarget(info); + [TaskInterceptor("浏览装扮商城主页", TaskLevel.Two, false)] + private async Task ViewDressMall(VipTaskInfo info) + { + //var code = "dress-view"; - _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); - } + CommonTaskItem targetTask = GetTarget(info); - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "dress-view"); - } + //如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); return info; } - - /// - /// 领取任务 - /// - private async Task TryReceive(string taskCode) + //0需要领取 + if (targetTask.state == 0) { - BiliApiResponse re = null; - try - { - var request = new ReceiveOrCompleteTaskRequest(taskCode); - re = await _vipApi.Receive(request); - if (re.Code == 0) - _logger.LogInformation("领取任务成功"); - else - _logger.LogInformation("领取任务失败:{msg}", re.ToJsonStr()); - } - catch (Exception e) - { - _logger.LogError("领取任务异常"); - _logger.LogError(e.Message + re?.ToJsonStr()); - } + _logger.LogInformation("开始领取任务"); + await TryReceive(targetTask.task_code); } - private async Task Complete(string taskCode) + _logger.LogInformation("开始完成任务"); + var re = await CompleteV2(targetTask.task_code); + + //确认 + if (re) { - var request = new ReceiveOrCompleteTaskRequest(taskCode); - var re = await _vipApi.Complete(request); - if (re.Code == 0) - { - _logger.LogInformation("已完成"); - return true; - } + var infoResult = await _vipApi.GetTaskList(); + if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); + info = infoResult.Data; + targetTask = GetTarget(info); - else - { - _logger.LogInformation("失败:{msg}", re.ToJsonStr()); - return false; - } + _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); } - private async Task CompleteView(string code) + CommonTaskItem GetTarget(VipTaskInfo info) { - _logger.LogInformation("开始浏览"); - await Task.Delay(10 * 1000); + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "dress-view"); + } + + return info; + } - var request = new ViewRequest(code); - var re = await _vipApi.ViewComplete(request); - if (re.Code == 0) - { - _logger.LogInformation("浏览完成"); - return true; - } + /// + /// 领取任务 + /// + private async Task TryReceive(string taskCode) + { + BiliApiResponse re = null; + try + { + var request = new ReceiveOrCompleteTaskRequest(taskCode); + re = await _vipApi.Receive(request); + if (re.Code == 0) + _logger.LogInformation("领取任务成功"); else - { - _logger.LogInformation("浏览失败:{msg}", re.ToJsonStr()); - return false; - } + _logger.LogInformation("领取任务失败:{msg}", re.ToJsonStr()); } - - public async Task WatchBangumi() + catch (Exception e) { - if (_vipBigPointOptions.ViewBangumiList == null ||_vipBigPointOptions.ViewBangumiList.Count == 0) - return false; - - long randomSsid = _vipBigPointOptions.ViewBangumiList[new Random().Next(0,_vipBigPointOptions.ViewBangumiList.Count)]; - - var res = await GetBangumi(randomSsid); - if (res is null) - { - return false; - } + _logger.LogError("领取任务异常"); + _logger.LogError(e.Message + re?.ToJsonStr()); + } + } - var videoInfo = res.Value.Item1; - - // 随机播放时间 - int playedTime = new Random().Next(905, 1800); - // 观看该视频 - var request = new UploadVideoHeartbeatRequest() - { - Aid = long.Parse(videoInfo.Aid), - Bvid = videoInfo.Bvid, - Cid = videoInfo.Cid, - Mid = long.Parse(_biliCookie.UserId), - Sid = randomSsid, - Epid = res.Value.Item2, - Csrf = _biliCookie.BiliJct, - Type = 4, - Sub_type = 1, - Start_ts = DateTime.Now.ToTimeStamp() - playedTime, - Played_time = playedTime, - Realtime = playedTime, - Real_played_time = playedTime - }; - BiliApiResponse apiResponse = await _videoApi.UploadVideoHeartbeat(request); - if (apiResponse.Code == 0) - { - return true; - } + private async Task Complete(string taskCode) + { + var request = new ReceiveOrCompleteTaskRequest(taskCode); + var re = await _vipApi.Complete(request); + if (re.Code == 0) + { + _logger.LogInformation("已完成"); + return true; + } + else + { + _logger.LogInformation("失败:{msg}", re.ToJsonStr()); return false; } + } + - /// - /// 从自定义的番剧ssid中选择其中的一部中的一集 - /// - /// 番剧ssid - /// - private async Task<(VideoInfoDto,long)?> GetBangumi(long randomSsid) + private async Task CompleteV2(string taskCode) + { + var request = new ReceiveOrCompleteTaskRequest(taskCode); + var re = await _vipApi.CompleteV2(request); + if (re.Code == 0) { - try - { - if (randomSsid is 0 or long.MinValue) - return null; - var bangumiInfo = await _videoApi.GetBangumiBySsid(randomSsid); - - // 从获取的剧集中随机获得其中的一集 - - var bangumi = bangumiInfo.Result.episodes[new Random().Next(0, bangumiInfo.Result.episodes.Count)]; - var videoInfo = new VideoInfoDto() - { - Bvid = bangumi.bvid, - Aid = bangumi.aid.ToString(), - Cid = bangumi.cid, - Copyright = 1, - Duration = bangumi.duration, - Title = bangumi.share_copy - }; - _logger.LogInformation("本次播放的正片为:{title}",bangumi.share_copy); - return (videoInfo, bangumi.ep_id); - } - catch (Exception e) - { - _logger.LogError(e.Message); - } - return null; + _logger.LogInformation("已完成"); + return true; } - #region deprecated - [TaskInterceptor("浏览影视频道页10秒", TaskLevel.Two, false)] - private async Task ViewFilmChannel(VipTaskInfo info) - { - var code = "tv_channel"; - CommonTaskItem targetTask = GetTarget(info); - - //如果状态不等于3,则做 - if (targetTask.state == 3) - { - _logger.LogInformation("已完成,跳过"); - return info; - } + else + { + _logger.LogInformation("失败:{msg}", re.ToJsonStr()); + return false; + } + } - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } + private async Task CompleteView(string code) + { + _logger.LogInformation("开始浏览"); + await Task.Delay(10 * 1000); - _logger.LogInformation("开始完成任务"); - var re = await CompleteView(code); + var request = new ViewRequest(code); + var re = await _vipApi.ViewComplete(request); + if (re.Code == 0) + { + _logger.LogInformation("浏览完成"); + return true; + } - //确认 - if (re) - { - var infoResult = await _vipApi.GetTaskList(); - if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); - info = infoResult.Data; - targetTask = GetTarget(info); + else + { + _logger.LogInformation("浏览失败:{msg}", re.ToJsonStr()); + return false; + } + } - _logger.LogInformation("确认:{re}", targetTask.state == 3 && targetTask.complete_times >= 1); - } + public async Task WatchBangumi() + { + if (_vipBigPointOptions.ViewBangumiList == null || _vipBigPointOptions.ViewBangumiList.Count == 0) + return false; - CommonTaskItem GetTarget(VipTaskInfo info) - { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "filmtab"); - } + long randomSsid = + _vipBigPointOptions.ViewBangumiList[new Random().Next(0, _vipBigPointOptions.ViewBangumiList.Count)]; - return info; + var res = await GetBangumi(randomSsid); + if (res is null) + { + return false; } - [TaskInterceptor("购买指定大会员产品(仅领取)", TaskLevel.Two, false)] - private async Task BuyVipProduct(VipTaskInfo info) + var videoInfo = res.Value.Item1; + + // 随机播放时间 + int playedTime = new Random().Next(905, 1800); + // 观看该视频 + var request = new UploadVideoHeartbeatRequest() { - CommonTaskItem targetTask = GetTarget(info); + Aid = long.Parse(videoInfo.Aid), + Bvid = videoInfo.Bvid, + Cid = videoInfo.Cid, + Mid = long.Parse(_biliCookie.UserId), + Sid = randomSsid, + Epid = res.Value.Item2, + Csrf = _biliCookie.BiliJct, + Type = 4, + Sub_type = 1, + Start_ts = DateTime.Now.ToTimeStamp() - playedTime, + Played_time = playedTime, + Realtime = playedTime, + Real_played_time = playedTime + }; + BiliApiResponse apiResponse = await _videoApi.UploadVideoHeartbeat(request); + if (apiResponse.Code == 0) + { + return true; + } - if (targetTask.state is 3 or 1) - { - var re = targetTask.state == 1 ? "已领取" : "已完成"; - _logger.LogInformation("{re},跳过", re); - return info; - } + return false; + } - //0需要领取 - if (targetTask.state == 0) - { - _logger.LogInformation("开始领取任务"); - await TryReceive(targetTask.task_code); - } + /// + /// 从自定义的番剧ssid中选择其中的一部中的一集 + /// + /// 番剧ssid + /// + private async Task<(VideoInfoDto, long)?> GetBangumi(long randomSsid) + { + try + { + if (randomSsid is 0 or long.MinValue) + return null; + var bangumiInfo = await _videoApi.GetBangumiBySsid(randomSsid); - return info; + // 从获取的剧集中随机获得其中的一集 - CommonTaskItem GetTarget(VipTaskInfo info) + var bangumi = bangumiInfo.Result.episodes[new Random().Next(0, bangumiInfo.Result.episodes.Count)]; + var videoInfo = new VideoInfoDto() { - return info.Task_info.Modules.First(x => x.module_title == "日常任务") - .common_task_item - .First(x => x.task_code == "subscribe"); - } + Bvid = bangumi.bvid, + Aid = bangumi.aid.ToString(), + Cid = bangumi.cid, + Copyright = 1, + Duration = bangumi.duration, + Title = bangumi.share_copy + }; + _logger.LogInformation("本次播放的正片为:{title}", bangumi.share_copy); + return (videoInfo, bangumi.ep_id); + } + catch (Exception e) + { + _logger.LogError(e.Message); } - - #endregion - + return null; } } diff --git a/test/AppServiceTest/VipServiceTest.cs b/test/AppServiceTest/VipServiceTest.cs index 437ed4260..ca5da50ce 100644 --- a/test/AppServiceTest/VipServiceTest.cs +++ b/test/AppServiceTest/VipServiceTest.cs @@ -1,4 +1,6 @@ using Microsoft.Extensions.DependencyInjection; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; using Ray.BiliBiliTool.Application.Contracts; using Ray.BiliBiliTool.DomainService.Dtos; using Ray.BiliBiliTool.Infrastructure; @@ -27,6 +29,24 @@ public async Task WatchVideo() var appService = scope.ServiceProvider.GetRequiredService(); var res = await appService.WatchBangumi(); Assert.True(res); - + } + + + [Fact] + public async Task CompleteV2Test() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var api = scope.ServiceProvider.GetRequiredService(); + var res = await api.CompleteV2(new ReceiveOrCompleteTaskRequest("dress-view")); + Assert.True(res.Code == 0); + } + + [Fact] + public async Task ReceiveV2Test() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var api = scope.ServiceProvider.GetRequiredService(); + var res = await api.ReceiveV2(new ReceiveOrCompleteTaskRequest("ogvwatchnew")); + Assert.True(res.Code == 0); } } From 8ac149505badb32b10763dae57a8b9cc8308caa6 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 22 Apr 2024 01:01:25 +0800 Subject: [PATCH 3/6] update UserAgent and ranking api --- CHANGELOG.md | 233 +++++++++--------- common.props | 2 +- .../BiliBiliAgent/Interfaces/IVideoApi.cs | 1 + .../Extensions/ServiceCollectionExtension.cs | 13 +- src/Ray.BiliBiliTool.Console/appsettings.json | 4 +- test/BiliAgentTest/BiliAgentTest.csproj | 2 + test/BiliAgentTest/VideoApiTest.cs | 12 + 7 files changed, 146 insertions(+), 121 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c8d0f943..7bc0f5448 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,60 +1,66 @@ -## 0.0.1 -- 重启项目 -- 支持[青龙面板](https://github.com/whyour/qinglong)部署 -## 0.0.2 -- 更新文档 -- 天选抽奖新增黑名单功能 -- 批量取关新增白名单功能 -## 0.0.3 -- 【#16】修复银瓜子兑换硬币bug -- 【#18】修改[青龙面板](https://github.com/whyour/qinglong)以`Production`环境运行 -- [青龙面板](https://github.com/whyour/qinglong)新增拉取dev先行版功能 -## 0.0.4 -- 【#15】修复`Actions`部署到腾讯云函数时的偶发异常 -## 0.0.5 -- 优化推送日志,在标题中显示运行的任务名称 -- 新增`CodeQL`workflows,用于检测代码 -- 新增`Publish image`workflows,用于发布镜像 -- 新增`no-toxic-comments.yml`,用于检测评论 -- 更新`auto-close-pr.yml`,用于修正PR的目标到`develop` -## 0.0.6 -- 更新docker镜像的构建 -- 【#12】新增配置`Notification:IsSingleAccountSingleNotify`,支持开启每个账号单独推送消息 -- publish-release.yml新增手动输入tag功能 -## 0.0.7 -- 【#44】兼容青龙最新版本(v2.12.0),修复因青龙调整目录结构导致的bug -- 更新`publish-image.yml`,只有`release`时才打`latest tag`,手动运行时不打`latest tag` -## 0.0.8 -- 【#55】新增日志推送端:`Microsoft Teams` -- 【#27】更新README -## 0.0.9 -- 【#47】青龙安装`dotnet`环境,支持arm架构服务器 -## 0.1.0 -- 【#62】`codeql-analysis.yml`可以指定检查的文件类型 -- 【#61】`publish-image.yml`手动打镜像时支持指定是否打latest的tag -- 【#32】新增企业微信的应用推送,实现微信接受推送消息 -- 优化日志格式 -## 0.1.1 -- 【#54】优化青龙shell脚本读取仓库目录方式,解决青龙新老版本切换导致出现多个repo目录的bug -- 【#82】【#85】合并外部PR,更新了文档 -- 感谢`JetBrain`提供免费的证书支持 -## 0.1.2 -- 修复`auto-close-pr.yml`分支错误的bug -- 【#107】新增自动检测并关闭长时无状态issues的actions:no-response.yml -- 【#73】【#105】【#108】更新、纠正文档内容 -- HostConfiguration,删除了CommandLine配置源,推荐只使用环境变量,同时更新青龙shell脚本内配置 -- 【#169】领取大会员福利任务更改为每日都尝试执行 -- 青龙拉库兼容大小写问题 -- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo) -## 0.2.0 -- 新增大会员大积分任务 -## 0.2.1 -- 合并PR(#253、#257),更新文档(@layui0320) -- 合并PR(#256),重构docker运行是cron构建方式,并优化读取环境变量的方式(@syrinka) -- Feature(#65):新增TG推送配置并使用代理功能 -- Feature(#240):新增gotify推送 -- Feature(#259):大会员状态改为枚举类型,当非会员时自动跳过大积分任务 -- Feature:更新、优化docker部署文档 +## 2.0.3 +- PR[#641]:实现浏览会员购页面与观看正片内容功能 +- PR[#685]:部分修复大积分功能 +- Fix:更新过于老旧的UserAgent +- Fix:更新排行榜api +## 2.0.2 +- PR[#617]:增加专栏投币功能与领取大会员经验的功能 +## 2.0.1 +- PR[#539]:更新文档 +- PR[#557]:修复直播接口权限不足问题 +## 2.0.0 +- Feature[#513]:将基础组件和抽象迁移到nuget包中 +- Fix[#543]:修复部分Api调用报“访问权限不足” +## 1.0.3 +- Fix #486 : fix release zip error +## 1.0.2 +- Fix #484 : fix read dic config error +- Merge PR #472 : add reverse proxy host for telegram notification +- Merge PR #483 : update login field for entrypoint +## 1.0.1 +- Fix #463 : do not trust user's ck config +- Feature #460 : publish single file when release +- Feature: use new scripts for gh actions's release +- Feature #473 : let user input when there is no target task in configs +## 1.0.0 +- Feature: Enable asynchronous +- Fix #344 : Support `Ctrl + C` to trigger exit event +- Fix #451 : Rebuild cookie factory pattern and fix bug of donating coin +- Featur: Replace AOP from MethodBoundaryAspect.Fody to Rougamo.Fody, to fix async exception +- Merge PR #448 : Fix typo +- Fix #446 : Change id type from int to long +## 0.4.6 +- Fix: ck list init empty error +- Feature #440 : use 'apk add' to install dotnet in qinglong +## 0.4.5 +- Fix #423 : Change int to string to avoid overflow exception +## 0.4.4 +- Fix #228 : Try to fix sharing video error +- Feature: Change default docker image from dockerhub to github +## 0.4.3 +- Feature #419 : Add a auto shell script for installing with docker +- Feature #396 : Publish docker image to GitHub pkg +## 0.4.2 +- Merfe PRs #425 #426 #427 : Enhancement docker things, thx @zclkkk +## 0.4.1 +- Merge PR #418 : Fix search video api's error, thx @catlair +## 0.4.0 +- 合并PR( #381 #383 ),新增直播间挂机功能,感谢@bakapiano +## 0.3.2 +- Fix( #358 ),获取auth时兼容老版青龙文件路径 +- Fix( #364 ),兼容青龙异形response数据类型 +- Fix( #366 #361 ),修复一些低级bug +- Feature( #359 ),兼容读取不到`$QL_DIR`的情况 +## 0.3.1 +- Fix( #260 ),在需要的时候encode cookie +- 更新文档 +## 0.3.0 +- hotfix docker build error +- 合并PR(#341),新增krew部署,感谢@chenliu1993 +- 合并PR(##348),更新文档,感谢@jexjws +- 合并PR(#350),修改请求header错误的bug,感谢@catlair +- 合并PR(#353),新增python扫码登录的feature(仅针对青龙),感谢@AFUL1991 +- Feature(#351):重构并新增了扫码登录功能,使之适用于各种部署平台 ## 0.2.2 - 新增`podman`部署教程 - 合并PR(#264),腾讯云定时任务补充新增的大会员大积分任务,感谢@layui0320 @@ -63,61 +69,60 @@ - 合并PR(#309)新增lv6后开启白嫖模式的配置(多账号时可以实现不足lv6的继续投币,达到lv6的开始白嫖),感谢@cluom - 优化青龙安装dotnet的脚本,改为使用官方`dotnet-install.sh`脚本安装(之前测试网络不通,后发现--no-cdn可以) - 优化青龙的执行脚本,提取公共部分,并且在执行前会尝试安装一次dotnet,会清理一次缓存 -## 0.3.0 -- hotfix docker build error -- 合并PR(#341),新增krew部署,感谢@chenliu1993 -- 合并PR(##348),更新文档,感谢@jexjws -- 合并PR(#350),修改请求header错误的bug,感谢@catlair -- 合并PR(#353),新增python扫码登录的feature(仅针对青龙),感谢@AFUL1991 -- Feature(#351):重构并新增了扫码登录功能,使之适用于各种部署平台 -## 0.3.1 -- Fix( #260 ),在需要的时候encode cookie +## 0.2.1 +- 合并PR(#253、#257),更新文档(@layui0320) +- 合并PR(#256),重构docker运行是cron构建方式,并优化读取环境变量的方式(@syrinka) +- Feature(#65):新增TG推送配置并使用代理功能 +- Feature(#240):新增gotify推送 +- Feature(#259):大会员状态改为枚举类型,当非会员时自动跳过大积分任务 +- Feature:更新、优化docker部署文档 +## 0.2.0 +- 新增大会员大积分任务 +## 0.1.2 +- 修复`auto-close-pr.yml`分支错误的bug +- 【#107】新增自动检测并关闭长时无状态issues的actions:no-response.yml +- 【#73】【#105】【#108】更新、纠正文档内容 +- HostConfiguration,删除了CommandLine配置源,推荐只使用环境变量,同时更新青龙shell脚本内配置 +- 【#169】领取大会员福利任务更改为每日都尝试执行 +- 青龙拉库兼容大小写问题 +- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo) +## 0.1.1 +- 【#54】优化青龙shell脚本读取仓库目录方式,解决青龙新老版本切换导致出现多个repo目录的bug +- 【#82】【#85】合并外部PR,更新了文档 +- 感谢`JetBrain`提供免费的证书支持 +## 0.1.0 +- 【#62】`codeql-analysis.yml`可以指定检查的文件类型 +- 【#61】`publish-image.yml`手动打镜像时支持指定是否打latest的tag +- 【#32】新增企业微信的应用推送,实现微信接受推送消息 +- 优化日志格式 +## 0.0.9 +- 【#47】青龙安装`dotnet`环境,支持arm架构服务器 +## 0.0.8 +- 【#55】新增日志推送端:`Microsoft Teams` +- 【#27】更新README +## 0.0.7 +- 【#44】兼容青龙最新版本(v2.12.0),修复因青龙调整目录结构导致的bug +- 更新`publish-image.yml`,只有`release`时才打`latest tag`,手动运行时不打`latest tag` +## 0.0.6 +- 更新docker镜像的构建 +- 【#12】新增配置`Notification:IsSingleAccountSingleNotify`,支持开启每个账号单独推送消息 +- publish-release.yml新增手动输入tag功能 +## 0.0.5 +- 优化推送日志,在标题中显示运行的任务名称 +- 新增`CodeQL`workflows,用于检测代码 +- 新增`Publish image`workflows,用于发布镜像 +- 新增`no-toxic-comments.yml`,用于检测评论 +- 更新`auto-close-pr.yml`,用于修正PR的目标到`develop` +## 0.0.4 +- 【#15】修复`Actions`部署到腾讯云函数时的偶发异常 +## 0.0.3 +- 【#16】修复银瓜子兑换硬币bug +- 【#18】修改[青龙面板](https://github.com/whyour/qinglong)以`Production`环境运行 +- [青龙面板](https://github.com/whyour/qinglong)新增拉取dev先行版功能 +## 0.0.2 - 更新文档 -## 0.3.2 -- Fix( #358 ),获取auth时兼容老版青龙文件路径 -- Fix( #364 ),兼容青龙异形response数据类型 -- Fix( #366 #361 ),修复一些低级bug -- Feature( #359 ),兼容读取不到`$QL_DIR`的情况 -## 0.4.0 -- 合并PR( #381 #383 ),新增直播间挂机功能,感谢@bakapiano -## 0.4.1 -- Merge PR #418 : Fix search video api's error, thx @catlair -## 0.4.2 -- Merfe PRs #425 #426 #427 : Enhancement docker things, thx @zclkkk -## 0.4.3 -- Feature #419 : Add a auto shell script for installing with docker -- Feature #396 : Publish docker image to GitHub pkg -## 0.4.4 -- Fix #228 : Try to fix sharing video error -- Feature: Change default docker image from dockerhub to github -## 0.4.5 -- Fix #423 : Change int to string to avoid overflow exception -## 0.4.6 -- Fix: ck list init empty error -- Feature #440 : use 'apk add' to install dotnet in qinglong -## 1.0.0 -- Feature: Enable asynchronous -- Fix #344 : Support `Ctrl + C` to trigger exit event -- Fix #451 : Rebuild cookie factory pattern and fix bug of donating coin -- Featur: Replace AOP from MethodBoundaryAspect.Fody to Rougamo.Fody, to fix async exception -- Merge PR #448 : Fix typo -- Fix #446 : Change id type from int to long -## 1.0.1 -- Fix #463 : do not trust user's ck config -- Feature #460 : publish single file when release -- Feature: use new scripts for gh actions's release -- Feature #473 : let user input when there is no target task in configs -## 1.0.2 -- Fix #484 : fix read dic config error -- Merge PR #472 : add reverse proxy host for telegram notification -- Merge PR #483 : update login field for entrypoint -## 1.0.3 -- Fix #486 : fix release zip error -## 2.0.0 -- Feature[#513]:将基础组件和抽象迁移到nuget包中 -- Fix[#543]:修复部分Api调用报“访问权限不足” -## 2.0.1 -- PR[#539]:更新文档 -- PR[#557]:修复直播接口权限不足问题 -## 2.0.2 -- PR[#617]:增加专栏投币功能与领取大会员经验的功能 +- 天选抽奖新增黑名单功能 +- 批量取关新增白名单功能 +## 0.0.1 +- 重启项目 +- 支持[青龙面板](https://github.com/whyour/qinglong)部署 diff --git a/common.props b/common.props index 74347ebbe..4add63019 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ Ray - 2.0.2 + 2.0.3 $(NoWarn);CS1591;CS0436 diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs index 7f4093496..5c9ab9053 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs @@ -116,6 +116,7 @@ public interface IVideoWithoutCookieApi : IVideoApi /// [Header("Referer", "https://www.bilibili.com/")] [Header("Origin", "https://www.bilibili.com")] + [Header("dnt", "1")] [HttpGet("/x/web-interface/ranking/v2?rid=0&type=all")] Task> GetRegionRankingVideosV2(); diff --git a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs index 3ace74915..8f5a2c12d 100644 --- a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs +++ b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs @@ -146,10 +146,15 @@ private static IServiceCollection SetGlobalProxy(this IServiceCollection service if (proxyAddress.Contains("@")) { string userPass = proxyAddress.Split("@")[0]; - string address = proxyAddress.Split("@")[1]; - - string proxyUser = userPass.Split(":")[0]; - string proxyPass = userPass.Split(":")[1]; + string address = proxyAddress.Split("@")[1]; + + string proxyUser = ""; + string proxyPass = ""; + if (userPass.Contains(":")) + { + proxyUser = userPass?.Split(":")[0]; + proxyPass = userPass?.Split(":")[1]; + } webProxy.Address = new Uri("http://" + address); webProxy.Credentials = new NetworkCredential(proxyUser, proxyPass); diff --git a/src/Ray.BiliBiliTool.Console/appsettings.json b/src/Ray.BiliBiliTool.Console/appsettings.json index d0af4e8e2..a32a6fb5f 100644 --- a/src/Ray.BiliBiliTool.Console/appsettings.json +++ b/src/Ray.BiliBiliTool.Console/appsettings.json @@ -56,8 +56,8 @@ "RandomSleepMaxMin": 0, //随机睡眠的最大时长(单位为分钟),用于使每天运行时间在范围内相对随机,值域[0,+];配置为0表示不进行休眠 "IntervalSecondsBetweenRequestApi": 20, //两次调用api之间的间隔[0,+](单位为秒)。因为有人担心在几秒内连续调用api会被b站安全机制发现,所以为不放心的朋友添加了间隔秒数配置,两次连续调用Api之间会大于该秒数 "IntervalMethodTypes": "GET,POST", //间隔秒数所针对的HttpMethod,多个用英文逗号隔开,当前有GET和POST两种,可配置如“GET,POST” - "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41", //请求B站接口时头部传递的User-Agent - "WebProxy": "" //代理,user:password@host:port + "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0", //请求B站接口时头部传递的User-Agent + "WebProxy": "" //代理,格式为http://host:port,如果有鉴权则为user:password@http://host:port }, // 推送 diff --git a/test/BiliAgentTest/BiliAgentTest.csproj b/test/BiliAgentTest/BiliAgentTest.csproj index 5f8cefe40..bc95c8a9c 100644 --- a/test/BiliAgentTest/BiliAgentTest.csproj +++ b/test/BiliAgentTest/BiliAgentTest.csproj @@ -5,6 +5,8 @@ enable false + + a6e5b261-0fe9-49e1-82e1-02349db119b4 diff --git a/test/BiliAgentTest/VideoApiTest.cs b/test/BiliAgentTest/VideoApiTest.cs index bb4248e33..512d35133 100644 --- a/test/BiliAgentTest/VideoApiTest.cs +++ b/test/BiliAgentTest/VideoApiTest.cs @@ -52,6 +52,18 @@ public async Task GetBangumiTest() var req = await api.GetBangumiBySsid(46508); Assert.Equal(0,req.Code); + } + + [Fact] + public async Task GetRandomVideoOfRanking() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + var req = await api.GetRegionRankingVideosV2(); + + Assert.Equal(0, req.Code); } } } From f8398357dd0f36f45822e6804ef9047c14d5d910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=A87=E6=A5=BC?= <31154238+RayWangQvQ@users.noreply.github.com> Date: Mon, 22 Apr 2024 22:39:18 +0800 Subject: [PATCH 4/6] sync with master branch (#690) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Release 2.0.3 (#688) * 实现浏览会员购页面与观看正片内容功能 (#641) * 实现浏览会员购页面 * 实现浏览正片内容的功能 * 观看正片任务运行两次以获取全部大积分 * 更新文档 * 修复专栏投币中导致提前结束的逻辑错误 * 修改大积分中相关api调用的错误 * 修复错误 * 修复专栏投币出现权限不足的问题 * 恢复默认配置 * 部分修复大积分功能 (#685) * 根据api进行修改,等待测试 * 待实现:观看剧集内容 * update UserAgent and ranking api --------- Co-authored-by: Polaris_cn * Update tag.yml * Update tag.yml * Update tag.yml * update cicd scripts --------- Co-authored-by: Polaris_cn --- .github/workflows/no-response.yml | 30 +++++++++++-------- .github/workflows/publish-image.yml | 4 +-- .github/workflows/publish-release.yml | 42 +++++++++------------------ .github/workflows/tag.yml | 3 +- 4 files changed, 36 insertions(+), 43 deletions(-) diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index dc42c28c4..0ecc3883a 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -1,19 +1,25 @@ -name: No Response - +name: Close Stale Issues on: - # workflow_dispatch: - issue_comment: - types: [created] schedule: - - cron: '7 4,10 * * *' + - cron: "0 8 * * *" # 每天的 00:00 运行 + workflow_dispatch: + +permissions: + contents: read + issues: write + pull-requests: write jobs: - noResponse: + close_stale_issues: runs-on: ubuntu-latest steps: - - uses: lee-dohm/no-response@v0.5.0 + - name: Close Stale Issues + uses: actions/stale@v5 with: - token: ${{ github.token }} - # closeComment: This issue has been automatically closed due to no response from the original author. Please feel free to reopen it if you have more information that can help us investigate the issue further. - daysUntilClose: 3 - responseRequiredLabel: needs-more-info + days-before-stale: 3 # 3 天不活跃后标记Stale + days-before-close: 3 # 标记Stale后3天不活跃则关闭问题 + stale-issue-label: "Stale" # 标记为 "Stale" 的问题 + stale-issue-message: "🕸️ This has been inactive for 3 days, please confirm if it still needs attention~~" # Comment added + close-issue-message: "🚫 This has been inactive for too long and is now closed, feel free to reopen it if needed!" # Comment added + only-labels: "needs-more-info" # 只处理标签为 "help wanted" 的问题 + repo-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/publish-image.yml b/.github/workflows/publish-image.yml index cd0abf31d..6db05d57c 100644 --- a/.github/workflows/publish-image.yml +++ b/.github/workflows/publish-image.yml @@ -33,8 +33,8 @@ jobs: if [ "${{ github.event.release.tag_name }}" ] ; then TargetVersion=${{ github.event.release.tag_name }} fi - if [ "${{ github.event.inputs.manualTag }}" ] ; then - TargetVersion=${{ github.event.inputs.manualTag }} + then + TargetVersion=$(echo "$GITHUB_REF" | sed 's/refs\/tags\///') fi echo "TargetVersion: $TargetVersion" echo "TargetVersion=$TargetVersion" >> $GITHUB_OUTPUT diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 8025a8030..2c61c1ee5 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -1,13 +1,8 @@ # 打包发布Release - name: Publish release on: workflow_dispatch: - inputs: - version: - description: '版本号' - required: true permissions: contents: write @@ -15,48 +10,39 @@ permissions: jobs: build: - name: publish relesae + name: Publish Release if: ${{ github.repository == 'RayWangQvQ/BiliBiliToolPro' }} runs-on: ubuntu-latest steps: - - name: Checkout code + - name: Checkout Code uses: actions/checkout@v3 - with: - ref: ${{ github.event.inputs.version }} - - name: Setup .NET + - name: Setup .NET Core uses: actions/setup-dotnet@v3 with: - dotnet-version: 6.0.x + dotnet-version: '6.0.x' - - name: Publish and zip + - name: Publish and Zip Release run: | - pwd && ls cd ./scripts chmod +x ./publish.sh - . publish.sh --runtime all + ./publish.sh --runtime all - - name: Get release content - id: release_content + - name: Extract Release Notes + id: release_notes run: | - cd ${{ github.workspace }} - pwd && ls - content=$(tac ./CHANGELOG.md | grep -m1 "##" -B 1000 | tac) - echo "Release content: $content" - echo "release_content<> $GITHUB_OUTPUT - echo "$content" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT + content=$(grep -m1 "##" -A 1000 ./CHANGELOG.md) + echo "::set-output name=content::$content" - - name: Upload release asset - id: upload-release-asset + - name: Create Release uses: softprops/action-gh-release@v1 with: - files: ./src/Ray.BiliBiliTool.Console/bin/Publish/*.zip + files: './src/Ray.BiliBiliTool.Console/bin/Publish/*.zip' token: ${{ secrets.GITHUB_TOKEN }} - name: BiliBiliToolPro-V${{ github.event.inputs.version }} + name: "BiliBiliToolPro-V${{ github.event.inputs.version }}" tag_name: ${{ github.event.inputs.version }} - body: ${{ steps.release_content.outputs.release_content }} + body: ${{ steps.release_notes.outputs.content }} discussion_category_name: Announcements generate_release_notes: true fail_on_unmatched_files: true diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index 84cbf8ffc..81d28dfb3 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -22,11 +22,12 @@ jobs: - name: Get current version id: current_version run: | - version=$(grep -oP '(?<=).*?(?=<\/Version>)' ./scripts/common.props) + version=$(grep -oP '(?<=).*?(?=<\/Version>)' ./common.props) echo "Curent version: $version" echo "current_version=$version" >> $GITHUB_OUTPUT - name: Tag and push run: | + new_tag="${{ steps.current_version.outputs.current_version }}" git tag "$new_tag" git push origin "$new_tag" From 84347a54db2e25049d06052c53a38ef3e9c0df57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=A87=E6=A5=BC?= <31154238+RayWangQvQ@users.noreply.github.com> Date: Mon, 29 Apr 2024 23:58:45 +0800 Subject: [PATCH 5/6] Try fix vip big point error and add functional tests for agent apis (#692) * add functional tests for agents * add DailyTaskApiTests * update DailyTaskApiTests * update wri logic * format codes * add UTs for IArticleApi * format codes * add UT for IChargeApi * add UT for IVipMallApi * add UT for VipBigPointApi * update change log * update UT for VipBigPointApi --- CHANGELOG.md | 75 +-- Ray.BiliBiliTool.sln | 469 +++++++++--------- common.props | 2 +- .../Dtos/Article/AddCoinForArticleRequest.cs | 2 +- .../Article/SearchArticlesByUpIdFullFto.cs | 22 +- .../BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs | 17 +- .../BiliBiliAgent/Dtos/UserInfo.cs | 20 +- .../Dtos/Video/SearchVideosByUpIdFullDto.cs | 62 +-- .../BiliBiliAgent/Dtos/VipPrivilegeType.cs | 8 + .../BiliBiliAgent/Dtos/VipTask/SignRequest.cs | 17 +- .../BiliBiliAgent/Interfaces/IAccountApi.cs | 2 +- .../BiliBiliAgent/Interfaces/IArticleApi.cs | 33 +- .../BiliBiliAgent/Interfaces/IChargeApi.cs | 4 +- .../BiliBiliAgent/Interfaces/IDailyTaskApi.cs | 6 +- .../BiliBiliAgent/Interfaces/IUserInfoApi.cs | 2 +- .../BiliBiliAgent/Interfaces/IVideoApi.cs | 2 +- .../Interfaces/IVipBigPointApi.cs | 42 +- .../BiliBiliAgent/Interfaces/IVipMallApi.cs | 2 +- .../BiliBiliAgent/Services/IWbiService.cs | 18 + .../BiliBiliAgent/Services/WbiService.cs | 158 ++++++ .../Extensions/ServiceCollectionExtension.cs | 289 +++++------ .../VipBigPointAppService.cs | 24 +- .../AccountDomainService.cs | 4 +- .../ArticleDomainService.cs | 39 +- .../ChargeDomainService.cs | 4 +- .../CoinDomainService.cs | 4 +- .../DonateCoinDomainService.cs | 2 +- .../Interfaces/IWbiDomainService.cs | 24 - .../LiveDomainService.cs | 29 +- .../VideoDomainService.cs | 34 +- .../VipPrivilegeDomainService.cs | 14 +- .../WbiDomainService.cs | 162 ------ test/BiliAgentTest/LiveApiTest.cs | 16 +- test/BiliAgentTest/VideoApiTest.cs | 85 ++-- test/BiliAgentTest/VipApiTest.cs | 107 ---- .../DomainServiceTest/WbiDomainServiceTest.cs | 73 --- .../AccountApiTests.cs | 38 ++ .../ArticleApiTests.cs | 145 ++++++ .../ChargeApiTest.cs | 69 +++ .../DailyTaskApiTests.cs | 70 +++ .../HomeApiTests.cs | 41 ++ ....BiliBiliTool.Agent.FunctionalTests.csproj | 28 ++ .../VipBigPointApiTest.cs | 106 ++++ .../VipMallApiTests.cs | 46 ++ .../WbiServiceTest.cs | 78 +++ 45 files changed, 1435 insertions(+), 1059 deletions(-) create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs delete mode 100644 src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs delete mode 100644 src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs delete mode 100644 test/BiliAgentTest/VipApiTest.cs delete mode 100644 test/DomainServiceTest/WbiDomainServiceTest.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bc0f5448..e1dd59046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,66 +1,69 @@ -## 2.0.3 -- PR[#641]:实现浏览会员购页面与观看正片内容功能 -- PR[#685]:部分修复大积分功能 -- Fix:更新过于老旧的UserAgent -- Fix:更新排行榜api +## 2.0.4 +- Fix: 尝试修复大会员大积分“账号风险”异常 +- Feature:为agent api创建集成测试 +## 2.0.3 +- PR[#641]:实现浏览会员购页面与观看正片内容功能 +- PR[#685]:部分修复大积分功能 +- Fix:更新过于老旧的UserAgent +- Fix:更新排行榜api ## 2.0.2 -- PR[#617]:增加专栏投币功能与领取大会员经验的功能 +- PR[#617]:增加专栏投币功能与领取大会员经验的功能 ## 2.0.1 - PR[#539]:更新文档 -- PR[#557]:修复直播接口权限不足问题 +- PR[#557]:修复直播接口权限不足问题 ## 2.0.0 - Feature[#513]:将基础组件和抽象迁移到nuget包中 -- Fix[#543]:修复部分Api调用报“访问权限不足” +- Fix[#543]:修复部分Api调用报“访问权限不足” ## 1.0.3 -- Fix #486 : fix release zip error +- Fix #486 : fix release zip error ## 1.0.2 - Fix #484 : fix read dic config error - Merge PR #472 : add reverse proxy host for telegram notification -- Merge PR #483 : update login field for entrypoint +- Merge PR #483 : update login field for entrypoint ## 1.0.1 - Fix #463 : do not trust user's ck config - Feature #460 : publish single file when release - Feature: use new scripts for gh actions's release -- Feature #473 : let user input when there is no target task in configs +- Feature #473 : let user input when there is no target task in configs ## 1.0.0 - Feature: Enable asynchronous - Fix #344 : Support `Ctrl + C` to trigger exit event - Fix #451 : Rebuild cookie factory pattern and fix bug of donating coin - Featur: Replace AOP from MethodBoundaryAspect.Fody to Rougamo.Fody, to fix async exception - Merge PR #448 : Fix typo -- Fix #446 : Change id type from int to long +- Fix #446 : Change id type from int to long ## 0.4.6 - Fix: ck list init empty error -- Feature #440 : use 'apk add' to install dotnet in qinglong +- Feature #440 : use 'apk add' to install dotnet in qinglong ## 0.4.5 -- Fix #423 : Change int to string to avoid overflow exception +- Fix #423 : Change int to string to avoid overflow exception ## 0.4.4 - Fix #228 : Try to fix sharing video error -- Feature: Change default docker image from dockerhub to github +- Feature: Change default docker image from dockerhub to github ## 0.4.3 - Feature #419 : Add a auto shell script for installing with docker -- Feature #396 : Publish docker image to GitHub pkg +- Feature #396 : Publish docker image to GitHub pkg ## 0.4.2 -- Merfe PRs #425 #426 #427 : Enhancement docker things, thx @zclkkk +- Merfe PRs #425 #426 #427 : Enhancement docker things, thx @zclkkk ## 0.4.1 -- Merge PR #418 : Fix search video api's error, thx @catlair +- Merge PR #418 : Fix search video api's error, thx @catlair ## 0.4.0 -- 合并PR( #381 #383 ),新增直播间挂机功能,感谢@bakapiano +- 合并PR( #381 #383 ),新增直播间挂机功能,感谢@bakapiano ## 0.3.2 - Fix( #358 ),获取auth时兼容老版青龙文件路径 - Fix( #364 ),兼容青龙异形response数据类型 - Fix( #366 #361 ),修复一些低级bug -- Feature( #359 ),兼容读取不到`$QL_DIR`的情况 +- Feature( #359 ),兼容读取不到`$QL_DIR`的情况 ## 0.3.1 - Fix( #260 ),在需要的时候encode cookie -- 更新文档 +- 更新文档 ## 0.3.0 - hotfix docker build error - 合并PR(#341),新增krew部署,感谢@chenliu1993 - 合并PR(##348),更新文档,感谢@jexjws - 合并PR(#350),修改请求header错误的bug,感谢@catlair - 合并PR(#353),新增python扫码登录的feature(仅针对青龙),感谢@AFUL1991 -- Feature(#351):重构并新增了扫码登录功能,使之适用于各种部署平台 +- Feature(#351):重构并新增了扫码登录功能,使之适用于各种部署平台 ## 0.2.2 - 新增`podman`部署教程 - 合并PR(#264),腾讯云定时任务补充新增的大会员大积分任务,感谢@layui0320 @@ -75,9 +78,9 @@ - Feature(#65):新增TG推送配置并使用代理功能 - Feature(#240):新增gotify推送 - Feature(#259):大会员状态改为枚举类型,当非会员时自动跳过大积分任务 -- Feature:更新、优化docker部署文档 +- Feature:更新、优化docker部署文档 ## 0.2.0 -- 新增大会员大积分任务 +- 新增大会员大积分任务 ## 0.1.2 - 修复`auto-close-pr.yml`分支错误的bug - 【#107】新增自动检测并关闭长时无状态issues的actions:no-response.yml @@ -85,44 +88,44 @@ - HostConfiguration,删除了CommandLine配置源,推荐只使用环境变量,同时更新青龙shell脚本内配置 - 【#169】领取大会员福利任务更改为每日都尝试执行 - 青龙拉库兼容大小写问题 -- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo) +- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo) ## 0.1.1 - 【#54】优化青龙shell脚本读取仓库目录方式,解决青龙新老版本切换导致出现多个repo目录的bug - 【#82】【#85】合并外部PR,更新了文档 -- 感谢`JetBrain`提供免费的证书支持 +- 感谢`JetBrain`提供免费的证书支持 ## 0.1.0 - 【#62】`codeql-analysis.yml`可以指定检查的文件类型 - 【#61】`publish-image.yml`手动打镜像时支持指定是否打latest的tag - 【#32】新增企业微信的应用推送,实现微信接受推送消息 -- 优化日志格式 +- 优化日志格式 ## 0.0.9 -- 【#47】青龙安装`dotnet`环境,支持arm架构服务器 +- 【#47】青龙安装`dotnet`环境,支持arm架构服务器 ## 0.0.8 - 【#55】新增日志推送端:`Microsoft Teams` -- 【#27】更新README +- 【#27】更新README ## 0.0.7 - 【#44】兼容青龙最新版本(v2.12.0),修复因青龙调整目录结构导致的bug -- 更新`publish-image.yml`,只有`release`时才打`latest tag`,手动运行时不打`latest tag` +- 更新`publish-image.yml`,只有`release`时才打`latest tag`,手动运行时不打`latest tag` ## 0.0.6 - 更新docker镜像的构建 - 【#12】新增配置`Notification:IsSingleAccountSingleNotify`,支持开启每个账号单独推送消息 -- publish-release.yml新增手动输入tag功能 +- publish-release.yml新增手动输入tag功能 ## 0.0.5 - 优化推送日志,在标题中显示运行的任务名称 - 新增`CodeQL`workflows,用于检测代码 - 新增`Publish image`workflows,用于发布镜像 - 新增`no-toxic-comments.yml`,用于检测评论 -- 更新`auto-close-pr.yml`,用于修正PR的目标到`develop` +- 更新`auto-close-pr.yml`,用于修正PR的目标到`develop` ## 0.0.4 -- 【#15】修复`Actions`部署到腾讯云函数时的偶发异常 +- 【#15】修复`Actions`部署到腾讯云函数时的偶发异常 ## 0.0.3 - 【#16】修复银瓜子兑换硬币bug - 【#18】修改[青龙面板](https://github.com/whyour/qinglong)以`Production`环境运行 -- [青龙面板](https://github.com/whyour/qinglong)新增拉取dev先行版功能 +- [青龙面板](https://github.com/whyour/qinglong)新增拉取dev先行版功能 ## 0.0.2 - 更新文档 - 天选抽奖新增黑名单功能 -- 批量取关新增白名单功能 +- 批量取关新增白名单功能 ## 0.0.1 - 重启项目 -- 支持[青龙面板](https://github.com/whyour/qinglong)部署 +- 支持[青龙面板](https://github.com/whyour/qinglong)部署 diff --git a/Ray.BiliBiliTool.sln b/Ray.BiliBiliTool.sln index c7f37172c..3406edc2f 100644 --- a/Ray.BiliBiliTool.sln +++ b/Ray.BiliBiliTool.sln @@ -1,231 +1,238 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.32112.339 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{38736647-2196-417E-8519-C48A012A63D9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Application", "Application", "{98051127-2868-4F5C-9B2C-2150975E05F3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Domain", "Domain", "{120917DC-474C-448B-9EBB-1B3BA3A20B9D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF21E067-3307-4E7F-8CE8-C695E6B61876}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{E9BDDCBE-A57D-4E3B-8252-708088386ADF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Console", "src\Ray.BiliBiliTool.Console\Ray.BiliBiliTool.Console.csproj", "{DB227D60-0737-45C2-8CEA-F55FDA711301}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfigTest", "test\ConfigTest\ConfigTest.csproj", "{114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LogTest", "test\LogTest\LogTest.csproj", "{2039BF6A-5EC4-439C-8D2E-77313075843A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{110D3D21-8E9B-45AB-9667-6DA1DB3862AC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Infrastructure", "src\Ray.BiliBiliTool.Infrastructure\Ray.BiliBiliTool.Infrastructure.csproj", "{7188698C-0A9A-43B2-B3E2-5136B14FDE13}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application", "src\Ray.BiliBiliTool.Application\Ray.BiliBiliTool.Application.csproj", "{3388A58D-91CC-4875-A29F-3E6FC3B44BF5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application.Contracts", "src\Ray.BiliBiliTool.Application.Contracts\Ray.BiliBiliTool.Application.Contracts.csproj", "{B6AEDD60-9C06-4391-9171-65EBD5E9D77A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Agent", "src\Ray.BiliBiliTool.Agent\Ray.BiliBiliTool.Agent.csproj", "{D5F9FBCE-31BE-4E80-93E2-183CF029431F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Config", "src\Ray.BiliBiliTool.Config\Ray.BiliBiliTool.Config.csproj", "{191C48BD-5CB5-42CA-B394-7A4A9BFA6275}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.DomainService", "src\Ray.BiliBiliTool.DomainService\Ray.BiliBiliTool.DomainService.csproj", "{7105652A-B1C1-4F9E-BA38-8034BC8B26B4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}" - ProjectSection(SolutionItems) = preProject - .dockerignore = .dockerignore - .editorconfig = .editorconfig - .gitignore = .gitignore - CHANGELOG.md = CHANGELOG.md - clean.cmd = clean.cmd - common.props = common.props - Dockerfile = Dockerfile - LICENSE = LICENSE - publish.bat = publish.bat - README.md = README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}" - ProjectSection(SolutionItems) = preProject - .github\pull.yml = .github\pull.yml - .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{61613EF4-3644-42D4-A620-70547291FB38}" - ProjectSection(SolutionItems) = preProject - .github\workflows\auto-close-pr.yml = .github\workflows\auto-close-pr.yml - .github\workflows\auto-deploy-tencent-scf.yml = .github\workflows\auto-deploy-tencent-scf.yml - .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml - .github\workflows\publish-image.yml = .github\workflows\publish-image.yml - .github\workflows\publish-release.yml = .github\workflows\publish-release.yml - .github\workflows\repo-sync.yml = .github\workflows\repo-sync.yml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{A93210FD-27B6-40E4-B08D-391F96CA2754}" - ProjectSection(SolutionItems) = preProject - docker\crontab = docker\crontab - docker\entry.sh = docker\entry.sh - docker\README.md = docker\README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A}" - ProjectSection(SolutionItems) = preProject - docker\sample\docker-compose.yml = docker\sample\docker-compose.yml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{C0173851-1515-4BE1-A018-84E0B64A6877}" - ProjectSection(SolutionItems) = preProject - docs\configuration.md = docs\configuration.md - docs\donate-list.md = docs\donate-list.md - docs\questions.md = docs\questions.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencentScf", "tencentScf", "{DD86F293-AE70-46CF-837C-8870D8F51237}" - ProjectSection(SolutionItems) = preProject - tencentScf\bootstrap = tencentScf\bootstrap - tencentScf\index.sh = tencentScf\index.sh - tencentScf\publish.bat = tencentScf\publish.bat - tencentScf\publish.sh = tencentScf\publish.sh - tencentScf\README.md = tencentScf\README.md - tencentScf\serverless.yml = tencentScf\serverless.yml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "qinglong", "qinglong", "{1C6CC38A-A5D5-41EF-9072-70AEEEA211F7}" - ProjectSection(SolutionItems) = preProject - qinglong\dotnet-install.sh = qinglong\dotnet-install.sh - qinglong\extra.sh = qinglong\extra.sh - qinglong\ray-dotnet-install.sh = qinglong\ray-dotnet-install.sh - qinglong\README.md = qinglong\README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DefaultTasks", "DefaultTasks", "{DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0}" - ProjectSection(SolutionItems) = preProject - qinglong\DefaultTasks\bili_dev_task_daily.sh = qinglong\DefaultTasks\bili_dev_task_daily.sh - qinglong\DefaultTasks\bili_dev_task_liveLottery.sh = qinglong\DefaultTasks\bili_dev_task_liveLottery.sh - qinglong\DefaultTasks\bili_dev_task_test.sh = qinglong\DefaultTasks\bili_dev_task_test.sh - qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh - qinglong\DefaultTasks\bili_task_daily.sh = qinglong\DefaultTasks\bili_task_daily.sh - qinglong\DefaultTasks\bili_task_liveLottery.sh = qinglong\DefaultTasks\bili_task_liveLottery.sh - qinglong\DefaultTasks\bili_task_test.sh = qinglong\DefaultTasks\bili_task_test.sh - qinglong\DefaultTasks\bili_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_task_unfollowBatched.sh - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ISSUE_TEMPLATE", "ISSUE_TEMPLATE", "{830361B7-BCC1-4853-879A-761B0FD86826}" - ProjectSection(SolutionItems) = preProject - .github\ISSUE_TEMPLATE\bug-report----.md = .github\ISSUE_TEMPLATE\bug-report----.md - .github\ISSUE_TEMPLATE\feature-request----.md = .github\ISSUE_TEMPLATE\feature-request----.md - .github\ISSUE_TEMPLATE\other----.md = .github\ISSUE_TEMPLATE\other----.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BiliAgentTest", "test\BiliAgentTest\BiliAgentTest.csproj", "{F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{75A9CC5C-DF92-4D72-A14C-625AA902855B}" - ProjectSection(SolutionItems) = preProject - docker\build\buildAndPushImage_multiArch.cmd = docker\build\buildAndPushImage_multiArch.cmd - docker\build\buildImage.cmd = docker\build\buildImage.cmd - docker\build\buildImage_amd64.cmd = docker\build\buildImage_amd64.cmd - docker\build\buildImage_arm64.cmd = docker\build\buildImage_arm64.cmd - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AppServiceTest", "test\AppServiceTest\AppServiceTest.csproj", "{1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DomainServiceTest", "test\DomainServiceTest\DomainServiceTest.csproj", "{26B21C30-7358-4E7B-A73E-2272F10A6CA8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfrastructureTest", "test\InfrastructureTest\InfrastructureTest.csproj", "{90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.Build.0 = Release|Any CPU - {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.Build.0 = Release|Any CPU - {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.Build.0 = Release|Any CPU - {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.Build.0 = Release|Any CPU - {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.Build.0 = Release|Any CPU - {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.Build.0 = Release|Any CPU - {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.Build.0 = Release|Any CPU - {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.Build.0 = Debug|Any CPU - {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.ActiveCfg = Release|Any CPU - {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.Build.0 = Release|Any CPU - {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.Build.0 = Release|Any CPU - {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Release|Any CPU.Build.0 = Release|Any CPU - {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Release|Any CPU.Build.0 = Release|Any CPU - {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Release|Any CPU.Build.0 = Release|Any CPU - {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {38736647-2196-417E-8519-C48A012A63D9} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} - {98051127-2868-4F5C-9B2C-2150975E05F3} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} - {120917DC-474C-448B-9EBB-1B3BA3A20B9D} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} - {DB227D60-0737-45C2-8CEA-F55FDA711301} = {38736647-2196-417E-8519-C48A012A63D9} - {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} - {2039BF6A-5EC4-439C-8D2E-77313075843A} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} - {110D3D21-8E9B-45AB-9667-6DA1DB3862AC} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} - {7188698C-0A9A-43B2-B3E2-5136B14FDE13} = {110D3D21-8E9B-45AB-9667-6DA1DB3862AC} - {3388A58D-91CC-4875-A29F-3E6FC3B44BF5} = {98051127-2868-4F5C-9B2C-2150975E05F3} - {B6AEDD60-9C06-4391-9171-65EBD5E9D77A} = {98051127-2868-4F5C-9B2C-2150975E05F3} - {D5F9FBCE-31BE-4E80-93E2-183CF029431F} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D} - {191C48BD-5CB5-42CA-B394-7A4A9BFA6275} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D} - {7105652A-B1C1-4F9E-BA38-8034BC8B26B4} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D} - {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} - {61613EF4-3644-42D4-A620-70547291FB38} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} - {A93210FD-27B6-40E4-B08D-391F96CA2754} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} - {2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A} = {A93210FD-27B6-40E4-B08D-391F96CA2754} - {DD86F293-AE70-46CF-837C-8870D8F51237} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} - {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} - {DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0} = {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7} - {830361B7-BCC1-4853-879A-761B0FD86826} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} - {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} - {75A9CC5C-DF92-4D72-A14C-625AA902855B} = {A93210FD-27B6-40E4-B08D-391F96CA2754} - {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} - {26B21C30-7358-4E7B-A73E-2272F10A6CA8} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} - {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {197319DA-1148-4A99-847C-8B270B6A29AB} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{38736647-2196-417E-8519-C48A012A63D9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Application", "Application", "{98051127-2868-4F5C-9B2C-2150975E05F3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Domain", "Domain", "{120917DC-474C-448B-9EBB-1B3BA3A20B9D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF21E067-3307-4E7F-8CE8-C695E6B61876}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{E9BDDCBE-A57D-4E3B-8252-708088386ADF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Console", "src\Ray.BiliBiliTool.Console\Ray.BiliBiliTool.Console.csproj", "{DB227D60-0737-45C2-8CEA-F55FDA711301}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfigTest", "test\ConfigTest\ConfigTest.csproj", "{114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LogTest", "test\LogTest\LogTest.csproj", "{2039BF6A-5EC4-439C-8D2E-77313075843A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{110D3D21-8E9B-45AB-9667-6DA1DB3862AC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Infrastructure", "src\Ray.BiliBiliTool.Infrastructure\Ray.BiliBiliTool.Infrastructure.csproj", "{7188698C-0A9A-43B2-B3E2-5136B14FDE13}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application", "src\Ray.BiliBiliTool.Application\Ray.BiliBiliTool.Application.csproj", "{3388A58D-91CC-4875-A29F-3E6FC3B44BF5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application.Contracts", "src\Ray.BiliBiliTool.Application.Contracts\Ray.BiliBiliTool.Application.Contracts.csproj", "{B6AEDD60-9C06-4391-9171-65EBD5E9D77A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Agent", "src\Ray.BiliBiliTool.Agent\Ray.BiliBiliTool.Agent.csproj", "{D5F9FBCE-31BE-4E80-93E2-183CF029431F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Config", "src\Ray.BiliBiliTool.Config\Ray.BiliBiliTool.Config.csproj", "{191C48BD-5CB5-42CA-B394-7A4A9BFA6275}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.DomainService", "src\Ray.BiliBiliTool.DomainService\Ray.BiliBiliTool.DomainService.csproj", "{7105652A-B1C1-4F9E-BA38-8034BC8B26B4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}" + ProjectSection(SolutionItems) = preProject + .dockerignore = .dockerignore + .editorconfig = .editorconfig + .gitignore = .gitignore + CHANGELOG.md = CHANGELOG.md + clean.cmd = clean.cmd + common.props = common.props + Dockerfile = Dockerfile + LICENSE = LICENSE + publish.bat = publish.bat + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}" + ProjectSection(SolutionItems) = preProject + .github\pull.yml = .github\pull.yml + .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{61613EF4-3644-42D4-A620-70547291FB38}" + ProjectSection(SolutionItems) = preProject + .github\workflows\auto-close-pr.yml = .github\workflows\auto-close-pr.yml + .github\workflows\auto-deploy-tencent-scf.yml = .github\workflows\auto-deploy-tencent-scf.yml + .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml + .github\workflows\publish-image.yml = .github\workflows\publish-image.yml + .github\workflows\publish-release.yml = .github\workflows\publish-release.yml + .github\workflows\repo-sync.yml = .github\workflows\repo-sync.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{A93210FD-27B6-40E4-B08D-391F96CA2754}" + ProjectSection(SolutionItems) = preProject + docker\crontab = docker\crontab + docker\entry.sh = docker\entry.sh + docker\README.md = docker\README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A}" + ProjectSection(SolutionItems) = preProject + docker\sample\docker-compose.yml = docker\sample\docker-compose.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{C0173851-1515-4BE1-A018-84E0B64A6877}" + ProjectSection(SolutionItems) = preProject + docs\configuration.md = docs\configuration.md + docs\donate-list.md = docs\donate-list.md + docs\questions.md = docs\questions.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencentScf", "tencentScf", "{DD86F293-AE70-46CF-837C-8870D8F51237}" + ProjectSection(SolutionItems) = preProject + tencentScf\bootstrap = tencentScf\bootstrap + tencentScf\index.sh = tencentScf\index.sh + tencentScf\publish.bat = tencentScf\publish.bat + tencentScf\publish.sh = tencentScf\publish.sh + tencentScf\README.md = tencentScf\README.md + tencentScf\serverless.yml = tencentScf\serverless.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "qinglong", "qinglong", "{1C6CC38A-A5D5-41EF-9072-70AEEEA211F7}" + ProjectSection(SolutionItems) = preProject + qinglong\dotnet-install.sh = qinglong\dotnet-install.sh + qinglong\extra.sh = qinglong\extra.sh + qinglong\ray-dotnet-install.sh = qinglong\ray-dotnet-install.sh + qinglong\README.md = qinglong\README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DefaultTasks", "DefaultTasks", "{DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0}" + ProjectSection(SolutionItems) = preProject + qinglong\DefaultTasks\bili_dev_task_daily.sh = qinglong\DefaultTasks\bili_dev_task_daily.sh + qinglong\DefaultTasks\bili_dev_task_liveLottery.sh = qinglong\DefaultTasks\bili_dev_task_liveLottery.sh + qinglong\DefaultTasks\bili_dev_task_test.sh = qinglong\DefaultTasks\bili_dev_task_test.sh + qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh + qinglong\DefaultTasks\bili_task_daily.sh = qinglong\DefaultTasks\bili_task_daily.sh + qinglong\DefaultTasks\bili_task_liveLottery.sh = qinglong\DefaultTasks\bili_task_liveLottery.sh + qinglong\DefaultTasks\bili_task_test.sh = qinglong\DefaultTasks\bili_task_test.sh + qinglong\DefaultTasks\bili_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_task_unfollowBatched.sh + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ISSUE_TEMPLATE", "ISSUE_TEMPLATE", "{830361B7-BCC1-4853-879A-761B0FD86826}" + ProjectSection(SolutionItems) = preProject + .github\ISSUE_TEMPLATE\bug-report----.md = .github\ISSUE_TEMPLATE\bug-report----.md + .github\ISSUE_TEMPLATE\feature-request----.md = .github\ISSUE_TEMPLATE\feature-request----.md + .github\ISSUE_TEMPLATE\other----.md = .github\ISSUE_TEMPLATE\other----.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BiliAgentTest", "test\BiliAgentTest\BiliAgentTest.csproj", "{F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{75A9CC5C-DF92-4D72-A14C-625AA902855B}" + ProjectSection(SolutionItems) = preProject + docker\build\buildAndPushImage_multiArch.cmd = docker\build\buildAndPushImage_multiArch.cmd + docker\build\buildImage.cmd = docker\build\buildImage.cmd + docker\build\buildImage_amd64.cmd = docker\build\buildImage_amd64.cmd + docker\build\buildImage_arm64.cmd = docker\build\buildImage_arm64.cmd + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AppServiceTest", "test\AppServiceTest\AppServiceTest.csproj", "{1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DomainServiceTest", "test\DomainServiceTest\DomainServiceTest.csproj", "{26B21C30-7358-4E7B-A73E-2272F10A6CA8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfrastructureTest", "test\InfrastructureTest\InfrastructureTest.csproj", "{90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ray.BiliBiliTool.Agent.FunctionalTests", "test\Ray.BiliBiliTool.Agent.FunctionalTests\Ray.BiliBiliTool.Agent.FunctionalTests.csproj", "{16F315CF-056A-4B08-8C3C-A3177EA3CBB9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.Build.0 = Release|Any CPU + {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.Build.0 = Release|Any CPU + {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.Build.0 = Release|Any CPU + {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.Build.0 = Release|Any CPU + {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.Build.0 = Release|Any CPU + {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.Build.0 = Release|Any CPU + {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.Build.0 = Release|Any CPU + {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.Build.0 = Debug|Any CPU + {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.ActiveCfg = Release|Any CPU + {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.Build.0 = Release|Any CPU + {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.Build.0 = Release|Any CPU + {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Release|Any CPU.Build.0 = Release|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Release|Any CPU.Build.0 = Release|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Release|Any CPU.Build.0 = Release|Any CPU + {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.Build.0 = Release|Any CPU + {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {38736647-2196-417E-8519-C48A012A63D9} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} + {98051127-2868-4F5C-9B2C-2150975E05F3} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} + {120917DC-474C-448B-9EBB-1B3BA3A20B9D} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} + {DB227D60-0737-45C2-8CEA-F55FDA711301} = {38736647-2196-417E-8519-C48A012A63D9} + {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + {2039BF6A-5EC4-439C-8D2E-77313075843A} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + {110D3D21-8E9B-45AB-9667-6DA1DB3862AC} = {AF21E067-3307-4E7F-8CE8-C695E6B61876} + {7188698C-0A9A-43B2-B3E2-5136B14FDE13} = {110D3D21-8E9B-45AB-9667-6DA1DB3862AC} + {3388A58D-91CC-4875-A29F-3E6FC3B44BF5} = {98051127-2868-4F5C-9B2C-2150975E05F3} + {B6AEDD60-9C06-4391-9171-65EBD5E9D77A} = {98051127-2868-4F5C-9B2C-2150975E05F3} + {D5F9FBCE-31BE-4E80-93E2-183CF029431F} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D} + {191C48BD-5CB5-42CA-B394-7A4A9BFA6275} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D} + {7105652A-B1C1-4F9E-BA38-8034BC8B26B4} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D} + {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} + {61613EF4-3644-42D4-A620-70547291FB38} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} + {A93210FD-27B6-40E4-B08D-391F96CA2754} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} + {2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A} = {A93210FD-27B6-40E4-B08D-391F96CA2754} + {DD86F293-AE70-46CF-837C-8870D8F51237} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} + {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1} + {DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0} = {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7} + {830361B7-BCC1-4853-879A-761B0FD86826} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} + {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + {75A9CC5C-DF92-4D72-A14C-625AA902855B} = {A93210FD-27B6-40E4-B08D-391F96CA2754} + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + {26B21C30-7358-4E7B-A73E-2272F10A6CA8} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + {16F315CF-056A-4B08-8C3C-A3177EA3CBB9} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {197319DA-1148-4A99-847C-8B270B6A29AB} + EndGlobalSection +EndGlobal diff --git a/common.props b/common.props index 4add63019..ca86e1fb3 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ Ray - 2.0.3 + 2.0.4 $(NoWarn);CS1591;CS0436 diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs index 7fd3f3e9d..e2b465fd5 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs @@ -2,7 +2,7 @@ public class AddCoinForArticleRequest { - public AddCoinForArticleRequest(long cvid,long mid,string csrf) + public AddCoinForArticleRequest(long cvid, long mid, string csrf) { Aid = cvid; Upid = mid; diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs index 8d646ffbd..f2b24b85d 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs @@ -1,6 +1,8 @@ -namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; -public class SearchArticlesByUpIdDto +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; + +public class SearchArticlesByUpIdDto : IWrid { public long mid { get; set; } @@ -8,16 +10,12 @@ public class SearchArticlesByUpIdDto public int ps { get; set; } = 12; - public string sort { get; set; } = "publish_time"; - - public long web_location { get; set; } = 1550101; - - public string platform { get; set; } = "web"; -} - -public class SearchArticlesByUpIdFullDto : SearchArticlesByUpIdDto -{ + public string sort { get; set; } = "publish_time"; + + public long web_location { get; set; } = 1550101; + + public string platform { get; set; } = "web"; + public string w_rid { get; set; } - public long wts { get; set; } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs index 0f388ec9a..338b8f290 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs @@ -1,12 +1,11 @@ -namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; -public class GetSpaceInfoDto -{ - public long mid { get; set; } -} -public class GetSpaceInfoFullDto : GetSpaceInfoDto -{ - public string w_rid { get; set; } +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; - public long wts { get; set; } +public class GetSpaceInfoDto : IWrid +{ + public long mid { get; set; } + + public string w_rid { get; set; } + public long wts { get; set; } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs index 15a7e8f9f..42268dfe7 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs @@ -143,23 +143,19 @@ public class Wallet public class WbiImg { /// - /// https://i0.hdslb.com/bfs/wbi/9cd4224d4fe74c7e9d6963e2ef891688.png - /// + /// img url + /// + /// https://i0.hdslb.com/bfs/wbi/9cd4224d4fe74c7e9d6963e2ef891688.png public string img_url { get; set; } /// - /// https://i0.hdslb.com/bfs/wbi/263655ae2cad4cce95c9c401981b044a.png - /// + /// sub url + /// + /// https://i0.hdslb.com/bfs/wbi/263655ae2cad4cce95c9c401981b044a.png public string sub_url { get; set; } - public string GetImgKey() - { - return img_url.Split("wbi/").ToList().Last().Replace(".png", ""); - } + public string ImgKey => img_url.Split("wbi/").ToList().Last().Replace(".png", ""); - public string GetSubKey() - { - return sub_url.Split("wbi/").ToList().Last().Replace(".png", ""); - } + public string SubKey => sub_url.Split("wbi/").ToList().Last().Replace(".png", ""); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs index b06b8a259..d342204e2 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs @@ -1,47 +1,37 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Ray.Infrastructure.Helpers; - -namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video -{ - public class SearchVideosByUpIdDto - { - /// - /// upId - /// - public long mid { get; set; } +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; - /// - /// pageSize - /// - public int ps { get; set; } = 30; +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video; - /// - /// pageNumber - /// - public int pn { get; set; } = 1; +public class SearchVideosByUpIdDto : IWrid +{ + /// + /// upId + /// + public long mid { get; set; } - public int tid { get; set; } = 0; + /// + /// pageSize + /// + public int ps { get; set; } = 30; - public string keyword { get; set; } = ""; + /// + /// pageNumber + /// + public int pn { get; set; } = 1; - public string order { get; set; } = "pubdate"; + public int tid { get; set; } = 0; - public string platform { get; set; } = "web"; + public string keyword { get; set; } = ""; - public int web_location { get; set; } = 1550101; + public string order { get; set; } = "pubdate"; - public string order_avoided { get; set; } = "true"; - } + public string platform { get; set; } = "web"; - public class SearchVideosByUpIdFullDto: SearchVideosByUpIdDto - { - public string w_rid { get; set; } //= "b280d7bc02d653ffa06d874a74e5bfd9"; //todo:应该是md5 + public int web_location { get; set; } = 1550101; - //public long wts { get; set; } = TimeStampHelper.DateTimeToTimeStamp(DateTime.Now); - public long wts { get; set; } //= 1684857205; //todo - } + public string order_avoided { get; set; } = "true"; + + public string w_rid { get; set; } //= "b280d7bc02d653ffa06d874a74e5bfd9"; //todo:应该是md5 + //public long wts { get; set; } = TimeStampHelper.DateTimeToTimeStamp(DateTime.Now); + public long wts { get; set; } //= 1684857205; //todo } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs new file mode 100644 index 000000000..4ad315cb6 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs @@ -0,0 +1,8 @@ +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos +{ + public enum VipPrivilegeType + { + BCoinCoupon = 1, + MembershipBenefits = 2 + } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs index c6ec47532..36fee6276 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; -namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask -{ - public class SignRequest - { - public string Statistics { get; set; }= "{\"appId\":1,\"platform\":3,\"version\":\"6.85.0\",\"abtest\":\"\"}"; - } +public class SignRequest +{ + public string csrf { get; set; } + + public string statistics { get; set; }= "{\"appId\":1,\"platform\":3,\"version\":\"6.85.0\",\"abtest\":\"\"}"; } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs index 00ed29a70..42fa70eec 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs @@ -13,6 +13,6 @@ public interface IAccountApi : IBiliBiliApi /// [Header("Referer", "https://account.bilibili.com/account/coin")] [HttpGet("/site/getCoin")] - Task> GetCoinBalance(); + Task> GetCoinBalanceAsync(); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs index 2019bb33b..88d993863 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs @@ -1,28 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video; using WebApiClientCore.Attributes; namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces -{ - +{ + [Header("Host", "api.bilibili.com")] public interface IArticleApi : IBiliBiliApi - { - [Header("Content-Type", "application/x-www-form-urlencoded")] - [Header("Origin", "https://www.bilibili.com")] - [HttpPost("/x/web-interface/coin/add")] - Task AddCoinForArticle([FormContent] AddCoinForArticleRequest request, [Header("referer")] string refer = "https://www.bilibili.com/read/cv5806746/?from=search&spm_id_from=333.337.0.0"); - - + { [Header("Referer", "https://www.bilibili.com/")] [Header("Origin", "https://space.bilibili.com")] [HttpGet("/x/space/wbi/article")] - Task> SearchUpArticlesByUpId( - [PathQuery] SearchArticlesByUpIdFullDto request); + Task> SearchUpArticlesByUpIdAsync([PathQuery] SearchArticlesByUpIdDto request); /// /// 获取专栏详情 @@ -30,16 +20,17 @@ Task> SearchUpArticlesByUpId( /// /// [HttpGet("/x/article/viewinfo?id={cvid}")] - Task> SearchArticleInfo(long cvid); + Task> SearchArticleInfoAsync(long cvid); + [Header("Content-Type", "application/x-www-form-urlencoded")] + [Header("Origin", "https://www.bilibili.com")] + [HttpPost("/x/web-interface/coin/add")] + Task AddCoinForArticleAsync([FormContent] AddCoinForArticleRequest request, [Header("referer")] string refer = "https://www.bilibili.com/read/cv5806746/?from=search&spm_id_from=333.337.0.0"); [Header("Content-Type", "application/x-www-form-urlencoded")] [Header("Referer", "https://www.bilibili.com/read/cv{cvid}/?from=search&spm_id_from=333.337.0.0")] [Header("Origin", "https://www.bilibili.com")] [HttpPost("/x/article/like?id={cvid}&type=1&csrf={csrf}")] - Task Like(long cvid, string csrf); - - } - - + Task LikeAsync(long cvid, string csrf); + } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs index dd159d14b..3a788381e 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs @@ -36,7 +36,7 @@ public interface IChargeApi : IBiliBiliApi [Header("Referer", "https://www.bilibili.com/")] [Header("Origin", "https://www.bilibili.com")] [HttpPost("/x/ugcpay/web/v2/trade/elec/pay/quick")] - Task> ChargeV2([FormContent] ChargeRequest request); + Task> ChargeV2Async([FormContent] ChargeRequest request); /// /// 充电后留言 @@ -50,7 +50,7 @@ public interface IChargeApi : IBiliBiliApi [Header("Referer", "https://www.bilibili.com/")] [Header("Origin", "https://www.bilibili.com")] [HttpPost("/x/ugcpay/trade/elec/message")] - Task> ChargeComment([FormContent] ChargeCommentRequest request); + Task> ChargeCommentAsync([FormContent] ChargeCommentRequest request); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs index 085125cda..9a5f1ac1b 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs @@ -18,7 +18,7 @@ public interface IDailyTaskApi : IBiliBiliApi [Header("Referer", "https://account.bilibili.com/account/home")] [Header("Origin", "https://account.bilibili.com")] [HttpGet("/x/member/web/exp/reward")] - Task> GetDailyTaskRewardInfo(); + Task> GetDailyTaskRewardInfoAsync(); /// /// 获取通过投币已获取的经验值 @@ -27,7 +27,7 @@ public interface IDailyTaskApi : IBiliBiliApi [Header("Referer", "https://www.bilibili.com/")] [Header("Origin", "https://www.bilibili.com")] [HttpGet("/x/web-interface/coin/today/exp")] - Task> GetDonateCoinExp(); + Task> GetDonateCoinExpAsync(); /// /// 获取VIP特权 @@ -36,6 +36,6 @@ public interface IDailyTaskApi : IBiliBiliApi /// /// [HttpPost("/x/vip/privilege/receive?type={type}&csrf={csrf}")] - Task ReceiveVipPrivilege(int type, string csrf); + Task ReceiveVipPrivilegeAsync(int type, string csrf); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs index 656972769..11e717f02 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs @@ -27,6 +27,6 @@ public interface IUserInfoApi : IBiliBiliApi /// uid /// [HttpGet("/x/space/wbi/acc/info")] - Task> GetSpaceInfo([PathQuery] GetSpaceInfoFullDto request); + Task> GetSpaceInfo([PathQuery] GetSpaceInfoDto request); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs index 5c9ab9053..7a21a4215 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs @@ -72,7 +72,7 @@ public interface IVideoApi : IBiliBiliApi [Header("Origin", "https://space.bilibili.com")] //[HttpGet("/x/space/wbi/arc/search?mid={upId}&ps={pageSize}&tid=0&pn={pageNumber}&keyword={keyword}&order=pubdate&platform=web&web_location=1550101&order_avoided=true&w_rid=5df06b1c48e2be86a96e9d0f99bf06f4&wts=1684854929")] [HttpGet("/x/space/wbi/arc/search")] - Task> SearchVideosByUpId([PathQuery] SearchVideosByUpIdFullDto request); + Task> SearchVideosByUpId([PathQuery] SearchVideosByUpIdDto request); /// /// 通过ssid获取番剧的具体信息 diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs index 3e762e179..64ad1687d 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs @@ -10,20 +10,32 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces /// 大会员大积分 /// [Header("Host", "api.bilibili.com")] - [Header("User-Agent", - "Mozilla/5.0 (Linux; Android 9; SM-N9700 Build/PQ3A.190605.04081832; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Safari/537.36 Mobile os/android model/SM-N9700 build/7300400 osVer/9 sdkInt/28 network/2 BiliApp/7300400 mobi_app/android channel/alifenfa Buvid/XY77D6C72ECDC63147110C5C8D1DA34D38CD1 sessionID/9795ed5c innerVer/7300400 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 7.30.0 os/android model/SM-N9700 mobi_app/android build/7300400 channel/alifenfa innerVer/7300400 osVer/9 network/2")] + [Header("User-Agent", "Mozilla/5.0 (Linux; Android 12; SM-S9080 Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36 os/android model/SM-S9080 build/7760700 osVer/12 sdkInt/32 network/2 BiliApp/7760700 mobi_app/android channel/bili Buvid/XZ286B42466A3AB0A8CC096DCF56101466E9A sessionID/811cdab4 innerVer/7760710 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 7.76.0 os/android model/SM-S9080 mobi_app/android build/7760700 channel/bili innerVer/7760710 osVer/12 network/2\nx-bili-trace-id: ba85aa511a87af24e23a771873662e7d:e23a771873662e7d:0:0")] [LogFilter] public interface IVipBigPointApi - { + { + /// + /// 获取任务列表 + /// + /// [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpGet("/x/vip_point/task/combine")] - Task> GetTaskList(); + Task> GetTaskListAsync(); - - [Header("Referer", "https://www.bilibili.com")] + /// + /// 签到任务 + /// + /// + /// + [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpPost("/pgc/activity/score/task/sign")] - Task Sign([FormContent] SignRequest request); - + Task SignAsync([FormContent] SignRequest request); + + /// + /// 领取任务 + /// + /// + /// [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpPost("/pgc/activity/score/task/receive")] Task Receive([JsonContent] ReceiveOrCompleteTaskRequest request); @@ -35,7 +47,7 @@ public interface IVipBigPointApi [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpPost("/pgc/activity/score/task/complete")] - Task Complete([JsonContent] ReceiveOrCompleteTaskRequest request); + Task CompleteAsync([JsonContent] ReceiveOrCompleteTaskRequest request); [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpPost("/pgc/activity/score/task/complete/v2")] @@ -48,11 +60,15 @@ public interface IVipBigPointApi [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] [HttpGet("/x/vip/privilege/my")] - Task> GetVouchersInfo(); - + Task> GetVouchersInfoAsync(); + + /// + /// 兑换大会员经验 + /// + /// + /// [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")] - // [Header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")] [HttpPost("/x/vip/experience/add")] - Task GetVipExperience([FormContent] VipExperienceRequest request); + Task ObtainVipExperienceAsync([FormContent] VipExperienceRequest request); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs index f5f2d5933..44e254d34 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs @@ -9,5 +9,5 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; public interface IVipMallApi { [HttpPost("/api/activity/fire/common/event/dispatch")] - Task ViewVipMall([JsonContent] ViewVipMallRequest request); + Task ViewVipMallAsync([JsonContent] ViewVipMallRequest request); } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs new file mode 100644 index 000000000..291454cb2 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; + +/// +/// 防爬 +/// +public interface IWbiService +{ + /// + /// 获取WbiKey + /// + /// + Task SetWridAsync(T ob) where T : IWrid; + + WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan = 0); +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs new file mode 100644 index 000000000..21171f05a --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text.RegularExpressions; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Infrastructure.Helpers; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; + +/// +/// 防爬 +/// +public class WbiService : IWbiService +{ + private readonly ILogger _logger; + private readonly IUserInfoApi _userInfoApi; + + public WbiService( + ILogger logger, + IUserInfoApi userInfoApi + ) + { + _logger = logger; + _userInfoApi = userInfoApi; + } + + public async Task SetWridAsync(T request) where T: IWrid + { + //生成字典 + Dictionary parameters = ObjectHelper.ObjectToDictionary(request); + parameters.Remove(nameof(IWrid.wts)); + parameters.Remove(nameof(IWrid.w_rid)); + + //根据当前用户信息取加密key + WbiImg wbi = await GetWbiKeysAsync(); + + //生成 + var re = EncWbi(parameters, wbi.ImgKey, wbi.SubKey); + + request.w_rid = re.w_rid; + request.wts = re.wts; + } + + /// + /// 为请求参数进行 wbi 签名 + /// + /// + /// + /// + /// + public WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan = 0) + { + var re = new WridDto(); + + var mixinKey = GetMixinKey(imgKey + subKey); + + if (timespan == 0) + { + re.wts = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + } + else + { + re.wts = timespan; + } + + var chrFilter = new Regex("[!'()*]"); + + var dic = new Dictionary + { + { "wts", re.wts.ToString() } + }; + + foreach (var entry in parameters) + { + var key = entry.Key; + var value = entry.Value.ToString(); + + var encodedValue = chrFilter.Replace(value, ""); + + dic.Add(Uri.EscapeDataString(key), Uri.EscapeDataString(encodedValue)); + } + + var keyList = dic.Keys.ToList(); + keyList.Sort(); + + var queryList = new List(); + foreach (var item in keyList) + { + var value = dic[item]; + queryList.Add($"{item}={value}"); + } + + var queryString = string.Join("&", queryList); + var md5Hasher = MD5.Create(); + var hashStr = queryString + mixinKey; + var hashedQueryString = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(hashStr)); + var wbiSign = BitConverter.ToString(hashedQueryString).Replace("-", "").ToLower(); + + re.w_rid = wbiSign; + + return re; + } + + + private async Task GetWbiKeysAsync() + { + BiliApiResponse apiResponse = await _userInfoApi.LoginByCookie(); + + UserInfo useInfo = apiResponse.Data; + + _logger.LogDebug("【img_url】{0}", useInfo.Wbi_img?.img_url); + _logger.LogDebug("【sub_url】{0}", useInfo.Wbi_img?.sub_url); + + return useInfo.Wbi_img; + } + + /// + /// 对 imgKey 和 subKey 进行字符顺序打乱编码 + /// + /// + /// + private string GetMixinKey(string orig) + { + int[] mixinKeyEncTab = new int[] + { + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39,12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 + }; + + var temp = new StringBuilder(); + foreach (var index in mixinKeyEncTab) + { + temp.Append(orig[index]); + } + return temp.ToString().Substring(0, 32); + } +} + +public class WridDto: IWrid +{ + public long wts { get; set; } + + public string w_rid { get; set; } +} + +public interface IWrid +{ + public long wts { get; set; } + + public string w_rid { get; set; } +} diff --git a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs index 8f5a2c12d..91baf9979 100644 --- a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs +++ b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs @@ -5,178 +5,179 @@ using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Polly; using Polly.Extensions.Http; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; using Ray.BiliBiliTool.Agent.HttpClientDelegatingHandlers; using Ray.BiliBiliTool.Agent.QingLong; using Ray.BiliBiliTool.Config.Options; -using Ray.BiliBiliTool.Infrastructure; using Ray.BiliBiliTool.Infrastructure.Cookie; -namespace Ray.BiliBiliTool.Agent.Extensions +namespace Ray.BiliBiliTool.Agent.Extensions; + +public static class ServiceCollectionExtension { - public static class ServiceCollectionExtension + /// + /// 注册强类型api客户端 + /// + /// + /// + public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, IConfiguration configuration) { - /// - /// 注册强类型api客户端 - /// - /// - /// - public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, IConfiguration configuration) + //Cookie + services.AddSingleton(sp => { - //Cookie - services.AddSingleton(sp => + var list = new List(); + var config = sp.GetRequiredService(); + + //兼容老版 + var old = config["BiliBiliCookie:CookieStr"]; + if (!string.IsNullOrWhiteSpace(old)) list.Add(old); + + var configList = config.GetSection("BiliBiliCookies") + .Get>() ?? new List() + .Where(x => !string.IsNullOrWhiteSpace(x)) + .ToList(); + list.AddRange(configList); + + return new CookieStrFactory(list); + }); + services.AddTransient(); + + //全局代理 + services.SetGlobalProxy(configuration); + + //DelegatingHandler + services.Scan(scan => scan + .FromAssemblyOf() + .AddClasses(classes => classes.AssignableTo()) + .AsSelf() + .WithTransientLifetime() + ); + + //服务 + services.AddScoped(); + + //bilibli + services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("https://manga.bilibili.com"); + services.AddBiliBiliClientApi("https://account.bilibili.com"); + services.AddBiliBiliClientApi("https://api.live.bilibili.com"); + services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("https://api.bilibili.com", false); + services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("http://passport.bilibili.com", false); + services.AddBiliBiliClientApi("https://live-trace.bilibili.com"); + services.AddBiliBiliClientApi("https://www.bilibili.com", false); + + // 添加注入 + services.AddBiliBiliClientApi("https://api.bilibili.com"); + services.AddBiliBiliClientApi("https://show.bilibili.com"); + + //qinglong + var qinglongHost = configuration["QL_URL"] ?? "http://localhost:5600"; + services + .AddHttpApi(o => { - var list = new List(); - var config = sp.GetRequiredService(); - - //兼容老版 - var old = config["BiliBiliCookie:CookieStr"]; - if (!string.IsNullOrWhiteSpace(old)) list.Add(old); + o.HttpHost = new Uri(qinglongHost); + o.UseDefaultUserAgent = false; + }) + .ConfigureHttpClient((sp, c) => + { + c.DefaultRequestHeaders.Add("User-Agent", + sp.GetRequiredService>().CurrentValue.UserAgent); + }) + .AddPolicyHandler(GetRetryPolicy()); - var configList = config.GetSection("BiliBiliCookies") - .Get>() ?? new List() - .Where(x => !string.IsNullOrWhiteSpace(x)) - .ToList(); - list.AddRange(configList); + return services; + } - return new CookieStrFactory(list); + /// + /// 封装Refit,默认将Cookie添加到Header中 + /// + /// + /// + /// + /// + private static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, string host, bool withCookie = true) + where TInterface : class + { + var uri = new Uri(host); + IHttpClientBuilder httpClientBuilder = services + .AddHttpApi(o => + { + o.HttpHost = uri; + o.UseDefaultUserAgent = false; + }) + .ConfigureHttpClient((sp, c) => + { + c.DefaultRequestHeaders.Add("User-Agent", + sp.GetRequiredService>().CurrentValue.UserAgent); + }) + .AddHttpMessageHandler() + .AddPolicyHandler(GetRetryPolicy()); + + if (withCookie) + httpClientBuilder.ConfigureHttpClient((sp, c) => + { + var ck = sp.GetRequiredService(); + c.DefaultRequestHeaders.Add("Cookie", ck.ToString()); }); - services.AddTransient(); - - //全局代理 - services.SetGlobalProxy(configuration); - - //DelegatingHandler - services.Scan(scan => scan - .FromAssemblyOf() - .AddClasses(classes => classes.AssignableTo()) - .AsSelf() - .WithTransientLifetime() - ); - - //bilibli - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("https://manga.bilibili.com"); - services.AddBiliBiliClientApi("https://account.bilibili.com"); - services.AddBiliBiliClientApi("https://api.live.bilibili.com"); - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("https://api.bilibili.com", false); - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("http://passport.bilibili.com", false); - services.AddBiliBiliClientApi("https://live-trace.bilibili.com"); - services.AddBiliBiliClientApi("https://www.bilibili.com", false); - - // 添加注入 - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("https://show.bilibili.com"); - - //qinglong - var qinglongHost = configuration["QL_URL"] ?? "http://localhost:5600"; - services - .AddHttpApi(o => - { - o.HttpHost = new Uri(qinglongHost); - o.UseDefaultUserAgent = false; - }) - .ConfigureHttpClient((sp, c) => - { - c.DefaultRequestHeaders.Add("User-Agent", - sp.GetRequiredService>().CurrentValue.UserAgent); - }) - .AddPolicyHandler(GetRetryPolicy()); - return services; - } + return services; + } - /// - /// 封装Refit,默认将Cookie添加到Header中 - /// - /// - /// - /// - /// - private static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, string host, bool withCookie = true) - where TInterface : class + /// + /// 设置全局代理(如果配置了代理) + /// + /// + /// + private static IServiceCollection SetGlobalProxy(this IServiceCollection services, IConfiguration configuration) + { + string proxyAddress = configuration["Security:WebProxy"]; + if (proxyAddress.IsNotNullOrEmpty()) { - var uri = new Uri(host); - IHttpClientBuilder httpClientBuilder = services - .AddHttpApi(o => - { - o.HttpHost = uri; - o.UseDefaultUserAgent = false; - }) - .ConfigureHttpClient((sp, c) => - { - c.DefaultRequestHeaders.Add("User-Agent", - sp.GetRequiredService>().CurrentValue.UserAgent); - }) - .AddHttpMessageHandler() - .AddPolicyHandler(GetRetryPolicy()); - - if (withCookie) - httpClientBuilder.ConfigureHttpClient((sp, c) => - { - var ck = sp.GetRequiredService(); - c.DefaultRequestHeaders.Add("Cookie", ck.ToString()); - }); - - return services; - } + WebProxy webProxy = new WebProxy(); - /// - /// 设置全局代理(如果配置了代理) - /// - /// - /// - private static IServiceCollection SetGlobalProxy(this IServiceCollection services, IConfiguration configuration) - { - string proxyAddress = configuration["Security:WebProxy"]; - if (proxyAddress.IsNotNullOrEmpty()) + //user:password@host:port http proxy only .Tested with tinyproxy-1.11.0-rc1 + if (proxyAddress.Contains("@")) { - WebProxy webProxy = new WebProxy(); + string userPass = proxyAddress.Split("@")[0]; + string address = proxyAddress.Split("@")[1]; - //user:password@host:port http proxy only .Tested with tinyproxy-1.11.0-rc1 - if (proxyAddress.Contains("@")) - { - string userPass = proxyAddress.Split("@")[0]; - string address = proxyAddress.Split("@")[1]; - - string proxyUser = ""; - string proxyPass = ""; - if (userPass.Contains(":")) - { - proxyUser = userPass?.Split(":")[0]; - proxyPass = userPass?.Split(":")[1]; - } - - webProxy.Address = new Uri("http://" + address); - webProxy.Credentials = new NetworkCredential(proxyUser, proxyPass); - } - else + string proxyUser = ""; + string proxyPass = ""; + if (userPass.Contains(":")) { - webProxy.Address = new Uri(proxyAddress); + proxyUser = userPass?.Split(":")[0]; + proxyPass = userPass?.Split(":")[1]; } - HttpClient.DefaultProxy = webProxy; + webProxy.Address = new Uri("http://" + address); + webProxy.Credentials = new NetworkCredential(proxyUser, proxyPass); + } + else + { + webProxy.Address = new Uri(proxyAddress); } - return services; + HttpClient.DefaultProxy = webProxy; } - static IAsyncPolicy GetRetryPolicy() - { - return HttpPolicyExtensions - .HandleTransientHttpError() - .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) - .WaitAndRetryAsync(1, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, - retryAttempt))); - } + return services; + } + + static IAsyncPolicy GetRetryPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(1, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, + retryAttempt))); } } diff --git a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs index 6d4f63c81..bd8276b31 100644 --- a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs @@ -62,7 +62,7 @@ public VipBigPointAppService( public async Task VipExpress() { _logger.LogInformation("大会员经验领取任务开始"); - var re = await _vipApi.GetVouchersInfo(); + var re = await _vipApi.GetVouchersInfoAsync(); if (re.Code == 0) { var state = re.Data.List.Find(x => x.Type == 9).State; @@ -85,7 +85,7 @@ public async Task VipExpress() case 0: _logger.LogInformation("大会员经验未兑换"); //兑换api - var response = await _vipApi.GetVipExperience(new VipExperienceRequest() + var response = await _vipApi.ObtainVipExperienceAsync(new VipExperienceRequest() { csrf = _biliCookie.BiliJct }); @@ -118,7 +118,7 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) return; } - var re = await _vipApi.GetTaskList(); + var re = await _vipApi.GetTaskListAsync(); if (re.Code != 0) throw new Exception(re.ToJsonStr()); @@ -177,11 +177,11 @@ private async Task Sign(VipTaskInfo info) return info; } - var re = await _vipApi.Sign(new SignRequest()); + var re = await _vipApi.SignAsync(new SignRequest()); if (re.Code != 0) throw new Exception(re.ToJsonStr()); //确认 - var infoResult = await _vipApi.GetTaskList(); + var infoResult = await _vipApi.GetTaskListAsync(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); info = infoResult.Data; @@ -217,7 +217,7 @@ private async Task Bonus(VipTaskInfo info) //确认 if (re) { - var infoResult = await _vipApi.GetTaskList(); + var infoResult = await _vipApi.GetTaskListAsync(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); info = infoResult.Data; bonusTask = GetTarget(info); @@ -260,7 +260,7 @@ private async Task Privilege(VipTaskInfo info) //确认 if (re) { - var infoResult = await _vipApi.GetTaskList(); + var infoResult = await _vipApi.GetTaskListAsync(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); info = infoResult.Data; privilegeTask = GetTarget(info); @@ -305,7 +305,7 @@ private async Task ViewAnimate(VipTaskInfo info) //确认 if (re) { - var infoResult = await _vipApi.GetTaskList(); + var infoResult = await _vipApi.GetTaskListAsync(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); info = infoResult.Data; targetTask = GetTarget(info); @@ -343,7 +343,7 @@ private async Task ViewVipMall(VipTaskInfo info) } _logger.LogInformation("开始完成任务"); - var re = await _vipMallApi.ViewVipMall(new ViewVipMallRequest() + var re = await _vipMallApi.ViewVipMallAsync(new ViewVipMallRequest() { Csrf = _biliCookie.BiliJct }); @@ -352,7 +352,7 @@ private async Task ViewVipMall(VipTaskInfo info) //确认 if (re.Code == 0) { - var infoResult = await _vipApi.GetTaskList(); + var infoResult = await _vipApi.GetTaskListAsync(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); info = infoResult.Data; targetTask = GetTarget(info); @@ -490,7 +490,7 @@ private async Task ViewDressMall(VipTaskInfo info) //确认 if (re) { - var infoResult = await _vipApi.GetTaskList(); + var infoResult = await _vipApi.GetTaskListAsync(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr()); info = infoResult.Data; targetTask = GetTarget(info); @@ -534,7 +534,7 @@ private async Task TryReceive(string taskCode) private async Task Complete(string taskCode) { var request = new ReceiveOrCompleteTaskRequest(taskCode); - var re = await _vipApi.Complete(request); + var re = await _vipApi.CompleteAsync(request); if (re.Code == 0) { _logger.LogInformation("已完成"); diff --git a/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs b/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs index e6d12dae5..c37ba98b4 100644 --- a/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs @@ -88,7 +88,7 @@ public async Task LoginByCookie() public async Task GetDailyTaskStatus() { DailyTaskInfo result = new(); - BiliApiResponse apiResponse = await _dailyTaskApi.GetDailyTaskRewardInfo(); + BiliApiResponse apiResponse = await _dailyTaskApi.GetDailyTaskRewardInfoAsync(); if (apiResponse.Code == 0) { _logger.LogDebug("请求本日任务完成状态成功"); @@ -97,7 +97,7 @@ public async Task GetDailyTaskStatus() else { _logger.LogWarning("获取今日任务完成状态失败:{result}", apiResponse.ToJsonStr()); - result = (await _dailyTaskApi.GetDailyTaskRewardInfo()).Data; + result = (await _dailyTaskApi.GetDailyTaskRewardInfoAsync()).Data; //todo:偶发性请求失败,再请求一次,这么写很丑陋,待用polly再框架层面实现 } diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index 2ff253492..79ec73510 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -10,6 +10,7 @@ using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.DomainService.Interfaces; @@ -23,7 +24,7 @@ public class ArticleDomainService : IArticleDomainService private readonly DailyTaskOptions _dailyTaskOptions; private readonly ICoinDomainService _coinDomainService; private readonly IAccountApi _accountApi; - private readonly IWbiDomainService _wbiDomainService; + private readonly IWbiService _wbiService; /// @@ -42,21 +43,21 @@ public ArticleDomainService( ILogger logger, IOptionsMonitor dailyTaskOptions, ICoinDomainService coinDomainService, - IAccountApi accountApi, IWbiDomainService wbiDomainService) + IAccountApi accountApi, IWbiService wbiService) { _articleApi = articleApi; _biliCookie = biliCookie; _logger = logger; _coinDomainService = coinDomainService; _accountApi = accountApi; - _wbiDomainService = wbiDomainService; + _wbiService = wbiService; _dailyTaskOptions = dailyTaskOptions.CurrentValue; } public async Task LikeArticle(long cvid) { - await _articleApi.Like(cvid, _biliCookie.BiliJct); + await _articleApi.LikeAsync(cvid, _biliCookie.BiliJct); } /// @@ -117,7 +118,7 @@ public async Task AddCoinForArticles() } - _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0); + _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalanceAsync()).Data.Money ?? 0); return true; } @@ -135,7 +136,7 @@ public async Task AddCoinForArticle(long cvid, long mid) try { var refer = $"https://www.bilibili.com/read/cv{cvid}/?from=search&spm_id_from=333.337.0.0"; - result = await _articleApi.AddCoinForArticle(new AddCoinForArticleRequest(cvid, mid, _biliCookie.BiliJct), + result = await _articleApi.AddCoinForArticleAsync(new AddCoinForArticleRequest(cvid, mid, _biliCookie.BiliJct), refer); } catch (Exception) @@ -183,18 +184,9 @@ private async Task GetRandomArticleFromUp(long mid) ps = 1, pn = new Random().Next(1, articleCount + 1) }; - var w_ridDto = await _wbiDomainService.GetWridAsync(req); + await _wbiService.SetWridAsync(req); - var fullDto = new SearchArticlesByUpIdFullDto() - { - mid = mid, - ps = req.ps, - pn = req.pn, - w_rid = w_ridDto.w_rid, - wts = w_ridDto.wts - }; - - BiliApiResponse re = await _articleApi.SearchUpArticlesByUpId(fullDto); + BiliApiResponse re = await _articleApi.SearchUpArticlesByUpIdAsync(req); if (re.Code != 0) { @@ -264,16 +256,9 @@ private async Task GetArticleCountOfUp(long mid) mid = mid }; - var w_ridDto = await _wbiDomainService.GetWridAsync(req); - - var fullDto = new SearchArticlesByUpIdFullDto() - { - mid = mid, - w_rid = w_ridDto.w_rid, - wts = w_ridDto.wts - }; + await _wbiService.SetWridAsync(req); - BiliApiResponse re = await _articleApi.SearchUpArticlesByUpId(fullDto); + BiliApiResponse re = await _articleApi.SearchUpArticlesByUpIdAsync(req); if (re.Code != 0) { @@ -376,7 +361,7 @@ private async Task IsCanDonate(long cvid) if (!_alreadyDonatedCoinCountCatch.TryGetValue(cvid.ToString(), out int multiply)) { - multiply = (await _articleApi.SearchArticleInfo(cvid)).Data.Coin; + multiply = (await _articleApi.SearchArticleInfoAsync(cvid)).Data.Coin; _alreadyDonatedCoinCountCatch.TryAdd(cvid.ToString(), multiply); } diff --git a/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs index 37fec6205..486d26f56 100644 --- a/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs @@ -88,7 +88,7 @@ public async Task Charge(UserInfo userInfo) var request = new ChargeRequest(couponBalance, long.Parse(targetUpId), _cookie.BiliJct); //BiliApiResponse response = await _chargeApi.Charge(decimal.ToInt32(couponBalance * 10), _dailyTaskOptions.AutoChargeUpId, _cookieOptions.UserId, _cookieOptions.BiliJct); - BiliApiResponse response = await _chargeApi.ChargeV2(request); + BiliApiResponse response = await _chargeApi.ChargeV2Async(request); if (response.Code == 0) { @@ -123,7 +123,7 @@ public async Task ChargeComments(string orderNum) { var comment = _dailyTaskOptions.ChargeComment ?? ""; var request = new ChargeCommentRequest(orderNum, comment, _cookie.BiliJct); - await _chargeApi.ChargeComment(request); + await _chargeApi.ChargeCommentAsync(request); _logger.LogInformation("【留言】{comment}", comment); } diff --git a/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs index 4eb8c6461..c8228ab2d 100644 --- a/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs @@ -27,7 +27,7 @@ IDailyTaskApi dailyTaskApi /// public async Task GetCoinBalance() { - var response = await _accountApi.GetCoinBalance(); + var response = await _accountApi.GetCoinBalanceAsync(); return response.Data.Money ?? 0; } @@ -47,7 +47,7 @@ public async Task GetDonatedCoins() /// private async Task GetDonateCoinExp() { - return (await _dailyTaskApi.GetDonateCoinExp()).Data; + return (await _dailyTaskApi.GetDonateCoinExpAsync()).Data; } #endregion } diff --git a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs index c989c595f..7e3eb9b70 100644 --- a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs @@ -128,7 +128,7 @@ public async Task AddCoinsForVideos() else _logger.LogInformation("投币尝试超过10次,已终止"); - _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0); + _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalanceAsync()).Data.Money ?? 0); } /// diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs deleted file mode 100644 index a865fe5ea..000000000 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; - -namespace Ray.BiliBiliTool.DomainService.Interfaces -{ - /// - /// 账户 - /// - public interface IWbiDomainService : IDomainService - { - /// - /// 获取WbiKey - /// - /// - Task GetWridAsync(object ob); - - Task GetWbiKeysAsync(); - - string GetMixinKey(string orig); - - WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan = 0); - } -} diff --git a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs index 6cf387596..7acdc3ec3 100644 --- a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs @@ -11,6 +11,7 @@ using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Live; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Relation; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.DomainService.Dtos; using Ray.BiliBiliTool.DomainService.Interfaces; @@ -33,7 +34,7 @@ public class LiveDomainService : ILiveDomainService private readonly DailyTaskOptions _dailyTaskOptions; private readonly SecurityOptions _securityOptions; private readonly BiliCookie _biliCookie; - private readonly IWbiDomainService _wbiDomainService; + private readonly IWbiService _wbiService; public LiveDomainService(ILogger logger, ILiveApi liveApi, @@ -44,7 +45,7 @@ public LiveDomainService(ILogger logger, IOptionsMonitor liveLotteryTaskOptions, IOptionsMonitor liveFansMedalTaskOptions, IOptionsMonitor securityOptions, - IWbiDomainService wbiDomainService, + IWbiService wbiService, BiliCookie biliCookie) { _logger = logger; @@ -56,7 +57,7 @@ public LiveDomainService(ILogger logger, _dailyTaskOptions = dailyTaskOptions.CurrentValue; _liveFansMedalTaskOptions = liveFansMedalTaskOptions.CurrentValue; _securityOptions = securityOptions.CurrentValue; - _wbiDomainService = wbiDomainService; + _wbiService = wbiService; _biliCookie = biliCookie; } @@ -413,16 +414,9 @@ public async Task SendDanmakuToFansMedalLive() { mid = liveHostUserId }; + await _wbiService.SetWridAsync(req); - - var w_ridDto = await _wbiDomainService.GetWridAsync(req); - var fullDto = new GetSpaceInfoFullDto() - { - mid = liveHostUserId, - w_rid = w_ridDto.w_rid, - wts = w_ridDto.wts - }; - var spaceInfo = await _userInfoApi.GetSpaceInfo(fullDto); + var spaceInfo = await _userInfoApi.GetSpaceInfo(req); if (spaceInfo.Code != 0) { _logger.LogError("【获取直播间信息】失败"); @@ -597,16 +591,9 @@ private async Task> GetFansMedalInfoList() { mid = liveHostUserId }; + await _wbiService.SetWridAsync(req); - - var w_ridDto = await _wbiDomainService.GetWridAsync(req); - var fullDto = new GetSpaceInfoFullDto() - { - mid = liveHostUserId, - w_rid = w_ridDto.w_rid, - wts = w_ridDto.wts - }; - var spaceInfo = await _userInfoApi.GetSpaceInfo(fullDto); + var spaceInfo = await _userInfoApi.GetSpaceInfo(req); if (spaceInfo.Code != 0) { _logger.LogError("【获取空间信息】失败"); diff --git a/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs b/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs index 90c3d3925..35a809451 100644 --- a/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs @@ -8,6 +8,7 @@ using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; using Ray.BiliBiliTool.Config; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.DomainService.Dtos; @@ -28,7 +29,7 @@ public class VideoDomainService : IVideoDomainService private readonly IRelationApi _relationApi; private readonly IVideoApi _videoApi; private readonly IVideoWithoutCookieApi _videoWithoutCookieApi; - private readonly IWbiDomainService _wbiDomainService; + private readonly IWbiService _wbiService; public VideoDomainService( ILogger logger, @@ -39,7 +40,7 @@ public VideoDomainService( IRelationApi relationApi, IVideoApi videoApi, IVideoWithoutCookieApi videoWithoutCookieApi, - IWbiDomainService wbiDomainService + IWbiService wbiService ) { _logger = logger; @@ -47,7 +48,7 @@ IWbiDomainService wbiDomainService _relationApi = relationApi; _videoApi = videoApi; _videoWithoutCookieApi = videoWithoutCookieApi; - _wbiDomainService = wbiDomainService; + _wbiService = wbiService; _biliBiliCookie = biliBiliCookie; _expDic = dicOptions.Get(Constants.OptionsNames.ExpDictionaryName); _dailyTaskOptions = dailyTaskOptions.CurrentValue; @@ -86,20 +87,9 @@ public async Task GetRandomVideoOfUp(long upId, int total) ps = 1, pn= new Random().Next(1, total + 1) }; + await _wbiService.SetWridAsync(req); - var w_ridDto = await _wbiDomainService.GetWridAsync(req); - - var fullDto = new SearchVideosByUpIdFullDto - { - mid = upId, - ps = req.ps, - pn = req.pn, - - w_rid = w_ridDto.w_rid, - wts = w_ridDto.wts, - }; - - BiliApiResponse re = await _videoApi.SearchVideosByUpId(fullDto); + BiliApiResponse re = await _videoApi.SearchVideosByUpId(req); if (re.Code != 0) { @@ -120,17 +110,9 @@ public async Task GetVideoCountOfUp(long upId) { mid = upId }; + await _wbiService.SetWridAsync(req); - var w_ridDto = await _wbiDomainService.GetWridAsync(req); - - var fullDto = new SearchVideosByUpIdFullDto - { - mid = upId, - w_rid = w_ridDto.w_rid, - wts = w_ridDto.wts, - }; - - BiliApiResponse re = await _videoApi.SearchVideosByUpId(fullDto); + BiliApiResponse re = await _videoApi.SearchVideosByUpId(req); if (re.Code != 0) { throw new Exception(re.Message); diff --git a/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs index 2740c9ffe..b64759c7f 100644 --- a/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs @@ -70,8 +70,8 @@ public async Task ReceiveVipPrivilege(UserInfo userInfo) } */ - var suc1 = await ReceiveVipPrivilege(1); - var suc2 = await ReceiveVipPrivilege(2); + var suc1 = await ReceiveVipPrivilege(VipPrivilegeType.BCoinCoupon); + var suc2 = await ReceiveVipPrivilege(VipPrivilegeType.MembershipBenefits); if (suc1 | suc2) return true; return false; @@ -83,9 +83,9 @@ public async Task ReceiveVipPrivilege(UserInfo userInfo) /// 领取大会员每月赠送福利 /// /// 1.大会员B币券;2.大会员福利 - private async Task ReceiveVipPrivilege(int type) + private async Task ReceiveVipPrivilege(VipPrivilegeType type) { - var response = await _dailyTaskApi.ReceiveVipPrivilege(type, _biliBiliCookie.BiliJct); + var response = await _dailyTaskApi.ReceiveVipPrivilegeAsync((int)type, _biliBiliCookie.BiliJct); var name = GetPrivilegeName(type); _logger.LogInformation("【领取】{name}", name); @@ -108,14 +108,14 @@ private async Task ReceiveVipPrivilege(int type) /// /// /// - private string GetPrivilegeName(int type) + private string GetPrivilegeName(VipPrivilegeType type) { switch (type) { - case 1: + case VipPrivilegeType.BCoinCoupon: return "年度大会员每月赠送的B币券"; - case 2: + case VipPrivilegeType.MembershipBenefits: return "大会员福利/权益"; } diff --git a/src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs b/src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs deleted file mode 100644 index 5700da450..000000000 --- a/src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Cryptography; -using System.Text.RegularExpressions; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Ray.BiliBiliTool.Agent; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Relation; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; -using Ray.BiliBiliTool.Config; -using Ray.BiliBiliTool.Config.Options; -using Ray.BiliBiliTool.DomainService.Interfaces; -using System.Reflection; -using Ray.BiliBiliTool.Infrastructure.Helpers; - -namespace Ray.BiliBiliTool.DomainService -{ - /// - /// 账户 - /// - public class WbiDomainService : IWbiDomainService - { - private readonly ILogger _logger; - private readonly IDailyTaskApi _dailyTaskApi; - private readonly IUserInfoApi _userInfoApi; - private readonly IRelationApi _relationApi; - private readonly UnfollowBatchedTaskOptions _unfollowBatchedTaskOptions; - private readonly BiliCookie _cookie; - - public WbiDomainService( - ILogger logger, - IDailyTaskApi dailyTaskApi, - BiliCookie cookie, - IUserInfoApi userInfoApi, - IRelationApi relationApi, - IOptionsMonitor unfollowBatchedTaskOptions - ) - { - _logger = logger; - _dailyTaskApi = dailyTaskApi; - _cookie = cookie; - _userInfoApi = userInfoApi; - _relationApi = relationApi; - _unfollowBatchedTaskOptions = unfollowBatchedTaskOptions.CurrentValue; - } - - public async Task GetWridAsync(object ob) - { - var parameters = ObjectHelper.ObjectToDictionary(ob); - - var wbi = await GetWbiKeysAsync(); - - var re = EncWbi(parameters, wbi.GetImgKey(), wbi.GetSubKey()); - - return re; - } - - public async Task GetWbiKeysAsync() - { - BiliApiResponse apiResponse = await _userInfoApi.LoginByCookie(); - - UserInfo useInfo = apiResponse.Data; - - _logger.LogDebug("【img_url】{0}", useInfo.Wbi_img?.img_url); - _logger.LogDebug("【sub_url】{0}", useInfo.Wbi_img?.sub_url); - - return useInfo.Wbi_img; - } - - /// - /// 对 imgKey 和 subKey 进行字符顺序打乱编码 - /// - /// - /// - public string GetMixinKey(string orig) - { - int[] mixinKeyEncTab = new int[] - { - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39,12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 - }; - - var temp = new StringBuilder(); - foreach (var index in mixinKeyEncTab) - { - temp.Append(orig[index]); - } - return temp.ToString().Substring(0, 32); - } - - /// - /// 为请求参数进行 wbi 签名 - /// - /// - /// - /// - /// - public WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan=0) - { - WridDto re=new WridDto(); - - var mixinKey = GetMixinKey(imgKey + subKey); - - if (timespan == 0) - { - re.wts = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; - } - else - { - re.wts = timespan; - } - - var chrFilter = new Regex("[!'()*]"); - - var dic=new Dictionary(); - dic.Add("wts", re.wts.ToString()); - - foreach (var entry in parameters) - { - var key = entry.Key; - var value = entry.Value.ToString(); - - var encodedValue = chrFilter.Replace(value, ""); - - dic.Add(Uri.EscapeDataString(key), Uri.EscapeDataString(encodedValue)); - } - - var keyList= dic.Keys.ToList(); - keyList.Sort(); - - var queryList = new List(); - foreach (var item in keyList) - { - var value = dic[item]; - queryList.Add($"{item}={value}"); - } - - var queryString = string.Join("&", queryList); - var md5Hasher = MD5.Create(); - var hashStr = queryString + mixinKey; - var hashedQueryString = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(hashStr)); - var wbiSign = BitConverter.ToString(hashedQueryString).Replace("-", "").ToLower(); - - re.w_rid = wbiSign; - - return re; - } - } - - public class WridDto - { - public long wts { get; set; } - - public string w_rid { get; set; } - } -} diff --git a/test/BiliAgentTest/LiveApiTest.cs b/test/BiliAgentTest/LiveApiTest.cs index 5cbf686d8..6aabd4b27 100644 --- a/test/BiliAgentTest/LiveApiTest.cs +++ b/test/BiliAgentTest/LiveApiTest.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Ray.BiliBiliTool.Infrastructure.Cookie; using Xunit; -using Ray.BiliBiliTool.DomainService.Interfaces; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; namespace BiliAgentTest { @@ -132,25 +132,17 @@ public async Task GetSpaceInfo_Normal_Success() var api = scope.ServiceProvider.GetRequiredService(); var biliCookie = scope.ServiceProvider.GetRequiredService(); - var domainService = scope.ServiceProvider.GetRequiredService(); + var wbiService = scope.ServiceProvider.GetRequiredService(); var req = new GetSpaceInfoDto() { mid = 919174L }; - var w_ridDto = await domainService.GetWridAsync(req); - - var fullDto = new GetSpaceInfoFullDto() - { - mid = 919174L, - w_rid = w_ridDto.w_rid, - wts = w_ridDto.wts - }; - + await wbiService.SetWridAsync(req); - BiliApiResponse re = api.GetSpaceInfo(fullDto).Result; + BiliApiResponse re = api.GetSpaceInfo(req).Result; Assert.True(re.Code == 0); Assert.NotNull(re.Data); diff --git a/test/BiliAgentTest/VideoApiTest.cs b/test/BiliAgentTest/VideoApiTest.cs index 512d35133..4058926a2 100644 --- a/test/BiliAgentTest/VideoApiTest.cs +++ b/test/BiliAgentTest/VideoApiTest.cs @@ -1,69 +1,64 @@ using Microsoft.Extensions.DependencyInjection; -using Ray.BiliBiliTool.Agent; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Live; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; using Ray.BiliBiliTool.Console; using Ray.BiliBiliTool.Infrastructure; -using System; -using System.Diagnostics; using System.Threading.Tasks; using Ray.BiliBiliTool.Infrastructure.Cookie; using Xunit; -namespace BiliAgentTest +namespace BiliAgentTest; + +public class VideoApiTest { - public class VideoApiTest + public VideoApiTest() { - public VideoApiTest() - { - Program.CreateHost(new[] { "--ENVIRONMENT=Development" });//Ĭ��Prd����������ָ��ΪDev�󣬿��Զ�ȡ���û��������� - } + Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); + } - [Fact] - public void GetLiveWalletStatus_Normal_Success() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); + [Fact] + public void GetLiveWalletStatus_Normal_Success() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); - var req = new GetAlreadyDonatedCoinsRequest(248097491); - BiliApiResponse? re = api.GetDonatedCoinsForVideo(req).Result; + var req = new GetAlreadyDonatedCoinsRequest(248097491); + BiliApiResponse? re = api.GetDonatedCoinsForVideo(req).Result; - if (ck.Count > 0) - { - Assert.True(re.Code == 0 && re.Data.Multiply >= 0); - } - else - { - Assert.False(re.Code != 0); - } + if (ck.Count > 0) + { + Assert.True(re.Code == 0 && re.Data.Multiply >= 0); } - - [Fact] - public async Task GetBangumiTest() + else { + Assert.False(re.Code != 0); + } + } + + [Fact] + public async Task GetBangumiTest() + { - using var scope = Global.ServiceProviderRoot.CreateScope(); + using var scope = Global.ServiceProviderRoot.CreateScope(); - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); - var req = await api.GetBangumiBySsid(46508); + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + var req = await api.GetBangumiBySsid(46508); - Assert.Equal(0,req.Code); - } - - [Fact] - public async Task GetRandomVideoOfRanking() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); + Assert.Equal(0,req.Code); + } + + [Fact] + public async Task GetRandomVideoOfRanking() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); - var req = await api.GetRegionRankingVideosV2(); + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + var req = await api.GetRegionRankingVideosV2(); - Assert.Equal(0, req.Code); - } + Assert.Equal(0, req.Code); } } diff --git a/test/BiliAgentTest/VipApiTest.cs b/test/BiliAgentTest/VipApiTest.cs deleted file mode 100644 index 793fa0531..000000000 --- a/test/BiliAgentTest/VipApiTest.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System.Threading.Tasks; -using Xunit; -using Microsoft.Extensions.DependencyInjection; -using Ray.BiliBiliTool.Agent; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; -using Ray.BiliBiliTool.Console; -using Ray.BiliBiliTool.Infrastructure; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; -using Xunit.Abstractions; -using System; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall; - -namespace BiliAgentTest; - -public class VipApiTest -{ - private readonly ITestOutputHelper _output; - public VipApiTest(ITestOutputHelper output) - { - _output = output; - Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); - } - - [Fact] - public async Task SignTaskTest() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); - - var re = await api.Sign(new SignRequest() - { - // Csrf = ck.BiliJct - }); - _output.WriteLine(re.ToJsonStr()); - Assert.Equal(0, re.Code); - } - - [Fact] - public async Task VipInfoTest() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); - - var re = await api.GetVouchersInfo(); - if (re.Code == 0) - { - var info = re.Data.List.Find(x => x.Type == 9); - if (info != null) - { - _output.WriteLine(info.State.ToString()); - } - else - { - _output.WriteLine("error"); - } - } - } - - - [Fact] - public async Task GetVipExperienceTest() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); - var re = await api.GetVipExperience(new VipExperienceRequest() - { - csrf = ck.BiliJct - }); - - _output.WriteLine(re.Message); - } - - [Fact] - public async Task ViewVipMallTest() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); - // var test = await api.ViewvipMall("{\r\n\"csrf\":\"33e5d4564b6b69cb4ed829bc404158cb\",\r\n\"eventId\":\"hevent_oy4b7h3epeb\"\r\n}"); - var re = await api.ViewVipMall(new ViewVipMallRequest() - { - Csrf = ck.BiliJct, - EventId = "hevent_oy4b7h3epeb" - }); - _output.WriteLine(re.Message); - - } - - [Fact] - public async Task DressViewTest() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - - var ck = scope.ServiceProvider.GetRequiredService(); - var api = scope.ServiceProvider.GetRequiredService(); - var re = await api.Complete(new ReceiveOrCompleteTaskRequest( - "dress-view")); - _output.WriteLine(re.Message); - } -} diff --git a/test/DomainServiceTest/WbiDomainServiceTest.cs b/test/DomainServiceTest/WbiDomainServiceTest.cs deleted file mode 100644 index 2ae0008db..000000000 --- a/test/DomainServiceTest/WbiDomainServiceTest.cs +++ /dev/null @@ -1,73 +0,0 @@ - -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video; -using Ray.BiliBiliTool.Infrastructure.Helpers; -using Ray.Infrastructure.Helpers; - -namespace DomainServiceTest -{ - public class WbiDomainServiceTest - { - public WbiDomainServiceTest() - { - Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); - } - - [Fact] - public async Task EncWbi_Test() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - var config = Global.ConfigurationRoot; - var domainService = scope.ServiceProvider.GetRequiredService(); - - var upId = 1585227649; - - var req = new SearchVideosByUpIdDto() - { - mid = upId, - ps = 30, - tid = 0, - pn = 1, - keyword = "", - order = "pubdate", - platform = "web", - web_location = 1550101, - order_avoided = "true" - }; - - //var wbiDto= await domainService.GetWbiKeysAsync(); - WbiImg wbiDto= new WbiImg() - { - img_url = "https://i0.hdslb.com/bfs/wbi/9cd4224d4fe74c7e9d6963e2ef891688.png", - sub_url = "https://i0.hdslb.com/bfs/wbi/263655ae2cad4cce95c9c401981b044a.png" - }; - var dic = ObjectHelper.ObjectToDictionary(req); - //dic.Remove("keyword"); - var re = domainService.EncWbi(dic, wbiDto.GetImgKey(),wbiDto.GetSubKey(), 1684866934); - - Assert.Equal(re.w_rid, "8dca01c5633c1ed8cda9566b8502ca03"); - } - - [Fact] - public async Task EncWbi_Test2() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - var domainService = scope.ServiceProvider.GetRequiredService(); - - WbiImg wbiDto = new WbiImg() - { - img_url= "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png", - sub_url = "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png" - }; - var dic = new Dictionary() - { - {"foo", "114"}, - {"bar", "514"}, - {"baz", "1919810"}, - }; - var re = domainService.EncWbi(dic, wbiDto.GetImgKey(), wbiDto.GetSubKey(), 1684746387); - - Assert.Equal(re.w_rid, "d3cbd2a2316089117134038bf4caf442"); - } - } -} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs new file mode 100644 index 000000000..dbb419d08 --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs @@ -0,0 +1,38 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Console; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class AccountApiTests +{ + private readonly IAccountApi _api; + + public AccountApiTests() + { + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _api = host.Services.GetRequiredService(); + } + + [Fact] + public async Task GetCoinBalance_Normal_GetCoinBalance() + { + // Act + BiliApiResponse re = await _api.GetCoinBalanceAsync(); + + // Arrange + + // Assert + re.Code.Should().Be(0); + re.Data.Money.Should().IsNotNull(); + } +} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs new file mode 100644 index 000000000..9697c19df --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs @@ -0,0 +1,145 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; +using Ray.BiliBiliTool.Console; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class ArticleApiTests +{ + private readonly IArticleApi _api; + + private readonly BiliCookie _ck; + private readonly IWbiService _wbiService; + + public ArticleApiTests() + { + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _ck = host.Services.GetRequiredService(); + _wbiService = host.Services.GetRequiredService(); + _api = host.Services.GetRequiredService(); + } + + #region SearchUpArticlesByUpIdAsync + + [Fact] + public async Task SearchUpArticlesByUpIdAsync_InputId_GetResultSuccess() + { + // Arrange + var mid = 1585227649; + var req = new SearchArticlesByUpIdDto() + { + mid = mid, + }; + await _wbiService.SetWridAsync(req); + + // Act + BiliApiResponse re = await _api.SearchUpArticlesByUpIdAsync(req); + + // Assert + re.Code.Should().Be(0); + re.Data.Count.Should().BeGreaterThan(0); + } + + #endregion + + #region SearchArticleInfoAsync + + [Fact] + public async Task SearchArticleInfoAsync_ValidId_GetResultSuccess() + { + // Arrange + var cvid = 34150576; + + // Act + var re = await _api.SearchArticleInfoAsync(cvid); + + // Assert + re.Code.Should().Be(0); + re.Data.Mid.Should().BeGreaterThan(0); + re.Data.Like.Should().BeGreaterThanOrEqualTo(1); + } + + [Fact] + public async Task SearchArticleInfoAsync_InvalidId_NoResult() + { + // Arrange + var cvid = 123; + + // Act + var re = await _api.SearchArticleInfoAsync(cvid); + + // Assert + re.Code.Should().Be(-404); + re.Data.Should().IsNull(); + re.Message.Should().BeEquivalentTo("啥都木有"); + } + + #endregion + + + #region AddCoinForArticleAsync + + [Fact] + public async Task AddCoinForArticleAsync_CoinSelf_Fail() + { + // Arrange + var selfCvId = 34150576;//todo + var req = new AddCoinForArticleRequest(selfCvId, long.Parse(_ck.UserId), _ck.BiliJct); + + // Act + BiliBiliAgent.Dtos.BiliApiResponse re = await _api.AddCoinForArticleAsync(req); + + // Assert + re.Code.Should().Be(34002); + re.Message.Should().BeEquivalentTo("up主不能自己投币"); + } + + [Fact] + public async Task AddCoinForArticleAsync_Normal_Success() + { + // Arrange + var cvId = 34049005;//todo + var upId = 25150765;//todo + var req = new AddCoinForArticleRequest(cvId, upId, _ck.BiliJct); + + // Act + BiliBiliAgent.Dtos.BiliApiResponse re = await _api.AddCoinForArticleAsync(req); + + // Assert + re.Code.Should().Be(0); + re.Message.Should().BeEquivalentTo("0"); + } + + #endregion + + #region LikeAsync + + [Fact] + public async Task LikeAsync_AlreadyLike_GetResultSuccess() + { + // Arrange + var cvid = 34150576; + + // Act + var re = await _api.LikeAsync(cvid, _ck.BiliJct); + + // Assert + re.Code.Should().Be(65006); + re.Data.Should().BeNull(); + re.Message.Should().BeEquivalentTo("已赞过"); + } + + #endregion + +} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs new file mode 100644 index 000000000..086a6e6b9 --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs @@ -0,0 +1,69 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Console; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class ChargeApiTest +{ + private readonly IChargeApi _target; + + private readonly BiliCookie _ck; + + public ChargeApiTest() + { + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _ck = host.Services.GetRequiredService(); + _target = host.Services.GetRequiredService(); + } + + #region ChargeV2Async + + [Fact] + public async void ChargeV2Async_SendRequest_NotEnough() + { + // Arrange + var upId = 220893216; + var req = new ChargeRequest(2, upId, _ck.BiliJct); + + // Act + BiliApiResponse re = await _target.ChargeV2Async(req); + + // Assert + re.Code.Should().Be(0); + re.Data.Status.Should().Be(-4); + re.Data.Msg.Should().BeEquivalentTo("bp.to.battery http failed, invalid args, errNo=800409904: B "); + } + + #endregion + + #region ChargeCommentAsync + + [Fact] + public async void ChargeCommentAsync_SendRequest_SetWridSuccess() + { + // Arrange + var upId = 220893216; + var req = new ChargeRequest(2, upId, _ck.BiliJct); + + // Act + BiliApiResponse re = await _target.ChargeV2Async(req); + + // Assert + re.Code.Should().Be(0); + re.Data.Status.Should().Be(-4); + re.Data.Msg.Should().BeEquivalentTo("bp.to.battery http failed, invalid args, errNo=800409904: B "); + } + + #endregion + +} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs new file mode 100644 index 000000000..f4cc92653 --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs @@ -0,0 +1,70 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Console; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class DailyTaskApiTests +{ + private readonly IDailyTaskApi _api; + + private readonly BiliCookie _ck; + + public DailyTaskApiTests() + { + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _ck = host.Services.GetRequiredService(); + _api = host.Services.GetRequiredService(); + } + + [Fact] + public async Task GetDailyTaskRewardInfo_Normal_Success() + { + // Act + BiliApiResponse re = await _api.GetDailyTaskRewardInfoAsync(); + + // Arrange + + // Assert + re.Code.Should().Be(0); + re.Data.Should().NotBeNull(); + } + + [Fact] + public async Task GetDonateCoinExp_Normal_Success() + { + // Act + BiliApiResponse re = await _api.GetDonateCoinExpAsync(); + + // Arrange + + // Assert + re.Code.Should().Be(0); + re.Data.Should().BeGreaterThanOrEqualTo(0); + } + + [Fact] + public async Task ReceiveVipPrivilege_Normal_Success() + { + // Act + BiliApiResponse re = await _api.ReceiveVipPrivilegeAsync((int)VipPrivilegeType.BCoinCoupon, _ck.BiliJct); + + // Arrange + + // Assert + re.Code.Should().BeOneOf(new List + { + 0, + 73319, //todo: sort out meannings + }); + } +} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs new file mode 100644 index 000000000..8c8cdab6c --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs @@ -0,0 +1,41 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Console; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class HomeApiTests +{ + private readonly IHomeApi _api; + + private readonly BiliCookie _ck; + + public HomeApiTests() + { + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _ck = host.Services.GetRequiredService(); + _api = host.Services.GetRequiredService(); + } + + [Fact] + public async Task GetHomePageAsync_Normal_Success() + { + // Act + HttpResponseMessage re = await _api.GetHomePageAsync(_ck.ToString()); + + // Arrange + var page = await re.Content.ReadAsStringAsync(); + + // Assert + re.IsSuccessStatusCode.Should().BeTrue(); + page.Should().Contain("哔哩哔哩 (゜-゜)つロ 干杯~-bilibili"); + } +} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj b/test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj new file mode 100644 index 000000000..b5c2eb240 --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj @@ -0,0 +1,28 @@ + + + + net6.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs new file mode 100644 index 000000000..36faaa229 --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs @@ -0,0 +1,106 @@ +using Microsoft.Extensions.DependencyInjection; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; +using Ray.BiliBiliTool.Console; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Xunit.Abstractions; +using Microsoft.Extensions.Hosting; +using FluentAssertions; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class VipBigPointApiTest +{ + private readonly IVipBigPointApi _api; + + private readonly ITestOutputHelper _output; + private readonly BiliCookie _ck; + + public VipBigPointApiTest(ITestOutputHelper output) + { + _output = output; + + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _ck = host.Services.GetRequiredService(); + _api = host.Services.GetRequiredService(); + } + + [Fact] + public async Task GetTaskListAsync_Normal_Success() + { + // Arrange + // Act + BiliApiResponse re = await _api.GetTaskListAsync(); + + // Assert + re.Code.Should().Be(0); + re.Data.Should().NotBeNull(); + re.Data.Task_info.Modules.Should().HaveCountGreaterThan(0); + } + + [Fact] + public async Task SignAsync_Normal_Success() + { + // Arrange + var req = new SignRequest() + { + csrf = _ck.BiliJct + }; + + // Act + BiliApiResponse re = await _api.SignAsync(req); + _output.WriteLine(re.ToJsonStr()); + + // Assert + re.Code.Should().Be(0); + re.Message.Should().BeEquivalentTo("success"); + } + + [Fact] + public async Task GetVouchersInfoAsync_Normal_Success() + { + // Arrange + // Act + var re = await _api.GetVouchersInfoAsync(); + + // Assert + re.Code.Should().Be(0); + re.Data.List.Should().Contain(x => x.Type == 9); + } + + + [Fact] + public async Task GetVipExperienceAsync_Normal_Success() + { + // Arrange + var req = new VipExperienceRequest() + { + csrf = _ck.BiliJct + }; + + // Act + BiliApiResponse re = await _api.ObtainVipExperienceAsync(req); + + // Assert + re.Code.Should().Be(0); + } + + [Fact] + public async Task CompleteAsync_Normal_Success() + { + // Arrange + var req = new ReceiveOrCompleteTaskRequest("dress-view"); + + // Act + var re = await _api.CompleteAsync(req); + + // Assert + re.Code.Should().Be(0); + } +} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs new file mode 100644 index 000000000..6d781240f --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs @@ -0,0 +1,46 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Console; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class VipMallApiTests +{ + private readonly IVipMallApi _api; + + private readonly BiliCookie _ck; + + public VipMallApiTests() + { + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _ck = host.Services.GetRequiredService(); + _api = host.Services.GetRequiredService(); + } + + [Fact] + public async Task ViewVipMallAsync_Normal_Success() + { + // Arrange + var req = new ViewVipMallRequest() + { + Csrf = _ck.BiliJct + }; + + // Act + BiliApiResponse re = await _api.ViewVipMallAsync(req); + + // Assert + re.Code.Should().Be(0); + re.Message.Should().BeEquivalentTo("SUCCESS"); + } +} diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs new file mode 100644 index 000000000..e23e6649c --- /dev/null +++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs @@ -0,0 +1,78 @@ +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services; +using Ray.BiliBiliTool.Console; + +namespace Ray.BiliBiliTool.Agent.FunctionalTests; + +public class WbiServiceTest +{ + private readonly IWbiService _target; + + public WbiServiceTest() + { + var envs = new List + { + "--ENVIRONMENT=Development", + //"HTTP_PROXY=localhost:8888", + //"HTTPS_PROXY=localhost:8888" + }; + IHost host = Program.CreateHost(envs.ToArray()); + _target = host.Services.GetRequiredService(); + } + + [Fact] + public async void SetWridAsync_SendRequest_SetWridSuccess() + { + // Arrange + var upId = 1585227649; + var req = new SearchVideosByUpIdDto() + { + mid = upId, + ps = 30, + tid = 0, + pn = 1, + keyword = "", + order = "pubdate", + platform = "web", + web_location = 1550101, + order_avoided = "true" + }; + + // Act + await _target.SetWridAsync(req); + + // Assert + req.w_rid.Should().NotBeNullOrWhiteSpace(); + req.wts.Should().NotBe(0); + } + + [Fact] + public void EncWbi_InputParams_GetCorrectWbiResult() + { + // Arrange + var wbiDto = new WbiImg() + { + img_url = "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png", + sub_url = "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png" + }; + var dic = new Dictionary() + { + {"foo", "114"}, + {"bar", "514"}, + {"baz", "1919810"}, + }; + var timeSpan = 1684746387; + var expectResult = "d3cbd2a2316089117134038bf4caf442"; + + // Act + var re = _target.EncWbi(dic, wbiDto.ImgKey, wbiDto.SubKey, timeSpan); + + // Assert + re.w_rid.Should().BeEquivalentTo(expectResult); + re.wts.Should().Be(timeSpan); + } +} From 68ef98de6902d964c570a551529e1fb3bfc81027 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 30 Apr 2024 00:25:31 +0800 Subject: [PATCH 6/6] fix merge error --- .../BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs | 2 +- test/BiliAgentTest/VideoApiTest.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs index ac7477b9d..6b4fbb7df 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs @@ -4,7 +4,7 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; public class SearchArticlesByUpIdDto : IWrid { - public long Mid { get; set; } + public long mid { get; set; } public int pn { get; set; } = 1; diff --git a/test/BiliAgentTest/VideoApiTest.cs b/test/BiliAgentTest/VideoApiTest.cs index 4058926a2..3ace91093 100644 --- a/test/BiliAgentTest/VideoApiTest.cs +++ b/test/BiliAgentTest/VideoApiTest.cs @@ -47,7 +47,7 @@ public async Task GetBangumiTest() var api = scope.ServiceProvider.GetRequiredService(); var req = await api.GetBangumiBySsid(46508); - Assert.Equal(0,req.Code); + Assert.Equal(0, req.Code); } [Fact]