From f9c5c18633bde790b400d7989ba521be21d21a95 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Wed, 11 Oct 2023 21:46:43 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E6=8E=92=E9=99=A4=E6=97=A0=E6=B3=95=E8=BF=9B=E8=A1=8C=E7=9B=B4?= =?UTF-8?q?=E6=92=AD=E6=8C=82=E6=9C=BA=E7=9A=84up=E4=B8=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs index 71e9fe23f..a857eb952 100644 --- a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs @@ -614,6 +614,10 @@ private async Task> GetFansMedalInfoList() continue; } + // 用以排除有牌子无直播间的up主 + if (spaceInfo.Data.Live_room is null) + continue; + var roomId = spaceInfo.Data.Live_room.Roomid; // 获取直播间详细信息 From 5db4ebe670c7f788d5987d03a1a5c4a7e286780b Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Thu, 12 Oct 2023 16:09:07 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E4=B8=BA=E8=B7=B3=E8=BF=87=E7=9A=84?= =?UTF-8?q?=E4=B8=BB=E6=92=AD=E6=B7=BB=E5=8A=A0=E8=B7=B3=E8=BF=87=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs index a857eb952..6cf387596 100644 --- a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs @@ -616,7 +616,11 @@ private async Task> GetFansMedalInfoList() // 用以排除有牌子无直播间的up主 if (spaceInfo.Data.Live_room is null) + { + _logger.LogInformation("【主播】{name} 直播间id获取失败,已跳过",medal.Target_name); continue; + } + var roomId = spaceInfo.Data.Live_room.Roomid; From aba496f4e3a643156f572b31379f1cf6ad6ad7c1 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sat, 21 Oct 2023 23:18:53 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E4=B8=93=E6=A0=8F=E6=8A=95=E5=B8=81?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E6=A1=86=E6=9E=B6=E5=B7=B2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/Article/AddCoinForArticleRequest.cs | 22 +++ .../BiliBiliAgent/Interfaces/IArticleApi.cs | 23 +++ .../Extensions/ServiceCollectionExtension.cs | 3 + .../DailyTaskAppService.cs | 1 + .../ArticleDomainService.cs | 162 ++++++++++++++++++ .../Interfaces/IArticleDomainService.cs | 9 + .../ArticleDomainServiceTest.cs | 25 +++ 7 files changed, 245 insertions(+) create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs create mode 100644 src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs create mode 100644 src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs create mode 100644 test/DomainServiceTest/ArticleDomainServiceTest.cs diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs new file mode 100644 index 000000000..7fd3f3e9d --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs @@ -0,0 +1,22 @@ +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; + +public class AddCoinForArticleRequest +{ + public AddCoinForArticleRequest(long cvid,long mid,string csrf) + { + Aid = cvid; + Upid = mid; + Csrf = csrf; + } + + public long Aid { get; set; } + + public long Upid { get; set; } + + public int Multiply { get; set; } = 1; + + // 必须为2 + public int Avtype { get; private set; } = 2; + + public string Csrf { get; set; } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs new file mode 100644 index 000000000..0ee889377 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +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"); + + } + + +} diff --git a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs index 64558e390..92b8831c4 100644 --- a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs +++ b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs @@ -73,6 +73,9 @@ public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection se services.AddBiliBiliClientApi("https://live-trace.bilibili.com"); services.AddBiliBiliClientApi("https://www.bilibili.com", false); + // 添加注入 + services.AddBiliBiliClientApi("https://api.bilibili.com"); + //qinglong var qinglongHost = configuration["QL_URL"] ?? "http://localhost:5600"; services diff --git a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs index 6f82e6d59..f72f11b4c 100644 --- a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs @@ -79,6 +79,7 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) DailyTaskInfo dailyTaskInfo = await GetDailyTaskStatus(); await WatchAndShareVideo(dailyTaskInfo); + // TODO 允许切换模式至投币给专栏 await AddCoinsForVideo(userInfo); //签到: diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs new file mode 100644 index 000000000..57895a4b8 --- /dev/null +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -0,0 +1,162 @@ +using System; +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.Article; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Config.Options; +using Ray.BiliBiliTool.DomainService.Interfaces; + +namespace Ray.BiliBiliTool.DomainService; + +public class ArticleDomainService : IArticleDomainService +{ + private readonly IArticleApi _articleApi; + private readonly BiliCookie _biliCookie; + private readonly ILogger _logger; + private readonly DailyTaskOptions _dailyTaskOptions; + private readonly ICoinDomainService _coinDomainService; + + public ArticleDomainService(IArticleApi articleApi, BiliCookie biliCookie, ILogger logger, IOptionsMonitor dailyTaskOptions, ICoinDomainService coinDomainService) + { + _articleApi = articleApi; + _biliCookie = biliCookie; + _logger = logger; + _coinDomainService = coinDomainService; + _dailyTaskOptions = dailyTaskOptions.CurrentValue; + } + + /// + /// 投币专栏任务 + /// + /// + public async Task AddCoinForArticles() + { + var donateCoinsCounts = await CalculateDonateCoinsCounts(); + + if (donateCoinsCounts == 0) + { + return; + } + + + + } + + + + /// + /// 给某一篇专栏投币 + /// + /// 文章cvid + /// 文章作者mid + /// 投币是否成功 + public async Task AddCoinForArticle(long cvid, long mid) + { + BiliApiResponse result; + 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), + refer); + } + catch (Exception ) + { + return false; + } + + if (result.Code == 0) + { + _logger.LogInformation("投币成功,经验+10 √" ); + return true; + } + else + { + _logger.LogError("投币错误 {message}", result.Message); + return false; + } + } + + + /// + /// 计算所需要投的硬币数量 + /// + /// 硬币数量 + public async Task CalculateDonateCoinsCounts() + { + int needCoins = await GetNeedDonateCoinCounts(); + + int protectedCoins = _dailyTaskOptions.NumberOfProtectedCoins; + if (needCoins <= 0) return 0; + + //投币前硬币余额 + decimal coinBalance = await _coinDomainService.GetCoinBalance(); + _logger.LogInformation("【投币前余额】 : {coinBalance}", coinBalance); + _ = int.TryParse(decimal.Truncate(coinBalance - protectedCoins).ToString(), out int unprotectedCoins); + + if (coinBalance <= 0) + { + _logger.LogInformation("因硬币余额不足,今日暂不执行投币任务"); + return 0; + } + + if (coinBalance <= protectedCoins) + { + _logger.LogInformation("因硬币余额达到或低于保留值,今日暂不执行投币任务"); + return 0; + } + + //余额小于目标投币数,按余额投 + if (coinBalance < needCoins) + { + _ = int.TryParse(decimal.Truncate(coinBalance).ToString(), out needCoins); + _logger.LogInformation("因硬币余额不足,目标投币数调整为: {needCoins}", needCoins); + return needCoins; + } + + //投币后余额小于等于保护值,按保护值允许投 + if (coinBalance - needCoins <= protectedCoins) + { + //排除需投等于保护后可投数量相等时的情况 + if (unprotectedCoins != needCoins) + { + needCoins = unprotectedCoins; + _logger.LogInformation("因硬币余额投币后将达到或低于保留值,目标投币数调整为: {needCoins}", needCoins); + return needCoins; + } + } + + return 0; + } + + public async Task GetNeedDonateCoinCounts() + { + int configCoins = _dailyTaskOptions.NumberOfCoins; + + if (configCoins <= 0) + { + _logger.LogInformation("已配置为跳过投币任务"); + return configCoins; + } + + //已投的硬币 + int alreadyCoins = await _coinDomainService.GetDonatedCoins(); + + int targetCoins = configCoins; + + _logger.LogInformation("【今日已投】{already}枚", alreadyCoins); + _logger.LogInformation("【目标欲投】{already}枚", targetCoins); + + if (targetCoins > alreadyCoins) + { + int needCoins = targetCoins - alreadyCoins; + _logger.LogInformation("【还需再投】{need}枚", needCoins); + return needCoins; + } + + _logger.LogInformation("已完成投币任务,不需要再投啦~"); + return 0; + } +} diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs new file mode 100644 index 000000000..557f473f3 --- /dev/null +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Ray.BiliBiliTool.DomainService.Interfaces; + +public interface IArticleDomainService :IDomainService +{ + // Task GetArticleCountByUp(long upId); + Task AddCoinForArticle(long cvid, long mid); +} diff --git a/test/DomainServiceTest/ArticleDomainServiceTest.cs b/test/DomainServiceTest/ArticleDomainServiceTest.cs new file mode 100644 index 000000000..c001c5653 --- /dev/null +++ b/test/DomainServiceTest/ArticleDomainServiceTest.cs @@ -0,0 +1,25 @@ +namespace DomainServiceTest; + +public class ArticleDomainServiceTest +{ + public ArticleDomainServiceTest() + { + Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); + } + + + + + + [Fact] + public async Task AddCoinForArticleTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var config = Global.ConfigurationRoot; + var domainService = scope.ServiceProvider.GetRequiredService(); + + // 测试用的专栏:https://www.bilibili.com/read/cv5806746/?from=search&spm_id_from=333.337.0.0 + + await domainService.AddCoinForArticle(5806746, 486980924); + } +} From b671e68b7caff32f7702b92783da0bf083dcac58 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sun, 22 Oct 2023 20:23:14 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E4=B8=93=E6=A0=8F=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E5=85=A8=E6=B5=81=E7=A8=8B=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83=E7=A1=AC?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E8=B0=83=E6=95=B4=E4=B8=BA=E4=B8=93=E6=A0=8F?= =?UTF-8?q?=E6=8A=95=E5=B8=81=E6=A8=A1=E5=BC=8F=E5=BC=80=E5=A7=8B=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=8C=82=E6=9C=BA=E6=B5=8B=E8=AF=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/Article/SearchArticleInfoResponse.cs | 10 + .../Article/SearchArticlesByUpIdFullFto.cs | 19 ++ .../Dtos/Article/SearchUpArticlesResponse.cs | 18 ++ .../BiliBiliAgent/Interfaces/IArticleApi.cs | 15 ++ .../DailyTaskAppService.cs | 7 +- src/Ray.BiliBiliTool.Console/appsettings.json | 2 +- .../ArticleDomainService.cs | 214 +++++++++++++++++- .../Interfaces/IArticleDomainService.cs | 5 +- .../ArticleDomainServiceTest.cs | 29 ++- 9 files changed, 305 insertions(+), 14 deletions(-) create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticleInfoResponse.cs create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticleInfoResponse.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticleInfoResponse.cs new file mode 100644 index 000000000..22b9b37a6 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticleInfoResponse.cs @@ -0,0 +1,10 @@ +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; + +public class SearchArticleInfoResponse +{ + public int Like { get; set; } + + public int Coin { get; set; } + + public long Mid { get; set; } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs new file mode 100644 index 000000000..6f9b46525 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs @@ -0,0 +1,19 @@ +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; + +public class SearchArticlesByUpIdDto +{ + public long Mid { get; set; } + + public int Pn { get; set; } = 1; + + public int Ps { get; set; } = 30; + + public string Sort { get; set; } = "publish_time"; +} + +public class SearchArticlesByUpIdFullFto : SearchArticlesByUpIdDto +{ + public string w_rid { get; set; } + + public long wts { get; set; } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs new file mode 100644 index 000000000..7c839c809 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; + +public class SearchUpArticlesResponse +{ + public List ArticleInfoList { get; set; } + public int Count { get; set; } + +} + +public class ArticleInfo +{ + public long Id { get; set; } + + public string Title { get; set; } + +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs index 0ee889377..a4c06fa8b 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs @@ -17,6 +17,21 @@ public interface IArticleApi : IBiliBiliApi [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] SearchArticlesByUpIdFullFto request); + + /// + /// 获取专栏详情 + /// + /// + /// + [HttpGet("/x/article/viewinfo?id={cvid}")] + Task> SearchArticleInfo(long cvid); + } diff --git a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs index f72f11b4c..52ee259a1 100644 --- a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs @@ -23,6 +23,7 @@ public class DailyTaskAppService : AppService, IDailyTaskAppService private readonly ILogger _logger; private readonly IAccountDomainService _accountDomainService; private readonly IVideoDomainService _videoDomainService; + private readonly IArticleDomainService _articleDomainService; private readonly IDonateCoinDomainService _donateCoinDomainService; private readonly IMangaDomainService _mangaDomainService; private readonly ILiveDomainService _liveDomainService; @@ -41,6 +42,7 @@ public DailyTaskAppService( IOptionsMonitor> dicOptions, IAccountDomainService accountDomainService, IVideoDomainService videoDomainService, + IArticleDomainService articleDomainService, IDonateCoinDomainService donateCoinDomainService, IMangaDomainService mangaDomainService, ILiveDomainService liveDomainService, @@ -56,6 +58,7 @@ public DailyTaskAppService( _expDic = dicOptions.Get(Constants.OptionsNames.ExpDictionaryName); _accountDomainService = accountDomainService; _videoDomainService = videoDomainService; + _articleDomainService = articleDomainService; _donateCoinDomainService = donateCoinDomainService; _mangaDomainService = mangaDomainService; _liveDomainService = liveDomainService; @@ -168,7 +171,9 @@ private async Task AddCoinsForVideo(UserInfo userInfo) _logger.LogInformation("已经为LV6大佬,开始白嫖"); return; } - await _donateCoinDomainService.AddCoinsForVideos(); + // await _donateCoinDomainService.AddCoinsForVideos(); + await _articleDomainService.AddCoinForArticles(); + } /// diff --git a/src/Ray.BiliBiliTool.Console/appsettings.json b/src/Ray.BiliBiliTool.Console/appsettings.json index a3f85f0cf..3f5e16d94 100644 --- a/src/Ray.BiliBiliTool.Console/appsettings.json +++ b/src/Ray.BiliBiliTool.Console/appsettings.json @@ -1,5 +1,5 @@ { - "RunTasks": "", //要运行的任务名称[Daily,LiveLottery,UnfollowBatched,VipBigPoint,Test],多个使用&分隔,如“Daily&LiveLottery”,建议使用命令行参数指定 + "RunTasks": "Daily", //要运行的任务名称[Daily,LiveLottery,UnfollowBatched,VipBigPoint,Test],多个使用&分隔,如“Daily&LiveLottery”,建议使用命令行参数指定 //程序自定义个性化配置 "DailyTaskConfig": { diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index 57895a4b8..8dbf5bb44 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -18,13 +21,34 @@ public class ArticleDomainService : IArticleDomainService private readonly ILogger _logger; private readonly DailyTaskOptions _dailyTaskOptions; private readonly ICoinDomainService _coinDomainService; + private readonly IAccountApi _accountApi; + private readonly IWbiDomainService _wbiDomainService; - public ArticleDomainService(IArticleApi articleApi, BiliCookie biliCookie, ILogger logger, IOptionsMonitor dailyTaskOptions, ICoinDomainService coinDomainService) + + /// + /// up的专栏总数缓存 + /// + private readonly Dictionary _upArticleCountDicCatch = new(); + + /// + /// 已对投币数量缓存 + /// + private readonly Dictionary _alreadyDonatedCoinCountCatch = new(); + + public ArticleDomainService( + IArticleApi articleApi, + BiliCookie biliCookie, + ILogger logger, + IOptionsMonitor dailyTaskOptions, + ICoinDomainService coinDomainService, + IAccountApi accountApi, IWbiDomainService wbiDomainService) { _articleApi = articleApi; _biliCookie = biliCookie; _logger = logger; _coinDomainService = coinDomainService; + _accountApi = accountApi; + _wbiDomainService = wbiDomainService; _dailyTaskOptions = dailyTaskOptions.CurrentValue; } @@ -42,9 +66,118 @@ public async Task AddCoinForArticles() } - + int success = 0; + int tryCount = 10; + + for (int i = 0; i <= tryCount && success < donateCoinsCounts; i++) + { + _logger.LogDebug("开始尝试第{num}次", i); + + var upId = GetUpFromConfigUps(); + var cvid = await GetRandomArticleFromUp(upId); + + if (await AddCoinForArticle(cvid, upId)) + success++; + } + + if (success == donateCoinsCounts) + _logger.LogInformation("投币任务完成"); + else + _logger.LogInformation("投币尝试超过10次,已终止"); + + _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0); } + /// + /// 从支持UP主列表中随机挑选一位 + /// + /// 被挑选up主的mid + public long GetUpFromConfigUps() + { + if (_dailyTaskOptions.SupportUpIdList == null || _dailyTaskOptions.SupportUpIdList.Count == 0) + { + return 0; + } + + try + { + long randomUpId = + _dailyTaskOptions.SupportUpIdList[new Random().Next(0, _dailyTaskOptions.SupportUpIdList.Count)]; + + if (randomUpId is 0 or long.MinValue) return 0; + + if (randomUpId.ToString() == _biliCookie.UserId) + { + _logger.LogDebug("不能为自己投币"); + return 0; + } + + return randomUpId; + } + catch (Exception e) + { + _logger.LogWarning("异常:{msg}", e); + } + + return 0; + } + + + /// + /// 从某个up主中随机挑选一个专栏 + /// + /// + /// 专栏的cvid + public async Task GetRandomArticleFromUp(long mid) + { + if (Equals(!_upArticleCountDicCatch.TryGetValue(mid, out int articleCount))) + { + articleCount = await GetArticleCountOfUp(mid); + _upArticleCountDicCatch.Add(mid, articleCount); + } + + // 专栏数为0时 + if (articleCount == 0) + { + return 0; + } + + var req = new SearchArticlesByUpIdDto() + { + Mid = mid, + Ps = 1, + Pn = new Random().Next(1, articleCount + 1) + }; + var w_ridDto = await _wbiDomainService.GetWridAsync(req); + + var fullDto = new SearchArticlesByUpIdFullFto() + { + Mid = mid, + Ps = req.Ps, + Pn = req.Pn, + w_rid = w_ridDto.w_rid, + wts = w_ridDto.wts + }; + + BiliApiResponse re = await _articleApi.SearchUpArticlesByUpId(fullDto); + + if (re.Code != 0) + { + throw new Exception(re.Message); + } + + ArticleInfo articleInfo = re.Data.ArticleInfoList.FirstOrDefault(); + + _logger.LogDebug("获取到的专栏{cvid}({title})", articleInfo.Id, articleInfo.Title); + + // 检查是否可投 + if (!await IsCanDonate(articleInfo.Id)) + { + return 0; + } + + return articleInfo.Id; + } /// @@ -52,7 +185,7 @@ public async Task AddCoinForArticles() /// /// 文章cvid /// 文章作者mid - /// 投币是否成功 + /// 投币是否成功(false 投币失败,true 投币成功) public async Task AddCoinForArticle(long cvid, long mid) { BiliApiResponse result; @@ -62,14 +195,14 @@ public async Task AddCoinForArticle(long cvid, long mid) result = await _articleApi.AddCoinForArticle(new AddCoinForArticleRequest(cvid, mid, _biliCookie.BiliJct), refer); } - catch (Exception ) + catch (Exception) { return false; } - + if (result.Code == 0) { - _logger.LogInformation("投币成功,经验+10 √" ); + _logger.LogInformation("投币成功,经验+10 √"); return true; } else @@ -80,6 +213,33 @@ public async Task AddCoinForArticle(long cvid, long mid) } + public async Task GetArticleCountOfUp(long mid) + { + var req = new SearchArticlesByUpIdDto() + { + Mid = mid + }; + + var w_ridDto = await _wbiDomainService.GetWridAsync(req); + + var fullDto = new SearchArticlesByUpIdFullFto() + { + Mid = mid, + w_rid = w_ridDto.w_rid, + wts = w_ridDto.wts + }; + + BiliApiResponse re = await _articleApi.SearchUpArticlesByUpId(fullDto); + + if (re.Code != 0) + { + throw new Exception(re.Message); + } + + return re.Data.Count; + } + + /// /// 计算所需要投的硬币数量 /// @@ -131,7 +291,9 @@ public async Task CalculateDonateCoinsCounts() return 0; } - public async Task GetNeedDonateCoinCounts() + #region private + + private async Task GetNeedDonateCoinCounts() { int configCoins = _dailyTaskOptions.NumberOfCoins; @@ -143,7 +305,7 @@ public async Task GetNeedDonateCoinCounts() //已投的硬币 int alreadyCoins = await _coinDomainService.GetDonatedCoins(); - + int targetCoins = configCoins; _logger.LogInformation("【今日已投】{already}枚", alreadyCoins); @@ -159,4 +321,40 @@ public async Task GetNeedDonateCoinCounts() _logger.LogInformation("已完成投币任务,不需要再投啦~"); return 0; } + + + private async Task IsCanDonate(long cvid) + { + try + { + if (_alreadyDonatedCoinCountCatch.Any(x => x.Key == cvid.ToString())) + { + _logger.LogDebug("重复专栏,丢弃处理"); + return false; + } + + if (!_alreadyDonatedCoinCountCatch.TryGetValue(cvid.ToString(), out int multiply)) + { + multiply = (await _articleApi.SearchArticleInfo(cvid)).Data.Coin; + _alreadyDonatedCoinCountCatch.TryAdd(cvid.ToString(), multiply); + } + // 在网页端我测试时只能投一枚硬币,暂时设置最多投一枚 + if (multiply >= 1) + { + return false; + } + + return true; + } + catch (Exception e) + { + _logger.LogWarning("异常:{mag}", e); + return false; + } + + } + + #endregion } + + diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs index 557f473f3..4770b2a11 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs @@ -2,8 +2,11 @@ namespace Ray.BiliBiliTool.DomainService.Interfaces; -public interface IArticleDomainService :IDomainService +public interface IArticleDomainService : IDomainService { // Task GetArticleCountByUp(long upId); Task AddCoinForArticle(long cvid, long mid); + + Task CalculateDonateCoinsCounts(); + Task AddCoinForArticles(); } diff --git a/test/DomainServiceTest/ArticleDomainServiceTest.cs b/test/DomainServiceTest/ArticleDomainServiceTest.cs index c001c5653..e86b360ed 100644 --- a/test/DomainServiceTest/ArticleDomainServiceTest.cs +++ b/test/DomainServiceTest/ArticleDomainServiceTest.cs @@ -1,14 +1,27 @@ -namespace DomainServiceTest; +using Xunit.Abstractions; + +namespace DomainServiceTest; public class ArticleDomainServiceTest { - public ArticleDomainServiceTest() + private readonly ITestOutputHelper _output; + public ArticleDomainServiceTest(ITestOutputHelper output) { + _output = output; Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); } + [Fact] + public async Task CalculateDonateCoinsCountsTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var config = Global.ConfigurationRoot; + var domainService = scope.ServiceProvider.GetRequiredService(); + + int coins = await domainService.CalculateDonateCoinsCounts(); + _output.WriteLine($"当前测试账户应当投币{coins}枚,请根据账户硬币余额自行计算结果是否正确"); + } - [Fact] @@ -22,4 +35,14 @@ public async Task AddCoinForArticleTest() await domainService.AddCoinForArticle(5806746, 486980924); } + + + [Fact] + public async Task AddCoinForArticlesTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var config = Global.ConfigurationRoot; + var domainService = scope.ServiceProvider.GetRequiredService(); + await domainService.AddCoinForArticles(); + } } From ae277a556da5a8e052f0ad50ed2d3ee54eda337e Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Mon, 23 Oct 2023 15:37:02 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=8BBug=EF=BC=8C=E7=9B=AE=E5=89=8D=E4=B8=93=E6=A0=8F?= =?UTF-8?q?=E6=8A=95=E5=B8=81=E5=8A=9F=E8=83=BD=E5=B7=B2=E7=BB=8F=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/Article/SearchUpArticlesResponse.cs | 2 +- .../DailyTaskAppService.cs | 24 +++- .../Options/DailyTaskOptions.cs | 5 + .../ArticleDomainService.cs | 131 ++++++++++-------- .../DonateCoinDomainService.cs | 2 +- .../Interfaces/IArticleDomainService.cs | 4 +- .../ArticleDomainServiceTest.cs | 13 -- 7 files changed, 100 insertions(+), 81 deletions(-) diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs index 7c839c809..bef59b449 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchUpArticlesResponse.cs @@ -4,7 +4,7 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; public class SearchUpArticlesResponse { - public List ArticleInfoList { get; set; } + public List Articles { get; set; } public int Count { get; set; } } diff --git a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs index 52ee259a1..88b3227fe 100644 --- a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs @@ -82,8 +82,8 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) DailyTaskInfo dailyTaskInfo = await GetDailyTaskStatus(); await WatchAndShareVideo(dailyTaskInfo); - // TODO 允许切换模式至投币给专栏 - await AddCoinsForVideo(userInfo); + + await AddCoins(userInfo); //签到: await LiveSign(); @@ -128,7 +128,7 @@ protected async Task SetCookiesAsync(BiliCookie biliCookie, Cancella private async Task Login() { UserInfo userInfo = await _accountDomainService.LoginByCookie(); - if (userInfo == null) throw new Exception("登录失败,请检查Cookie");//终止流程 + if (userInfo == null) throw new Exception("登录失败,请检查Cookie"); //终止流程 _expDic.TryGetValue("每日登录", out int exp); _logger.LogInformation("登录成功,经验+{exp} √", exp); @@ -157,6 +157,7 @@ private async Task WatchAndShareVideo(DailyTaskInfo dailyTaskInfo) _logger.LogInformation("已配置为关闭,跳过任务"); return; } + await _videoDomainService.WatchAndShareVideo(dailyTaskInfo); } @@ -164,16 +165,27 @@ private async Task WatchAndShareVideo(DailyTaskInfo dailyTaskInfo) /// 投币任务 /// [TaskInterceptor("投币", rethrowWhenException: false)] - private async Task AddCoinsForVideo(UserInfo userInfo) + private async Task AddCoins(UserInfo userInfo) { if (_dailyTaskOptions.SaveCoinsWhenLv6 && userInfo.Level_info.Current_level >= 6) { _logger.LogInformation("已经为LV6大佬,开始白嫖"); return; } - // await _donateCoinDomainService.AddCoinsForVideos(); - await _articleDomainService.AddCoinForArticles(); + if (_dailyTaskOptions.IsDonateCoinForArticle) + { + _logger.LogInformation("专栏投币已开启"); + + if (!await _articleDomainService.AddCoinForArticles()) + { + await _donateCoinDomainService.AddCoinsForVideos(); + } + } + else + { + await _donateCoinDomainService.AddCoinsForVideos(); + } } /// diff --git a/src/Ray.BiliBiliTool.Config/Options/DailyTaskOptions.cs b/src/Ray.BiliBiliTool.Config/Options/DailyTaskOptions.cs index 2258edf00..810562797 100644 --- a/src/Ray.BiliBiliTool.Config/Options/DailyTaskOptions.cs +++ b/src/Ray.BiliBiliTool.Config/Options/DailyTaskOptions.cs @@ -18,6 +18,11 @@ public class DailyTaskOptions /// public bool IsShareVideo { get; set; } + /// + /// 是否开启专栏投币模式 + /// + public bool IsDonateCoinForArticle { get; set; } + /// /// 每日设定的投币数 [0,5] /// diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index 8dbf5bb44..44177f6a7 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Polly; using Ray.BiliBiliTool.Agent; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article; @@ -56,13 +57,14 @@ public ArticleDomainService( /// 投币专栏任务 /// /// - public async Task AddCoinForArticles() + public async Task AddCoinForArticles() { var donateCoinsCounts = await CalculateDonateCoinsCounts(); if (donateCoinsCounts == 0) { - return; + // 没有可投的币相当于投币任务全部完成 + return true; } @@ -75,62 +77,74 @@ public async Task AddCoinForArticles() var upId = GetUpFromConfigUps(); var cvid = await GetRandomArticleFromUp(upId); + if (upId == 0 || cvid == 0) + { + _logger.LogInformation("未添加支持的Up主,任务跳过"); + return false; + } if (await AddCoinForArticle(cvid, upId)) success++; } if (success == donateCoinsCounts) - _logger.LogInformation("投币任务完成"); + _logger.LogInformation("专栏投币任务完成"); else + { _logger.LogInformation("投币尝试超过10次,已终止"); + return false; + } + _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0); + + return true; } + /// - /// 从支持UP主列表中随机挑选一位 + /// 给某一篇专栏投币 /// - /// 被挑选up主的mid - public long GetUpFromConfigUps() + /// 文章cvid + /// 文章作者mid + /// 投币是否成功(false 投币失败,true 投币成功) + public async Task AddCoinForArticle(long cvid, long mid) { - if (_dailyTaskOptions.SupportUpIdList == null || _dailyTaskOptions.SupportUpIdList.Count == 0) + BiliApiResponse result; + try { - return 0; + 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), + refer); } - - try + catch (Exception) { - long randomUpId = - _dailyTaskOptions.SupportUpIdList[new Random().Next(0, _dailyTaskOptions.SupportUpIdList.Count)]; - - if (randomUpId is 0 or long.MinValue) return 0; - - if (randomUpId.ToString() == _biliCookie.UserId) - { - _logger.LogDebug("不能为自己投币"); - return 0; - } + return false; + } - return randomUpId; + if (result.Code == 0) + { + _logger.LogInformation("投币成功,经验+10 √"); + return true; } - catch (Exception e) + else { - _logger.LogWarning("异常:{msg}", e); + _logger.LogError("投币错误 {message}", result.Message); + return false; } - - return 0; } + #region private + /// /// 从某个up主中随机挑选一个专栏 /// /// /// 专栏的cvid - public async Task GetRandomArticleFromUp(long mid) + private async Task GetRandomArticleFromUp(long mid) { - if (Equals(!_upArticleCountDicCatch.TryGetValue(mid, out int articleCount))) + if (!_upArticleCountDicCatch.TryGetValue(mid, out int articleCount)) { articleCount = await GetArticleCountOfUp(mid); _upArticleCountDicCatch.Add(mid, articleCount); @@ -166,7 +180,7 @@ public async Task GetRandomArticleFromUp(long mid) throw new Exception(re.Message); } - ArticleInfo articleInfo = re.Data.ArticleInfoList.FirstOrDefault(); + ArticleInfo articleInfo = re.Data.Articles.FirstOrDefault(); _logger.LogDebug("获取到的专栏{cvid}({title})", articleInfo.Id, articleInfo.Title); @@ -180,40 +194,48 @@ public async Task GetRandomArticleFromUp(long mid) } + // TODO 转变为异步代码 /// - /// 给某一篇专栏投币 + /// 从支持UP主列表中随机挑选一位 /// - /// 文章cvid - /// 文章作者mid - /// 投币是否成功(false 投币失败,true 投币成功) - public async Task AddCoinForArticle(long cvid, long mid) + /// 被挑选up主的mid + private long GetUpFromConfigUps() { - BiliApiResponse result; - 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), - refer); - } - catch (Exception) + if (_dailyTaskOptions.SupportUpIdList == null || _dailyTaskOptions.SupportUpIdList.Count == 0) { - return false; + return 0; } - if (result.Code == 0) + try { - _logger.LogInformation("投币成功,经验+10 √"); - return true; + long randomUpId = + _dailyTaskOptions.SupportUpIdList[new Random().Next(0, _dailyTaskOptions.SupportUpIdList.Count)]; + + if (randomUpId is 0 or long.MinValue) return 0; + + if (randomUpId.ToString() == _biliCookie.UserId) + { + _logger.LogDebug("不能为自己投币"); + return 0; + } + + return randomUpId; } - else + catch (Exception e) { - _logger.LogError("投币错误 {message}", result.Message); - return false; + _logger.LogWarning("异常:{msg}", e); } - } + return 0; + } - public async Task GetArticleCountOfUp(long mid) + /// + /// 获取Up主专栏总数 + /// + /// up主mid + /// 专栏总数 + /// + private async Task GetArticleCountOfUp(long mid) { var req = new SearchArticlesByUpIdDto() { @@ -239,12 +261,11 @@ public async Task GetArticleCountOfUp(long mid) return re.Data.Count; } - /// /// 计算所需要投的硬币数量 /// /// 硬币数量 - public async Task CalculateDonateCoinsCounts() + private async Task CalculateDonateCoinsCounts() { int needCoins = await GetNeedDonateCoinCounts(); @@ -291,8 +312,6 @@ public async Task CalculateDonateCoinsCounts() return 0; } - #region private - private async Task GetNeedDonateCoinCounts() { int configCoins = _dailyTaskOptions.NumberOfCoins; @@ -338,6 +357,7 @@ private async Task IsCanDonate(long cvid) multiply = (await _articleApi.SearchArticleInfo(cvid)).Data.Coin; _alreadyDonatedCoinCountCatch.TryAdd(cvid.ToString(), multiply); } + // 在网页端我测试时只能投一枚硬币,暂时设置最多投一枚 if (multiply >= 1) { @@ -351,10 +371,7 @@ private async Task IsCanDonate(long cvid) _logger.LogWarning("异常:{mag}", e); return false; } - } #endregion } - - diff --git a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs index 8e5114749..f2320991b 100644 --- a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs @@ -124,7 +124,7 @@ public async Task AddCoinsForVideos() } if (success == needCoins) - _logger.LogInformation("投币任务完成"); + _logger.LogInformation("视频投币任务完成"); else _logger.LogInformation("投币尝试超过10次,已终止"); diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs index 4770b2a11..b43706e51 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs @@ -4,9 +4,7 @@ namespace Ray.BiliBiliTool.DomainService.Interfaces; public interface IArticleDomainService : IDomainService { - // Task GetArticleCountByUp(long upId); Task AddCoinForArticle(long cvid, long mid); - Task CalculateDonateCoinsCounts(); - Task AddCoinForArticles(); + Task AddCoinForArticles(); } diff --git a/test/DomainServiceTest/ArticleDomainServiceTest.cs b/test/DomainServiceTest/ArticleDomainServiceTest.cs index e86b360ed..71f964064 100644 --- a/test/DomainServiceTest/ArticleDomainServiceTest.cs +++ b/test/DomainServiceTest/ArticleDomainServiceTest.cs @@ -11,19 +11,6 @@ public ArticleDomainServiceTest(ITestOutputHelper output) Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); } - [Fact] - public async Task CalculateDonateCoinsCountsTest() - { - using var scope = Global.ServiceProviderRoot.CreateScope(); - var config = Global.ConfigurationRoot; - var domainService = scope.ServiceProvider.GetRequiredService(); - - int coins = await domainService.CalculateDonateCoinsCounts(); - _output.WriteLine($"当前测试账户应当投币{coins}枚,请根据账户硬币余额自行计算结果是否正确"); - } - - - [Fact] public async Task AddCoinForArticleTest() { From 2ee8890238384e5df06f017603babe0f81dd8a04 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Mon, 23 Oct 2023 15:48:50 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E6=98=BE=E5=BC=8F=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=B8=AA=E6=80=A7=E5=8C=96=E9=85=8D=E7=BD=AEIsDonateCoinForArt?= =?UTF-8?q?icle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ray.BiliBiliTool.Console/appsettings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Ray.BiliBiliTool.Console/appsettings.json b/src/Ray.BiliBiliTool.Console/appsettings.json index 3f5e16d94..7d740645a 100644 --- a/src/Ray.BiliBiliTool.Console/appsettings.json +++ b/src/Ray.BiliBiliTool.Console/appsettings.json @@ -6,6 +6,7 @@ "Cron": "0 15 * * *", "IsWatchVideo": true, //是否观看视频 "IsShareVideo": true, //是否分享视频 + "IsDonateCoinForArticle": false, "NumberOfCoins": 5, //每日设定的投币数 [0,5] "NumberOfProtectedCoins": 0, // 要保留的硬币数量 [0,int_max],0 为不保留,int_max 通常取 (2^31)-1 "SaveCoinsWhenLv6": false, //达到六级后是否开始白嫖[false,true] From bfc33518b3dbc7024163678bac604146130f3b27 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sat, 25 Nov 2023 01:43:46 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=E4=B8=93?= =?UTF-8?q?=E6=A0=8F=E6=8A=95=E5=B8=81=E5=90=8C=E6=97=B6=E7=82=B9=E8=B5=9E?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=B8=8E=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=82=B9=E8=B5=9E=E5=85=B1=E4=BA=AB=E4=B8=80=E4=B8=AA=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BiliBiliAgent/Interfaces/IArticleApi.cs | 7 +++++++ src/Ray.BiliBiliTool.Console/appsettings.json | 2 +- .../ArticleDomainService.cs | 20 ++++++++++++++++++- .../Interfaces/IArticleDomainService.cs | 2 ++ .../ArticleDomainServiceTest.cs | 12 +++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs index a4c06fa8b..be54d5b08 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs @@ -32,6 +32,13 @@ Task> SearchUpArticlesByUpId( [HttpGet("/x/article/viewinfo?id={cvid}")] Task> SearchArticleInfo(long cvid); + + [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); + } diff --git a/src/Ray.BiliBiliTool.Console/appsettings.json b/src/Ray.BiliBiliTool.Console/appsettings.json index 7d740645a..d92fc1e05 100644 --- a/src/Ray.BiliBiliTool.Console/appsettings.json +++ b/src/Ray.BiliBiliTool.Console/appsettings.json @@ -1,5 +1,5 @@ { - "RunTasks": "Daily", //要运行的任务名称[Daily,LiveLottery,UnfollowBatched,VipBigPoint,Test],多个使用&分隔,如“Daily&LiveLottery”,建议使用命令行参数指定 + "RunTasks": "", //要运行的任务名称[Daily,LiveLottery,UnfollowBatched,VipBigPoint,Test],多个使用&分隔,如“Daily&LiveLottery”,建议使用命令行参数指定 //程序自定义个性化配置 "DailyTaskConfig": { diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index 44177f6a7..396968840 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -53,12 +53,20 @@ public ArticleDomainService( _dailyTaskOptions = dailyTaskOptions.CurrentValue; } + + + public async Task LikeArticle(long cvid) + { + await _articleApi.Like(cvid, _biliCookie.BiliJct); + } + /// /// 投币专栏任务 /// /// public async Task AddCoinForArticles() { + var donateCoinsCounts = await CalculateDonateCoinsCounts(); if (donateCoinsCounts == 0) @@ -84,7 +92,17 @@ public async Task AddCoinForArticles() } if (await AddCoinForArticle(cvid, upId)) + { + // 点赞 + if (_dailyTaskOptions.SelectLike) + { + await LikeArticle(cvid); + _logger.LogInformation("文章点赞成功"); + } success++; + } + + } if (success == donateCoinsCounts) @@ -101,7 +119,7 @@ public async Task AddCoinForArticles() return true; } - + /// /// 给某一篇专栏投币 /// diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs index b43706e51..f5a2f6d77 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IArticleDomainService.cs @@ -7,4 +7,6 @@ public interface IArticleDomainService : IDomainService Task AddCoinForArticle(long cvid, long mid); Task AddCoinForArticles(); + + Task LikeArticle(long cvid); } diff --git a/test/DomainServiceTest/ArticleDomainServiceTest.cs b/test/DomainServiceTest/ArticleDomainServiceTest.cs index 71f964064..6f9d268e4 100644 --- a/test/DomainServiceTest/ArticleDomainServiceTest.cs +++ b/test/DomainServiceTest/ArticleDomainServiceTest.cs @@ -11,6 +11,16 @@ public ArticleDomainServiceTest(ITestOutputHelper output) Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); } + [Fact] + public async Task LikeArticleTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var config = Global.ConfigurationRoot; + var domainService = scope.ServiceProvider.GetRequiredService(); + await domainService.LikeArticle(5806746); + } + + [Fact] public async Task AddCoinForArticleTest() { @@ -32,4 +42,6 @@ public async Task AddCoinForArticlesTest() var domainService = scope.ServiceProvider.GetRequiredService(); await domainService.AddCoinForArticles(); } + + } From 234a3de7f81a42403450696414aae77d25c77cc8 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sat, 25 Nov 2023 01:53:39 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A1=AC=E5=B8=81?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E5=A4=9A=E7=9A=84=E6=97=B6=E5=80=99=E5=8F=AF?= =?UTF-8?q?=E6=8A=95=E7=A1=AC=E5=B8=81=E6=95=B0=E8=BF=94=E5=9B=9E=E5=80=BC?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index 396968840..c41c818e9 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -327,7 +327,7 @@ private async Task CalculateDonateCoinsCounts() } } - return 0; + return needCoins; } private async Task GetNeedDonateCoinCounts() From 182501f5d34924890a9a100a3febda7a7d779429 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sat, 25 Nov 2023 02:34:39 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9Blog=EF=BC=8C=E6=96=B9=E4=BE=BF=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs | 1 + src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs index 88b3227fe..f7e6ccc84 100644 --- a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs @@ -179,6 +179,7 @@ private async Task AddCoins(UserInfo userInfo) if (!await _articleDomainService.AddCoinForArticles()) { + _logger.LogInformation("专栏投币结束,转入视频投币"); await _donateCoinDomainService.AddCoinsForVideos(); } } diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index c41c818e9..2ed14988f 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -236,7 +236,7 @@ private long GetUpFromConfigUps() _logger.LogDebug("不能为自己投币"); return 0; } - + _logger.LogDebug("挑选出的up主为{UpId}",randomUpId); return randomUpId; } catch (Exception e) From a41419b2a72755a54c6402ed42ec0e30e0344e46 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sat, 25 Nov 2023 12:11:06 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs | 2 +- .../BiliBiliAgent/Interfaces/IArticleApi.cs | 2 +- src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs index 6f9b46525..e4cae3b9b 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs @@ -11,7 +11,7 @@ public class SearchArticlesByUpIdDto public string Sort { get; set; } = "publish_time"; } -public class SearchArticlesByUpIdFullFto : SearchArticlesByUpIdDto +public class SearchArticlesByUpIdFullDto : SearchArticlesByUpIdDto { public string w_rid { get; set; } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs index be54d5b08..2019bb33b 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs @@ -22,7 +22,7 @@ public interface IArticleApi : IBiliBiliApi [Header("Origin", "https://space.bilibili.com")] [HttpGet("/x/space/wbi/article")] Task> SearchUpArticlesByUpId( - [PathQuery] SearchArticlesByUpIdFullFto request); + [PathQuery] SearchArticlesByUpIdFullDto request); /// /// 获取专栏详情 diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs index 2ed14988f..bda778dba 100644 --- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs @@ -182,7 +182,7 @@ private async Task GetRandomArticleFromUp(long mid) }; var w_ridDto = await _wbiDomainService.GetWridAsync(req); - var fullDto = new SearchArticlesByUpIdFullFto() + var fullDto = new SearchArticlesByUpIdFullDto() { Mid = mid, Ps = req.Ps, @@ -262,7 +262,7 @@ private async Task GetArticleCountOfUp(long mid) var w_ridDto = await _wbiDomainService.GetWridAsync(req); - var fullDto = new SearchArticlesByUpIdFullFto() + var fullDto = new SearchArticlesByUpIdFullDto() { Mid = mid, w_rid = w_ridDto.w_rid, From 25f489215371a2caf27c5ae287fe89a155291927 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sun, 26 Nov 2023 19:05:50 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E7=9A=84windows?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E6=9E=84=E5=BB=BA=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/publish.ps1 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 scripts/publish.ps1 diff --git a/scripts/publish.ps1 b/scripts/publish.ps1 new file mode 100644 index 000000000..e21417b8c --- /dev/null +++ b/scripts/publish.ps1 @@ -0,0 +1,16 @@ +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime win-x86 --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/win-x86 +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime win-x64 --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/win-x64 +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime win-arm64 --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/win-arm64 +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime linux-x64 --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/linux-x64 +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime linux-musl-x64 --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/linux-musl-x64 +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime linux-arm64 --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/linux-arm64 +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime linux-arm --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/linux-arm +dotnet.exe publish ../src/Ray.BiliBiliTool.Console/Ray.BiliBiliTool.Console.csproj --runtime osx-x64 --no-self-contained -c Release -p:PublishSingleFile=true -o ./bin/Publish/osx-x64 +Remove-Item ./bin/Publish/win-x86/*.pdb +Remove-Item ./bin/Publish/win-x64/*.pdb +Remove-Item ./bin/Publish/win-arm64/*.pdb +Remove-Item ./bin/Publish/linux-x64/*.pdb +Remove-Item ./bin/Publish/linux-musl-x64/*.pdb +Remove-Item ./bin/Publish/linux-arm64/*.pdb +Remove-Item ./bin/Publish/linux-arm/*.pdb +Remove-Item ./bin/Publish/osx-x64/*.pdb From 92be7fccf370a786da4f4058cf9c9e1c5a8a1706 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sun, 26 Nov 2023 19:06:30 +0800 Subject: [PATCH 12/15] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=9C=AA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs index f2320991b..c989c595f 100644 --- a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs @@ -419,7 +419,7 @@ private async Task IsCanDonate(string aid) //已经投满2个币的,不能再投 if (!await IsDonatedLessThenLimitCoinsForVideo(aid)) { - _logger.LogDebug("超出单个视频投币数量限制,丢弃处理", aid); + _logger.LogDebug("超出单个视频投币数量限制,丢弃处理"); return false; } From bf70735bb3e62618a2c78936a856c209d6ff022a Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Sun, 26 Nov 2023 19:07:16 +0800 Subject: [PATCH 13/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=A1=E5=88=B8?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9F=A5=E8=AF=A2=E7=9B=B8=E5=85=B3api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/VipTask/VouchersInfoResponse.cs | 28 +++++++++++++ .../Interfaces/IVipBigPointApi.cs | 3 ++ .../DailyTaskAppService.cs | 3 ++ .../VipBigPointAppService.cs | 34 ++++++++++++++- test/BiliAgentTest/VipApiTest.cs | 41 +++++++++++++++++++ 5 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs create mode 100644 test/BiliAgentTest/VipApiTest.cs diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs new file mode 100644 index 000000000..1e2e92816 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; + +public class VouchersInfoResponse +{ + public List VouchersInfos { get; set; } + public bool IsShortVip { get; set; } + public bool IsFreightOpen { get; set; } + public int Level { get; set; } + public int CurExp { get; set; } + public int NextExp { get; set; } + public bool IsVip { get; set; } + public int IsSeniorMember { get; set; } + public int Format060102 { get; set; } +} + + +public class VouchersInfo +{ + public int Type { get; set; } + public int State { get; set; } + public int ExpireTime { get; set; } + public int VipType { get; set; } + public int NextReceiveDays { get; set; } + public int PeriodEndUnix { get; set; } +} + diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs index ecc0451da..732411905 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs @@ -31,5 +31,8 @@ public interface IVipBigPointApi [HttpPost("/pgc/activity/deliver/task/complete")] Task ViewComplete([FormContent] ViewRequest request); + + [HttpGet("/x/vip/privilege/my")] + Task> GetVouchersInfo(); } } diff --git a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs index f7e6ccc84..db2ee02f9 100644 --- a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs @@ -95,6 +95,9 @@ 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 fd7a8c197..06251c2d6 100644 --- a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs @@ -19,20 +19,50 @@ public class VipBigPointAppService : AppService, IVipBigPointAppService private readonly IConfiguration _configuration; private readonly IVipBigPointApi _vipApi; private readonly IAccountDomainService _loginDomainService; + private readonly IVideoDomainService _videoDomainService; public VipBigPointAppService( IConfiguration configuration, ILogger logger, IVipBigPointApi vipApi, - IAccountDomainService loginDomainService - ) + IAccountDomainService loginDomainService, + IVideoDomainService videoDomainService) { _configuration = configuration; _logger = logger; _vipApi = vipApi; _loginDomainService = loginDomainService; + _videoDomainService = videoDomainService; } + // 临时测试函数 + public async Task Info() + { + 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("未完成"); + // 未观看视频,观看和分享视频为第一个执行的每日任务,如果认为观看,就直接抛弃此任务 + break; + case 1: + _logger.LogInformation("已兑换"); + break; + case 0: + _logger.LogInformation("未兑换"); + // TODO 兑换api + break; + } + + } + + } + + [TaskInterceptor("大会员大积分", TaskLevel.One)] public override async Task DoTaskAsync(CancellationToken cancellationToken) { diff --git a/test/BiliAgentTest/VipApiTest.cs b/test/BiliAgentTest/VipApiTest.cs new file mode 100644 index 000000000..2739e2e5d --- /dev/null +++ b/test/BiliAgentTest/VipApiTest.cs @@ -0,0 +1,41 @@ +using System.Threading.Tasks; +using Xunit; +using Microsoft.Extensions.DependencyInjection; +using Ray.BiliBiliTool.Agent; +using Ray.BiliBiliTool.Console; +using Ray.BiliBiliTool.Infrastructure; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Xunit.Abstractions; +namespace BiliAgentTest; + +public class VipApiTest +{ + private readonly ITestOutputHelper _output; + public VipApiTest(ITestOutputHelper output) + { + _output = output; + Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); + } + + [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"); + } + } + } +} From 265bff063296c43f22f113b2777297a52d2b98de Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Mon, 27 Nov 2023 09:26:29 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E9=A2=86=E5=8F=96=E5=A4=A7=E4=BC=9A=E5=91=98=E7=BB=8F=E9=AA=8C?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=EF=BC=8C=E5=90=8C=E6=97=B6=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=9C=A8=E5=A4=A7=E7=A7=AF=E5=88=86=E4=BB=BB=E5=8A=A1=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E4=BA=9B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/VipTask/VipExperienceRequest.cs | 6 ++ .../Dtos/VipTask/VouchersInfoResponse.cs | 4 +- .../Interfaces/IVipBigPointApi.cs | 4 ++ .../IVipBigPointAppService.cs | 2 + .../VipBigPointAppService.cs | 57 ++++++++++++++----- test/AppServiceTest/VipServiceTest.cs | 21 +++++++ test/BiliAgentTest/VipApiTest.cs | 20 ++++++- 7 files changed, 98 insertions(+), 16 deletions(-) create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VipExperienceRequest.cs create mode 100644 test/AppServiceTest/VipServiceTest.cs diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VipExperienceRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VipExperienceRequest.cs new file mode 100644 index 000000000..542e6b083 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VipExperienceRequest.cs @@ -0,0 +1,6 @@ +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; + +public class VipExperienceRequest +{ + public string csrf { get; set; } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs index 1e2e92816..ae85e0fd8 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/VouchersInfoResponse.cs @@ -4,7 +4,7 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; public class VouchersInfoResponse { - public List VouchersInfos { get; set; } + public List List { get; set; } public bool IsShortVip { get; set; } public bool IsFreightOpen { get; set; } public int Level { get; set; } @@ -16,7 +16,7 @@ public class VouchersInfoResponse } -public class VouchersInfo +public class List { public int Type { get; set; } public int State { get; set; } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs index 732411905..f83122d74 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs @@ -34,5 +34,9 @@ public interface IVipBigPointApi [HttpGet("/x/vip/privilege/my")] Task> GetVouchersInfo(); + + [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.Contracts/IVipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs index abd10b07f..f78097ef3 100644 --- a/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application.Contracts/IVipBigPointAppService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Text; +using System.Threading.Tasks; namespace Ray.BiliBiliTool.Application.Contracts { @@ -12,5 +13,6 @@ namespace Ray.BiliBiliTool.Application.Contracts public interface IVipBigPointAppService : IAppService { + Task VipExpress(); } } diff --git a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs index 06251c2d6..7d3d038ee 100644 --- a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Ray.BiliBiliTool.Agent; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; @@ -20,41 +21,66 @@ public class VipBigPointAppService : AppService, IVipBigPointAppService private readonly IVipBigPointApi _vipApi; private readonly IAccountDomainService _loginDomainService; private readonly IVideoDomainService _videoDomainService; + private readonly IAccountDomainService _accountDomainService; + private readonly BiliCookie _biliCookie; public VipBigPointAppService( IConfiguration configuration, ILogger logger, IVipBigPointApi vipApi, IAccountDomainService loginDomainService, - IVideoDomainService videoDomainService) + IVideoDomainService videoDomainService, + BiliCookie biliCookie, IAccountDomainService accountDomainService) { _configuration = configuration; _logger = logger; _vipApi = vipApi; _loginDomainService = loginDomainService; _videoDomainService = videoDomainService; + _biliCookie = biliCookie; + _accountDomainService = accountDomainService; } - // 临时测试函数 - public async Task Info() + 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; + var state = re.Data.List.Find(x => x.Type == 9).State; switch (state) { case 2: - _logger.LogInformation("未完成"); - // 未观看视频,观看和分享视频为第一个执行的每日任务,如果认为观看,就直接抛弃此任务 - break; + _logger.LogInformation("大会员经验观看任务未完成"); + _logger.LogInformation("开始观看视频"); + // 观看视频,暂时没有好办法解决,先这样使着 + DailyTaskInfo dailyTaskInfo = await _accountDomainService.GetDailyTaskStatus(); + await _videoDomainService.WatchAndShareVideo(dailyTaskInfo); + // 跳转到未兑换,执行兑换任务 + goto case 0; + case 1: - _logger.LogInformation("已兑换"); + _logger.LogInformation("大会员经验已兑换"); break; + case 0: - _logger.LogInformation("未兑换"); - // TODO 兑换api + _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 √"); + break; + + default: + _logger.LogDebug("大会员经验领取失败,未知错误"); break; } @@ -66,6 +92,9 @@ public async Task Info() [TaskInterceptor("大会员大积分", TaskLevel.One)] public override async Task DoTaskAsync(CancellationToken cancellationToken) { + await VipExpress(); + + // TODO 解决taskInfo在一个任务出错后,后续的任务均会报空引用错误 var ui = await GetUserInfo(); if (ui.GetVipType() == VipType.None) @@ -96,7 +125,7 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) taskInfo = await ViewAnimate(taskInfo); //浏览影视频道页10秒 - taskInfo = await ViewFilmChannel(taskInfo); + // taskInfo = await ViewFilmChannel(taskInfo); //浏览会员购页面10秒 taskInfo = ViewVipMall(taskInfo); @@ -106,10 +135,12 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken) //领取购买任务 taskInfo = await BuyVipVideo(taskInfo); - taskInfo = await BuyVipProduct(taskInfo); + // taskInfo = await BuyVipProduct(taskInfo); taskInfo = await BuyVipMall(taskInfo); - + taskInfo.LogInfo(_logger); + + } [TaskInterceptor("测试Cookie")] diff --git a/test/AppServiceTest/VipServiceTest.cs b/test/AppServiceTest/VipServiceTest.cs new file mode 100644 index 000000000..f50bafe0d --- /dev/null +++ b/test/AppServiceTest/VipServiceTest.cs @@ -0,0 +1,21 @@ +using Microsoft.Extensions.DependencyInjection; +using Ray.BiliBiliTool.Application.Contracts; +using Ray.BiliBiliTool.Infrastructure; + +namespace AppServiceTest; + +public class VipServiceTest +{ + public VipServiceTest() + { + Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); + } + + [Fact] + public async Task VipExpressTest() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var appService = scope.ServiceProvider.GetRequiredService(); + await appService.VipExpress(); + } +} diff --git a/test/BiliAgentTest/VipApiTest.cs b/test/BiliAgentTest/VipApiTest.cs index 2739e2e5d..70ae381f7 100644 --- a/test/BiliAgentTest/VipApiTest.cs +++ b/test/BiliAgentTest/VipApiTest.cs @@ -2,6 +2,7 @@ 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; @@ -24,10 +25,11 @@ public async Task VipInfoTest() 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); + var info = re.Data.VouchersInfos.Find(x => x.Type == 9); if (info != null) { _output.WriteLine(info.State.ToString()); @@ -38,4 +40,20 @@ public async Task VipInfoTest() } } } + + + [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); + } } From 8a716f8d5ff4a0b96a969591b908e746eb3ddb84 Mon Sep 17 00:00:00 2001 From: Polaris_cn Date: Mon, 27 Nov 2023 09:41:15 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/BiliAgentTest/VipApiTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/BiliAgentTest/VipApiTest.cs b/test/BiliAgentTest/VipApiTest.cs index 70ae381f7..3e540a0a2 100644 --- a/test/BiliAgentTest/VipApiTest.cs +++ b/test/BiliAgentTest/VipApiTest.cs @@ -29,7 +29,7 @@ public async Task VipInfoTest() var re = await api.GetVouchersInfo(); if (re.Code == 0) { - var info = re.Data.VouchersInfos.Find(x => x.Type == 9); + var info = re.Data.List.Find(x => x.Type == 9); if (info != null) { _output.WriteLine(info.State.ToString());