diff --git a/CHANGELOG.md b/CHANGELOG.md index c9dd19fc9..2e8137482 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -94,4 +94,11 @@ - Fix #423 : Change int to string to avoid overflow exception ## 0.4.6 - Fix: ck list init empty error -- Feature #440 : use 'apk add' to install dotnet in qinglong \ No newline at end of file +- Feature #440 : use 'apk add' to install dotnet in qinglong +## 1.0.0 +- Feature: Enable asynchronous +- Fix #344 : Support `Ctrl + C` to trigger exit event +- Fix #451 : Rebuild cookie factory pattern and fix bug of donating coin +- Featur: Replace AOP from MethodBoundaryAspect.Fody to Rougamo.Fody, to fix async exception +- Merge PR #448 : Fix typo +- Fix #446 : Change id type from int to long diff --git a/Ray.BiliBiliTool.sln b/Ray.BiliBiliTool.sln index bb7f0f112..4ef6f646a 100644 --- a/Ray.BiliBiliTool.sln +++ b/Ray.BiliBiliTool.sln @@ -153,6 +153,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.Serilog.Sinks.Microsoft EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.Serilog.Sinks.GotifyBatched", "src\Ray.Serilog.Sinks\Ray.Serilog.Sinks.GotifyBatched\Ray.Serilog.Sinks.GotifyBatched.csproj", "{B00FF75D-4C48-45ED-9A24-5C0D383317EE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppServiceTest", "test\AppServiceTest\AppServiceTest.csproj", "{1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DomainServiceTest", "test\DomainServiceTest\DomainServiceTest.csproj", "{26B21C30-7358-4E7B-A73E-2272F10A6CA8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -243,6 +247,14 @@ Global {B00FF75D-4C48-45ED-9A24-5C0D383317EE}.Debug|Any CPU.Build.0 = Debug|Any CPU {B00FF75D-4C48-45ED-9A24-5C0D383317EE}.Release|Any CPU.ActiveCfg = Release|Any CPU {B00FF75D-4C48-45ED-9A24-5C0D383317EE}.Release|Any CPU.Build.0 = Release|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}.Release|Any CPU.Build.0 = Release|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26B21C30-7358-4E7B-A73E-2272F10A6CA8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -283,6 +295,8 @@ Global {099C4E10-1114-495C-A664-63A15E77B31A} = {4BAFC980-7A73-45C3-9460-8B8CCB87939B} {FB9A43DE-00F0-42C4-BF92-AF61D752CCA2} = {4BAFC980-7A73-45C3-9460-8B8CCB87939B} {B00FF75D-4C48-45ED-9A24-5C0D383317EE} = {4BAFC980-7A73-45C3-9460-8B8CCB87939B} + {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} + {26B21C30-7358-4E7B-A73E-2272F10A6CA8} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {197319DA-1148-4A99-847C-8B270B6A29AB} diff --git a/common.props b/common.props index e1a1569dd..383b96e86 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ Ray - 0.4.6 + 1.0.0 $(NoWarn);CS1591;CS0436 diff --git a/docker/scripts/entry.sh b/docker/scripts/entry.sh index 97d3d94c8..d6795340e 100644 --- a/docker/scripts/entry.sh +++ b/docker/scripts/entry.sh @@ -32,7 +32,7 @@ else if ! [ -z "$Ray_VipBigPointConfig__Cron" ]; then echo "$Ray_VipBigPointConfig__Cron cd /app && dotnet $CONSOLE_DLL --runTasks=VipBigPoint" >>$CRON_FILE fi - if ! [ -z "$Ray_LiveFansMedalTaskConfig__Cron " ]; then + if ! [ -z "$Ray_LiveFansMedalTaskConfig__Cron" ]; then echo "$Ray_LiveFansMedalTaskConfig__Cron cd /app && dotnet $CONSOLE_DLL --runTasks=LiveFansMedal" >>$CRON_FILE fi fi diff --git a/qinglong/DefaultTasks/bili_task_base.sh b/qinglong/DefaultTasks/bili_task_base.sh index cda02eab9..0c71b0270 100644 --- a/qinglong/DefaultTasks/bili_task_base.sh +++ b/qinglong/DefaultTasks/bili_task_base.sh @@ -42,3 +42,4 @@ echo -e "bili仓库目录: $bili_repo_dir\n" cd $bili_repo_dir export Ray_PlateformType=QingLong +export DOTNET_ENVIRONMENT=Production diff --git a/qinglong/DefaultTasks/bili_task_daily.sh b/qinglong/DefaultTasks/bili_task_daily.sh index e9ebd6adc..9eacc6f69 100644 --- a/qinglong/DefaultTasks/bili_task_daily.sh +++ b/qinglong/DefaultTasks/bili_task_daily.sh @@ -6,4 +6,4 @@ cd ./src/Ray.BiliBiliTool.Console export Ray_RunTasks=Daily && \ -dotnet run --ENVIRONMENT=Production +dotnet run diff --git a/qinglong/DefaultTasks/bili_task_liveFansMedal.sh b/qinglong/DefaultTasks/bili_task_liveFansMedal.sh index aea011d95..d0c46ae62 100644 --- a/qinglong/DefaultTasks/bili_task_liveFansMedal.sh +++ b/qinglong/DefaultTasks/bili_task_liveFansMedal.sh @@ -6,4 +6,4 @@ cd ./src/Ray.BiliBiliTool.Console export Ray_RunTasks=LiveFansMedal && \ -dotnet run --ENVIRONMENT=Production +dotnet run diff --git a/qinglong/DefaultTasks/bili_task_liveLottery.sh b/qinglong/DefaultTasks/bili_task_liveLottery.sh index 9c209094f..4eda72904 100644 --- a/qinglong/DefaultTasks/bili_task_liveLottery.sh +++ b/qinglong/DefaultTasks/bili_task_liveLottery.sh @@ -6,4 +6,4 @@ cd ./src/Ray.BiliBiliTool.Console export Ray_RunTasks=LiveLottery && \ -dotnet run --ENVIRONMENT=Production +dotnet run diff --git a/qinglong/DefaultTasks/bili_task_login.sh b/qinglong/DefaultTasks/bili_task_login.sh index 3ff547614..b385ddf7d 100644 --- a/qinglong/DefaultTasks/bili_task_login.sh +++ b/qinglong/DefaultTasks/bili_task_login.sh @@ -6,4 +6,4 @@ cd ./src/Ray.BiliBiliTool.Console export Ray_RunTasks=Login && \ -dotnet run --ENVIRONMENT=Production +dotnet run diff --git a/qinglong/DefaultTasks/bili_task_test.sh b/qinglong/DefaultTasks/bili_task_test.sh index bf18cf76e..8ade4702d 100644 --- a/qinglong/DefaultTasks/bili_task_test.sh +++ b/qinglong/DefaultTasks/bili_task_test.sh @@ -6,4 +6,4 @@ cd ./src/Ray.BiliBiliTool.Console export Ray_RunTasks=Test && \ -dotnet run --ENVIRONMENT=Production +dotnet run diff --git a/qinglong/DefaultTasks/bili_task_tryFix.sh b/qinglong/DefaultTasks/bili_task_tryFix.sh index 8ff3e6d5c..5066d5697 100644 --- a/qinglong/DefaultTasks/bili_task_tryFix.sh +++ b/qinglong/DefaultTasks/bili_task_tryFix.sh @@ -16,9 +16,9 @@ echo -e "清理缓存...\n" cd $bili_repo_dir find . -type d -name "bin" -exec rm -rf {} + find . -type d -name "obj" -exec rm -rf {} + -echo "清理完成" +echo -e "清理完成\n" -echo "检测dotnet" +echo "检测dotnet..." dotnetVersion=$(dotnet --version) if [[ $dotnetVersion == 6.* ]]; then echo "已安装dotnet,当前版本:$dotnetVersion" @@ -26,4 +26,5 @@ else echo "which dotnet: $(which dotnet)" echo "Paht: $PATH" rm -f /usr/local/bin/dotnet -fi \ No newline at end of file +fi +echo "检测dotnet结束" \ No newline at end of file diff --git a/qinglong/DefaultTasks/bili_task_unfollowBatched.sh b/qinglong/DefaultTasks/bili_task_unfollowBatched.sh index 0db839f19..0541347e1 100644 --- a/qinglong/DefaultTasks/bili_task_unfollowBatched.sh +++ b/qinglong/DefaultTasks/bili_task_unfollowBatched.sh @@ -6,4 +6,4 @@ cd ./src/Ray.BiliBiliTool.Console export Ray_RunTasks=UnfollowBatched && \ -dotnet run --ENVIRONMENT=Production +dotnet run diff --git a/qinglong/DefaultTasks/bili_task_vipBigPoint.sh b/qinglong/DefaultTasks/bili_task_vipBigPoint.sh index da6baffec..b7bb4782f 100644 --- a/qinglong/DefaultTasks/bili_task_vipBigPoint.sh +++ b/qinglong/DefaultTasks/bili_task_vipBigPoint.sh @@ -6,4 +6,4 @@ cd ./src/Ray.BiliBiliTool.Console export Ray_RunTasks=VipBigPoint && \ -dotnet run --ENVIRONMENT=Production +dotnet run diff --git a/qinglong/DefaultTasks/dev/bili_dev_task_base.sh b/qinglong/DefaultTasks/dev/bili_dev_task_base.sh index 70b93a34e..5b389e88f 100644 --- a/qinglong/DefaultTasks/dev/bili_dev_task_base.sh +++ b/qinglong/DefaultTasks/dev/bili_dev_task_base.sh @@ -42,3 +42,4 @@ echo -e "bili仓库目录: $bili_repo_dir\n" cd $bili_repo_dir export Ray_PlateformType=QingLong +export DOTNET_ENVIRONMENT=Production \ No newline at end of file diff --git a/qinglong/DefaultTasks/dev/bili_dev_task_tryFix.sh b/qinglong/DefaultTasks/dev/bili_dev_task_tryFix.sh index 563ff1508..d5df0dff7 100644 --- a/qinglong/DefaultTasks/dev/bili_dev_task_tryFix.sh +++ b/qinglong/DefaultTasks/dev/bili_dev_task_tryFix.sh @@ -16,9 +16,9 @@ echo -e "清理缓存...\n" cd $bili_repo_dir find . -type d -name "bin" -exec rm -rf {} + find . -type d -name "obj" -exec rm -rf {} + -echo "清理完成" +echo -e "清理完成\n" -echo "检测dotnet" +echo "检测dotnet..." dotnetVersion=$(dotnet --version) if [[ $dotnetVersion == 6.* ]]; then echo "已安装dotnet,当前版本:$dotnetVersion" @@ -26,4 +26,5 @@ else echo "which dotnet: $(which dotnet)" echo "Paht: $PATH" rm -f /usr/local/bin/dotnet -fi \ No newline at end of file +fi +echo "检测dotnet结束" \ No newline at end of file diff --git a/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs b/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs index 3a5431614..410f42efe 100644 --- a/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs +++ b/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs @@ -35,7 +35,9 @@ protected override Task WriteLogAsync(ApiResponseContext context, LogMessage log ILogger logger = loggerFactory.CreateLogger(categoryName); if (logMessage.Exception == null) + { logger.LogDebug(logMessage.ToString());//修改为Debug等级 + } else { if (_logError) diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/AddCoinRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/AddCoinRequest.cs index 7327774da..5cc9d5d93 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/AddCoinRequest.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/AddCoinRequest.cs @@ -23,5 +23,13 @@ public AddCoinRequest(long aid, string csrf) public string Cross_domain { get; set; } = "true"; public string Csrf { get; set; } + + public string Eab_x { get; set; } = "2"; + + public string Ramval { get; set; } = "3"; + + public string Source { get; set; } = "web_normal"; + + public string Ga { get; set; } = "1"; } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Live/MedalWallDto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Live/MedalWallDto.cs index bfd5bb547..b28c579bc 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Live/MedalWallDto.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Live/MedalWallDto.cs @@ -26,9 +26,9 @@ public class MedalInfoDto { public string Medal_name { get; set; } - public int Medal_id { get; set; } + public long Medal_id { get; set; } - public int Target_id { get; set; } + public long Target_id { get; set; } public int Level { get; set; } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Passport/GetSsoListResponse.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Passport/GetSsoListResponse.cs new file mode 100644 index 000000000..feaef2e03 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Passport/GetSsoListResponse.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Passport +{ + public class GetSsoListResponse + { + public List sso { get; set; } + } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IHomeApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IHomeApi.cs new file mode 100644 index 000000000..d4dea1694 --- /dev/null +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IHomeApi.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; +using Ray.BiliBiliTool.Agent.Attributes; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using WebApiClientCore.Attributes; + +namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces +{ + /// + /// 主站首页接口API + /// + public interface IHomeApi : IBiliBiliApi + { + [HttpGet("")] + Task GetHomePageAsync([Header("Cookie")] string ck); + } +} diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs index 602385242..f016705b1 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs @@ -15,5 +15,8 @@ public interface IPassportApi : IBiliBiliApi [HttpGet("/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=main_mini")] //Task> CheckQrCodeHasScaned(string qrcode_key); Task CheckQrCodeHasScaned(string qrcode_key); + + [HttpGet("/x/passport-login/web/sso/list?biliCSRF={csrf}")] + Task> GetSsoListAsync(string csrf); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs index 45f425118..1feb2176b 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Ray.BiliBiliTool.Agent.Attributes; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using WebApiClientCore.Attributes; @@ -26,6 +27,6 @@ public interface IUserInfoApi : IBiliBiliApi /// uid /// [HttpGet("/x/space/wbi/acc/info?mid={userId}")] - Task> GetSpaceInfo(int userId); + Task> GetSpaceInfo(long userId); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs index 90e3a4161..5ee7b2d71 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs @@ -44,10 +44,10 @@ public interface IVideoApi : IBiliBiliApi /// /// [Header("Content-Type", "application/x-www-form-urlencoded")] - [Header("Referer", "https://www.bilibili.com/")] + //[Header("Referer", "https://www.bilibili.com/")] [Header("Origin", "https://www.bilibili.com")] - [HttpPost("/x/web-interface/coin/add?aid={aid}&multiply={multiply}&select_like={select_like}&cross_domain=true&csrf={csrf}")] - Task AddCoinForVideo([FormContent] AddCoinRequest request); + [HttpPost("/x/web-interface/coin/add")] + Task AddCoinForVideo([FormContent] AddCoinRequest request,[Header("referer")]string refer= "https://www.bilibili.com/video/BV123456/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=80c1601a7003934e7a90709c18dfcffd"); /// /// 获取当前用户对视频的投币信息 diff --git a/src/Ray.BiliBiliTool.Agent/BiliCookie.cs b/src/Ray.BiliBiliTool.Agent/BiliCookie.cs index 15029f40e..0edd8ea19 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliCookie.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliCookie.cs @@ -20,46 +20,40 @@ public BiliCookie(List ckStrList) : this(NullLogger.Instance, new CookieStrFactory(ckStrList)) { } public BiliCookie(ILogger logger, CookieStrFactory cookieStrFactory) - : this(logger, cookieStrFactory.GetCurrentCookieStr()) { } - - private BiliCookie(ILogger logger, string ckStr) - : base(ckStr, null, v => v.Contains(',') ? Uri.EscapeDataString(v) : v) - //: base(ckStr, null, v => v) + : base(cookieStrFactory) { _logger = logger; + } - if (CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(UserId)), out string userId)) - { - UserId = userId; - } - if (CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(BiliJct)), out string jct)) - { - BiliJct = jct; - } - if (CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(SessData)), out string sess)) - { - SessData = sess; - } - if (CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(LiveBuvid)), out string liveBuvid)) + public override string CkValueBuild(string value) + { + value = base.CkValueBuild(value); + + if (value.Contains(',')) { - LiveBuvid = liveBuvid; + value = Uri.EscapeDataString(value); } + + return value; } [Description("DedeUserID")] - public string UserId { get; set; } + public string UserId => CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(UserId)), out string userId) ? userId : ""; /// /// SESSDATA /// [Description("SESSDATA")] - public string SessData { get; set; } + public string SessData => CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(SessData)), out string sess) ? sess : ""; [Description("bili_jct")] - public string BiliJct { get; set; } + public string BiliJct => CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(BiliJct)), out string jct) ? jct : ""; [Description("LIVE_BUVID")] - public string LiveBuvid { get; set; } + public string LiveBuvid => CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(LiveBuvid)), out string liveBuvid) ? liveBuvid : ""; + + [Description("buvid3")] + public string Buvid => CookieItemDictionary.TryGetValue(GetPropertyDescription(nameof(Buvid)), out string buvid) ? buvid : ""; /// /// 检查是否已配置 @@ -104,22 +98,6 @@ public override void Check() throw new Exception($"请正确配置Cookie后再运行,配置方式见 {Constants.SourceCodeUrl}"); } - public override string ToString() - { - var re = CookieStr; - if (re.IsNullOrEmpty()) return ""; - - // https://github.com/RayWangQvQ/BiliBiliToolPro/issues/228 - if (!re.Contains("buvid3")) - { - //buvid3=G5F0F1C0-C1B5-D6E7-4CC0-13C1AAB7C1BC33815infoc; - var random = $"buvid3={Guid.NewGuid().ToString().ToUpper()}infoc; "; - re = random + re; - } - - return re; - } - private string GetPropertyDescription(string propertyName) { return GetType().GetPropertyDescription(propertyName); diff --git a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs index 9b6d1a9a2..b92f3d677 100644 --- a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs +++ b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs @@ -14,6 +14,7 @@ using Ray.BiliBiliTool.Agent.QingLong; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.Infrastructure; +using Ray.BiliBiliTool.Infrastructure.Cookie; namespace Ray.BiliBiliTool.Agent.Extensions { @@ -44,7 +45,7 @@ public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection se return new CookieStrFactory(list); }); - services.AddTransient(); + services.AddScoped(); //全局代理 services.SetGlobalProxy(configuration); @@ -67,12 +68,10 @@ public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection se services.AddBiliBiliClientApi("https://api.bilibili.com"); services.AddBiliBiliClientApi("https://api.bilibili.com"); services.AddBiliBiliClientApi("https://api.bilibili.com", false); - services.AddBiliBiliClientApi("https://api.bilibili.com"); - services.AddBiliBiliClientApi("http://passport.bilibili.com", false); - services.AddBiliBiliClientApi("https://live-trace.bilibili.com"); + services.AddBiliBiliClientApi("https://www.bilibili.com", false); //qinglong var qinglongHost = configuration["QL_URL"] ?? "http://localhost:5600"; diff --git a/src/Ray.BiliBiliTool.Application.Contracts/IAppService.cs b/src/Ray.BiliBiliTool.Application.Contracts/IAppService.cs index 78c3504f2..12aa1754d 100644 --- a/src/Ray.BiliBiliTool.Application.Contracts/IAppService.cs +++ b/src/Ray.BiliBiliTool.Application.Contracts/IAppService.cs @@ -1,6 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading; +using System.Threading.Tasks; namespace Ray.BiliBiliTool.Application.Contracts { @@ -9,6 +8,6 @@ namespace Ray.BiliBiliTool.Application.Contracts /// public interface IAppService { - void DoTask(); + Task DoTaskAsync(CancellationToken cancellationToken); } } diff --git a/src/Ray.BiliBiliTool.Application/AppService.cs b/src/Ray.BiliBiliTool.Application/AppService.cs index 3cfd1e293..91252325c 100644 --- a/src/Ray.BiliBiliTool.Application/AppService.cs +++ b/src/Ray.BiliBiliTool.Application/AppService.cs @@ -1,19 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; +using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; -using Ray.BiliBiliTool.Config.Options; namespace Ray.BiliBiliTool.Application { public abstract class AppService : IAppService { - public abstract void DoTask(); + public abstract Task DoTaskAsync(CancellationToken cancellationToken = default); } } diff --git a/src/Ray.BiliBiliTool.Application/Attributes/TaskInterceptorAttribute.cs b/src/Ray.BiliBiliTool.Application/Attributes/TaskInterceptorAttribute.cs index 63eb3e2cb..075913a6a 100644 --- a/src/Ray.BiliBiliTool.Application/Attributes/TaskInterceptorAttribute.cs +++ b/src/Ray.BiliBiliTool.Application/Attributes/TaskInterceptorAttribute.cs @@ -1,18 +1,17 @@ using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Text; -using MethodBoundaryAspect.Fody.Attributes; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Ray.BiliBiliTool.Infrastructure; +using Rougamo; +using Rougamo.Context; namespace Ray.BiliBiliTool.Application.Attributes { /// /// 任务拦截器 /// - public class TaskInterceptorAttribute : OnMethodBoundaryAspect + public class TaskInterceptorAttribute : MoAttribute //: OnMethodBoundaryAspect { private readonly ILogger _logger; private readonly string _taskName; @@ -28,7 +27,7 @@ public TaskInterceptorAttribute(string taskName = null, TaskLevel taskLevel = Ta _logger = Global.ServiceProviderRoot.GetRequiredService>(); } - public override void OnEntry(MethodExecutionArgs arg) + public override void OnEntry(MethodContext context) { if (_taskName == null) return; string end = _taskLevel == TaskLevel.One ? Environment.NewLine : ""; @@ -36,7 +35,7 @@ public override void OnEntry(MethodExecutionArgs arg) _logger.LogInformation(delimiter + "开始 {taskName} " + delimiter + end, _taskName); } - public override void OnExit(MethodExecutionArgs arg) + public override void OnExit(MethodContext context) { if (_taskName == null) return; @@ -46,17 +45,17 @@ public override void OnExit(MethodExecutionArgs arg) _logger.LogInformation(delimiter + append + "结束" + append + delimiter + Environment.NewLine); } - public override void OnException(MethodExecutionArgs arg) + public override void OnException(MethodContext context) { if (_rethrowWhenException) { - _logger.LogError("程序发生异常:{msg}", arg.Exception.Message); - base.OnException(arg); + _logger.LogError("程序发生异常:{msg}", context.Exception?.Message??""); + base.OnException(context); return; } - _logger.LogError("{task}失败,继续其他任务。失败信息:{msg}" + Environment.NewLine, _taskName, arg.Exception.Message); - arg.FlowBehavior = FlowBehavior.Continue; + _logger.LogError("{task}失败,继续其他任务。失败信息:{msg}" + Environment.NewLine, _taskName, context.Exception?.Message??""); + context.HandledException(this,null); } private string GetDelimiters() diff --git a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs index 34e364966..6f82e6d59 100644 --- a/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs @@ -1,20 +1,27 @@ using System; using System.Collections.Generic; +using System.Threading; +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.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; using Ray.BiliBiliTool.Config; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.DomainService.Interfaces; +using Ray.BiliBiliTool.Infrastructure; +using Ray.BiliBiliTool.Infrastructure.Cookie; +using Ray.BiliBiliTool.Infrastructure.Enums; namespace Ray.BiliBiliTool.Application { public class DailyTaskAppService : AppService, IDailyTaskAppService { private readonly ILogger _logger; - private readonly IAccountDomainService _loginDomainService; + private readonly IAccountDomainService _accountDomainService; private readonly IVideoDomainService _videoDomainService; private readonly IDonateCoinDomainService _donateCoinDomainService; private readonly IMangaDomainService _mangaDomainService; @@ -23,27 +30,31 @@ public class DailyTaskAppService : AppService, IDailyTaskAppService private readonly IChargeDomainService _chargeDomainService; private readonly DailyTaskOptions _dailyTaskOptions; private readonly ICoinDomainService _coinDomainService; - private readonly SecurityOptions _securityOptions; private readonly Dictionary _expDic; + private readonly ILoginDomainService _loginDomainService; + private readonly IConfiguration _configuration; + private readonly CookieStrFactory _cookieStrFactory; + private BiliCookie _biliCookie; public DailyTaskAppService( ILogger logger, IOptionsMonitor> dicOptions, - IAccountDomainService loginDomainService, + IAccountDomainService accountDomainService, IVideoDomainService videoDomainService, IDonateCoinDomainService donateCoinDomainService, IMangaDomainService mangaDomainService, ILiveDomainService liveDomainService, IVipPrivilegeDomainService vipPrivilegeDomainService, IChargeDomainService chargeDomainService, - IOptionsMonitor securityOptions, IOptionsMonitor dailyTaskOptions, - ICoinDomainService coinDomainService - ) + ICoinDomainService coinDomainService, + ILoginDomainService loginDomainService, IConfiguration configuration, + CookieStrFactory cookieStrFactory, + BiliCookie biliCookie) { _logger = logger; _expDic = dicOptions.Get(Constants.OptionsNames.ExpDictionaryName); - _loginDomainService = loginDomainService; + _accountDomainService = accountDomainService; _videoDomainService = videoDomainService; _donateCoinDomainService = donateCoinDomainService; _mangaDomainService = mangaDomainService; @@ -52,29 +63,57 @@ ICoinDomainService coinDomainService _chargeDomainService = chargeDomainService; _dailyTaskOptions = dailyTaskOptions.CurrentValue; _coinDomainService = coinDomainService; - _securityOptions = securityOptions.CurrentValue; + _loginDomainService = loginDomainService; + _configuration = configuration; + _cookieStrFactory = cookieStrFactory; + _biliCookie = biliCookie; } [TaskInterceptor("每日任务", TaskLevel.One)] - public override void DoTask() + public override async Task DoTaskAsync(CancellationToken cancellationToken) { + await SetCookiesAsync(_biliCookie, cancellationToken); + //每日任务赚经验: - UserInfo userInfo = Login(); - DailyTaskInfo dailyTaskInfo = GetDailyTaskStatus(); - WatchAndShareVideo(dailyTaskInfo); - AddCoinsForVideo(userInfo); + UserInfo userInfo = await Login(); + + DailyTaskInfo dailyTaskInfo = await GetDailyTaskStatus(); + await WatchAndShareVideo(dailyTaskInfo); + await AddCoinsForVideo(userInfo); //签到: - LiveSign(); - MangaSign(); - MangaRead(); - ExchangeSilver2Coin(); + await LiveSign(); + await MangaSign(); + await MangaRead(); + await ExchangeSilver2Coin(); //领福利: - ReceiveVipPrivilege(ref userInfo); - ReceiveMangaVipReward(userInfo); + await ReceiveVipPrivilege(userInfo); + await ReceiveMangaVipReward(userInfo); - Charge(userInfo); + await Charge(userInfo); + } + + + [TaskInterceptor("Set Cookie", TaskLevel.Two)] + protected async Task SetCookiesAsync(BiliCookie biliCookie, CancellationToken cancellationToken) + { + //判断cookie是否完整 + if (biliCookie.Buvid.IsNotNullOrEmpty()) + { + _logger.LogInformation("Cookie完整,不需要Set Cookie"); + return biliCookie; + } + + //Set + _logger.LogInformation("开始Set Cookie"); + var ck = await _loginDomainService.SetCookieAsync(biliCookie, cancellationToken); + + //持久化 + _logger.LogInformation("持久化Cookie"); + await SaveCookieAsync(ck, cancellationToken); + + return ck; } /// @@ -82,9 +121,9 @@ public override void DoTask() /// /// [TaskInterceptor("登录")] - private UserInfo Login() + private async Task Login() { - UserInfo userInfo = _loginDomainService.LoginByCookie(); + UserInfo userInfo = await _accountDomainService.LoginByCookie(); if (userInfo == null) throw new Exception("登录失败,请检查Cookie");//终止流程 _expDic.TryGetValue("每日登录", out int exp); @@ -98,55 +137,55 @@ private UserInfo Login() /// /// [TaskInterceptor(null, rethrowWhenException: false)] - private DailyTaskInfo GetDailyTaskStatus() + private async Task GetDailyTaskStatus() { - return _loginDomainService.GetDailyTaskStatus(); + return await _accountDomainService.GetDailyTaskStatus(); } /// /// 观看、分享视频 /// [TaskInterceptor("观看、分享视频", rethrowWhenException: false)] - private void WatchAndShareVideo(DailyTaskInfo dailyTaskInfo) + private async Task WatchAndShareVideo(DailyTaskInfo dailyTaskInfo) { if (!_dailyTaskOptions.IsWatchVideo && !_dailyTaskOptions.IsShareVideo) { _logger.LogInformation("已配置为关闭,跳过任务"); return; } - _videoDomainService.WatchAndShareVideo(dailyTaskInfo); + await _videoDomainService.WatchAndShareVideo(dailyTaskInfo); } /// /// 投币任务 /// [TaskInterceptor("投币", rethrowWhenException: false)] - private void AddCoinsForVideo(UserInfo userInfo) + private async Task AddCoinsForVideo(UserInfo userInfo) { if (_dailyTaskOptions.SaveCoinsWhenLv6 && userInfo.Level_info.Current_level >= 6) { _logger.LogInformation("已经为LV6大佬,开始白嫖"); return; } - _donateCoinDomainService.AddCoinsForVideos(); + await _donateCoinDomainService.AddCoinsForVideos(); } /// /// 直播中心签到 /// [TaskInterceptor("直播签到", rethrowWhenException: false)] - private void LiveSign() + private async Task LiveSign() { - _liveDomainService.LiveSign(); + await _liveDomainService.LiveSign(); } /// /// 直播中心的银瓜子兑换硬币 /// [TaskInterceptor("银瓜子兑换硬币", rethrowWhenException: false)] - private void ExchangeSilver2Coin() + private async Task ExchangeSilver2Coin() { - var success = _liveDomainService.ExchangeSilver2Coin(); + var success = await _liveDomainService.ExchangeSilver2Coin(); if (!success) return; //如果兑换成功,则打印硬币余额 @@ -158,16 +197,16 @@ private void ExchangeSilver2Coin() /// 每月领取大会员福利 /// [TaskInterceptor("领取大会员福利", rethrowWhenException: false)] - private void ReceiveVipPrivilege(ref UserInfo userInfo) + private async Task ReceiveVipPrivilege(UserInfo userInfo) { - var suc = _vipPrivilegeDomainService.ReceiveVipPrivilege(userInfo); + var suc = await _vipPrivilegeDomainService.ReceiveVipPrivilege(userInfo); //如果领取成功,需要刷新账户信息(比如B币余额) if (suc) { try { - userInfo = _loginDomainService.LoginByCookie(); + userInfo = await _accountDomainService.LoginByCookie(); } catch (Exception ex) { @@ -180,36 +219,52 @@ private void ReceiveVipPrivilege(ref UserInfo userInfo) /// 每月为自己充电 /// [TaskInterceptor("B币券充电", rethrowWhenException: false)] - private void Charge(UserInfo userInfo) + private async Task Charge(UserInfo userInfo) { - _chargeDomainService.Charge(userInfo); + await _chargeDomainService.Charge(userInfo); } /// /// 漫画签到 /// [TaskInterceptor("漫画签到", rethrowWhenException: false)] - private void MangaSign() + private async Task MangaSign() { - _mangaDomainService.MangaSign(); + await _mangaDomainService.MangaSign(); } /// /// 漫画阅读 /// [TaskInterceptor("漫画阅读", rethrowWhenException: false)] - private void MangaRead() + private async Task MangaRead() { - _mangaDomainService.MangaRead(); + await _mangaDomainService.MangaRead(); } /// /// 每月获取大会员漫画权益 /// [TaskInterceptor("领取大会员漫画权益", rethrowWhenException: false)] - private void ReceiveMangaVipReward(UserInfo userInfo) + private async Task ReceiveMangaVipReward(UserInfo userInfo) + { + await _mangaDomainService.ReceiveMangaVipReward(1, userInfo); + } + + private async Task SaveCookieAsync(BiliCookie ckInfo, CancellationToken cancellationToken) { - _mangaDomainService.ReceiveMangaVipReward(1, userInfo); + var platformType = _configuration.GetSection("PlateformType").Get(); + _logger.LogInformation("当前运行平台:{platform}", platformType); + + //更新cookie到青龙env + if (platformType == PlatformType.QingLong) + { + await _loginDomainService.SaveCookieToQinLongAsync(ckInfo, cancellationToken); + return; + } + + //更新cookie到json + await _loginDomainService.SaveCookieToJsonFileAsync(ckInfo, cancellationToken); } } } diff --git a/src/Ray.BiliBiliTool.Application/FodyWeavers.xml b/src/Ray.BiliBiliTool.Application/FodyWeavers.xml index 941268255..9c7ce4fdb 100644 --- a/src/Ray.BiliBiliTool.Application/FodyWeavers.xml +++ b/src/Ray.BiliBiliTool.Application/FodyWeavers.xml @@ -1,3 +1,3 @@  - - \ No newline at end of file + + diff --git a/src/Ray.BiliBiliTool.Application/FodyWeavers.xsd b/src/Ray.BiliBiliTool.Application/FodyWeavers.xsd index f421e79ed..f35a69b73 100644 --- a/src/Ray.BiliBiliTool.Application/FodyWeavers.xsd +++ b/src/Ray.BiliBiliTool.Application/FodyWeavers.xsd @@ -4,7 +4,7 @@ - + diff --git a/src/Ray.BiliBiliTool.Application/LiveFansMedalAppService.cs b/src/Ray.BiliBiliTool.Application/LiveFansMedalAppService.cs index 427d2b8f5..91671e6e6 100644 --- a/src/Ray.BiliBiliTool.Application/LiveFansMedalAppService.cs +++ b/src/Ray.BiliBiliTool.Application/LiveFansMedalAppService.cs @@ -1,4 +1,6 @@ -using Microsoft.Extensions.Logging; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; using Ray.BiliBiliTool.DomainService.Interfaces; @@ -7,42 +9,39 @@ namespace Ray.BiliBiliTool.Application { public class LiveFansMedalAppService : AppService, ILiveFansMedalAppService { - private readonly ILogger _logger; private readonly ILiveDomainService _liveDomainService; public LiveFansMedalAppService( - ILiveDomainService liveDomainService, - ILogger logger + ILiveDomainService liveDomainService ) { _liveDomainService = liveDomainService; - _logger = logger; } [TaskInterceptor("直播间互动", TaskLevel.One)] - public override void DoTask() + public override async Task DoTaskAsync(CancellationToken cancellationToken) { - SendDanmaku(); - Like(); - HeartBeat(); + await SendDanmaku(); + await Like(); + await HeartBeat(); } - [TaskInterceptor("发送弹幕", TaskLevel.Two,false)] - private void SendDanmaku() + [TaskInterceptor("发送弹幕", TaskLevel.Two, false)] + private async Task SendDanmaku() { - _liveDomainService.SendDanmakuToFansMedalLive(); + await _liveDomainService.SendDanmakuToFansMedalLive(); } - [TaskInterceptor("点赞直播间", TaskLevel.Two,false)] - private void Like() + [TaskInterceptor("点赞直播间", TaskLevel.Two, false)] + private async Task Like() { - _liveDomainService.LikeFansMedalLive(); + await _liveDomainService.LikeFansMedalLive(); } - [TaskInterceptor("直播时长挂机", TaskLevel.Two,false)] - private void HeartBeat() + [TaskInterceptor("直播时长挂机", TaskLevel.Two, false)] + private async Task HeartBeat() { - _liveDomainService.SendHeartBeatToFansMedalLive(); + await _liveDomainService.SendHeartBeatToFansMedalLive(); } } } diff --git a/src/Ray.BiliBiliTool.Application/LiveLotteryTaskAppService.cs b/src/Ray.BiliBiliTool.Application/LiveLotteryTaskAppService.cs index 80e3bb128..5e321dd63 100644 --- a/src/Ray.BiliBiliTool.Application/LiveLotteryTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/LiveLotteryTaskAppService.cs @@ -1,73 +1,59 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; +using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.DomainService.Interfaces; -using Ray.BiliBiliTool.Infrastructure.Enums; namespace Ray.BiliBiliTool.Application { public class LiveLotteryTaskAppService : AppService, ILiveLotteryTaskAppService { private readonly ILogger _logger; - private readonly IConfiguration _configuration; private readonly ILiveDomainService _liveDomainService; private readonly LiveLotteryTaskOptions _liveLotteryTaskOptions; - private readonly SecurityOptions _securityOptions; private readonly IAccountDomainService _accountDomainService; - public LiveLotteryTaskAppService( - IConfiguration configuration, - ILiveDomainService liveDomainService, - IOptionsMonitor securityOptions, + public LiveLotteryTaskAppService(ILiveDomainService liveDomainService, IOptionsMonitor liveLotteryTaskOptions, ILogger logger, IAccountDomainService accountDomainService ) { - _configuration = configuration; _liveDomainService = liveDomainService; _liveLotteryTaskOptions = liveLotteryTaskOptions.CurrentValue; - _securityOptions = securityOptions.CurrentValue; _logger = logger; _accountDomainService = accountDomainService; } [TaskInterceptor("天选时刻抽奖", TaskLevel.One)] - public override void DoTask() + public override async Task DoTaskAsync(CancellationToken cancellationToken) { - LogUserInfo(); - LotteryTianXuan(); - AutoGroupFollowings(); + await LogUserInfo(); + await LotteryTianXuan(); + await AutoGroupFollowings(); } [TaskInterceptor("打印用户信息")] - private void LogUserInfo() + private async Task LogUserInfo() { - _accountDomainService.LoginByCookie(); + await _accountDomainService.LoginByCookie(); } [TaskInterceptor("抽奖")] - private void LotteryTianXuan() + private async Task LotteryTianXuan() { - _liveDomainService.TianXuan(); + await _liveDomainService.TianXuan(); } [TaskInterceptor("自动分组关注的主播")] - private void AutoGroupFollowings() + private async Task AutoGroupFollowings() { if (_liveLotteryTaskOptions.AutoGroupFollowings) { - _liveDomainService.GroupFollowing(); + await _liveDomainService.GroupFollowing(); } else { diff --git a/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs b/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs index e7dd5967a..06571f45c 100644 --- a/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs @@ -18,392 +18,71 @@ using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; using Ray.BiliBiliTool.Infrastructure.Enums; -using Ray.BiliBiliTool.Infrastructure; -using Microsoft.Extensions.DependencyInjection; +using System.Threading; +using Ray.BiliBiliTool.DomainService.Interfaces; +using Ray.BiliBiliTool.Infrastructure.Cookie; namespace Ray.BiliBiliTool.Application { public class LoginTaskAppService : AppService, ILoginTaskAppService { private readonly ILogger _logger; - private readonly IPassportApi _passportApi; - private readonly IHostEnvironment _hostingEnvironment; - private readonly IQingLongApi _qingLongApi; + private readonly ILoginDomainService _loginDomainService; private readonly IConfiguration _configuration; public LoginTaskAppService( IConfiguration configuration, ILogger logger, - IPassportApi passportApi, - IHostEnvironment hostingEnvironment, - IQingLongApi qingLongApi) + ILoginDomainService loginDomainService) { _configuration = configuration; _logger = logger; - _passportApi = passportApi; - _hostingEnvironment = hostingEnvironment; - _qingLongApi = qingLongApi; + _loginDomainService = loginDomainService; } [TaskInterceptor("扫码登录", TaskLevel.One)] - public override void DoTask() + public override async Task DoTaskAsync(CancellationToken cancellationToken) { //扫码登录 - var suc = QrCodeLogin(out BiliCookie cookieInfo); - if (!suc) return; + var cookieInfo = await QrCodeLoginAsync(cancellationToken); + if (cookieInfo == null) return; - var plateformType = _configuration.GetSection("PlateformType").Get(); + //set cookie + cookieInfo = await SetCookiesAsync(cookieInfo, cancellationToken); - //更新cookie到青龙env - if (plateformType == PlateformType.QingLong) - { - AddOrUpdateCkToQingLong(cookieInfo); - return; - } - - //更新cookie到json - AddOrUpdateCkToJson(cookieInfo); + //持久化cookie + await SaveCookieAsync(cookieInfo, cancellationToken); } - [TaskInterceptor("二维码登录", TaskLevel.Two)] - protected bool QrCodeLogin(out BiliCookie cookieInfo) + [TaskInterceptor("获取二维码", TaskLevel.Two)] + protected async Task QrCodeLoginAsync(CancellationToken cancellationToken) { - var result = false; - cookieInfo = new BiliCookie(""); - - var re = _passportApi.GenerateQrCode().Result; - if (re.Code != 0) - { - _logger.LogWarning("获取二维码失败:{msg}", re.ToJson()); - return result; - } - - var url = re.Data.Url; - GenerateQrCode(url); - - var online = GetOnlinePic(url); - _logger.LogInformation(Environment.NewLine + Environment.NewLine); - _logger.LogInformation("如果上方二维码显示异常,或扫描失败,请使用浏览器访问如下链接,查看高清二维码:"); - _logger.LogInformation(online + Environment.NewLine + Environment.NewLine); - - var waitTimes = 10; - _logger.LogInformation("我数到{num},动作快点", waitTimes); - for (int i = 0; i < waitTimes; i++) - { - _logger.LogInformation("[{num}]等待扫描...", i + 1); - - Task.Delay(5 * 1000).Wait(); - - var check = _passportApi.CheckQrCodeHasScaned(re.Data.Qrcode_key).Result; - if (!check.IsSuccessStatusCode) - { - _logger.LogWarning("调用检测接口异常"); - continue; - } - - var content = JsonConvert.DeserializeObject>(check.Content.ReadAsStringAsync().Result); - if (content.Code != 0) - { - _logger.LogWarning("调用检测接口异常:{msg}", check.ToJson()); - break; - } - - if (content.Data.Code == 86038)//已失效 - { - _logger.LogInformation(content.Data.Message); - break; - } - - if (content.Data.Code == 0) - { - _logger.LogInformation("扫描成功!"); - IEnumerable cookies = check.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value; - - cookieInfo = GetCookie(cookies); - result = true; - - break; - } - - _logger.LogInformation("{msg}", content.Data.Message + Environment.NewLine); - } - - return result; + var biliCookie = await _loginDomainService.LoginByQrCodeAsync(cancellationToken); + return biliCookie; } - - [TaskInterceptor("添加ck到json配置文件", TaskLevel.Two)] - protected void AddOrUpdateCkToJson(BiliCookie ckInfo) + [TaskInterceptor("Set Cookie", TaskLevel.Two)] + protected async Task SetCookiesAsync(BiliCookie biliCookie, CancellationToken cancellationToken) { - //读取json - var path = _hostingEnvironment.ContentRootPath; - var indexOfBin = path.LastIndexOf("bin"); - if (indexOfBin != -1) path = path.Substring(0, indexOfBin); - var fileProvider = new PhysicalFileProvider(path); - IFileInfo fileInfo = fileProvider.GetFileInfo("cookies.json"); - _logger.LogInformation("目标json地址:{path}", fileInfo.PhysicalPath); - - if (!fileInfo.Exists) - { - using (var stream = File.Create(fileInfo.PhysicalPath)) - { - using (var sw = new StreamWriter(stream)) - { - sw.Write($"{{{Environment.NewLine}}}"); - } - } - } - - string json; - using (var stream = new FileStream(fileInfo.PhysicalPath, FileMode.Open)) - { - using var reader = new StreamReader(stream); - json = reader.ReadToEnd(); - } - var lines = json.Split(Environment.NewLine).ToList(); - - var indexOfCkConfigKey = lines.FindIndex(x => x.TrimStart().StartsWith("\"BiliBiliCookies\"")); - if (indexOfCkConfigKey == -1) - { - _logger.LogInformation("未配置过cookie,初始化并新增"); - - var indexOfInsert = lines.FindIndex(x => x.TrimStart().StartsWith("{")); - lines.InsertRange(indexOfInsert + 1, new List() - { - " \"BiliBiliCookies\":[", - $@" ""{ckInfo.CookieStr}"",", - " ]," - }); - - SaveJson(lines, fileInfo); - _logger.LogInformation("新增成功!"); - return; - } - - ckInfo.CookieItemDictionary.TryGetValue("DedeUserID", out string userId); - userId ??= ckInfo.CookieStr; - var indexOfCkConfigEnd = lines.FindIndex(indexOfCkConfigKey, x => x.TrimStart().StartsWith("]")); - var indexOfTargetCk = lines.FindIndex(indexOfCkConfigKey, - indexOfCkConfigEnd - indexOfCkConfigKey, - x => x.Contains(userId) && !x.TrimStart().StartsWith("//")); - - if (indexOfTargetCk == -1) - { - _logger.LogInformation("不存在该用户,新增cookie"); - lines.Insert(indexOfCkConfigEnd, $@" ""{ckInfo.CookieStr}"","); - SaveJson(lines, fileInfo); - _logger.LogInformation("新增成功!"); - return; - } - - _logger.LogInformation("已存在该用户,更新cookie"); - lines[indexOfTargetCk] = $@" ""{ckInfo.CookieStr}"","; - SaveJson(lines, fileInfo); - _logger.LogInformation("更新成功!"); + var ck= await _loginDomainService.SetCookieAsync(biliCookie, cancellationToken); + return ck; } - [TaskInterceptor("添加ck到青龙环境变量", TaskLevel.Two)] - protected void AddOrUpdateCkToQingLong(BiliCookie ckInfo) + [TaskInterceptor("持久化Cookie", TaskLevel.Two)] + protected async Task SaveCookieAsync(BiliCookie ckInfo, CancellationToken cancellationToken) { - //拿token - var suc = GetToken(out string token); + var platformType = _configuration.GetSection("PlateformType").Get(); + _logger.LogInformation("当前运行平台:{platform}",platformType); - if (!suc) return; - - token = $"Bearer {token}"; - - //查env - var re = _qingLongApi.GetEnvs("Ray_BiliBiliCookies__", token).Result; - - if (re.Code != 200) - { - _logger.LogInformation($"查询环境变量失败:{re}", re.ToJson()); - return; - } - - var list = re.Data.Where(x => x.name.StartsWith("Ray_BiliBiliCookies__")).ToList(); - QingLongEnv oldEnv = list.FirstOrDefault(x => x.value.Contains(ckInfo.UserId)); - - if (oldEnv != null) + //更新cookie到青龙env + if (platformType == PlatformType.QingLong) { - _logger.LogInformation("用户已存在,更新cookie"); - _logger.LogInformation("Key:{key}", oldEnv.name); - var update = new UpdateQingLongEnv() - { - id = oldEnv.id, - name = oldEnv.name, - value = ckInfo.CookieStr, - remarks = oldEnv.remarks.IsNullOrEmpty() - ? $"bili-{ckInfo.UserId}" - : oldEnv.remarks, - }; - - var updateRe = _qingLongApi.UpdateEnvs(update, token).Result; - if (updateRe.Code == 200) _logger.LogInformation("更新成功!"); - else _logger.LogInformation(updateRe.ToJson()); - + await _loginDomainService.SaveCookieToQinLongAsync(ckInfo, cancellationToken); return; } - _logger.LogInformation("用户不存在,新增cookie"); - var maxNum = -1; - if (list.Any()) - { - maxNum = list.Select(x => - { - var num = x.name.Replace("Ray_BiliBiliCookies__", ""); - var parseSuc = int.TryParse(num, out int envNum); - return parseSuc ? envNum : 0; - }).Max(); - } - var name = $"Ray_BiliBiliCookies__{maxNum + 1}"; - _logger.LogInformation("Key:{key}", name); - - var add = new AddQingLongEnv() - { - name = name, - value = ckInfo.CookieStr, - remarks = $"bili-{ckInfo.UserId}" - }; - var addRe = _qingLongApi.AddEnvs(new List() { add }, token).Result; - if (addRe.Code == 200) _logger.LogInformation("新增成功!"); - else _logger.LogInformation(addRe.ToJson()); - } - - private void GenerateQrCode(string str) - { - var qrGenerator = new QRCodeGenerator(); - QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, QRCodeGenerator.ECCLevel.L); - - _logger.LogInformation("AsciiQRCode:"); - //var qrCode = new AsciiQRCode(qrCodeData); - //var qrCodeStr = qrCode.GetGraphic(1, drawQuietZones: false); - //_logger.LogInformation(Environment.NewLine + qrCodeStr); - - //Console.WriteLine("Console:"); - //Print(qrCodeData); - PrintSmall(qrCodeData); - } - - private void Print(QRCodeData qrCodeData) - { - Console.BackgroundColor = ConsoleColor.White; - for (int i = 0; i < qrCodeData.ModuleMatrix.Count + 2; i++) Console.Write(" ");//中文全角的空格符 - Console.WriteLine(); - for (int j = 0; j < qrCodeData.ModuleMatrix.Count; j++) - { - for (int i = 0; i < qrCodeData.ModuleMatrix.Count; i++) - { - //char charToPoint = qrCode.Matrix[i, j] ? '█' : ' '; - Console.Write(i == 0 ? " " : "");//中文全角的空格符 - Console.BackgroundColor = qrCodeData.ModuleMatrix[i][j] ? ConsoleColor.Black : ConsoleColor.White; - Console.Write(' ');//中文全角的空格符 - Console.BackgroundColor = ConsoleColor.White; - Console.Write(i == qrCodeData.ModuleMatrix.Count - 1 ? " " : "");//中文全角的空格符 - } - Console.WriteLine(); - } - for (int i = 0; i < qrCodeData.ModuleMatrix.Count + 2; i++) Console.Write(" ");//中文全角的空格符 - - Console.WriteLine(); - } - - private void PrintSmall(QRCodeData qrCodeData) - { - //黑黑(" ") - //白白("█") - //黑白("▄") - //白黑("▀") - var dic = new Dictionary() - { - {"11", ' '}, - {"00", '█'}, - {"10", '▄'}, - {"01", '▀'},//todo:win平台的cmd会显示?,是已知问题,待想办法解决 - //{"01", '^'},//▼▔ - }; - - var count = qrCodeData.ModuleMatrix.Count; - - var list = new List(); - for (int rowNum = 0; rowNum < count; rowNum++) - { - var rowStr = ""; - for (int colNum = 0; colNum < count; colNum++) - { - var num = qrCodeData.ModuleMatrix[colNum][rowNum] ? "1" : "0"; - var numDown = "0"; - if (rowNum + 1 < count) - numDown = qrCodeData.ModuleMatrix[colNum][rowNum + 1] ? "1" : "0"; - - rowStr += dic[num + numDown]; - } - list.Add(rowStr); - rowNum++; - } - - _logger.LogInformation(Environment.NewLine + string.Join(Environment.NewLine, list)); - } - - private string GetOnlinePic(string str) - { - var encode = System.Web.HttpUtility.UrlEncode(str); ; - return $"https://tool.lu/qrcode/basic.html?text={encode}"; - } - - private BiliCookie GetCookie(IEnumerable cookies) - { - var ckItemList = new List(); - foreach (var item in cookies) - { - ckItemList.Add(item.Split(';').FirstOrDefault()); - } - - var biliCk = new BiliCookie(string.Join("; ", ckItemList)); - - biliCk.Check(); - return biliCk; - } - - private void SaveJson(List lines, IFileInfo fileInfo) - { - var newJson = string.Join(Environment.NewLine, lines); - - using (var sw = new StreamWriter(fileInfo.PhysicalPath)) - { - sw.Write(newJson); - } - } - - #region qinglong - - private bool GetToken(out string token) - { - token = ""; - - var qlDir = _configuration["QL_DIR"] ?? "/ql"; - - string authFile = qlDir; - if (_hostingEnvironment.ContentRootPath.Contains($"{qlDir}/data/")) - { - authFile = Path.Combine(authFile, "data"); - } - authFile = Path.Combine(authFile, "config/auth.json"); - - if (!File.Exists(authFile)) - { - _logger.LogWarning("获取青龙授权失败,文件不在:{authFile}", authFile); - return false; - } - - var authJson = File.ReadAllText(authFile); - - var jb = JsonConvert.DeserializeObject(authJson); - token = jb["token"].ToString(); - - return true; + //更新cookie到json + await _loginDomainService.SaveCookieToJsonFileAsync(ckInfo, cancellationToken); } - - #endregion } } diff --git a/src/Ray.BiliBiliTool.Application/Ray.BiliBiliTool.Application.csproj b/src/Ray.BiliBiliTool.Application/Ray.BiliBiliTool.Application.csproj index 6ae26800a..46d04486a 100644 --- a/src/Ray.BiliBiliTool.Application/Ray.BiliBiliTool.Application.csproj +++ b/src/Ray.BiliBiliTool.Application/Ray.BiliBiliTool.Application.csproj @@ -5,11 +5,11 @@ - + diff --git a/src/Ray.BiliBiliTool.Application/TestAppService.cs b/src/Ray.BiliBiliTool.Application/TestAppService.cs index b8c721ed3..ad624fba3 100644 --- a/src/Ray.BiliBiliTool.Application/TestAppService.cs +++ b/src/Ray.BiliBiliTool.Application/TestAppService.cs @@ -1,4 +1,6 @@ -using Microsoft.Extensions.Configuration; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; @@ -24,9 +26,9 @@ IAccountDomainService accountDomainService } [TaskInterceptor("测试Cookie")] - public override void DoTask() + public override async Task DoTaskAsync(CancellationToken cancellationToken) { - _accountDomainService.LoginByCookie(); + await _accountDomainService.LoginByCookie(); } } } diff --git a/src/Ray.BiliBiliTool.Application/UnfollowBatchedTaskAppService.cs b/src/Ray.BiliBiliTool.Application/UnfollowBatchedTaskAppService.cs index 10eb6e540..62d550a3a 100644 --- a/src/Ray.BiliBiliTool.Application/UnfollowBatchedTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/UnfollowBatchedTaskAppService.cs @@ -1,48 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.DomainService.Interfaces; -using Ray.BiliBiliTool.Infrastructure.Enums; namespace Ray.BiliBiliTool.Application { public class UnfollowBatchedTaskAppService : AppService, IUnfollowBatchedTaskAppService { - private readonly ILogger _logger; - private readonly IConfiguration _configuration; - private readonly SecurityOptions _securityOptions; - private readonly UnfollowBatchedTaskOptions _unfollowBatchedTaskOptions; private readonly IAccountDomainService _accountDomainService; public UnfollowBatchedTaskAppService( - IConfiguration configuration, - IOptionsMonitor securityOptions, - IOptionsMonitor unfollwBatchedTaskOptions, - ILogger logger, IAccountDomainService accountDomainService ) { - _configuration = configuration; - _securityOptions = securityOptions.CurrentValue; - _logger = logger; _accountDomainService = accountDomainService; - _unfollowBatchedTaskOptions = unfollwBatchedTaskOptions.CurrentValue; } [TaskInterceptor("批量取关", TaskLevel.One)] - public override void DoTask() + public override async Task DoTaskAsync(CancellationToken cancellationToken) { - _accountDomainService.UnfollowBatched(); + await _accountDomainService.UnfollowBatched(); } } } diff --git a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs index bd2de21c3..f1e709d2a 100644 --- a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs +++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; @@ -33,9 +34,9 @@ IAccountDomainService loginDomainService } [TaskInterceptor("大会员大积分", TaskLevel.One)] - public override void DoTask() + public override async Task DoTaskAsync(CancellationToken cancellationToken) { - var ui = GetUserInfo(); + var ui = await GetUserInfo(); if (ui.GetVipType() == VipType.None) { @@ -43,7 +44,7 @@ public override void DoTask() return; } - var re = _vipApi.GetTaskList().Result; + var re = await _vipApi.GetTaskList(); if (re.Code != 0) throw new Exception(re.ToJson()); @@ -51,47 +52,47 @@ public override void DoTask() taskInfo.LogInfo(_logger); //签到 - taskInfo = Sign(taskInfo); + taskInfo = await Sign(taskInfo); //福利任务 - taskInfo = Bonus(taskInfo); + taskInfo = await Bonus(taskInfo); //体验任务 - taskInfo = Privilege(taskInfo); + taskInfo = await Privilege(taskInfo); //日常任务 //浏览追番频道页10秒 - taskInfo = ViewAnimate(taskInfo); + taskInfo = await ViewAnimate(taskInfo); //浏览影视频道页10秒 - taskInfo = ViewFilmChannel(taskInfo); + taskInfo = await ViewFilmChannel(taskInfo); //浏览会员购页面10秒 taskInfo = ViewVipMall(taskInfo); //观看任意正片内容 - taskInfo = ViewVideo(taskInfo); + taskInfo = await ViewVideo(taskInfo); //领取购买任务 - taskInfo = BuyVipVideo(taskInfo); - taskInfo = BuyVipProduct(taskInfo); - taskInfo = BuyVipMall(taskInfo); + taskInfo = await BuyVipVideo(taskInfo); + taskInfo = await BuyVipProduct(taskInfo); + taskInfo = await BuyVipMall(taskInfo); taskInfo.LogInfo(_logger); } [TaskInterceptor("测试Cookie")] - private UserInfo GetUserInfo() + private async Task GetUserInfo() { - UserInfo userInfo = _loginDomainService.LoginByCookie(); + UserInfo userInfo = await _loginDomainService.LoginByCookie(); if (userInfo == null) throw new Exception("登录失败,请检查Cookie");//终止流程 return userInfo; } [TaskInterceptor("签到", TaskLevel.Two, false)] - private VipTaskInfo Sign(VipTaskInfo info) + private async Task Sign(VipTaskInfo info) { if (info.Task_info.Sing_task_item.IsTodaySigned) { @@ -101,11 +102,11 @@ private VipTaskInfo Sign(VipTaskInfo info) return info; } - var re = _vipApi.Sign(new SignRequest()).Result; + var re = await _vipApi.Sign(new SignRequest()); if (re.Code != 0) throw new Exception(re.ToJson()); //确认 - var infoResult = _vipApi.GetTaskList().Result; + var infoResult = await _vipApi.GetTaskList(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); info = infoResult.Data; @@ -117,7 +118,7 @@ private VipTaskInfo Sign(VipTaskInfo info) } [TaskInterceptor("福利任务", TaskLevel.Two, false)] - private VipTaskInfo Bonus(VipTaskInfo info) + private async Task Bonus(VipTaskInfo info) { var bonusTask = GetTarget(info); @@ -132,16 +133,16 @@ private VipTaskInfo Bonus(VipTaskInfo info) if (bonusTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(bonusTask.task_code); + await TryReceive(bonusTask.task_code); } _logger.LogInformation("开始完成任务"); - var re = Complete(bonusTask.task_code); + var re = await Complete(bonusTask.task_code); //确认 if (re) { - var infoResult = _vipApi.GetTaskList().Result; + var infoResult = await _vipApi.GetTaskList(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); info = infoResult.Data; bonusTask = GetTarget(info); @@ -160,7 +161,7 @@ CommonTaskItem GetTarget(VipTaskInfo info) } [TaskInterceptor("体验任务", TaskLevel.Two, false)] - private VipTaskInfo Privilege(VipTaskInfo info) + private async Task Privilege(VipTaskInfo info) { var privilegeTask = GetTarget(info); @@ -175,16 +176,16 @@ private VipTaskInfo Privilege(VipTaskInfo info) if (privilegeTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(privilegeTask.task_code); + await TryReceive(privilegeTask.task_code); } _logger.LogInformation("开始完成任务"); - var re = Complete(privilegeTask.task_code); + var re = await Complete(privilegeTask.task_code); //确认 if (re) { - var infoResult = _vipApi.GetTaskList().Result; + var infoResult = await _vipApi.GetTaskList(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); info = infoResult.Data; privilegeTask = GetTarget(info); @@ -203,7 +204,7 @@ CommonTaskItem GetTarget(VipTaskInfo info) } [TaskInterceptor("浏览追番频道页10秒", TaskLevel.Two, false)] - private VipTaskInfo ViewAnimate(VipTaskInfo info) + private async Task ViewAnimate(VipTaskInfo info) { var code = "jp_channel"; @@ -220,16 +221,16 @@ private VipTaskInfo ViewAnimate(VipTaskInfo info) if (targetTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(targetTask.task_code); + await TryReceive(targetTask.task_code); } _logger.LogInformation("开始完成任务"); - var re = CompleteView(code); + var re = await CompleteView(code); //确认 if (re) { - var infoResult = _vipApi.GetTaskList().Result; + var infoResult = await _vipApi.GetTaskList(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); info = infoResult.Data; targetTask = GetTarget(info); @@ -248,7 +249,7 @@ CommonTaskItem GetTarget(VipTaskInfo info) } [TaskInterceptor("浏览影视频道页10秒", TaskLevel.Two, false)] - private VipTaskInfo ViewFilmChannel(VipTaskInfo info) + private async Task ViewFilmChannel(VipTaskInfo info) { var code = "tv_channel"; @@ -265,16 +266,16 @@ private VipTaskInfo ViewFilmChannel(VipTaskInfo info) if (targetTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(targetTask.task_code); + await TryReceive(targetTask.task_code); } _logger.LogInformation("开始完成任务"); - var re = CompleteView(code); + var re = await CompleteView(code); //确认 if (re) { - var infoResult = _vipApi.GetTaskList().Result; + var infoResult = await _vipApi.GetTaskList(); if (infoResult.Code != 0) throw new Exception(infoResult.ToJson()); info = infoResult.Data; targetTask = GetTarget(info); @@ -301,7 +302,7 @@ private VipTaskInfo ViewVipMall(VipTaskInfo info) } [TaskInterceptor("观看任意正片内容", TaskLevel.Two, false)] - private VipTaskInfo ViewVideo(VipTaskInfo info) + private async Task ViewVideo(VipTaskInfo info) { CommonTaskItem targetTask = GetTarget(info); @@ -316,7 +317,7 @@ private VipTaskInfo ViewVideo(VipTaskInfo info) if (targetTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(targetTask.task_code); + await TryReceive(targetTask.task_code); } _logger.LogInformation("开始完成任务"); @@ -333,7 +334,7 @@ CommonTaskItem GetTarget(VipTaskInfo info) } [TaskInterceptor("购买单点付费影片(仅领取)", TaskLevel.Two, false)] - private VipTaskInfo BuyVipVideo(VipTaskInfo info) + private async Task BuyVipVideo(VipTaskInfo info) { CommonTaskItem targetTask = GetTarget(info); @@ -348,7 +349,7 @@ private VipTaskInfo BuyVipVideo(VipTaskInfo info) if (targetTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(targetTask.task_code); + await TryReceive(targetTask.task_code); } return info; @@ -362,7 +363,7 @@ CommonTaskItem GetTarget(VipTaskInfo info) } [TaskInterceptor("购买指定大会员产品(仅领取)", TaskLevel.Two, false)] - private VipTaskInfo BuyVipProduct(VipTaskInfo info) + private async Task BuyVipProduct(VipTaskInfo info) { CommonTaskItem targetTask = GetTarget(info); @@ -377,7 +378,7 @@ private VipTaskInfo BuyVipProduct(VipTaskInfo info) if (targetTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(targetTask.task_code); + await TryReceive(targetTask.task_code); } return info; @@ -391,7 +392,7 @@ CommonTaskItem GetTarget(VipTaskInfo info) } [TaskInterceptor("购买指定会员购商品(仅领取)", TaskLevel.Two, false)] - private VipTaskInfo BuyVipMall(VipTaskInfo info) + private async Task BuyVipMall(VipTaskInfo info) { CommonTaskItem targetTask = GetTarget(info); @@ -406,7 +407,7 @@ private VipTaskInfo BuyVipMall(VipTaskInfo info) if (targetTask.state == 0) { _logger.LogInformation("开始领取任务"); - TryReceive(targetTask.task_code); + await TryReceive(targetTask.task_code); } return info; @@ -422,13 +423,13 @@ CommonTaskItem GetTarget(VipTaskInfo info) /// /// 领取任务 /// - private void TryReceive(string taskCode) + private async Task TryReceive(string taskCode) { BiliApiResponse re = null; try { var request = new ReceiveOrCompleteTaskRequest(taskCode); - re = _vipApi.Receive(request).Result; + re = await _vipApi.Receive(request); if (re.Code == 0) _logger.LogInformation("领取任务成功"); else @@ -441,10 +442,10 @@ private void TryReceive(string taskCode) } } - private bool Complete(string taskCode) + private async Task Complete(string taskCode) { var request = new ReceiveOrCompleteTaskRequest(taskCode); - var re = _vipApi.Complete(request).Result; + var re = await _vipApi.Complete(request); if (re.Code == 0) { _logger.LogInformation("已完成"); @@ -458,13 +459,13 @@ private bool Complete(string taskCode) } } - private bool CompleteView(string code) + private async Task CompleteView(string code) { _logger.LogInformation("开始浏览"); - Task.Delay(10 * 1000).Wait(); + await Task.Delay(10 * 1000); var request = new ViewRequest(code); - var re = _vipApi.ViewComplete(request).Result; + var re = await _vipApi.ViewComplete(request); if (re.Code == 0) { _logger.LogInformation("浏览完成"); diff --git a/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs b/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs index dbc008a72..50ae56be8 100644 --- a/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs +++ b/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs @@ -12,6 +12,7 @@ using Ray.BiliBiliTool.Config; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.Infrastructure; +using Ray.BiliBiliTool.Infrastructure.Cookie; namespace Ray.BiliBiliTool.Console { @@ -43,7 +44,7 @@ IHostApplicationLifetime applicationLifetime _securityOptions = securityOptions.CurrentValue; } - public Task StartAsync(CancellationToken cancellationToken) + public async Task StartAsync(CancellationToken cancellationToken) { var isNotifySingle = _configuration.GetSection("Notification:IsSingleAccountSingleNotify").Get(); @@ -51,17 +52,17 @@ public Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("BiliBiliToolPro 开始运行...{newLine}", Environment.NewLine); - var pass = PreCheck(); - if (!pass) return Task.CompletedTask; + var pass = await PreCheckAsync(cancellationToken); + if (!pass) return; - RandomSleep(); + await RandomSleepAsync(cancellationToken); var tasks = _configuration["RunTasks"] .Split("&", options: StringSplitOptions.RemoveEmptyEntries); if (tasks.Contains("Login")) { - DoTasks(tasks); + await DoTasksAsync(tasks, cancellationToken); } else @@ -73,7 +74,7 @@ public Task StartAsync(CancellationToken cancellationToken) try { - DoTasks(tasks); + await DoTasksAsync(tasks, cancellationToken); if (isNotifySingle) { LogAppInfo(); @@ -108,7 +109,6 @@ public Task StartAsync(CancellationToken cancellationToken) _logger.LogInformation("运行结束"); _applicationLifetime.StopApplication(); } - return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) @@ -116,43 +116,41 @@ public Task StopAsync(CancellationToken cancellationToken) return Task.CompletedTask; } - private bool PreCheck() + private Task PreCheckAsync(CancellationToken cancellationToken) { //目标任务 _logger.LogInformation("【目标任务】{tasks}", _configuration["RunTasks"]); var tasks = _configuration["RunTasks"] .Split("&", options: StringSplitOptions.RemoveEmptyEntries); - if (!tasks.Any()) return false; + if (!tasks.Any()) return Task.FromResult(false); //Cookie _logger.LogInformation("【账号个数】{count}个{newLine}", _cookieStrFactory.Count, Environment.NewLine); - if (_cookieStrFactory.Count == 0 && !tasks.Contains("Login")) return false; + if (_cookieStrFactory.Count == 0 && !tasks.Contains("Login")) return Task.FromResult(false); //是否跳过 if (_securityOptions.IsSkipDailyTask) { _logger.LogWarning("已配置为跳过任务{newLine}", Environment.NewLine); - return false; + return Task.FromResult(false); } - return true; + return Task.FromResult(true); } - private Task RandomSleep() + private async Task RandomSleepAsync(CancellationToken cancellationToken) { - if (_configuration["RunTasks"].Contains("Login") || _configuration["RunTasks"].Contains("Test")) return Task.CompletedTask; + if (_configuration["RunTasks"].Contains("Login") || _configuration["RunTasks"].Contains("Test")) return; if (_securityOptions.RandomSleepMaxMin > 0) { int randomMin = new Random().Next(1, ++_securityOptions.RandomSleepMaxMin); _logger.LogInformation("随机休眠{min}分钟{newLine}", randomMin, Environment.NewLine); - Thread.Sleep(randomMin * 1000 * 60); + await Task.Delay(randomMin * 1000 * 60, cancellationToken); } - - return Task.CompletedTask; } - private void DoTasks(string[] tasks) + private async Task DoTasksAsync(string[] tasks, CancellationToken cancellationToken) { using var scope = _serviceProvider.CreateScope(); foreach (var task in tasks) @@ -165,7 +163,7 @@ private void DoTasks(string[] tasks) } var appService = (IAppService)scope.ServiceProvider.GetRequiredService(type); - appService?.DoTask(); + await appService?.DoTaskAsync(cancellationToken); } } diff --git a/src/Ray.BiliBiliTool.Console/Program.cs b/src/Ray.BiliBiliTool.Console/Program.cs index 78551d65d..af9725c59 100644 --- a/src/Ray.BiliBiliTool.Console/Program.cs +++ b/src/Ray.BiliBiliTool.Console/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; @@ -48,32 +49,34 @@ public static IHost CreateHost(string[] args) internal static IHostBuilder CreateHostBuilder(string[] args) { + //IHostBuilder hostBuilder = Host.CreateDefaultBuilder(); IHostBuilder hostBuilder = new HostBuilder(); + hostBuilder.UseContentRoot(Directory.GetCurrentDirectory()); + //承载系统自身的配置: hostBuilder.ConfigureHostConfiguration(hostConfigurationBuilder => { - Environment.SetEnvironmentVariable(HostDefaults.EnvironmentKey, Environment.GetEnvironmentVariable(Global.EnvironmentKey)); - hostConfigurationBuilder.AddEnvironmentVariables(); + hostConfigurationBuilder.AddEnvironmentVariables(prefix: "DOTNET_"); }); //应用配置: hostBuilder.ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) => { Global.HostingEnvironment = hostBuilderContext.HostingEnvironment; + IHostEnvironment env = hostBuilderContext.HostingEnvironment; //json文件: configurationBuilder.AddJsonFile("appsettings.json", false, true) .AddJsonFile($"appsettings.{hostBuilderContext.HostingEnvironment.EnvironmentName}.json", true, true) - .AddJsonFile("exp.json", false, true) - .AddJsonFile("donateCoinCanContinueStatus.json", false, true); + .AddJsonFile("exp.json", false, true) //todo:不要使用配置 + .AddJsonFile("donateCoinCanContinueStatus.json", false, true);//todo:不要使用配置 //用户机密: - if (hostBuilderContext.HostingEnvironment.IsDevelopment()) + if (env.IsDevelopment() && env.ApplicationName?.Length > 0) { - //Assembly assembly = Assembly.Load(new AssemblyName(hostBuilderContext.HostingEnvironment.ApplicationName)); - Assembly assembly = typeof(Program).Assembly; - configurationBuilder.AddUserSecrets(assembly, true); + var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); + configurationBuilder.AddUserSecrets(appAssembly, optional: true, reloadOnChange: true); } //环境变量: @@ -85,7 +88,7 @@ internal static IHostBuilder CreateHostBuilder(string[] args) { configurationBuilder.AddCommandLine(args, hostBuilderContext.Configuration .GetSection("CommandLineMappings") - .Get>()); + .Get>());//todo:不要使用配置 } //本地cookie存储文件 diff --git a/src/Ray.BiliBiliTool.Console/Properties/launchSettings.json b/src/Ray.BiliBiliTool.Console/Properties/launchSettings.json index bd1534eba..4e3af4dba 100644 --- a/src/Ray.BiliBiliTool.Console/Properties/launchSettings.json +++ b/src/Ray.BiliBiliTool.Console/Properties/launchSettings.json @@ -3,7 +3,7 @@ "Ray.BiliBiliTool.Console": { "commandName": "Project", "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" + "DOTNET_ENVIRONMENT": "Development" } }, "Docker": { diff --git a/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs b/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs index fcece4462..a9c7c1111 100644 --- a/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Ray.BiliBiliTool.Agent; @@ -46,9 +47,9 @@ IOptionsMonitor unfollowBatchedTaskOptions /// 登录 /// /// - public UserInfo LoginByCookie() + public async Task LoginByCookie() { - BiliApiResponse apiResponse = _userInfoApi.LoginByCookie().GetAwaiter().GetResult(); + BiliApiResponse apiResponse = await _userInfoApi.LoginByCookie(); if (apiResponse.Code != 0 || !apiResponse.Data.IsLogin) { @@ -58,9 +59,6 @@ public UserInfo LoginByCookie() UserInfo useInfo = apiResponse.Data; - //获取到UserId - _cookie.UserId = useInfo.Mid.ToString(); - _logger.LogInformation("【用户名】{0}", useInfo.GetFuzzyUname()); _logger.LogInformation("【会员类型】{0}", useInfo.VipType.Description()); _logger.LogInformation("【会员状态】{0}", useInfo.VipStatus.Description()); @@ -85,10 +83,10 @@ public UserInfo LoginByCookie() /// 获取每日任务完成情况 /// /// - public DailyTaskInfo GetDailyTaskStatus() + public async Task GetDailyTaskStatus() { DailyTaskInfo result = new(); - BiliApiResponse apiResponse = _dailyTaskApi.GetDailyTaskRewardInfo().GetAwaiter().GetResult(); + BiliApiResponse apiResponse = await _dailyTaskApi.GetDailyTaskRewardInfo(); if (apiResponse.Code == 0) { _logger.LogDebug("请求本日任务完成状态成功"); @@ -97,7 +95,7 @@ public DailyTaskInfo GetDailyTaskStatus() else { _logger.LogWarning("获取今日任务完成状态失败:{result}", apiResponse.ToJson()); - result = _dailyTaskApi.GetDailyTaskRewardInfo().GetAwaiter().GetResult().Data; + result = (await _dailyTaskApi.GetDailyTaskRewardInfo()).Data; //todo:偶发性请求失败,再请求一次,这么写很丑陋,待用polly再框架层面实现 } @@ -109,12 +107,12 @@ public DailyTaskInfo GetDailyTaskStatus() /// /// /// - public void UnfollowBatched() + public async Task UnfollowBatched() { _logger.LogInformation("【分组名】{group}", _unfollowBatchedTaskOptions.GroupName); //根据分组名称获取tag - TagDto tag = GetTag(_unfollowBatchedTaskOptions.GroupName); + TagDto tag = await GetTag(_unfollowBatchedTaskOptions.GroupName); int? tagId = tag?.Tagid; int total = tag?.Count ?? 0; @@ -143,9 +141,7 @@ public void UnfollowBatched() { Pn = totalPage }; - List followings = _relationApi.GetFollowingsByTag(req) - .GetAwaiter().GetResult() - .Data; + List followings = (await _relationApi.GetFollowingsByTag(req)).Data; followings.Reverse(); var targetList = new List(); @@ -165,9 +161,7 @@ public void UnfollowBatched() pn -= 1; if (pn <= 0) break; req.Pn = pn; - followings = _relationApi.GetFollowingsByTag(req) - .GetAwaiter().GetResult() - .Data; + followings = (await _relationApi.GetFollowingsByTag(req)).Data; followings.Reverse(); } } @@ -189,8 +183,7 @@ public void UnfollowBatched() string modifyReferer = string.Format(RelationApiConstant.ModifyReferer, _cookie.UserId, tagId); var modifyReq = new ModifyRelationRequest(info.Mid, _cookie.BiliJct); - var re = _relationApi.ModifyRelation(modifyReq, modifyReferer) - .GetAwaiter().GetResult(); + var re = await _relationApi.ModifyRelation(modifyReq, modifyReferer); if (re.Code == 0) { @@ -207,7 +200,7 @@ public void UnfollowBatched() _logger.LogInformation("【本次共取关】{count}人", success); //计算剩余 - tag = GetTag(_unfollowBatchedTaskOptions.GroupName); + tag = await GetTag(_unfollowBatchedTaskOptions.GroupName); _logger.LogInformation("【分组下剩余】{count}人", tag?.Count ?? 0); } @@ -216,12 +209,10 @@ public void UnfollowBatched() /// /// /// - private TagDto GetTag(string groupName) + private async Task GetTag(string groupName) { string getTagsReferer = string.Format(RelationApiConstant.GetTagsReferer, _cookie.UserId); - List tagList = _relationApi.GetTags(getTagsReferer) - .GetAwaiter().GetResult() - .Data; + List tagList = (await _relationApi.GetTags(getTagsReferer)).Data; TagDto tag = tagList.FirstOrDefault(x => x.Name == groupName); return tag; } diff --git a/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs index 771f69736..f717ff7f9 100644 --- a/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Ray.BiliBiliTool.Agent; @@ -39,7 +40,7 @@ IChargeApi chargeApi /// 月底自动己充电 /// 仅充会到期的B币券,低于2的时候不会充 /// - public void Charge(UserInfo userInfo) + public async Task Charge(UserInfo userInfo) { if (_dailyTaskOptions.DayOfAutoCharge == 0) { @@ -86,9 +87,8 @@ public void Charge(UserInfo userInfo) var request = new ChargeRequest(couponBalance, long.Parse(targetUpId), _cookie.BiliJct); - //BiliApiResponse response = _chargeApi.Charge(decimal.ToInt32(couponBalance * 10), _dailyTaskOptions.AutoChargeUpId, _cookieOptions.UserId, _cookieOptions.BiliJct).Result; - BiliApiResponse response = _chargeApi.ChargeV2(request) - .GetAwaiter().GetResult(); + //BiliApiResponse response = await _chargeApi.Charge(decimal.ToInt32(couponBalance * 10), _dailyTaskOptions.AutoChargeUpId, _cookieOptions.UserId, _cookieOptions.BiliJct); + BiliApiResponse response = await _chargeApi.ChargeV2(request); if (response.Code == 0) { @@ -100,7 +100,7 @@ public void Charge(UserInfo userInfo) _logger.LogInformation("在过期前使用成功,赠送的B币券没有浪费哦~"); //充电留言 - ChargeComments(response.Data.Order_no); + await ChargeComments(response.Data.Order_no); } else { @@ -119,11 +119,11 @@ public void Charge(UserInfo userInfo) /// 充电后留言 /// /// - public void ChargeComments(string orderNum) + public async Task ChargeComments(string orderNum) { var comment = _dailyTaskOptions.ChargeComment ?? ""; var request = new ChargeCommentRequest(orderNum, comment, _cookie.BiliJct); - _chargeApi.ChargeComment(request).GetAwaiter().GetResult(); + await _chargeApi.ChargeComment(request); _logger.LogInformation("【留言】{comment}", comment); } diff --git a/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs index fc5696c93..4eb8c6461 100644 --- a/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs @@ -1,4 +1,5 @@ -using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using System.Threading.Tasks; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; using Ray.BiliBiliTool.DomainService.Interfaces; namespace Ray.BiliBiliTool.DomainService @@ -24,9 +25,9 @@ IDailyTaskApi dailyTaskApi /// 获取账户硬币余额 /// /// - public decimal GetCoinBalance() + public async Task GetCoinBalance() { - var response = _accountApi.GetCoinBalance().GetAwaiter().GetResult(); + var response = await _accountApi.GetCoinBalance(); return response.Data.Money ?? 0; } @@ -34,9 +35,9 @@ public decimal GetCoinBalance() /// 获取今日已投币数 /// /// - public int GetDonatedCoins() + public async Task GetDonatedCoins() { - return GetDonateCoinExp() / 10; + return (await GetDonateCoinExp()) / 10; } #region private @@ -44,9 +45,9 @@ public int GetDonatedCoins() /// 获取今日通过投币已获取的经验值 /// /// - private int GetDonateCoinExp() + private async Task GetDonateCoinExp() { - return _dailyTaskApi.GetDonateCoinExp().GetAwaiter().GetResult().Data; + return (await _dailyTaskApi.GetDonateCoinExp()).Data; } #endregion } diff --git a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs index 5defe7e9c..387afb54c 100644 --- a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Ray.BiliBiliTool.Agent; @@ -18,7 +19,6 @@ namespace Ray.BiliBiliTool.DomainService public class DonateCoinDomainService : IDonateCoinDomainService { private readonly ILogger _logger; - private readonly IDailyTaskApi _dailyTaskApi; private readonly BiliCookie _biliBiliCookie; private readonly DailyTaskOptions _dailyTaskOptions; private readonly IAccountApi _accountApi; @@ -32,16 +32,15 @@ public class DonateCoinDomainService : IDonateCoinDomainService /// /// up的视频稿件总数缓存 /// - private readonly Dictionary _upVideoCountDicCatch = new Dictionary(); + private readonly Dictionary _upVideoCountDicCatch = new(); /// /// 已对视频投币数量缓存 /// - private readonly Dictionary _alreadyDonatedCoinCountCatch = new Dictionary(); + private readonly Dictionary _alreadyDonatedCoinCountCatch = new(); public DonateCoinDomainService( ILogger logger, - IDailyTaskApi dailyTaskApi, BiliCookie cookie, IOptionsMonitor dailyTaskOptions, IAccountApi accountApi, @@ -54,7 +53,6 @@ IVideoApi videoApi ) { _logger = logger; - _dailyTaskApi = dailyTaskApi; _biliBiliCookie = cookie; _dailyTaskOptions = dailyTaskOptions.CurrentValue; _accountApi = accountApi; @@ -69,13 +67,13 @@ IVideoApi videoApi /// /// 完成投币任务 /// - public void AddCoinsForVideos() + public async Task AddCoinsForVideos() { - int needCoins = GetNeedDonateCoinNum(); + int needCoins = await GetNeedDonateCoinNum(); if (needCoins <= 0) return; //投币前硬币余额 - decimal coinBalance = _coinDomainService.GetCoinBalance(); + decimal coinBalance = await _coinDomainService.GetCoinBalance(); _logger.LogInformation("【投币前余额】 : {coinBalance}", coinBalance); if (coinBalance <= 0) @@ -87,7 +85,7 @@ public void AddCoinsForVideos() //余额小于目标投币数,按余额投 if (coinBalance < needCoins) { - int.TryParse(decimal.Truncate(coinBalance).ToString(), out needCoins); + _ = int.TryParse(decimal.Truncate(coinBalance).ToString(), out needCoins); _logger.LogInformation("因硬币余额不足,目标投币数调整为: {needCoins}", needCoins); } @@ -97,12 +95,12 @@ public void AddCoinsForVideos() { _logger.LogDebug("开始尝试第{num}次", i); - Tuple video = TryGetCanDonatedVideo(); + UpVideoInfo video = await TryGetCanDonatedVideo(); if (video == null) continue; - _logger.LogInformation("【视频】{title}", video.Item2); + _logger.LogInformation("【视频】{title}", video.Title); - bool re = DoAddCoinForVideo(video.Item1, 1, _dailyTaskOptions.SelectLike, video.Item2); + bool re = await DoAddCoinForVideo(video, _dailyTaskOptions.SelectLike); if (re) success++; } @@ -111,31 +109,31 @@ public void AddCoinsForVideos() else _logger.LogInformation("投币尝试超过10次,已终止"); - _logger.LogInformation("【硬币余额】{coin}", _accountApi.GetCoinBalance().GetAwaiter().GetResult().Data.Money ?? 0); + _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0); } /// /// 尝试获取一个可以投币的视频 /// /// - public Tuple TryGetCanDonatedVideo() + public async Task TryGetCanDonatedVideo() { - Tuple result = null; + UpVideoInfo result; //从配置的up中随机尝试获取1次 - result = TryGetCanDonateVideoByConfigUps(1); + result = await TryGetCanDonateVideoByConfigUps(1); if (result != null) return result; //然后从特别关注列表尝试获取1次 - result = TryGetCanDonateVideoBySpecialUps(1); + result = await TryGetCanDonateVideoBySpecialUps(1); if (result != null) return result; //然后从普通关注列表获取1次 - result = TryGetCanDonateVideoByFollowingUps(1); + result = await TryGetCanDonateVideoByFollowingUps(1); if (result != null) return result; //最后从排行榜尝试5次 - result = TryGetCanDonateVideoByRegion(5); + result = await TryGetCanDonateVideoByRegion(5); return result; } @@ -147,16 +145,17 @@ public Tuple TryGetCanDonatedVideo() /// 投币数量 /// 是否同时点赞 1是0否 /// 是否投币成功 - public bool DoAddCoinForVideo(string aid, int multiply, bool select_like, string title = "") + public async Task DoAddCoinForVideo(UpVideoInfo video, bool select_like) { BiliApiResponse result; try { - var request = new AddCoinRequest(long.Parse(aid), _biliBiliCookie.BiliJct); - request.Multiply = multiply; - request.Select_like = select_like ? 1 : 0; - result = _videoApi.AddCoinForVideo(request) - .GetAwaiter().GetResult(); + var request = new AddCoinRequest(video.Aid, _biliBiliCookie.BiliJct) + { + Select_like = select_like ? 1 : 0 + }; + var referer = $"https://www.bilibili.com/video/{video.Bvid}/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=80c1601a7003934e7a90709c18dfcffd"; + result = await _videoApi.AddCoinForVideo(request, referer); } catch (Exception) { @@ -190,7 +189,7 @@ public bool DoAddCoinForVideo(string aid, int multiply, bool select_like, string /// 获取今日的目标投币数 /// /// - private int GetNeedDonateCoinNum() + private async Task GetNeedDonateCoinNum() { //获取自定义配置投币数 int configCoins = _dailyTaskOptions.NumberOfCoins; @@ -200,14 +199,14 @@ private int GetNeedDonateCoinNum() _logger.LogInformation("已配置为跳过投币任务"); return configCoins; } - //已投的硬币 - int alreadyCoins = _coinDomainService.GetDonatedCoins(); + int alreadyCoins = await _coinDomainService.GetDonatedCoins(); //目标 - int targetCoins = configCoins > Constants.MaxNumberOfDonateCoins - ? Constants.MaxNumberOfDonateCoins - : configCoins; + //int targetCoins = configCoins > Constants.MaxNumberOfDonateCoins + // ? Constants.MaxNumberOfDonateCoins + // : configCoins; + int targetCoins = configCoins; _logger.LogInformation("【今日已投】{already}枚", alreadyCoins); _logger.LogInformation("【目标欲投】{already}枚", targetCoins); @@ -228,12 +227,12 @@ private int GetNeedDonateCoinNum() /// /// /// - private Tuple TryGetCanDonateVideoByConfigUps(int tryCount) + private async Task TryGetCanDonateVideoByConfigUps(int tryCount) { //是否配置了up主 if (_dailyTaskOptions.SupportUpIdList.Count == 0) return null; - return TryCanDonateVideoByUps(_dailyTaskOptions.SupportUpIdList, tryCount); ; + return await TryCanDonateVideoByUps(_dailyTaskOptions.SupportUpIdList, tryCount); ; } /// @@ -241,15 +240,14 @@ private Tuple TryGetCanDonateVideoByConfigUps(int tryCount) /// /// /// - private Tuple TryGetCanDonateVideoBySpecialUps(int tryCount) + private async Task TryGetCanDonateVideoBySpecialUps(int tryCount) { //获取特别关注列表 var request = new GetSpecialFollowingsRequest(long.Parse(_biliBiliCookie.UserId)); - BiliApiResponse> specials = _relationApi.GetFollowingsByTag(request) - .GetAwaiter().GetResult(); + BiliApiResponse> specials = await _relationApi.GetFollowingsByTag(request); if (specials.Data == null || specials.Data.Count == 0) return null; - return TryCanDonateVideoByUps(specials.Data.Select(x => x.Mid).ToList(), tryCount); + return await TryCanDonateVideoByUps(specials.Data.Select(x => x.Mid).ToList(), tryCount); } /// @@ -257,15 +255,14 @@ private Tuple TryGetCanDonateVideoBySpecialUps(int tryCount) /// /// /// - private Tuple TryGetCanDonateVideoByFollowingUps(int tryCount) + private async Task TryGetCanDonateVideoByFollowingUps(int tryCount) { //获取特别关注列表 var request = new GetFollowingsRequest(long.Parse(_biliBiliCookie.UserId)); - BiliApiResponse result = _relationApi.GetFollowings(request) - .GetAwaiter().GetResult(); + BiliApiResponse result = await _relationApi.GetFollowings(request); if (result.Data.Total == 0) return null; - return TryCanDonateVideoByUps(result.Data.List.Select(x => x.Mid).ToList(), tryCount); + return await TryCanDonateVideoByUps(result.Data.List.Select(x => x.Mid).ToList(), tryCount); } /// @@ -273,15 +270,20 @@ private Tuple TryGetCanDonateVideoByFollowingUps(int tryCount) /// /// /// - private Tuple TryGetCanDonateVideoByRegion(int tryCount) + private async Task TryGetCanDonateVideoByRegion(int tryCount) { try { for (int i = 0; i < tryCount; i++) { - var video = _videoDomainService.GetRandomVideoOfRanking(); - if (!IsCanDonate(video.Aid.ToString())) continue; - return Tuple.Create(video.Aid.ToString(), video.Title); + RankingInfo video = await _videoDomainService.GetRandomVideoOfRanking(); + if (!await IsCanDonate(video.Aid.ToString())) continue; + return new UpVideoInfo() + { + Aid = video.Aid, + Bvid = video.Bvid, + Title = video.Title + }; } } catch (Exception e) @@ -298,7 +300,7 @@ private Tuple TryGetCanDonateVideoByRegion(int tryCount) /// /// /// - private Tuple TryCanDonateVideoByUps(List upIds, int tryCount) + private async Task TryCanDonateVideoByUps(List upIds, int tryCount) { if (upIds == null || upIds.Count == 0) return null; @@ -321,18 +323,18 @@ private Tuple TryCanDonateVideoByUps(List upIds, int tryCo //该up的视频总数 if (!_upVideoCountDicCatch.TryGetValue(randomUpId, out int videoCount)) { - videoCount = _videoDomainService.GetVideoCountOfUp(randomUpId); + videoCount = await _videoDomainService.GetVideoCountOfUp(randomUpId); _upVideoCountDicCatch.Add(randomUpId, videoCount); } if (videoCount == 0) continue; - UpVideoInfo videoInfo = _videoDomainService.GetRandomVideoOfUp(randomUpId, videoCount); + UpVideoInfo videoInfo = await _videoDomainService.GetRandomVideoOfUp(randomUpId, videoCount); _logger.LogDebug("获取到视频{aid}({title})", videoInfo.Aid, videoInfo.Title); //检查是否可以投 - if (!IsCanDonate(videoInfo.Aid.ToString())) continue; + if (!await IsCanDonate(videoInfo.Aid.ToString())) continue; - return Tuple.Create(videoInfo.Aid.ToString(), videoInfo.Title); + return videoInfo; } } catch (Exception e) @@ -349,15 +351,14 @@ private Tuple TryCanDonateVideoByUps(List upIds, int tryCo /// /// av号 /// - private bool IsDonatedLessThenLimitCoinsForVideo(string aid) + private async Task IsDonatedLessThenLimitCoinsForVideo(string aid) { try { //获取已投币数量 if (!_alreadyDonatedCoinCountCatch.TryGetValue(aid, out int multiply)) { - multiply = _videoApi.GetDonatedCoinsForVideo(new GetAlreadyDonatedCoinsRequest(long.Parse(aid))) - .GetAwaiter().GetResult() + multiply = (await _videoApi.GetDonatedCoinsForVideo(new GetAlreadyDonatedCoinsRequest(long.Parse(aid)))) .Data.Multiply; _alreadyDonatedCoinCountCatch.TryAdd(aid, multiply); } @@ -367,7 +368,7 @@ private bool IsDonatedLessThenLimitCoinsForVideo(string aid) if (multiply >= 2) return false; //获取该视频可投币数量 - int limitCoinNum = _videoDomainService.GetVideoDetail(aid).Copyright == 1 + int limitCoinNum = (await _videoDomainService.GetVideoDetail(aid)).Copyright == 1 ? 2 //原创,最多可投2枚 : 1;//转载,最多可投1枚 _logger.LogDebug("该视频的最大投币数为{num}", limitCoinNum); @@ -387,7 +388,7 @@ private bool IsDonatedLessThenLimitCoinsForVideo(string aid) /// /// /// - private bool IsCanDonate(string aid) + private async Task IsCanDonate(string aid) { //本次运行已经尝试投过的,不进行重复投(不管成功还是失败,凡取过尝试过的,不重复尝试) if (_alreadyDonatedCoinCountCatch.Any(x => x.Key == aid)) @@ -397,7 +398,7 @@ private bool IsCanDonate(string aid) } //已经投满2个币的,不能再投 - if (!IsDonatedLessThenLimitCoinsForVideo(aid)) + if (!await IsDonatedLessThenLimitCoinsForVideo(aid)) { _logger.LogDebug("超出单个视频投币数量限制,丢弃处理", aid); return false; diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IAccountDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IAccountDomainService.cs index 1ce8ae40f..b599bd78c 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IAccountDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IAccountDomainService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; namespace Ray.BiliBiliTool.DomainService.Interfaces @@ -14,17 +12,17 @@ public interface IAccountDomainService : IDomainService /// 使用Cookie登录 /// /// - UserInfo LoginByCookie(); + Task LoginByCookie(); /// /// 获取每日任务完成情况 /// /// - DailyTaskInfo GetDailyTaskStatus(); + Task GetDailyTaskStatus(); /// /// 批量取关 /// - void UnfollowBatched(); + Task UnfollowBatched(); } } diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IChargeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IChargeDomainService.cs index a6e17b481..613834b1e 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IChargeDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IChargeDomainService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; namespace Ray.BiliBiliTool.DomainService.Interfaces @@ -14,12 +12,12 @@ public interface IChargeDomainService : IDomainService /// 充电 /// /// - void Charge(UserInfo userInfo); + Task Charge(UserInfo userInfo); /// /// 充电后留言 /// /// - void ChargeComments(string token); + Task ChargeComments(string token); } } diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/ICoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/ICoinDomainService.cs index 98eb603fc..0249a81fe 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/ICoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/ICoinDomainService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; namespace Ray.BiliBiliTool.DomainService.Interfaces { @@ -13,12 +11,12 @@ public interface ICoinDomainService : IDomainService /// 获取账户硬币余额 /// /// - decimal GetCoinBalance(); + Task GetCoinBalance(); /// /// 获取今日已投币数量 /// /// - int GetDonatedCoins(); + Task GetDonatedCoins(); } } diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IDomainService.cs index c5fccfe66..6392fcdc0 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IDomainService.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Ray.BiliBiliTool.DomainService.Interfaces +namespace Ray.BiliBiliTool.DomainService.Interfaces { /// /// 定义一个领域服务 diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IDonateCoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IDonateCoinDomainService.cs index 4543e22cd..a3be8f1dc 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IDonateCoinDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IDonateCoinDomainService.cs @@ -1,6 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Text; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using System; +using System.Threading.Tasks; namespace Ray.BiliBiliTool.DomainService.Interfaces { @@ -9,10 +9,10 @@ namespace Ray.BiliBiliTool.DomainService.Interfaces /// public interface IDonateCoinDomainService : IDomainService { - void AddCoinsForVideos(); + Task AddCoinsForVideos(); - Tuple TryGetCanDonatedVideo(); + Task TryGetCanDonatedVideo(); - bool DoAddCoinForVideo(string aid, int multiply, bool select_like, string title = ""); + Task DoAddCoinForVideo(UpVideoInfo video, bool select_like); } } diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/ILiveDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/ILiveDomainService.cs index f7d724de9..774eb534e 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/ILiveDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/ILiveDomainService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Live; namespace Ray.BiliBiliTool.DomainService.Interfaces @@ -13,36 +11,36 @@ public interface ILiveDomainService : IDomainService /// /// 签到 /// - void LiveSign(); + Task LiveSign(); /// /// 银瓜子兑换硬币 /// /// - bool ExchangeSilver2Coin(); + Task ExchangeSilver2Coin(); /// /// 天选抽奖 /// - void TianXuan(); + Task TianXuan(); - void TryJoinTianXuan(ListItemDto target); + Task TryJoinTianXuan(ListItemDto target); - void GroupFollowing(); + Task GroupFollowing(); /// /// 发送弹幕 /// - void SendDanmakuToFansMedalLive(); + Task SendDanmakuToFansMedalLive(); /// /// 直播时长挂机 /// - void SendHeartBeatToFansMedalLive(); + Task SendHeartBeatToFansMedalLive(); /// /// 点赞直播间 /// - void LikeFansMedalLive(); + Task LikeFansMedalLive(); } } diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/ILoginDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/ILoginDomainService.cs new file mode 100644 index 000000000..f323b8e16 --- /dev/null +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/ILoginDomainService.cs @@ -0,0 +1,38 @@ +using System.Threading; +using System.Threading.Tasks; +using Ray.BiliBiliTool.Agent; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; + +namespace Ray.BiliBiliTool.DomainService.Interfaces +{ + /// + /// 账户 + /// + public interface ILoginDomainService : IDomainService + { + /// + /// 扫描二维码登录 + /// + /// + Task LoginByQrCodeAsync(CancellationToken cancellationToken); + + /// + /// Set Cookie + /// + /// + /// + Task SetCookieAsync(BiliCookie cookie, CancellationToken cancellationToken); + + /// + /// 持久化Cookie到配置文件 + /// + /// + Task SaveCookieToJsonFileAsync(BiliCookie ckInfo, CancellationToken cancellationToken); + + /// + /// 持久化Cookie到青龙环境变量 + /// + /// + Task SaveCookieToQinLongAsync(BiliCookie ckInfo, CancellationToken cancellationToken); + } +} diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IMangaDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IMangaDomainService.cs index be3a0b5f4..c9818189c 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IMangaDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IMangaDomainService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; namespace Ray.BiliBiliTool.DomainService.Interfaces @@ -13,18 +11,18 @@ public interface IMangaDomainService : IDomainService /// /// 签到 /// - void MangaSign(); + Task MangaSign(); /// /// 阅读 /// - void MangaRead(); + Task MangaRead(); /// /// 获取大会员权益 /// /// /// - void ReceiveMangaVipReward(int reason_id, UserInfo userIfo); + Task ReceiveMangaVipReward(int reason_id, UserInfo userIfo); } } diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IVideoDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IVideoDomainService.cs index 2986525fe..bd3d56b7f 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IVideoDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IVideoDomainService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.DomainService.Dtos; @@ -16,13 +14,13 @@ public interface IVideoDomainService : IDomainService /// /// /// - VideoDetail GetVideoDetail(string aid); + Task GetVideoDetail(string aid); /// /// 从排行榜获取一个随机视频 /// /// - RankingInfo GetRandomVideoOfRanking(); + Task GetRandomVideoOfRanking(); /// /// 从某个指定UP下获取随机视频 @@ -30,28 +28,28 @@ public interface IVideoDomainService : IDomainService /// /// /// - UpVideoInfo GetRandomVideoOfUp(long upId, int total); + Task GetRandomVideoOfUp(long upId, int total); - int GetVideoCountOfUp(long upId); + Task GetVideoCountOfUp(long upId); /// /// 观看并分享视频 /// /// - void WatchAndShareVideo(DailyTaskInfo dailyTaskStatus); + Task WatchAndShareVideo(DailyTaskInfo dailyTaskStatus); /// /// 观看 /// /// /// - void WatchVideo(VideoInfoDto videoInfo); + Task WatchVideo(VideoInfoDto videoInfo); /// /// 分享 /// /// /// - void ShareVideo(VideoInfoDto videoInfo); + Task ShareVideo(VideoInfoDto videoInfo); } } diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IVipPrivilegeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IVipPrivilegeDomainService.cs index 394f7b762..8698abef7 100644 --- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IVipPrivilegeDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/Interfaces/IVipPrivilegeDomainService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; namespace Ray.BiliBiliTool.DomainService.Interfaces @@ -14,6 +12,6 @@ public interface IVipPrivilegeDomainService : IDomainService /// 获取大会员权益 /// /// - bool ReceiveVipPrivilege(UserInfo userInfo); + Task ReceiveVipPrivilege(UserInfo userInfo); } } diff --git a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs index b529e54d6..389d2e36a 100644 --- a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; @@ -61,7 +62,7 @@ public LiveDomainService(ILogger logger, /// /// 本次通过天选关注的主播 /// - private List _tianXuanFollowed = new List(); + private List _tianXuanFollowed = new(); /// /// 开始抽奖前最后一个关注的up @@ -71,10 +72,9 @@ public LiveDomainService(ILogger logger, /// /// 直播签到 /// - public void LiveSign() + public async Task LiveSign() { - var response = _liveApi.Sign() - .GetAwaiter().GetResult(); + var response = await _liveApi.Sign(); if (response.Code == 0) { @@ -92,7 +92,7 @@ public void LiveSign() /// 直播中心银瓜子兑换B币 /// /// 兑换银瓜子后硬币余额 - public bool ExchangeSilver2Coin() + public async Task ExchangeSilver2Coin() { var result = false; @@ -117,7 +117,7 @@ public bool ExchangeSilver2Coin() return false; } - BiliApiResponse queryStatus = _liveApi.GetLiveWalletStatus().GetAwaiter().GetResult(); + BiliApiResponse queryStatus = await _liveApi.GetLiveWalletStatus(); _logger.LogInformation("【银瓜子余额】 {silver}", queryStatus.Data.Silver); _logger.LogInformation("【硬币余额】 {coin}", queryStatus.Data.Coin); _logger.LogInformation("【今日剩余兑换次数】 {left}", queryStatus.Data.Silver_2_coin_left); @@ -126,7 +126,7 @@ public bool ExchangeSilver2Coin() _logger.LogInformation("开始尝试兑换..."); Silver2CoinRequest request = new(_biliCookie.BiliJct); - var response = _liveApi.Silver2Coin(request).GetAwaiter().GetResult(); + var response = await _liveApi.Silver2Coin(request); if (response.Code == 0) { result = true; @@ -146,34 +146,30 @@ public bool ExchangeSilver2Coin() /// /// 天选抽奖 /// - public void TianXuan() + public async Task TianXuan() { _tianXuanFollowed = new List(); if (_liveLotteryTaskOptions.AutoGroupFollowings) { //获取此时最后一个关注的up,此后再新增的关注,与参与成功的抽奖,取交集,就是本地新增的天选关注 - _lastFollowUpId = GetLastFollowUpId(); + _lastFollowUpId = await GetLastFollowUpId(); } //获取直播的分区 - List areaList = _liveApi.GetAreaList() - .GetAwaiter().GetResult() - .Data.Data; + List areaList = (await _liveApi.GetAreaList()).Data.Data; //遍历分区 int count = 0; foreach (var area in areaList) { - _logger.LogInformation("【扫描分区】{area}..." + Environment.NewLine, area.Name); + _logger.LogInformation("【扫描分区】{area}...{newLine}", area.Name, Environment.NewLine); string defaultSort = ""; //每个分区下搜索5页 for (int i = 1; i < 6; i++) { - var reData = _liveApi.GetList(area.Id, i, sortType: defaultSort) - .GetAwaiter().GetResult() - .Data; + var reData = (await _liveApi.GetList(area.Id, i, sortType: defaultSort)).Data; foreach (var item in reData.List ?? new List()) { if (item.Pendant_info == null || item.Pendant_info.Count == 0) continue; @@ -182,7 +178,7 @@ public void TianXuan() if (pendant.Pendent_id != 504) continue; count++; - TryJoinTianXuan(item); + await TryJoinTianXuan(item); } if (reData.Has_more != 1) break; defaultSort = reData.New_tags.FirstOrDefault()?.Sort_type ?? ""; @@ -197,7 +193,7 @@ public void TianXuan() } } - public void TryJoinTianXuan(ListItemDto target) + public async Task TryJoinTianXuan(ListItemDto target) { _logger.LogDebug("【房间】{name}", target.Title); try @@ -209,9 +205,7 @@ public void TryJoinTianXuan(ListItemDto target) return; } - CheckTianXuanDto check = _liveApi.CheckTianXuan(target.Roomid) - .GetAwaiter().GetResult() - .Data; + CheckTianXuanDto check = (await _liveApi.CheckTianXuan(target.Roomid)).Data; if (check == null) { @@ -221,14 +215,14 @@ public void TryJoinTianXuan(ListItemDto target) if (check.Status != TianXuanStatus.Enable) { - _logger.LogDebug("已开奖,跳过" + Environment.NewLine); + _logger.LogDebug("已开奖,跳过{newLine}", Environment.NewLine); return; } //根据配置过滤 if (!check.AwardNameIsSatisfied(_liveLotteryTaskOptions.IncludeAwardNameList, _liveLotteryTaskOptions.ExcludeAwardNameList)) { - _logger.LogDebug("不满足配置的筛选条件,跳过" + Environment.NewLine); + _logger.LogDebug("不满足配置的筛选条件,跳过{newLine}", Environment.NewLine); return; } @@ -236,7 +230,7 @@ public void TryJoinTianXuan(ListItemDto target) if (check.Gift_price > 0) { _logger.LogDebug("【赠礼】{gift}", check.GiftDesc); - _logger.LogDebug("需赠送礼物,跳过" + Environment.NewLine); + _logger.LogDebug("需赠送礼物,跳过{newLine}", Environment.NewLine); return; } @@ -259,22 +253,21 @@ public void TryJoinTianXuan(ListItemDto target) Gift_num = check.Gift_num, Csrf = _biliCookie.BiliJct }; - var re = _liveApi.Join(request) - .GetAwaiter().GetResult(); + var re = await _liveApi.Join(request); if (re.Code == 0) { - _logger.LogInformation("【抽奖】成功 √" + Environment.NewLine); + _logger.LogInformation("【抽奖】成功 √{newLine}", Environment.NewLine); if (check.Require_type == RequireType.Follow) _tianXuanFollowed.AddIfNotExist(target, x => x.Uid == target.Uid); return; } _logger.LogInformation("【抽奖】失败"); - _logger.LogInformation("【原因】{msg}" + Environment.NewLine, re.Message); + _logger.LogInformation("【原因】{msg}{newLine}", re.Message, Environment.NewLine); } catch (Exception ex) { - _logger.LogWarning("【异常】{msg},{detail}" + Environment.NewLine, ex.Message, ex); + _logger.LogWarning("【异常】{msg},{detail}{newLine}", ex.Message, ex, Environment.NewLine); //ignore } } @@ -282,7 +275,7 @@ public void TryJoinTianXuan(ListItemDto target) /// /// 将本次抽奖新增的关注统一转移到指定分组中 /// - public void GroupFollowing() + public async Task GroupFollowing() { if (!_tianXuanFollowed.Any()) { @@ -293,7 +286,7 @@ public void GroupFollowing() string.Join(",", _tianXuanFollowed.Select(x => x.Uname))); //目标分组up集合 - List targetUps = GetNeedGroup(); + List targetUps = await GetNeedGroup(); _logger.LogInformation("【将自动分组】{ups}", string.Join(",", targetUps.Select(x => x.Uname))); @@ -303,7 +296,7 @@ public void GroupFollowing() } //目标分组Id - long targetGroupId = GetOrCreateTianXuanGroupId(); + long targetGroupId = await GetOrCreateTianXuanGroupId(); //执行批量分组 var referer = string.Format(RelationApiConstant.CopyReferer, _biliCookie.UserId); @@ -311,8 +304,7 @@ public void GroupFollowing() targetUps.Select(x => x.Uid).ToList(), targetGroupId.ToString(), _biliCookie.BiliJct); - var re = _relationApi.CopyUpsToGroup(req, referer) - .GetAwaiter().GetResult(); + var re = await _relationApi.CopyUpsToGroup(req, referer); if (re.Code == 0) { @@ -331,11 +323,10 @@ public void GroupFollowing() /// 获取抽奖前最后一个关注的up /// /// - private long GetLastFollowUpId() + private async Task GetLastFollowUpId() { - var followings = _relationApi - .GetFollowings(new GetFollowingsRequest(long.Parse(_biliCookie.UserId), FollowingsOrderType.TimeDesc)) - .GetAwaiter().GetResult(); + var followings = await _relationApi + .GetFollowings(new GetFollowingsRequest(long.Parse(_biliCookie.UserId), FollowingsOrderType.TimeDesc)); return followings.Data.List.FirstOrDefault()?.Mid ?? 0; } @@ -343,14 +334,13 @@ private long GetLastFollowUpId() /// 获取本次需要自动分组的主播 /// /// - private List GetNeedGroup() + private async Task> GetNeedGroup() { - List addUpIds = new List(); + List addUpIds = new(); //获取最后一个upId之后关注的所有upId - var followings = _relationApi - .GetFollowings(new GetFollowingsRequest(long.Parse(_biliCookie.UserId), FollowingsOrderType.TimeDesc)) - .GetAwaiter().GetResult(); + var followings = await _relationApi + .GetFollowings(new GetFollowingsRequest(long.Parse(_biliCookie.UserId), FollowingsOrderType.TimeDesc)); foreach (UpInfo item in followings.Data.List) { @@ -363,7 +353,7 @@ private List GetNeedGroup() } //和成功抽奖的主播取交集 - List target = new List(); + List target = new(); foreach (var listItemDto in _tianXuanFollowed) { if (addUpIds.Contains(listItemDto.Uid)) @@ -377,19 +367,18 @@ private List GetNeedGroup() /// 获取或创建天选时刻分组 /// /// - private long GetOrCreateTianXuanGroupId() + private async Task GetOrCreateTianXuanGroupId() { //获取天选分组Id,没有就创建 long groupId = 0; string referer = string.Format(RelationApiConstant.GetTagsReferer, _biliCookie.UserId); - var groups = _relationApi.GetTags(referer).GetAwaiter().GetResult(); + var groups = await _relationApi.GetTags(referer); var tianXuanGroup = groups.Data.FirstOrDefault(x => x.Name == "天选时刻"); if (tianXuanGroup == null) { _logger.LogInformation("“天选时刻”分组不存在,尝试创建..."); //创建一个 - var createRe = _relationApi.CreateTag(new CreateTagRequest { Tag = "天选时刻", Csrf = _biliCookie.BiliJct }) - .GetAwaiter().GetResult(); + var createRe = await _relationApi.CreateTag(new CreateTagRequest { Tag = "天选时刻", Csrf = _biliCookie.BiliJct }); groupId = createRe.Data.Tagid; _logger.LogInformation("创建成功"); } @@ -403,11 +392,11 @@ private long GetOrCreateTianXuanGroupId() } #endregion - public void SendDanmakuToFansMedalLive() + public async Task SendDanmakuToFansMedalLive() { - if (!CheckLiveCookie()) return; + if (!await CheckLiveCookie()) return; - GetFansMedalInfoList().ForEach(info => + (await GetFansMedalInfoList()).ForEach(async info => { var medal = info.MedalInfo; @@ -417,8 +406,8 @@ public void SendDanmakuToFansMedalLive() _logger.LogInformation("正在发送弹幕..."); // 通过空间主页信息获取直播间 id - int liveHostUserId = medal.Medal_info.Target_id; - var spaceInfo = _userInfoApi.GetSpaceInfo(liveHostUserId).Result; + var liveHostUserId = medal.Medal_info.Target_id; + var spaceInfo = await _userInfoApi.GetSpaceInfo(liveHostUserId); if (spaceInfo.Code != 0) { _logger.LogError("【获取直播间信息】失败"); @@ -427,10 +416,10 @@ public void SendDanmakuToFansMedalLive() } // 发送弹幕 - var sendResult = _liveApi.SendLiveDanmuku(new SendLiveDanmukuRequest( + var sendResult = await _liveApi.SendLiveDanmuku(new SendLiveDanmukuRequest( _biliCookie.BiliJct, spaceInfo.Data.Live_room.Roomid, - _liveFansMedalTaskOptions.DanmakuContent)).Result; + _liveFansMedalTaskOptions.DanmakuContent)); if (sendResult.Code != 0) { @@ -443,12 +432,14 @@ public void SendDanmakuToFansMedalLive() }); } - public void SendHeartBeatToFansMedalLive() + public async Task SendHeartBeatToFansMedalLive() { - if (!CheckLiveCookie()) return; + if (!await CheckLiveCookie()) return; var infoList = new List(); - GetFansMedalInfoList().ForEach((medal) => infoList.Add(new(medal.RoomId, medal.LiveRoomInfo, new(), 0, 0))); + (await GetFansMedalInfoList()).ForEach(medal => + infoList.Add(new(medal.RoomId, medal.LiveRoomInfo, new(), 0, 0)) + ); if (infoList.Count == 0) { @@ -483,7 +474,7 @@ public void SendHeartBeatToFansMedalLive() BiliApiResponse heartBeatResult = null; if (info.HeartBeatCount == 0) { - heartBeatResult = _liveTraceApi.EnterRoom( + heartBeatResult = await _liveTraceApi.EnterRoom( new EnterRoomRequest( info.RoomId, info.RoomInfo.Parent_area_id, @@ -494,12 +485,11 @@ public void SendHeartBeatToFansMedalLive() _biliCookie.BiliJct, info.RoomInfo.Uid, $"[\"{_biliCookie.LiveBuvid}\",\"{uuid}\"]") - ) - .Result; + ); } else { - heartBeatResult = _liveTraceApi.HeartBeat( + heartBeatResult = await _liveTraceApi.HeartBeat( new HeartBeatRequest( info.RoomId, info.RoomInfo.Parent_area_id, @@ -514,8 +504,7 @@ public void SendHeartBeatToFansMedalLive() _biliCookie.BiliJct, uuid, $"[\"{_biliCookie.LiveBuvid}\",\"{uuid}\"]") - ) - .Result; + ); } info.LastBeatTime = Now(); @@ -546,13 +535,13 @@ public void SendHeartBeatToFansMedalLive() _logger.LogInformation("【直播观看时长】完成情况:{success}/{total} ", successCount, infoList.Count); } - public void LikeFansMedalLive() + public async Task LikeFansMedalLive() { - if (!CheckLiveCookie()) return; + if (!await CheckLiveCookie()) return; - GetFansMedalInfoList().ForEach(info => + (await GetFansMedalInfoList()).ForEach(async info => { - var result = _liveApi.LikeLiveRoom(new LikeLiveRoomRequest(info.RoomId, _biliCookie.BiliJct)).Result; + var result = await _liveApi.LikeLiveRoom(new LikeLiveRoomRequest(info.RoomId, _biliCookie.BiliJct)); if (result.Code == 0) { _logger.LogInformation("【点赞直播间】{roomId} 完成", info.RoomId); @@ -565,10 +554,10 @@ public void LikeFansMedalLive() }); } - private List GetFansMedalInfoList() + private async Task> GetFansMedalInfoList() { _logger.LogInformation("【获取直播列表】获取拥有粉丝牌的直播列表"); - var medalWallInfo = _liveApi.GetMedalWall(_biliCookie.UserId).Result; + var medalWallInfo = await _liveApi.GetMedalWall(_biliCookie.UserId); if (medalWallInfo.Code != 0) { @@ -588,8 +577,8 @@ private List GetFansMedalInfoList() } // 通过空间主页信息获取直播间 id - int liveHostUserId = medal.Medal_info.Target_id; - var spaceInfo = _userInfoApi.GetSpaceInfo(liveHostUserId).Result; + var liveHostUserId = medal.Medal_info.Target_id; + var spaceInfo = await _userInfoApi.GetSpaceInfo(liveHostUserId); if (spaceInfo.Code != 0) { _logger.LogError("【获取空间信息】失败"); @@ -600,7 +589,7 @@ private List GetFansMedalInfoList() var roomId = spaceInfo.Data.Live_room.Roomid; // 获取直播间详细信息 - var liveRoomInfo = _liveApi.GetLiveRoomInfo(roomId).Result; + var liveRoomInfo = await _liveApi.GetLiveRoomInfo(roomId); if (liveRoomInfo.Code != 0) { _logger.LogError("【获取直播间信息】失败"); @@ -620,44 +609,34 @@ private List GetFansMedalInfoList() /// /// bool 成功配置 or not /// - private bool CheckLiveCookie() + private async Task CheckLiveCookie() { // 检测 _biliCookie 是否正确配置 - if (string.IsNullOrWhiteSpace(_biliCookie.LiveBuvid)) - { - try - { - _logger.LogInformation("检测到直播 Cookie 未正确配置,尝试自动配置中..."); + if (!string.IsNullOrWhiteSpace(_biliCookie.LiveBuvid)) return true; - // 请求主播主页来正确配置 cookie - var liveHome = _liveApi.GetLiveHome().Result; - var liveHomeContent = JsonConvert.DeserializeObject(liveHome.Content.ReadAsStringAsync().Result); - if (liveHomeContent.Code != 0) - { - throw new Exception(liveHomeContent.Message); - } + try + { + _logger.LogInformation("检测到直播 Cookie 未正确配置,尝试自动配置中..."); - IEnumerable liveCookies = liveHome.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value; - var ckItemList = new List(); - foreach (var item in liveCookies) - { - ckItemList.Add(item.Split(';').FirstOrDefault()); - } - _biliCookie.LiveBuvid = CookieInfo.BuildCookieItemDictionaryByCookieItemList( - ckItemList, - null, - v => v.Contains(',') ? Uri.EscapeDataString(v) : v) - [_biliCookie.GetType().GetPropertyDescription(nameof(BiliCookie.LiveBuvid))]; - - _logger.LogDebug("LiveBuvid {value}", _biliCookie.LiveBuvid); - _logger.LogInformation("直播 Cookie 配置成功!"); - } - catch (Exception exception) + // 请求主播主页来正确配置 cookie + var liveHome = await _liveApi.GetLiveHome(); + var liveHomeContent = JsonConvert.DeserializeObject(await liveHome.Content.ReadAsStringAsync()); + if (liveHomeContent.Code != 0) { - _logger.LogError("【配置直播Cookie】失败,放弃执行后续任务..."); - _logger.LogError("【原因】{message}", exception.Message); - return false; + throw new Exception(liveHomeContent.Message); } + + List liveCookies = liveHome.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value.ToList(); + _biliCookie.MergeCurrentCookie(liveCookies); + + _logger.LogDebug("LiveBuvid {value}", _biliCookie.LiveBuvid); + _logger.LogInformation("直播 Cookie 配置成功!"); + } + catch (Exception exception) + { + _logger.LogError("【配置直播Cookie】失败,放弃执行后续任务..."); + _logger.LogError("【原因】{message}", exception.Message); + return false; } return true; } diff --git a/src/Ray.BiliBiliTool.DomainService/LoginDomainService.cs b/src/Ray.BiliBiliTool.DomainService/LoginDomainService.cs new file mode 100644 index 000000000..afa93c535 --- /dev/null +++ b/src/Ray.BiliBiliTool.DomainService/LoginDomainService.cs @@ -0,0 +1,407 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Ray.BiliBiliTool.Agent; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Passport; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.DomainService.Interfaces; +using System.IO; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json.Linq; +using QRCoder; +using Ray.BiliBiliTool.Agent.QingLong; +using Ray.BiliBiliTool.Infrastructure.Cookie; + +namespace Ray.BiliBiliTool.DomainService +{ + /// + /// 账户 + /// + public class LoginDomainService : ILoginDomainService + { + private readonly ILogger _logger; + private readonly IPassportApi _passportApi; + private readonly IHostEnvironment _hostingEnvironment; + private readonly IQingLongApi _qingLongApi; + private readonly IHomeApi _homeApi; + private readonly IConfiguration _configuration; + + public LoginDomainService( + ILogger logger, + IPassportApi passportApi, + IHostEnvironment hostingEnvironment, + IQingLongApi qingLongApi, + IHomeApi homeApi, + IConfiguration configuration) + { + _logger = logger; + _passportApi = passportApi; + _hostingEnvironment = hostingEnvironment; + _qingLongApi = qingLongApi; + _homeApi = homeApi; + _configuration = configuration; + } + + public async Task LoginByQrCodeAsync(CancellationToken cancellationToken) + { + BiliCookie cookieInfo = null; + + var re = await _passportApi.GenerateQrCode(); + if (re.Code != 0) + { + _logger.LogWarning("获取二维码失败:{msg}", re.ToJson()); + return null; + } + + var url = re.Data.Url; + GenerateQrCode(url); + + var online = GetOnlinePic(url); + _logger.LogInformation(Environment.NewLine + Environment.NewLine); + _logger.LogInformation("如果上方二维码显示异常,或扫描失败,请使用浏览器访问如下链接,查看高清二维码:"); + _logger.LogInformation(online + Environment.NewLine + Environment.NewLine); + + var waitTimes = 10; + _logger.LogInformation("我数到{num},动作快点", waitTimes); + for (int i = 0; i < waitTimes; i++) + { + _logger.LogInformation("[{num}]等待扫描...", i + 1); + + await Task.Delay(5 * 1000, cancellationToken); + + var check = await _passportApi.CheckQrCodeHasScaned(re.Data.Qrcode_key); + if (!check.IsSuccessStatusCode) + { + _logger.LogWarning("调用检测接口异常"); + continue; + } + + var content = JsonConvert.DeserializeObject>(await check.Content.ReadAsStringAsync(cancellationToken)); + if (content.Code != 0) + { + _logger.LogWarning("调用检测接口异常:{msg}", check.ToJson()); + break; + } + + if (content.Data.Code == 86038)//已失效 + { + _logger.LogInformation(content.Data.Message); + break; + } + + if (content.Data.Code == 0) + { + _logger.LogInformation("扫描成功!"); + IEnumerable cookies = check.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value; + + var cookieStr = CookieInfo.ConvertSetCkHeadersToCkStr(cookies); + cookieInfo = new BiliCookie(cookieStr); + cookieInfo.Check(); + + break; + } + + _logger.LogInformation("{msg}", content.Data.Message + Environment.NewLine); + } + + return cookieInfo; + } + + public async Task SetCookieAsync(BiliCookie biliCookie, CancellationToken cancellationToken) + { + try + { + var homePage = await _homeApi.GetHomePageAsync(biliCookie.ToString()); + if (homePage.IsSuccessStatusCode) + { + _logger.LogInformation("访问主站成功"); + IEnumerable setCookieHeaders = homePage.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value; + biliCookie.MergeCurrentCookieBySetCookieHeaders(setCookieHeaders); + _logger.LogInformation("SetCookie成功"); + return biliCookie; + } + _logger.LogError("访问主站失败:{msg}", homePage.ToJson()); + } + catch (Exception e) + { + //buvid只影响分享和投币,可以吞掉异常 + _logger.LogError(e.ToJson()); + } + + return biliCookie; + } + + public async Task SaveCookieToJsonFileAsync(BiliCookie ckInfo, CancellationToken cancellationToken) + { + //读取json + var path = _hostingEnvironment.ContentRootPath; + var indexOfBin = path.LastIndexOf("bin"); + if (indexOfBin != -1) path = path[..indexOfBin]; + var fileProvider = new PhysicalFileProvider(path); + IFileInfo fileInfo = fileProvider.GetFileInfo("cookies.json"); + _logger.LogInformation("目标json地址:{path}", fileInfo.PhysicalPath); + + if (!fileInfo.Exists) + { + await using var stream = File.Create(fileInfo.PhysicalPath); + await using var sw = new StreamWriter(stream); + await sw.WriteAsync($"{{{Environment.NewLine}}}"); + } + + string json; + await using (var stream = new FileStream(fileInfo.PhysicalPath, FileMode.Open)) + { + using var reader = new StreamReader(stream); + json = await reader.ReadToEndAsync(); + } + var lines = json.Split(Environment.NewLine).ToList(); + + var indexOfCkConfigKey = lines.FindIndex(x => x.TrimStart().StartsWith("\"BiliBiliCookies\"")); + if (indexOfCkConfigKey == -1) + { + _logger.LogInformation("未配置过cookie,初始化并新增"); + + var indexOfInsert = lines.FindIndex(x => x.TrimStart().StartsWith("{")); + lines.InsertRange(indexOfInsert + 1, new List() + { + " \"BiliBiliCookies\":[", + $@" ""{ckInfo.CookieStr}"",", + " ]," + }); + + await SaveJson(lines, fileInfo); + _logger.LogInformation("新增成功!"); + return; + } + + ckInfo.CookieItemDictionary.TryGetValue("DedeUserID", out string userId); + userId ??= ckInfo.CookieStr; + var indexOfCkConfigEnd = lines.FindIndex(indexOfCkConfigKey, x => x.TrimStart().StartsWith("]")); + var indexOfTargetCk = lines.FindIndex(indexOfCkConfigKey, + indexOfCkConfigEnd - indexOfCkConfigKey, + x => x.Contains(userId) && !x.TrimStart().StartsWith("//")); + + if (indexOfTargetCk == -1) + { + _logger.LogInformation("不存在该用户,新增cookie"); + lines.Insert(indexOfCkConfigEnd, $@" ""{ckInfo.CookieStr}"","); + await SaveJson(lines, fileInfo); + _logger.LogInformation("新增成功!"); + return; + } + + _logger.LogInformation("已存在该用户,更新cookie"); + lines[indexOfTargetCk] = $@" ""{ckInfo.CookieStr}"","; + await SaveJson(lines, fileInfo); + _logger.LogInformation("更新成功!"); + } + + public async Task SaveCookieToQinLongAsync(BiliCookie ckInfo, CancellationToken cancellationToken) + { + //拿token + var token = await GetQingLongAuthTokenAsync(); + + if (token.IsNullOrEmpty()) return; + + token = $"Bearer {token}"; + + //查env + var re = await _qingLongApi.GetEnvs("Ray_BiliBiliCookies__", token); + + if (re.Code != 200) + { + _logger.LogInformation($"查询环境变量失败:{re}", re.ToJson()); + return; + } + + var list = re.Data.Where(x => x.name.StartsWith("Ray_BiliBiliCookies__")).ToList(); + QingLongEnv oldEnv = list.FirstOrDefault(x => x.value.Contains(ckInfo.UserId)); + + if (oldEnv != null) + { + _logger.LogInformation("用户已存在,更新cookie"); + _logger.LogInformation("Key:{key}", oldEnv.name); + var update = new UpdateQingLongEnv() + { + id = oldEnv.id, + name = oldEnv.name, + value = ckInfo.CookieStr, + remarks = oldEnv.remarks.IsNullOrEmpty() + ? $"bili-{ckInfo.UserId}" + : oldEnv.remarks, + }; + + var updateRe = await _qingLongApi.UpdateEnvs(update, token); + _logger.LogInformation(updateRe.Code == 200 ? "更新成功!" : updateRe.ToJson()); + + return; + } + + _logger.LogInformation("用户不存在,新增cookie"); + var maxNum = -1; + if (list.Any()) + { + maxNum = list.Select(x => + { + var num = x.name.Replace("Ray_BiliBiliCookies__", ""); + var parseSuc = int.TryParse(num, out int envNum); + return parseSuc ? envNum : 0; + }).Max(); + } + var name = $"Ray_BiliBiliCookies__{maxNum + 1}"; + _logger.LogInformation("Key:{key}", name); + + var add = new AddQingLongEnv() + { + name = name, + value = ckInfo.CookieStr, + remarks = $"bili-{ckInfo.UserId}" + }; + var addRe = await _qingLongApi.AddEnvs(new List { add }, token); + _logger.LogInformation(addRe.Code == 200 ? "新增成功!" : addRe.ToJson()); + } + + #region private + + private void GenerateQrCode(string str) + { + var qrGenerator = new QRCodeGenerator(); + QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, QRCodeGenerator.ECCLevel.L); + + _logger.LogInformation("AsciiQRCode:"); + //var qrCode = new AsciiQRCode(qrCodeData); + //var qrCodeStr = qrCode.GetGraphic(1, drawQuietZones: false); + //_logger.LogInformation(Environment.NewLine + qrCodeStr); + + //Console.WriteLine("Console:"); + //Print(qrCodeData); + PrintSmall(qrCodeData); + } + + private void Print(QRCodeData qrCodeData) + { + Console.BackgroundColor = ConsoleColor.White; + for (int i = 0; i < qrCodeData.ModuleMatrix.Count + 2; i++) Console.Write(" ");//中文全角的空格符 + Console.WriteLine(); + for (int j = 0; j < qrCodeData.ModuleMatrix.Count; j++) + { + for (int i = 0; i < qrCodeData.ModuleMatrix.Count; i++) + { + //char charToPoint = qrCode.Matrix[i, j] ? '█' : ' '; + Console.Write(i == 0 ? " " : "");//中文全角的空格符 + Console.BackgroundColor = qrCodeData.ModuleMatrix[i][j] ? ConsoleColor.Black : ConsoleColor.White; + Console.Write(' ');//中文全角的空格符 + Console.BackgroundColor = ConsoleColor.White; + Console.Write(i == qrCodeData.ModuleMatrix.Count - 1 ? " " : "");//中文全角的空格符 + } + Console.WriteLine(); + } + for (int i = 0; i < qrCodeData.ModuleMatrix.Count + 2; i++) Console.Write(" ");//中文全角的空格符 + + Console.WriteLine(); + } + + private void PrintSmall(QRCodeData qrCodeData) + { + //黑黑(" ") + //白白("█") + //黑白("▄") + //白黑("▀") + var dic = new Dictionary() + { + {"11", ' '}, + {"00", '█'}, + {"10", '▄'}, + {"01", '▀'},//todo:win平台的cmd会显示?,是已知问题,待想办法解决 + //{"01", '^'},//▼▔ + }; + + var count = qrCodeData.ModuleMatrix.Count; + + var list = new List(); + for (int rowNum = 0; rowNum < count; rowNum++) + { + var rowStr = ""; + for (int colNum = 0; colNum < count; colNum++) + { + var num = qrCodeData.ModuleMatrix[colNum][rowNum] ? "1" : "0"; + var numDown = "0"; + if (rowNum + 1 < count) + numDown = qrCodeData.ModuleMatrix[colNum][rowNum + 1] ? "1" : "0"; + + rowStr += dic[num + numDown]; + } + list.Add(rowStr); + rowNum++; + } + + _logger.LogInformation(Environment.NewLine + string.Join(Environment.NewLine, list)); + } + + private string GetOnlinePic(string str) + { + var encode = System.Web.HttpUtility.UrlEncode(str); ; + return $"https://tool.lu/qrcode/basic.html?text={encode}"; + } + + private string GetCookieStr(IEnumerable setCookies) + { + var ckItemList = new List(); + foreach (var item in setCookies) + { + ckItemList.Add(item.Split(';').FirstOrDefault()); + } + var biliCk = string.Join("; ", ckItemList); + return biliCk; + } + + private async Task SaveJson(List lines, IFileInfo fileInfo) + { + var newJson = string.Join(Environment.NewLine, lines); + + await using var sw = new StreamWriter(fileInfo.PhysicalPath); + await sw.WriteAsync(newJson); + } + + #region qinglong + + private async Task GetQingLongAuthTokenAsync() + { + var token = ""; + + var qlDir = _configuration["QL_DIR"] ?? "/ql"; + + string authFile = qlDir; + if (_hostingEnvironment.ContentRootPath.Contains($"{qlDir}/data/")) + { + authFile = Path.Combine(authFile, "data"); + } + authFile = Path.Combine(authFile, "config/auth.json"); + + if (!File.Exists(authFile)) + { + _logger.LogWarning("获取青龙授权失败,文件不在:{authFile}", authFile); + return token; + } + + var authJson = await File.ReadAllTextAsync(authFile); + + var jb = JsonConvert.DeserializeObject(authJson); + token = jb["token"]?.ToString(); + + return token; + } + + #endregion + + #endregion + + } +} diff --git a/src/Ray.BiliBiliTool.DomainService/MangaDomainService.cs b/src/Ray.BiliBiliTool.DomainService/MangaDomainService.cs index a0b53f9eb..4459f4625 100644 --- a/src/Ray.BiliBiliTool.DomainService/MangaDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/MangaDomainService.cs @@ -1,11 +1,9 @@ using System; -using System.Collections.Generic; -using System.Text; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; -using Ray.BiliBiliTool.Config; using Ray.BiliBiliTool.Config.Options; using Ray.BiliBiliTool.DomainService.Interfaces; @@ -32,12 +30,12 @@ public MangaDomainService(ILogger logger, /// /// 漫画签到 /// - public void MangaSign() + public async Task MangaSign() { BiliApiResponse response; try { - response = _mangaApi.ClockIn(_dailyTaskOptions.DevicePlatform).GetAwaiter().GetResult(); + response = await _mangaApi.ClockIn(_dailyTaskOptions.DevicePlatform); } catch (Exception) { @@ -62,9 +60,9 @@ public void MangaSign() /// /// 漫画阅读 /// - public void MangaRead() + public async Task MangaRead() { - BiliApiResponse response = _mangaApi.ReadManga(_dailyTaskOptions.DevicePlatform).GetAwaiter().GetResult(); + BiliApiResponse response = await _mangaApi.ReadManga(_dailyTaskOptions.DevicePlatform); if (response.Code == 0) { @@ -82,7 +80,7 @@ public void MangaRead() /// /// 权益号,由https://api.bilibili.com/x/vip/privilege/my得到权益号数组,取值范围为数组中的整数 /// 这里为方便直接取1,为领取漫读劵,暂时不取其他的值 - public void ReceiveMangaVipReward(int reason_id, UserInfo userInfo) + public async Task ReceiveMangaVipReward(int reason_id, UserInfo userInfo) { if (userInfo.GetVipType() == 0) { @@ -101,8 +99,7 @@ public void ReceiveMangaVipReward(int reason_id, UserInfo userInfo) return; } - var response = _mangaApi.ReceiveMangaVipReward(reason_id) - .GetAwaiter().GetResult(); + var response = await _mangaApi.ReceiveMangaVipReward(reason_id); if (response.Code == 0) { _logger.LogInformation("【领取结果】成功"); diff --git a/src/Ray.BiliBiliTool.DomainService/Ray.BiliBiliTool.DomainService.csproj b/src/Ray.BiliBiliTool.DomainService/Ray.BiliBiliTool.DomainService.csproj index 560a330c7..33c379df6 100644 --- a/src/Ray.BiliBiliTool.DomainService/Ray.BiliBiliTool.DomainService.csproj +++ b/src/Ray.BiliBiliTool.DomainService/Ray.BiliBiliTool.DomainService.csproj @@ -5,8 +5,10 @@ + + diff --git a/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs b/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs index 1af2f370e..f3f6d8081 100644 --- a/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Ray.BiliBiliTool.Agent; @@ -53,10 +54,9 @@ IVideoWithoutCookieApi videoWithoutCookieApi /// /// /// - public VideoDetail GetVideoDetail(string aid) + public async Task GetVideoDetail(string aid) { - var re = _videoWithoutCookieApi.GetVideoDetail(aid) - .GetAwaiter().GetResult(); + var re = await _videoWithoutCookieApi.GetVideoDetail(aid); return re.Data; } @@ -64,20 +64,20 @@ public VideoDetail GetVideoDetail(string aid) /// 从排行榜获取随机视频 /// /// - public RankingInfo GetRandomVideoOfRanking() + public async Task GetRandomVideoOfRanking() { - var apiResponse = _videoWithoutCookieApi.GetRegionRankingVideosV2().GetAwaiter().GetResult(); + var apiResponse = await _videoWithoutCookieApi.GetRegionRankingVideosV2(); _logger.LogDebug("获取排行榜成功"); RankingInfo data = apiResponse.Data.List[new Random().Next(apiResponse.Data.List.Count)]; return data; } - public UpVideoInfo GetRandomVideoOfUp(long upId, int total) + public async Task GetRandomVideoOfUp(long upId, int total) { if (total <= 0) return null; int pageNum = new Random().Next(1, total + 1); - BiliApiResponse re = _videoApi.SearchVideosByUpId(upId, 1, pageNum).GetAwaiter().GetResult(); + BiliApiResponse re = await _videoApi.SearchVideosByUpId(upId, 1, pageNum); if (re.Code != 0) { @@ -92,10 +92,9 @@ public UpVideoInfo GetRandomVideoOfUp(long upId, int total) /// /// /// - public int GetVideoCountOfUp(long upId) + public async Task GetVideoCountOfUp(long upId) { - BiliApiResponse re = _videoApi.SearchVideosByUpId(upId) - .GetAwaiter().GetResult(); + BiliApiResponse re = await _videoApi.SearchVideosByUpId(upId); if (re.Code != 0) { throw new Exception(re.Message); @@ -104,14 +103,14 @@ public int GetVideoCountOfUp(long upId) return re.Data.Page.Count; } - public void WatchAndShareVideo(DailyTaskInfo dailyTaskStatus) + public async Task WatchAndShareVideo(DailyTaskInfo dailyTaskStatus) { VideoInfoDto targetVideo = null; //至少有一项未完成,获取视频 if (!dailyTaskStatus.Watch || !dailyTaskStatus.Share) { - targetVideo = GetRandomVideoForWatchAndShare(); + targetVideo = await GetRandomVideoForWatchAndShare(); _logger.LogInformation("【随机视频】{title}", targetVideo.Title); } @@ -119,7 +118,7 @@ public void WatchAndShareVideo(DailyTaskInfo dailyTaskStatus) //观看 if (!dailyTaskStatus.Watch && _dailyTaskOptions.IsWatchVideo) { - WatchVideo(targetVideo); + await WatchVideo(targetVideo); watched = true; } else @@ -133,7 +132,7 @@ public void WatchAndShareVideo(DailyTaskInfo dailyTaskStatus) { try { - OpenVideo(targetVideo); + await OpenVideo(targetVideo); } catch (Exception e) { @@ -141,7 +140,7 @@ public void WatchAndShareVideo(DailyTaskInfo dailyTaskStatus) _logger.LogError("打开视频异常:{msg}", e.Message); } } - ShareVideo(targetVideo); + await ShareVideo(targetVideo); } else _logger.LogInformation("今天已经分享过了,不用再分享啦"); @@ -150,10 +149,10 @@ public void WatchAndShareVideo(DailyTaskInfo dailyTaskStatus) /// /// 观看视频 /// - public void WatchVideo(VideoInfoDto videoInfo) + public async Task WatchVideo(VideoInfoDto videoInfo) { //开始上报一次 - OpenVideo(videoInfo); + await OpenVideo(videoInfo); //结束上报一次 videoInfo.Duration = videoInfo.Duration ?? 15; @@ -172,8 +171,7 @@ public void WatchVideo(VideoInfoDto videoInfo) Realtime = playedTime, Real_played_time = playedTime, }; - BiliApiResponse apiResponse = _videoApi.UploadVideoHeartbeat(request) - .GetAwaiter().GetResult(); + BiliApiResponse apiResponse = await _videoApi.UploadVideoHeartbeat(request); if (apiResponse.Code == 0) { @@ -190,11 +188,10 @@ public void WatchVideo(VideoInfoDto videoInfo) /// 分享视频 /// /// 视频 - public void ShareVideo(VideoInfoDto videoInfo) + public async Task ShareVideo(VideoInfoDto videoInfo) { var request = new ShareVideoRequest(long.Parse(videoInfo.Aid), _biliBiliCookie.BiliJct); - BiliApiResponse apiResponse = _videoApi.ShareVideo(request) - .GetAwaiter().GetResult(); + BiliApiResponse apiResponse = await _videoApi.ShareVideo(request); if (apiResponse.Code == 0) { @@ -212,7 +209,7 @@ public void ShareVideo(VideoInfoDto videoInfo) /// /// /// - private bool OpenVideo(VideoInfoDto videoInfo) + private async Task OpenVideo(VideoInfoDto videoInfo) { var request = new UploadVideoHeartbeatRequest { @@ -225,8 +222,7 @@ private bool OpenVideo(VideoInfoDto videoInfo) }; //开始上报一次 - BiliApiResponse apiResponse = _videoApi.UploadVideoHeartbeat(request) - .GetAwaiter().GetResult(); + BiliApiResponse apiResponse = await _videoApi.UploadVideoHeartbeat(request); if (apiResponse.Code == 0) { @@ -245,14 +241,14 @@ private bool OpenVideo(VideoInfoDto videoInfo) /// 获取一个视频用来观看并分享 /// /// - private VideoInfoDto GetRandomVideoForWatchAndShare() + private async Task GetRandomVideoForWatchAndShare() { //先从配置的或关注的up中取 - VideoInfoDto video = GetRandomVideoOfFollowingUps(); + VideoInfoDto video = await GetRandomVideoOfFollowingUps(); if (video != null) return video; //然后从排行榜中取 - RankingInfo t = GetRandomVideoOfRanking(); + RankingInfo t = await GetRandomVideoOfRanking(); return new VideoInfoDto { Aid = t.Aid.ToString(), @@ -264,23 +260,22 @@ private VideoInfoDto GetRandomVideoForWatchAndShare() }; } - private VideoInfoDto GetRandomVideoOfFollowingUps() + private async Task GetRandomVideoOfFollowingUps() { //配置的UpId int configUpsCount = _dailyTaskOptions.SupportUpIdList.Count; if (configUpsCount > 0) { - VideoInfoDto video = GetRandomVideoOfUps(_dailyTaskOptions.SupportUpIdList); + VideoInfoDto video = await GetRandomVideoOfUps(_dailyTaskOptions.SupportUpIdList); if (video != null) return video; } //关注列表 var request = new GetFollowingsRequest(long.Parse(_biliBiliCookie.UserId)); - BiliApiResponse result = _relationApi.GetFollowings(request) - .GetAwaiter().GetResult(); + BiliApiResponse result = await _relationApi.GetFollowings(request); if (result.Data.Total > 0) { - VideoInfoDto video = GetRandomVideoOfUps(result.Data.List.Select(x => x.Mid).ToList()); + VideoInfoDto video = await GetRandomVideoOfUps(result.Data.List.Select(x => x.Mid).ToList()); if (video != null) return video; } @@ -292,17 +287,17 @@ private VideoInfoDto GetRandomVideoOfFollowingUps() /// /// /// - private VideoInfoDto GetRandomVideoOfUps(List upIds) + private async Task GetRandomVideoOfUps(List upIds) { long upId = upIds[new Random().Next(0, upIds.Count)]; if (upId == 0 || upId == long.MinValue) return null; - int count = GetVideoCountOfUp(upId); + int count = await GetVideoCountOfUp(upId); if (count > 0) { - UpVideoInfo video = GetRandomVideoOfUp(upId, count); + UpVideoInfo video = await GetRandomVideoOfUp(upId, count); if (video == null) return null; return new VideoInfoDto { diff --git a/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs index 5392dc7b1..2740c9ffe 100644 --- a/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs +++ b/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Ray.BiliBiliTool.Agent; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; @@ -37,7 +38,7 @@ public VipPrivilegeDomainService( /// 每月领取大会员福利(B币券、大会员权益) /// /// - public bool ReceiveVipPrivilege(UserInfo userInfo) + public async Task ReceiveVipPrivilege(UserInfo userInfo) { if (!_receiveVipPrivilegeOptionsce.IsEnable) { @@ -69,8 +70,8 @@ public bool ReceiveVipPrivilege(UserInfo userInfo) } */ - var suc1 = ReceiveVipPrivilege(1); - var suc2 = ReceiveVipPrivilege(2); + var suc1 = await ReceiveVipPrivilege(1); + var suc2 = await ReceiveVipPrivilege(2); if (suc1 | suc2) return true; return false; @@ -82,10 +83,9 @@ public bool ReceiveVipPrivilege(UserInfo userInfo) /// 领取大会员每月赠送福利 /// /// 1.大会员B币券;2.大会员福利 - private bool ReceiveVipPrivilege(int type) + private async Task ReceiveVipPrivilege(int type) { - var response = _dailyTaskApi.ReceiveVipPrivilege(type, _biliBiliCookie.BiliJct) - .GetAwaiter().GetResult(); + var response = await _dailyTaskApi.ReceiveVipPrivilege(type, _biliBiliCookie.BiliJct); var name = GetPrivilegeName(type); _logger.LogInformation("【领取】{name}", name); diff --git a/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs b/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs index e3ce5daa1..b3ca0f9c4 100644 --- a/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs +++ b/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs @@ -6,43 +6,111 @@ namespace Ray.BiliBiliTool.Infrastructure.Cookie { public class CookieInfo { - public CookieInfo(string cookieStr, Func nameBuilder = null, Func valueBuilder = null) : this(cookieStr?.Split(';'), nameBuilder, valueBuilder) + private readonly CookieStrFactory _ckFactory; + + public CookieInfo(CookieStrFactory ckFactory) { + _ckFactory = ckFactory; } - public CookieInfo(IEnumerable cookieItemList, Func nameBuilder = null, Func valueBuilder = null) + public string CookieStr => _ckFactory.GetCurrentCookieStr(); + + public Dictionary CookieItemDictionary => _ckFactory.GetCurrentCookieDic(); + + public virtual void Check() { - CookieItemDictionary = BuildCookieItemDictionaryByCookieItemList(cookieItemList, nameBuilder, valueBuilder); + if (string.IsNullOrWhiteSpace(CookieStr)) throw new Exception("Cookie字符串为空"); + } + + public virtual string CkNameBuild(string name) { return name; } + + public virtual string CkValueBuild(string value) { return value; } - CookieStr = string.Join("; ", CookieItemDictionary.Select(kv => $"{kv.Key}={kv.Value}")); + public override string ToString() + { + var list = CookieItemDictionary.Select(d => $"{CkNameBuild(d.Key)}={CkValueBuild(d.Value)}"); + return string.Join("; ", list); } - public string CookieStr { get; private set; } + #region merge - public Dictionary CookieItemDictionary { get; private set; } + public void MergeCurrentCookieBySetCookieHeaders(IEnumerable setCookieList) + { + _ckFactory.MergeCurrentCookieBySetCookieHeaders(setCookieList); + } - public virtual void Check() + public void MergeCurrentCookie(string ckStr) { - if (string.IsNullOrWhiteSpace(CookieStr)) throw new Exception("Cookie字符串为空"); + _ckFactory.MergeCurrentCookie(ckStr); + } + + public void MergeCurrentCookie(List ckItemList) + { + _ckFactory.MergeCurrentCookie(ckItemList); } - public static Dictionary BuildCookieItemDictionaryByCookieItemList(IEnumerable cookieItemList, Func nameBuilder = null, Func valueBuilder = null) + public void MergeCurrentCookie(Dictionary ckDic) { - var re = new Dictionary(); - foreach (var item in cookieItemList ?? new List()) - { - var index = item.IndexOf('='); - if (index == -1) continue; + _ckFactory.MergeCurrentCookie(ckDic); + } + + #endregion + + #region convert + + /// + /// List—>List + /// + /// + /// + public static List ConvertSetCkHeadersToCkItemList(IEnumerable setCookieList) + { + return setCookieList.Select(item => item.Split(';').FirstOrDefault()?.Trim()).ToList(); + } + + /// + /// List—>ckStr + /// + /// + /// + public static string ConvertSetCkHeadersToCkStr(IEnumerable setCookieList) + { + var ckItemList = ConvertSetCkHeadersToCkItemList(setCookieList); + return ConvertCkItemListToCkStr(ckItemList); + } - var name = item[..index].Trim(); - if (nameBuilder != null) name = nameBuilder(name); + /// + /// ckStr—>List + /// + /// + /// + public static List ConvertCkStrToCkItemList(string ckStr) + { + return ckStr.Split(";", StringSplitOptions.TrimEntries).ToList(); + } - var value = item[(index+1)..].Trim(); - if (valueBuilder != null) value = valueBuilder(value); + /// + /// List—>ckStr + /// + /// + /// + public static string ConvertCkItemListToCkStr(IEnumerable ckItemList) + { + return string.Join("; ", ckItemList); + } - re.TryAdd(name, value); - } - return re; + /// + /// List—>Dictionary<> + /// + /// + /// + public static Dictionary ConvertCkItemListToCkDic(IEnumerable ckItemList) + { + return ckItemList.ToDictionary(k => k[..k.IndexOf("=", StringComparison.Ordinal)].Trim(), + v => v[(v.IndexOf("=", StringComparison.Ordinal) + 1)..].Trim().TrimEnd(';')); } + + #endregion + } } diff --git a/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieStrFactory.cs b/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieStrFactory.cs index 079d5d93f..e9645693e 100644 --- a/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieStrFactory.cs +++ b/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieStrFactory.cs @@ -1,25 +1,28 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; -namespace Ray.BiliBiliTool.Infrastructure +namespace Ray.BiliBiliTool.Infrastructure.Cookie { public class CookieStrFactory { - private List _strList = new List(); + private readonly Dictionary> _cookieDictionary; public CookieStrFactory(List strList) { - _strList = strList; + _cookieDictionary = new Dictionary>(); + + for (int i = 0; i < strList?.Count; i++) + { + _cookieDictionary.Add(i + 1, CkStrToDictionary(strList[i])); + } + + CurrentNum = 1; } - public int CurrentNum { get; set; } = 1; - private int _index => CurrentNum - 1; + public int CurrentNum { get; set; } - public int Count => _strList.Count; + public int Count => _cookieDictionary.Count; public bool Any() { @@ -27,11 +30,88 @@ public bool Any() else return false; } + public Dictionary GetCurrentCookieDic() + { + if (!Any()) throw new Exception($"第 {CurrentNum} 个cookie不存在"); + + return _cookieDictionary[CurrentNum]; + } + public string GetCurrentCookieStr() { if (!Any()) throw new Exception($"第 {CurrentNum} 个cookie字符串不存在"); - return _strList[_index]; + var ckDic = _cookieDictionary[CurrentNum]; + return DictionaryToCkStr(ckDic); } + + #region merge + + /// + /// 根据请求返回header中的set-cookie来merge cookie + /// + /// ["ak=av; expire=abc;"] + public void MergeCurrentCookieBySetCookieHeaders(IEnumerable setCookieList) + { + MergeCurrentCookie(CookieInfo.ConvertSetCkHeadersToCkItemList(setCookieList)); + } + + /// + /// 根据cookie字符串merge + /// + /// + public void MergeCurrentCookie(string ckStr) + { + MergeCurrentCookie(CookieInfo.ConvertCkStrToCkItemList(ckStr)); + } + + /// + /// 根据cookie item集合merge(一个“ak=av”为一个cookie item) + /// + /// ["ak=av","bk=bv"] + public void MergeCurrentCookie(List ckItemList) + { + MergeCurrentCookie(CookieInfo.ConvertCkItemListToCkDic(ckItemList)); + } + + /// + /// 根据cookie dic来merge + /// + /// {{"ak":"av"}} + public void MergeCurrentCookie(Dictionary ckDic) + { + var currentCkDic = GetCurrentCookieDic(); + foreach (var item in ckDic) + { + if (currentCkDic.ContainsKey(item.Key)) + { + currentCkDic[item.Key] = item.Value; + } + else + { + currentCkDic.Add(item.Key, item.Value); + } + } + } + + #endregion + + #region private + + private Dictionary CkStrToDictionary(string ckStr) + { + return ckStr.Split(";", StringSplitOptions.TrimEntries) + .ToDictionary(k => k[..k.IndexOf("=", StringComparison.Ordinal)].Trim(), + v => v[(v.IndexOf("=", StringComparison.Ordinal) + 1)..].Trim()); + } + + private string DictionaryToCkStr(Dictionary dic) + { + var list = dic.Select(item => $"{item.Key}={item.Value}").ToList(); + return string.Join("; ", list); + } + + #endregion + } } diff --git a/src/Ray.BiliBiliTool.Infrastructure/Enums/PlateformType.cs b/src/Ray.BiliBiliTool.Infrastructure/Enums/PlatformType.cs similarity index 89% rename from src/Ray.BiliBiliTool.Infrastructure/Enums/PlateformType.cs rename to src/Ray.BiliBiliTool.Infrastructure/Enums/PlatformType.cs index 47991555c..3d544ff3e 100644 --- a/src/Ray.BiliBiliTool.Infrastructure/Enums/PlateformType.cs +++ b/src/Ray.BiliBiliTool.Infrastructure/Enums/PlatformType.cs @@ -6,7 +6,7 @@ namespace Ray.BiliBiliTool.Infrastructure.Enums { - public enum PlateformType + public enum PlatformType { Unknown, GitHubActions, diff --git a/src/Ray.BiliBiliTool.Infrastructure/Helpers/IpHelper.cs b/src/Ray.BiliBiliTool.Infrastructure/Helpers/IpHelper.cs index 68d140248..755ff44b1 100644 --- a/src/Ray.BiliBiliTool.Infrastructure/Helpers/IpHelper.cs +++ b/src/Ray.BiliBiliTool.Infrastructure/Helpers/IpHelper.cs @@ -17,7 +17,7 @@ public static string GetIp() .GetAsync("http://api.ipify.org/") .Result; return re.IsSuccessStatusCode - ? re.Content?.ReadAsStringAsync()?.Result + ? re.Content.ReadAsStringAsync().Result : null; } catch (Exception) diff --git a/src/Ray.BiliBiliTool.Infrastructure/Helpers/RegexHelper.cs b/src/Ray.BiliBiliTool.Infrastructure/Helpers/RegexHelper.cs new file mode 100644 index 000000000..5636f0355 --- /dev/null +++ b/src/Ray.BiliBiliTool.Infrastructure/Helpers/RegexHelper.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Ray.BiliBiliTool.Infrastructure.Helpers +{ + public class RegexHelper + { + public static string QuerySingle(string source, string pattern) + { + Regex rg = new Regex(pattern, RegexOptions.Multiline | RegexOptions.Singleline); + return rg.Match(source).Value; + } + + public static List QueryMultiple(string source, string pattern) + { + Regex rg = new Regex(pattern, RegexOptions.Multiline | RegexOptions.Singleline); + //Regex rg = new Regex(pattern, RegexOptions.Singleline); + + MatchCollection matches = rg.Matches(source); + + List resList = new List(); + + foreach (Match item in matches) + resList.Add(item.Value); + + return resList; + } + + /// + /// 截取字符串中开始和结束字符串中间的字符串 + /// + /// 源字符串 + /// 开始字符串 + /// 结束字符串 + /// 中间字符串 + public static string SubstringSingle(string source, string startStr, string endStr) + { + var regexStr = $"(?<=({startStr}))[.\\s\\S]*?(?=({endStr}))"; + Regex rg = new Regex(regexStr, RegexOptions.Multiline | RegexOptions.Singleline); + return rg.Match(source).Value; + } + + /// + /// (批量)截取字符串中开始和结束字符串中间的字符串 + /// + /// 源字符串 + /// 开始字符串 + /// 结束字符串 + /// 中间字符串 + public static List SubstringMultiple(string source, string startStr, string endStr) + { + var regexStr = $"(?<=({startStr}))[.\\s\\S]*?(?=({endStr}))"; + // Regex rg = new Regex(regexStr, RegexOptions.Multiline | RegexOptions.Singleline); + Regex rg = new Regex(regexStr, RegexOptions.Singleline); + + MatchCollection matches = rg.Matches(source); + + List resList = new List(); + + foreach (Match item in matches) + resList.Add(item.Value); + + return resList; + } + } +} diff --git a/test/AppServiceTest/AppServiceTest.csproj b/test/AppServiceTest/AppServiceTest.csproj new file mode 100644 index 000000000..b0f835762 --- /dev/null +++ b/test/AppServiceTest/AppServiceTest.csproj @@ -0,0 +1,28 @@ + + + + net6.0 + enable + enable + + false + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/test/AppServiceTest/DailyTask/DonateCoinsTest.cs b/test/AppServiceTest/DailyTask/DonateCoinsTest.cs new file mode 100644 index 000000000..9b61f1e74 --- /dev/null +++ b/test/AppServiceTest/DailyTask/DonateCoinsTest.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.DependencyInjection; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Application.Contracts; +using Ray.BiliBiliTool.Infrastructure; + +namespace AppServiceTest.DailyTask +{ + public class DonateCoinsTest + { + public DonateCoinsTest() + { + Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); + } + + [Fact] + public void Test1() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var appService = scope.ServiceProvider.GetRequiredService(); + + + } + } +} diff --git a/test/AppServiceTest/Usings.cs b/test/AppServiceTest/Usings.cs new file mode 100644 index 000000000..abd64112f --- /dev/null +++ b/test/AppServiceTest/Usings.cs @@ -0,0 +1,2 @@ +global using Xunit; +global using Ray.BiliBiliTool.Console; diff --git a/test/BiliAgentTest/HomeApiTest.cs b/test/BiliAgentTest/HomeApiTest.cs new file mode 100644 index 000000000..f953aea73 --- /dev/null +++ b/test/BiliAgentTest/HomeApiTest.cs @@ -0,0 +1,35 @@ +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Ray.BiliBiliTool.Agent; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Live; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; +using Ray.BiliBiliTool.Console; +using Ray.BiliBiliTool.Infrastructure; +using Ray.BiliBiliTool.Infrastructure.Helpers; +using Xunit; + +namespace BiliAgentTest +{ + public class HomeApiTest + { + public HomeApiTest() + { + Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); + } + + [Fact] + public async Task WebHeartBeat_Normal_Success() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + + var ck = scope.ServiceProvider.GetRequiredService(); + var api = scope.ServiceProvider.GetRequiredService(); + + var re = await api.GetHomePageAsync(ck.ToString()); + + + } + } +} diff --git a/test/BiliAgentTest/LiveApiTest.cs b/test/BiliAgentTest/LiveApiTest.cs index 872a79fd4..c1114748c 100644 --- a/test/BiliAgentTest/LiveApiTest.cs +++ b/test/BiliAgentTest/LiveApiTest.cs @@ -8,6 +8,7 @@ using System; using System.Diagnostics; using System.Threading.Tasks; +using Ray.BiliBiliTool.Infrastructure.Cookie; using Xunit; namespace BiliAgentTest diff --git a/test/BiliAgentTest/LiveTraceApiTest.cs b/test/BiliAgentTest/LiveTraceApiTest.cs index 32332957b..a14d413f7 100644 --- a/test/BiliAgentTest/LiveTraceApiTest.cs +++ b/test/BiliAgentTest/LiveTraceApiTest.cs @@ -5,6 +5,7 @@ using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; using Ray.BiliBiliTool.Console; using Ray.BiliBiliTool.Infrastructure; +using Ray.BiliBiliTool.Infrastructure.Cookie; using Xunit; namespace BiliAgentTest diff --git a/test/BiliAgentTest/VideoApiTest.cs b/test/BiliAgentTest/VideoApiTest.cs index 93da33832..7ee21588c 100644 --- a/test/BiliAgentTest/VideoApiTest.cs +++ b/test/BiliAgentTest/VideoApiTest.cs @@ -8,6 +8,7 @@ using System; using System.Diagnostics; using System.Threading.Tasks; +using Ray.BiliBiliTool.Infrastructure.Cookie; using Xunit; namespace BiliAgentTest diff --git a/test/ConfigTest/TestEnum.cs b/test/ConfigTest/TestEnum.cs index 6e6650827..83a1f6c04 100644 --- a/test/ConfigTest/TestEnum.cs +++ b/test/ConfigTest/TestEnum.cs @@ -27,7 +27,7 @@ public void Test1() { using var scope = Global.ServiceProviderRoot.CreateScope(); - var en = Global.ConfigurationRoot.GetSection("PlateformType").Get(); + var en = Global.ConfigurationRoot.GetSection("PlatformType").Get(); } } } diff --git a/test/ConfigTest/UnitTest1.cs b/test/ConfigTest/UnitTest1.cs index 1cf0bedc8..2a13ea4d4 100644 --- a/test/ConfigTest/UnitTest1.cs +++ b/test/ConfigTest/UnitTest1.cs @@ -150,5 +150,15 @@ public void TestHostDefaults() { Debug.WriteLine(Environment.GetEnvironmentVariable(HostDefaults.EnvironmentKey)); } + + [Fact] + public void Test() + { + var s = "0123456"; + + var s1 = s[..2]; + + var s2 = s[4..]; + } } } diff --git a/test/DomainServiceTest/DomainServiceTest.csproj b/test/DomainServiceTest/DomainServiceTest.csproj new file mode 100644 index 000000000..869f6c876 --- /dev/null +++ b/test/DomainServiceTest/DomainServiceTest.csproj @@ -0,0 +1,28 @@ + + + + net6.0 + enable + enable + + false + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/test/DomainServiceTest/DonateCoinDomainServiceTest.cs b/test/DomainServiceTest/DonateCoinDomainServiceTest.cs new file mode 100644 index 000000000..c2df7c7e7 --- /dev/null +++ b/test/DomainServiceTest/DonateCoinDomainServiceTest.cs @@ -0,0 +1,21 @@ + +namespace DomainServiceTest +{ + public class DonateCoinDomainServiceTest + { + public DonateCoinDomainServiceTest() + { + Program.CreateHost(new[] { "--ENVIRONMENT=Development" }); + } + + [Fact] + public async Task AddCoinsForVideos() + { + using var scope = Global.ServiceProviderRoot.CreateScope(); + var config = Global.ConfigurationRoot; + var domainService = scope.ServiceProvider.GetRequiredService(); + + await domainService.AddCoinsForVideos(); + } + } +} diff --git a/test/DomainServiceTest/Usings.cs b/test/DomainServiceTest/Usings.cs new file mode 100644 index 000000000..b8e1dd33d --- /dev/null +++ b/test/DomainServiceTest/Usings.cs @@ -0,0 +1,5 @@ +global using Xunit; +global using Ray.BiliBiliTool.Console; +global using Microsoft.Extensions.DependencyInjection; +global using Ray.BiliBiliTool.DomainService.Interfaces; +global using Ray.BiliBiliTool.Infrastructure;