From d6b416ee40e7604fac44b386b3e5a41f6b6f66a2 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 12 Dec 2022 00:12:41 +0800 Subject: [PATCH 1/2] feat: encode cookie when needed --- README.md | 31 ++++----- docs/imgs/dotnet-login.png | Bin 0 -> 86070 bytes docs/questions.md | 21 +++++- docs/runInLocal.md | 59 ++++++++--------- .../Attributes/LogFilterAttribute.cs | 13 ++-- .../BiliBiliAgent/Interfaces/IPassportApi.cs | 6 +- src/Ray.BiliBiliTool.Agent/BiliCookie.cs | 20 ++++-- .../LogDelegatingHandler.cs | 1 - .../LoginTaskAppService.cs | 60 +++++++++++------- .../BiliBiliToolHostedService.cs | 6 +- src/Ray.BiliBiliTool.Console/appsettings.json | 2 +- .../Cookie/CookieInfo.cs | 59 +++++++---------- 12 files changed, 147 insertions(+), 131 deletions(-) create mode 100644 docs/imgs/dotnet-login.png 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/docs/imgs/dotnet-login.png b/docs/imgs/dotnet-login.png new file mode 100644 index 0000000000000000000000000000000000000000..125631cb3e3234c5861288f4712a08f0e9d8e2bf GIT binary patch literal 86070 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

%wk3I((u|W{Q0=S-VqI3V4^dwA0{x>&w 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 literal 0 HcmV?d00001 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; } } } From 920541181c86028a03d7e048b8aeb3b2a2156dd5 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 12 Dec 2022 00:16:03 +0800 Subject: [PATCH 2/2] chore: update current tag --- CHANGELOG.md | 5 ++++- common.props | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) 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/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