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;
}
}
}