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); + } }