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 //开关
},
//安全相关配置