diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b5b367b8..d407fa8c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,9 @@ - hotfix docker build error - 合并PR(#341),新增krew部署,感谢@chenliu1993 - 合并PR(##348),更新文档,感谢@jexjws -- 合并PR(#350),修改请求header错误的bug +- 合并PR(#350),修改请求header错误的bug,感谢@catlair - 合并PR(#353),新增python扫码登录的feature(仅针对青龙),感谢@AFUL1991 - Feature(#351):重构并新增了扫码登录功能,使之适用于各种部署平台 +## 0.3.1 +- Fix(#260),在需要的时候encode cookie +- 更新文档 diff --git a/README.md b/README.md index 3457bb5cf..b0a26ee7d 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ BiliBiliTool 详细功能如下: +- **扫码登录,自动更新cookie** - **每日获取满额升级经验(登录、投币、点赞、分享视频)(支持指定支持up主)** - **每天漫画签到** - **每天直播签到** @@ -143,12 +144,11 @@ dotnet Ray.BiliBiliTool.Console.dll --runTasks=Daily&LiveLottery 会依次运行`每日任务`和`天选抽奖任务`。 -一般来说,每个任务都有一个 GitHub Actions 的工作流脚本(workflow)对应,划分的依据主要是根据功能需求,其次是触发频率(比如,有些每天只需运行一次,有些需要允许多次)。 - 任务列表如下: | 任务名 | Code | 功能 | 默认WorkFlow文件 | GithHub Environments | 推荐运行频率 | 备注 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | +| 扫码登录 | Login | 试用bili app扫码登录,用于第一次运行时初始化cookie,或cookie过期时的更新。不同平台会将cookie存储到不同地方,青龙存储到环境变量中,其他会存储到cookies。json中 | | Production | 手动 | | | 每日任务 | Daily | 完成每日任务获取满额65点经验(登录、观看视频、分享视频、投币),以及签到、领福利和充电等附属功能 | bilibili-daily-task.yml | Production | 每天一次 | | | 天选时刻抽奖 | LiveLottery | 直播中心天选时刻抽奖 | live-lottery-task.yml | LiveLottery | 建议每天运行0-4次内 | 对应Actions工作流默认是关闭的,需要添加key为`ISOPENLIVELOTTERYTASK`、值为`true`的secret来手动开启;大部分抽奖都需要关注主播,介意的不要开启 | | 批量取关 | UnfollowBatched | 批量取关指定分组下的所有关注(主要用于清理天选抽奖而产生的关注) | unfollow-batched-task.yml | 无 | 需要时手动运行 | 需要通过配置指定2个参数:`GroupName`(分组名称,如`天选时刻`)和`Count`(目标取关个数,-1表示全部),应用会倒序从后往前取关指定个数 | @@ -162,20 +162,22 @@ dotnet Ray.BiliBiliTool.Console.dll --runTasks=Daily&LiveLottery ## 4. 多账号支持 -~~对于 GitHub Actions 托管的,可以通过添加 Key 为 `COOKIESTR2` 和 `COOKIESTR3` 的 Secret ,来支持最多 3 个账号。~~ +部署成功后,直接去运行扫码登录任务,扫码成功后,应用会自动更新或添加cookie。 + +青龙平台会添加环境变量里,Key 为 `Ray_BiliBiliCookies__0`、`Ray_BiliBiliCookies__1`、`Ray_BiliBiliCookies__2`... -Docker或其他方式托管的,因配置项 `BiliBiliCookies` 被设计为一个字符串数组,所以理论可以添加任意个数的账号,例: +其他平台默认会添加到名为cookies.json的账号配置文件中: ``` - "BiliBiliCookies": [ - "cookies1", - "cookies2", - "..." +{ + "BiliBiliCookies": [ + "cookie1", + "cookie2", + "...", ], +} ``` -使用环境变量配置的话,可以添加 Key 为 `Ray_BiliBiliCookies__2`、`Ray_BiliBiliCookies__3`、`Ray_BiliBiliCookies__4`...的环境变量,以此类推。 - ## 5. 常见问题 [>>点击查看常见问题文档](docs/questions.md) @@ -197,13 +199,9 @@ Docker或其他方式托管的,因配置项 `BiliBiliCookies` 被设计为一 ## 6. 版本发布及更新 -当前正处于稳定的迭代开发中,~~正常情况下每 2 周会发布一个小版本~~,详细待更新和计划内容可参见 [Projects](https://github.com/RayWangQvQ/BiliBiliToolPro/projects) 和 [Issues](https://github.com/RayWangQvQ/BiliBiliTool/issues) 。 +当前正处于稳定的迭代开发中,详细待更新和计划内容可参见 [Projects](https://github.com/RayWangQvQ/BiliBiliToolPro/projects) 和 [Issues](https://github.com/RayWangQvQ/BiliBiliTool/issues) 。 -关于新版本发布后,如何同步最新的内容到自己 Fork 的仓库,可参考**常见问题文档**中的 《**我 Fork 之后如何同步原作者的更新内容?**》章节。 - -建议每个人都开启自动同步更新,因为越新的版本功能越完善、对账号来说也越安全。 - -也建议把右上角的 Star 点一下,这样有重要更新时就会有邮件推送了。 +想要有重要更新时收到通知的话,可以把仓库右上角的`Star`或`Watch`按钮点亮。 ## 7. 成为开源贡献成员 @@ -240,7 +238,6 @@ Docker或其他方式托管的,因配置项 `BiliBiliCookies` 被设计为一 ![赞赏码](docs/imgs/donate.jpg) > 项目中的优先支持的UP主的配置项,默认是作者的 UpId (只是作为了 JSON 配置文件的默认值,代码是干净的),需要更改的话,直接修改相应配置即可(secrets或环境变量等各种方式都行)。 - 当然,不改的话,也算是另一种捐赠支持作者的方式啦。 感谢支持~ diff --git a/common.props b/common.props index 1ac4a8905..bb89aec01 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ Ray - 0.3.0 + 0.3.1 $(NoWarn);CS1591;CS0436 diff --git a/docs/imgs/dotnet-login.png b/docs/imgs/dotnet-login.png new file mode 100644 index 000000000..125631cb3 Binary files /dev/null and b/docs/imgs/dotnet-login.png differ diff --git a/docs/questions.md b/docs/questions.md index 079bd5e78..182d96663 100644 --- a/docs/questions.md +++ b/docs/questions.md @@ -198,9 +198,26 @@ Pull App 可以指定是否保留自己已经修改的内容,分为下面两 当然也可以立即手动触发同步:`https://pull.git.ci/process/${owner}/${repo}` ## 6. 本地或服务器如何安装.net环境 -若需手动安装运行环境,请点击 ![Download .NET 5.0 (Linux, macOS, and Windows)](https://dotnet.microsoft.com/download/dotnet/5.0),分别选择相应平台的`ASP.NET Core Runtime 5.0.0`与`.NET Runtime 5.0.0`的安装包(Installers)进行安装;亦可下载.NET SDK 5.0.100的安装包(上述二者已包含于其中)。 -注:若已从 ![.NET官网下载入口](https://dotnet.microsoft.com/download) 的“Download .NET Runtime”选项进行了下载安装,则仍需根据上述方法补充安装`ASP.NET Core Runtime 5.0.0`(由于该选项仅提供了`.NET Runtime 5.0.0`的安装包)。 +macOS/Linux: +``` +curl -sSL https://ghproxy.com/https://raw.githubusercontent.com/RayWangQvQ/BiliBiliToolPro/main/qinglong/ray-dotnet-install.sh | bash /dev/stdin +``` +如果出现下载缓慢的情况,可以将上面指令改为: + +``` +curl -sSL https://ghproxy.com/https://raw.githubusercontent.com/RayWangQvQ/BiliBiliToolPro/main/qinglong/ray-dotnet-install.sh | bash /dev/stdin --no-official +``` + +`--no-official`表示不会使用官方脚本去安装,而是通过手动下载二进制文件的形式来安装。 + +Windows: +``` +# Run a separate PowerShell process because the script calls exit, so it will end the current PowerShell session. +&powershell -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) --channel 6.0 --no-cdn --verbose" +``` + +其他问题请见[官方文档](https://learn.microsoft.com/zh-cn/dotnet/core/tools/dotnet-install-script) ## 7. 如何关停Actions运行 推荐做法有两种:一是使用配置关停应用的每日任务,二是关停Actions。 diff --git a/docs/runInLocal.md b/docs/runInLocal.md index 74d56533a..01564856f 100644 --- a/docs/runInLocal.md +++ b/docs/runInLocal.md @@ -2,57 +2,52 @@ -- [1. 下载应用文件](#1-下载应用文件) -- [2. 运行](#2-运行) +- [1. 任意系统,但已安装`.NET 6.0`](#1-任意系统但已安装net-60) +- [2. Win](#2-win) +- [3. Linux:](#3-linux) +- [4. macOS](#4-macos) +- [5. 配置](#5-配置) -如果是 DotNet 开发者,直接 Clone 源码,然后 VS 打开解决方案,配置 Cookie 后即可直接本地进行运行和调试。 +如果是 DotNet 开发者,直接 Clone 源码,然后 VS 打开解决方案,即可调式和运行。 -对于不是开发者的朋友,可以通过下载 Release 包到本地或任意服务器运行,步骤如下。 -
+跑什么任务,可以在`Ray.BiliBiliTool.Console`项目下的`appsettings.json`文件里的`RunTasks`指定。 -## 1. 下载应用文件 +对于不是开发者的朋友,可以通过下载 [BiliBiliTool/release](https://github.com/RayWangQvQ/BiliBiliToolPro/releases) 到本地或任意服务器运行。 -点击 [BiliBiliTool/release](https://github.com/RayWangQvQ/BiliBiliToolPro/releases),下载已发布的最新版本。 +## 1. 任意系统,但已安装`.NET 6.0` -* 如果本地已安装 `.NET 6.0` 环境: +任何操作系统,不管是Win还是Linux还是mac,只要已安装了`.NET 6.0` 环境,均可通过下载`net-dependent.zip`运行。 -请下载 `net-dependent.zip` 文件,本文件依赖本地运行库(runtime-dependent),所以文件包非常小(不到1M)。 +下载解压后,进入应用目录,执行`dotnet ./Ray.BiliBiliTool.Console.dll --runTasks=Login` -P.S.这里的运行环境指的是 `.NET Runtime 6.0.0` ,安装方法可详见 [常见问题](docs/questions.md) 中的 **本地或服务器如何安装.net环境** +会出现二维码,扫码登录后即可运行各个任务。 -* 如果不希望安装或不知如何安装.net运行环境: +![login](imgs/dotnet-login.png) -请根据操作系统下载对应的 zip 文件,此文件已自包含(self-contained)运行环境,但相较不包含运行时的文件略大(20M 左右,Github 服务器在国外,下载可能比较慢)。 +![运行图示](imgs/run-exe.png) -如,Windows系统请下载 `win-x86-x64.zip` ,其他以此类推。 +P.S.这里的运行环境指的是 `.NET Runtime 6.0.0` ,安装方法可详见 [常见问题](questions.md) 中的 **本地或服务器如何安装.net环境** -## 2. 运行 +## 2. Win -下载并解压zip文件。 +请下载 `win-x86-x64.zip`,此文件已自包含(self-contained)运行环境。 -* Windows 系统 +解压后,在应用目录打开cmd或powershell,执行`.\Ray.BiliBiliTool.Console.exe --runTasks=Login`,扫码登录。 -对于已安装.net环境,且使用的是依赖包,可在当前目录下执行命令:`dotnet Ray.BiliBiliTool.Console.dll --runTasks=Login`,或者直接双击运行名称为 start.bat 的批处理文件,均可运行。 - -对于使用自包含运行环境版本的,可直接双击运行名称为 Ray.BiliBiliTool.Console.exe 的可执行文件。 - -* Linux 系统 - -对于已安装.net环境,且使用的是依赖包,同上,可在终端中执行命令:`dotnet Ray.BiliBiliTool.Console.dll --runTasks=Login` - -对于使用独立包的,可在终端中执行命令: +## 3. Linux: ``` -chmod +x ./Ray.BiliBiliTool.Console -Ray.BiliBiliTool.Console +wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/0.3.1/bilibili-tool-pro-v0.3.1-linux-x64.zip +unzip bilibili-tool-pro-v0.3.1-linux-x64.zip +cd cd ./linux-x64/ +./Ray.BiliBiliTool.Console --runTasks=Login ``` -其他系统依此类推,运行结果图示如下: - -![运行图示](docs/imgs/run-exe.png) +## 4. macOS +请下载 `osx-x64.zip`,解压后在应用目录运行`./Ray.BiliBiliTool.Console --runTasks=Login` -除了修改配置文件,也可以通过添加环境变量或在启动命令后附加参数来实现配置,详细方法可参考下面的**配置说明**章节。 +## 5. 配置 -
+最简单的方式是直接修改应用目录下的`appsettings.json`,详细方法可参考下面的**配置说明**章节。 diff --git a/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs b/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs index d0bc17ed4..3a5431614 100644 --- a/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs +++ b/src/Ray.BiliBiliTool.Agent/Attributes/LogFilterAttribute.cs @@ -19,21 +19,20 @@ public LogFilterAttribute(bool logError = true) protected override Task WriteLogAsync(ApiResponseContext context, LogMessage logMessage) { - ILoggerFactory service = context.HttpContext.ServiceProvider.GetService(); - if (service == null) - return Task.CompletedTask; + ILoggerFactory loggerFactory = context.HttpContext.ServiceProvider.GetService(); + if (loggerFactory == null) return Task.CompletedTask; MethodInfo member = context.ApiAction.Member; - string[] strArray = new string[5]; + var strArray = new string[5]; Type declaringType1 = member.DeclaringType; - strArray[0] = (object)declaringType1 != null ? declaringType1.Namespace : (string)null; + strArray[0] = (object)declaringType1 != null ? declaringType1.Namespace : null; strArray[1] = "."; Type declaringType2 = member.DeclaringType; - strArray[2] = (object)declaringType2 != null ? declaringType2.Name : (string)null; + strArray[2] = (object)declaringType2 != null ? declaringType2.Name : null; strArray[3] = "."; strArray[4] = member.Name; string categoryName = string.Concat(strArray); - ILogger logger = service.CreateLogger(categoryName); + ILogger logger = loggerFactory.CreateLogger(categoryName); if (logMessage.Exception == null) logger.LogDebug(logMessage.ToString());//修改为Debug等级 diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs index 8ce564a70..602385242 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IPassportApi.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Net.Http; +using System.Threading.Tasks; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Passport; using WebApiClientCore.Attributes; @@ -12,6 +13,7 @@ public interface IPassportApi : IBiliBiliApi Task> GenerateQrCode(); [HttpGet("/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=main_mini")] - Task> CheckQrCodeHasScaned(string qrcode_key); + //Task> CheckQrCodeHasScaned(string qrcode_key); + Task CheckQrCodeHasScaned(string qrcode_key); } } diff --git a/src/Ray.BiliBiliTool.Agent/BiliCookie.cs b/src/Ray.BiliBiliTool.Agent/BiliCookie.cs index ab52c4ba6..46d324c81 100644 --- a/src/Ray.BiliBiliTool.Agent/BiliCookie.cs +++ b/src/Ray.BiliBiliTool.Agent/BiliCookie.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Net.Http.Headers; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Ray.BiliBiliTool.Config; @@ -12,9 +13,18 @@ public class BiliCookie : CookieInfo { private readonly ILogger _logger; - public BiliCookie(ILogger logger, - CookieStrFactory cookieStrFactory) - : base(cookieStrFactory.GetCurrentCookieStr()) + public BiliCookie(string ckStr) + : this(new List { ckStr }) { } + + 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) { _logger = logger; @@ -32,10 +42,6 @@ public BiliCookie(ILogger logger, } } - public BiliCookie(List ckList) : this(NullLogger.Instance,new CookieStrFactory(ckList)) - { - } - [Description("DedeUserID")] public string UserId { get; set; } diff --git a/src/Ray.BiliBiliTool.Agent/HttpClientDelegatingHandlers/LogDelegatingHandler.cs b/src/Ray.BiliBiliTool.Agent/HttpClientDelegatingHandlers/LogDelegatingHandler.cs index 3cc39a896..030e6801c 100644 --- a/src/Ray.BiliBiliTool.Agent/HttpClientDelegatingHandlers/LogDelegatingHandler.cs +++ b/src/Ray.BiliBiliTool.Agent/HttpClientDelegatingHandlers/LogDelegatingHandler.cs @@ -26,7 +26,6 @@ protected override async Task SendAsync(HttpRequestMessage } HttpResponseMessage response = await base.SendAsync(request, cancellationToken); - if (response.Content == null) return response; var content = await response.Content.ReadAsStringAsync(cancellationToken); _logger.LogDebug("返回Content:{content}", content); diff --git a/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs b/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs index 05e8d63ef..091aa3fe1 100644 --- a/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs +++ b/src/Ray.BiliBiliTool.Application/LoginTaskAppService.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; -using System.Text.Json.Nodes; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.FileProviders; @@ -13,11 +11,12 @@ using Newtonsoft.Json.Linq; using QRCoder; using Ray.BiliBiliTool.Agent; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Passport; +using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos; using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces; using Ray.BiliBiliTool.Agent.QingLong; using Ray.BiliBiliTool.Application.Attributes; using Ray.BiliBiliTool.Application.Contracts; -using Ray.BiliBiliTool.Infrastructure; using Ray.BiliBiliTool.Infrastructure.Enums; namespace Ray.BiliBiliTool.Application @@ -69,7 +68,7 @@ public override void DoTask() protected bool QrCodeLogin(out BiliCookie cookieInfo) { var result = false; - cookieInfo = new BiliCookie(new List() { "" }); + cookieInfo = new BiliCookie(""); var re = _passportApi.GenerateQrCode().Result; if (re.Code != 0) @@ -95,27 +94,37 @@ protected bool QrCodeLogin(out BiliCookie cookieInfo) Task.Delay(5 * 1000).Wait(); var check = _passportApi.CheckQrCodeHasScaned(re.Data.Qrcode_key).Result; - if (check.Code != 0) + if (!check.IsSuccessStatusCode) { - _logger.LogWarning("调用检查接口异常:{msg}", check.ToJson()); + _logger.LogWarning("调用检测接口异常"); + continue; + } + + var content = JsonConvert.DeserializeObject>(check.Content.ReadAsStringAsync().Result); + if (content.Code != 0) + { + _logger.LogWarning("调用检测接口异常:{msg}", check.ToJson()); break; } - if (check.Data.Code == 86038)//已失效 + if (content.Data.Code == 86038)//已失效 { - _logger.LogInformation(check.Data.Message); + _logger.LogInformation(content.Data.Message); break; } - if (check.Data.Code == 0) + if (content.Data.Code == 0) { _logger.LogInformation("扫描成功!"); - cookieInfo = GetCookie(check.Data.Url); + IEnumerable cookies = check.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value; + + cookieInfo = GetCookie(cookies); result = true; + break; } - _logger.LogInformation("{msg}", check.Data.Message + Environment.NewLine); + _logger.LogInformation("{msg}", content.Data.Message + Environment.NewLine); } return result; @@ -222,7 +231,9 @@ protected void AddOrUpdateCkToQingLong(BiliCookie ckInfo) id = oldEnv.id, name = oldEnv.name, value = ckInfo.CookieStr, - remarks = oldEnv.remarks, + remarks = oldEnv.remarks.IsNullOrEmpty() + ?$"bili-{ckInfo.UserId}" + :oldEnv.remarks, }; var updateRe = _qingLongApi.UpdateEnvs(update, token).Result; @@ -244,13 +255,11 @@ protected void AddOrUpdateCkToQingLong(BiliCookie ckInfo) { name = name, value = ckInfo.CookieStr, - remarks = "" + remarks = $"bili-{ckInfo.UserId}" }; var addRe = _qingLongApi.AddEnvs(new List() { add }, token).Result; if (addRe.Code == 200) _logger.LogInformation("新增成功!"); else _logger.LogInformation(addRe.ToJson()); - - return; } private void GenerateQrCode(string str) @@ -334,14 +343,15 @@ private string GetOnlinePic(string str) return $"https://tool.lu/qrcode/basic.html?text={encode}"; } - private BiliCookie GetCookie(string url) + private BiliCookie GetCookie(IEnumerable cookies) { - var ckItemList = url.Split('?')[1] - .Split("&gourl=")[0] - .Split('&') - .ToList(); - var ckStr = string.Join(';', ckItemList); - var biliCk = new BiliCookie(new List() { ckStr }); + 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; @@ -366,7 +376,11 @@ private bool GetToken(out string token) var qlDir = _configuration["QL_DIR"] ?? "/ql"; var authFile = Path.Combine(qlDir, "data/config/auth.json"); - if (!File.Exists(authFile)) return false; + if (!File.Exists(authFile)) + { + _logger.LogWarning("获取青龙授权失败"); + return false; + } var authJson = File.ReadAllText(authFile); diff --git a/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs b/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs index 885022e72..dbc008a72 100644 --- a/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs +++ b/src/Ray.BiliBiliTool.Console/BiliBiliToolHostedService.cs @@ -140,6 +140,8 @@ private bool PreCheck() private Task RandomSleep() { + if (_configuration["RunTasks"].Contains("Login") || _configuration["RunTasks"].Contains("Test")) return Task.CompletedTask; + if (_securityOptions.RandomSleepMaxMin > 0) { int randomMin = new Random().Next(1, ++_securityOptions.RandomSleepMaxMin); @@ -170,12 +172,10 @@ private void DoTasks(string[] tasks) private void LogAppInfo() { _logger.LogInformation( - "{newLine}========================{newLine} v{version} in {env} env.{newLine}开源 by {url}", + "{newLine}========================{newLine} v{version} 开源 by {url}", Environment.NewLine + Environment.NewLine, Environment.NewLine + Environment.NewLine, typeof(Program).Assembly.GetCustomAttribute()?.InformationalVersion, - Global.HostingEnvironment.EnvironmentName, - Environment.NewLine, Constants.SourceCodeUrl + Environment.NewLine ); //_logger.LogInformation("【当前IP】{ip} ", IpHelper.GetIp()); diff --git a/src/Ray.BiliBiliTool.Console/appsettings.json b/src/Ray.BiliBiliTool.Console/appsettings.json index 6ad77d850..a3f9a2999 100644 --- a/src/Ray.BiliBiliTool.Console/appsettings.json +++ b/src/Ray.BiliBiliTool.Console/appsettings.json @@ -201,6 +201,6 @@ "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ] }, - "PlateformType": "GitHubActions", + "PlateformType": "Unknown", "IsPrd": false } diff --git a/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs b/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs index ff9e25ac5..f26bbb625 100644 --- a/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs +++ b/src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs @@ -9,56 +9,43 @@ namespace Ray.BiliBiliTool.Infrastructure { public class CookieInfo { - public CookieInfo(string cookieStr) + public CookieInfo(string cookieStr, Func nameBuilder = null, Func valueBuilder = null) : this(cookieStr?.Split(';'), nameBuilder, valueBuilder) { - CookieStr = cookieStr ?? ""; - - CookieItemList = CookieStr.Split(";") - .Select(x => x.Trim()) - .Where(x => !string.IsNullOrWhiteSpace(x)) - .ToList(); - - foreach (var item in CookieItemList) - { - var list = item.Split('='); - if (list.Length >= 2) - CookieItemDictionary.TryAdd(list[0].Trim(), list[1].Trim()); - } } - public CookieInfo(List cookieItemList) + public CookieInfo(IEnumerable cookieItemList, Func nameBuilder = null, Func valueBuilder = null) { - CookieItemList=cookieItemList ?? new List(); - foreach (var item in CookieItemList) - { - var list = item.Split('='); - if (list.Length >= 2) - CookieItemDictionary.TryAdd(list[0].Trim(), list[1].Trim()); - } + CookieItemDictionary = BuildCookieItemDictionaryByCookieItemList(cookieItemList, nameBuilder, valueBuilder); - CookieStr = string.Join(';', CookieItemList); + CookieStr = string.Join("; ", CookieItemDictionary.Select(kv => $"{kv.Key}={kv.Value}")); } - public string CookieStr { get; set; } + public string CookieStr { get; private set; } - public List CookieItemList { get; set; } + public Dictionary CookieItemDictionary { get; private set; } - public Dictionary CookieItemDictionary { get; set; } = new Dictionary(); + public virtual void Check() + { + if (string.IsNullOrWhiteSpace(CookieStr)) throw new Exception("Cookie字符串为空"); + } - public virtual CookieContainer CreateCookieContainer(Uri uri) + private static Dictionary BuildCookieItemDictionaryByCookieItemList(IEnumerable cookieItemList, Func nameBuilder = null, Func valueBuilder = null) { - var cookieContainer = new CookieContainer(); - foreach (var item in CookieItemList) + var re = new Dictionary(); + foreach (var item in cookieItemList ?? new List()) { - cookieContainer.SetCookies(uri, item); - } + var index = item.IndexOf('='); + if (index == -1) continue; - return cookieContainer; - } + var name = item[..index].Trim(); + if (nameBuilder != null) name = nameBuilder(name); - public virtual void Check() - { - if (string.IsNullOrWhiteSpace(CookieStr)) throw new Exception("Cookie字符串为空"); + var value = item[(index+1)..].Trim(); + if (valueBuilder != null) value = valueBuilder(value); + + re.TryAdd(name, value); + } + return re; } } }