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;