diff --git a/CHANGELOG.md b/CHANGELOG.md index 5859b9db0..c5aecfbd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,3 +46,5 @@ - 【#169】领取大会员福利任务更改为每日都尝试执行 - 青龙拉库兼容大小写问题 - 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo) +## 0.2.0 +- 新增大会员大积分任务 diff --git a/README.md b/README.md index 055e89432..982927150 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ BiliBiliTool - **月底在 B 币券过期前进行充电(支持指定想要支持的up主,如果没有喜欢的up,也可以为自己充个电啊,做个用爱为自己发电的人~)** - **直播中心天选时刻自动参与抽奖** - **批量取关** +- **大会员大积分任务** - **支持多账号** - **理论上支持所有远端的日志推送(默认支持推送到Telegram、企业微信、钉钉、PushPlus、Server酱、钉钉、酷推,另外也支持自定义推送到任意api)** @@ -217,6 +218,7 @@ dotnet Ray.BiliBiliTool.Console.dll --runTasks=Daily&LiveLottery | 每日任务 | Daily | 完成每日任务获取满额65点经验(登录、观看视频、分享视频、投币),以及签到、领福利和充电等附属功能 | bilibili-daily-task.yml | Production | 每天一次 | | | 天选时刻抽奖 | LiveLottery | 直播中心天选时刻抽奖 | live-lottery-task.yml | LiveLottery | 建议每天运行0-4次内 | 对应Actions工作流默认是关闭的,需要添加key为`ISOPENLIVELOTTERYTASK`、值为`true`的secret来手动开启;大部分抽奖都需要关注主播,介意的不要开启 | | 批量取关 | UnfollowBatched | 批量取关指定分组下的所有关注(主要用于清理天选抽奖而产生的关注) | unfollow-batched-task.yml | 无 | 需要时手动运行 | 需要通过配置指定2个参数:`GroupName`(分组名称,如`天选时刻`)和`Count`(目标取关个数,-1表示全部),应用会倒序从后往前取关指定个数 | +| 大会员大积分 | VipBigPoint | 大会员大积分任务(签到、浏览、观看) | 无 | 无 | 每天凌晨一点运行 | | | 测试Cookie | Test | 测试Cookie是否正常 | 无,可以使用empty-task.yml来运行 | 无 | 需要时手动运行 | 主要用于调试 | | 空模板 | 无(只用于 GitHub Actions ) | 用于 GitHub Actions 运行指定的任意任务 | empty-task.yml | 无 | 需要时手动运行 | 需要通过配置指定要运行的任务Code(多个使用英文逗号分隔),主要用于调试 | diff --git a/common.props b/common.props index c52fc1f18..77ce7f072 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ Ray - 0.1.2 + 0.2.0 $(NoWarn);CS1591;CS0436 diff --git a/qinglong/DefaultTasks/bili_dev_task_vipBigPoint.sh b/qinglong/DefaultTasks/bili_dev_task_vipBigPoint.sh new file mode 100644 index 000000000..a5a63e2a1 --- /dev/null +++ b/qinglong/DefaultTasks/bili_dev_task_vipBigPoint.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# new Env("bili大会员大积分[dev先行版]") +# cron 7 1 * * * bili_dev_task_vipBigPoint.sh + +dir_shell=$QL_DIR/shell +. $dir_shell/share.sh + +bili_repo="raywangqvq_bilibilitoolpro_develop" + +echo "repo目录: $dir_repo" +bili_repo_dir="$(find $dir_repo -type d -iname $bili_repo | head -1)" +echo -e "bili仓库目录: $bili_repo_dir\n" + +cd $bili_repo_dir +export ENVIRONMENT=Production && \ +export Ray_RunTasks=VipBigPoint && \ +dotnet run --project ./src/Ray.BiliBiliTool.Console diff --git a/qinglong/DefaultTasks/bili_task_vipBigPoint.sh b/qinglong/DefaultTasks/bili_task_vipBigPoint.sh new file mode 100644 index 000000000..1dada710d --- /dev/null +++ b/qinglong/DefaultTasks/bili_task_vipBigPoint.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# new Env("bili大会员大积分") +# cron 7 1 * * * bili_task_vipBigPoint.sh + +dir_shell=$QL_DIR/shell +. $dir_shell/share.sh + +bili_repo="raywangqvq_bilibilitoolpro" + +echo "repo目录: $dir_repo" +bili_repo_dir="$(find $dir_repo -type d -iname $bili_repo | head -1)" +echo -e "bili仓库目录: $bili_repo_dir\n" + +cd $bili_repo_dir +export ENVIRONMENT=Production && \ +export Ray_RunTasks=VipBigPoint && \ +dotnet run --project ./src/Ray.BiliBiliTool.Console diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/ReceiveOrCompleteTaskRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/ReceiveOrCompleteTaskRequest.cs new file mode 100644 index 000000000..51b7efed4 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/ReceiveOrCompleteTaskRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask +{ + public class ReceiveOrCompleteTaskRequest + { + public ReceiveOrCompleteTaskRequest(string taskCode) + { + TaskCode=taskCode; + } + + public string TaskCode { get; set; } + } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs new file mode 100644 index 000000000..c6ec47532 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask +{ + public class SignRequest + { + public string Statistics { get; set; }= "{\"appId\":1,\"platform\":3,\"version\":\"6.85.0\",\"abtest\":\"\"}"; + } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/ViewRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/ViewRequest.cs new file mode 100644 index 000000000..d2459a3c9 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/ViewRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask +{ + public class ViewRequest + { + public ViewRequest(string position) + { + this.position=position; + } + + public string position { get; set; } + + public string c_locale { get; set; } = "zh_CN"; + + public string channel { get; set; } = "html5_search_baidu"; + + public int disable_rcmd { get; set; } = 0; + + public string mobi_app { get; set; } = "android"; + + public string platform { get; set; } = "android"; + + public string s_locale { get; set; } = "zh_CN"; + + public string statistics { get; set; } = "{\"appId\":1,\"platform\":3,\"version\":\"6.85.0\",\"abtest\":\"\"}"; + } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VipTaskListItem.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VipTaskListItem.cs new file mode 100644 index 000000000..c8622ea63 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VipTaskListItem.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask +{ + public class VipTaskInfo + { + public TaskInfo Task_info { get; set; } + + public void LogInfo(ILogger logger) + { + logger.LogInformation("------当前任务状态------"); + + logger.LogInformation("打卡:{signed}", Task_info.Sing_task_item.IsTodaySigned ? "√" : "X"); + + foreach (var moduleItem in Task_info.Modules) + { + logger.LogInformation("-{title}", moduleItem.module_title); + foreach (var commonTaskItem in moduleItem.common_task_item) + { + logger.LogInformation("---{title}:{status}", + commonTaskItem.title, + commonTaskItem.state == 3 ? "√" : "X"); + } + } + logger.LogInformation("------------------------{newLine}", Environment.NewLine); + + } + } + + public class TaskInfo + { + public int Score_month { get; set; } + + public int Score_limit { get; set; } + + public List Modules { get; set; } + + public SingTaskItem Sing_task_item { get; set; } + } + + public class SingTaskItem + { + public int Count { get; set; } + + public int Base_score { get; set; } + + public List Histories { get; set; } = new List(); + + public Histtory TodayHistory => Histories.FirstOrDefault(x => x.Is_today); + + public bool IsTodaySigned => TodayHistory?.Signed == true; + } + + public class ModuleItem + { + public string module_title { get; set; } + + public List common_task_item { get; set; } + } + + public class CommonTaskItem + { + public string title { get; set; } + + public string subtitle { get; set; } + + public string explain { get; set; } + + public string task_code { get; set; } + + public int state { get; set; } + + public int vip_limit { get; set; } + + public int complete_times { get; set; } + + public int max_times { get; set; } + + public int recall_num { get; set; } + } + + public class Histtory + { + public DateTime Day { get; set; } + + public bool Signed { get; set; } + + public int Score { get; set; } + + public bool Is_today { get; set; } + } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs new file mode 100644 index 000000000..ecc0451da --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Ray.BiliBiliTool.Agent.Attributes; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; +using WebApiClientCore.Attributes; + +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 + { + [HttpGet("/x/vip_point/task/combine")] + Task> GetTaskList(); + + [HttpPost("/pgc/activity/score/task/sign")] + Task Sign([FormContent] SignRequest request); + + [HttpPost("/pgc/activity/score/task/receive")] + Task Receive([JsonContent] ReceiveOrCompleteTaskRequest request); + + [HttpPost("/pgc/activity/score/task/complete")] + Task Complete([JsonContent] ReceiveOrCompleteTaskRequest request); + + [HttpPost("/pgc/activity/deliver/task/complete")] + Task ViewComplete([FormContent] ViewRequest request); + } +} diff --git a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs index 2640de064..e7eaf0fd6 100644 --- a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs +++ b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs @@ -67,6 +67,8 @@ public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection se services.AddBiliBiliClientApi("https://api.bilibili.com"); services.AddBiliBiliClientApi("https://api.bilibili.com", false); + services.AddBiliBiliClientApi("https://api.bilibili.com"); + return services; } diff --git a/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs new file mode 100644 index 000000000..abd10b07f --- /dev/null +++ b/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; + +namespace Ray.BiliBiliTool.Application.Contracts +{ + /// + /// 每日自动任务 + /// + [Description("VipBigPoint")] + + public interface IVipBigPointAppService : IAppService + { + } +} diff --git a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs new file mode 100644 index 000000000..991222508 --- /dev/null +++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs @@ -0,0 +1,464 @@ +using System; +using System.Linq; +using System.Runtime.InteropServices; +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.VipTask; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Application.Attributes; +using Ray.BiliBiliTool.Application.Contracts; +using Ray.BiliBiliTool.Config.Options; + +namespace Ray.BiliBiliTool.Application +{ + public class VipBigPointAppService : AppService, IVipBigPointAppService + { + private readonly ILogger _logger; + private readonly IConfiguration _configuration; + private readonly IVipBigPointApi _vipApi; + + public VipBigPointAppService( + IConfiguration configuration, + ILogger logger, + IVipBigPointApi vipApi + ) + { + _configuration = configuration; + _logger = logger; + _vipApi = vipApi; + } + + [TaskInterceptor("大会员大积分", TaskLevel.One)] + public override void DoTask() + { + var re = _vipApi.GetTaskList().Result; + + if (re.Code != 0) throw new Exception(re.ToJson()); + + VipTaskInfo taskInfo = re.Data; + taskInfo.LogInfo(_logger); + + //签到 + taskInfo = Sign(taskInfo); + + //福利任务 + taskInfo = Bonus(taskInfo); + + //体验任务 + taskInfo = Privilege(taskInfo); + + //日常任务 + + //浏览追番频道页10秒 + taskInfo = ViewAnimate(taskInfo); + + //浏览影视频道页10秒 + taskInfo = ViewFilmChannel(taskInfo); + + //浏览会员购页面10秒 + taskInfo = ViewVipMall(taskInfo); + + //观看任意正片内容 + taskInfo = ViewVideo(taskInfo); + + //领取购买任务 + taskInfo = BuyVipVideo(taskInfo); + taskInfo = BuyVipProduct(taskInfo); + taskInfo = BuyVipMall(taskInfo); + + taskInfo.LogInfo(_logger); + } + + [TaskInterceptor("签到", TaskLevel.Two, false)] + private VipTaskInfo 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 = _vipApi.Sign(new SignRequest()).Result; + if (re.Code != 0) throw new Exception(re.ToJson()); + + //确认 + var infoResult = _vipApi.GetTaskList().Result; + if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); + 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); + + return info; + } + + [TaskInterceptor("福利任务", TaskLevel.Two, false)] + private VipTaskInfo Bonus(VipTaskInfo info) + { + var bonusTask = GetTarget(info); + + //如果状态不等于3,则做 + if (bonusTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); + return info; + } + + //0需要领取 + if (bonusTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + TryReceive(bonusTask.task_code); + } + + _logger.LogInformation("开始完成任务"); + var re = Complete(bonusTask.task_code); + + //确认 + if (re) + { + var infoResult = _vipApi.GetTaskList().Result; + if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); + info = infoResult.Data; + bonusTask = GetTarget(info); + + _logger.LogInformation("确认:{re}", bonusTask.state == 3 && bonusTask.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 == "bonus"); + } + } + + [TaskInterceptor("体验任务", TaskLevel.Two, false)] + private VipTaskInfo Privilege(VipTaskInfo info) + { + var privilegeTask = GetTarget(info); + + //如果状态不等于3,则做 + if (privilegeTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); + return info; + } + + //0需要领取 + if (privilegeTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + TryReceive(privilegeTask.task_code); + } + + _logger.LogInformation("开始完成任务"); + var re = Complete(privilegeTask.task_code); + + //确认 + if (re) + { + var infoResult = _vipApi.GetTaskList().Result; + if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); + info = infoResult.Data; + privilegeTask = GetTarget(info); + + _logger.LogInformation("确认:{re}", privilegeTask.state == 3 && privilegeTask.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 == "privilege"); + } + + return info; + } + + [TaskInterceptor("浏览追番频道页10秒", TaskLevel.Two, false)] + private VipTaskInfo ViewAnimate(VipTaskInfo info) + { + var code = "jp_channel"; + + CommonTaskItem targetTask = GetTarget(info); + + //如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); + return info; + } + + //0需要领取 + if (targetTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + TryReceive(targetTask.task_code); + } + + _logger.LogInformation("开始完成任务"); + var re = CompleteView(code); + + //确认 + if (re) + { + var infoResult = _vipApi.GetTaskList().Result; + if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); + 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 == "animatetab"); + } + + return info; + } + + [TaskInterceptor("浏览影视频道页10秒", TaskLevel.Two, false)] + private VipTaskInfo 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("开始领取任务"); + TryReceive(targetTask.task_code); + } + + _logger.LogInformation("开始完成任务"); + var re = CompleteView(code); + + //确认 + if (re) + { + var infoResult = _vipApi.GetTaskList().Result; + if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); + 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("浏览会员购页面10秒", TaskLevel.Two, false)] + private VipTaskInfo ViewVipMall(VipTaskInfo info) + { + //todo + _logger.LogInformation("待实现..."); + return info; + } + + [TaskInterceptor("观看任意正片内容", TaskLevel.Two, false)] + private VipTaskInfo ViewVideo(VipTaskInfo info) + { + CommonTaskItem targetTask = GetTarget(info); + + //如果状态不等于3,则做 + if (targetTask.state == 3) + { + _logger.LogInformation("已完成,跳过"); + return info; + } + + //0需要领取 + if (targetTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + TryReceive(targetTask.task_code); + } + + _logger.LogInformation("开始完成任务"); + _logger.LogInformation("待开发...");//todo + + CommonTaskItem GetTarget(VipTaskInfo info) + { + return info.Task_info.Modules.First(x => x.module_title == "日常任务") + .common_task_item + .First(x => x.task_code == "ogvwatch"); + } + + return info; + } + + [TaskInterceptor("购买单点付费影片(仅领取)", TaskLevel.Two, false)] + private VipTaskInfo 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; + } + + //0需要领取 + if (targetTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + 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"); + } + } + + [TaskInterceptor("购买指定大会员产品(仅领取)", TaskLevel.Two, false)] + private VipTaskInfo 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("开始领取任务"); + 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"); + } + } + + [TaskInterceptor("购买指定会员购商品(仅领取)", TaskLevel.Two, false)] + private VipTaskInfo 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; + } + + //0需要领取 + if (targetTask.state == 0) + { + _logger.LogInformation("开始领取任务"); + 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 == "vipmallbuy"); + } + } + + /// + /// 领取任务 + /// + private void TryReceive(string taskCode) + { + BiliApiResponse re = null; + try + { + var request = new ReceiveOrCompleteTaskRequest(taskCode); + re = _vipApi.Receive(request).Result; + if (re.Code == 0) + _logger.LogInformation("领取任务成功"); + else + _logger.LogInformation("领取任务失败:{msg}", re.ToJson()); + } + catch (Exception e) + { + _logger.LogError("领取任务异常"); + _logger.LogError(e.Message + re?.ToJson()); + } + } + + private bool Complete(string taskCode) + { + var request = new ReceiveOrCompleteTaskRequest(taskCode); + var re = _vipApi.Complete(request).Result; + if (re.Code == 0) + { + _logger.LogInformation("已完成"); + return true; + } + + else + { + _logger.LogInformation("失败:{msg}", re.ToJson()); + return false; + } + } + + private bool CompleteView(string code) + { + _logger.LogInformation("开始浏览"); + Task.Delay(10 * 1000).Wait(); + + var request = new ViewRequest(code); + var re = _vipApi.ViewComplete(request).Result; + if (re.Code == 0) + { + _logger.LogInformation("浏览完成"); + return true; + } + + else + { + _logger.LogInformation("浏览失败:{msg}", re.ToJson()); + return false; + } + } + } +} diff --git a/src/Ray.BiliBiliTool.Console/appsettings.json b/src/Ray.BiliBiliTool.Console/appsettings.json index 97551bd69..a32cb5712 100644 --- a/src/Ray.BiliBiliTool.Console/appsettings.json +++ b/src/Ray.BiliBiliTool.Console/appsettings.json @@ -4,7 +4,7 @@ "" ], - "RunTasks": "Daily", //要运行的任务名称[Daily,LiveLottery,UnfollowBatched,Test],多个使用&分隔,如“Daily&LiveLottery”,建议使用命令行参数指定 + "RunTasks": "Daily", //要运行的任务名称[Daily,LiveLottery,UnfollowBatched,VipBigPoint,Test],多个使用&分隔,如“Daily&LiveLottery”,建议使用命令行参数指定 //程序自定义个性化配置 "DailyTaskConfig": { @@ -35,7 +35,7 @@ }, "ReceiveVipPrivilegeConfig": { - "IsEnable": true //开关 + "IsEnable": true //开关 }, //安全相关配置