From 84347a54db2e25049d06052c53a38ef3e9c0df57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=9C=A87=E6=A5=BC?=
<31154238+RayWangQvQ@users.noreply.github.com>
Date: Mon, 29 Apr 2024 23:58:45 +0800
Subject: [PATCH] Try fix vip big point error and add functional tests for
agent apis (#692)
* add functional tests for agents
* add DailyTaskApiTests
* update DailyTaskApiTests
* update wri logic
* format codes
* add UTs for IArticleApi
* format codes
* add UT for IChargeApi
* add UT for IVipMallApi
* add UT for VipBigPointApi
* update change log
* update UT for VipBigPointApi
---
CHANGELOG.md | 75 +--
Ray.BiliBiliTool.sln | 469 +++++++++---------
common.props | 2 +-
.../Dtos/Article/AddCoinForArticleRequest.cs | 2 +-
.../Article/SearchArticlesByUpIdFullFto.cs | 22 +-
.../BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs | 17 +-
.../BiliBiliAgent/Dtos/UserInfo.cs | 20 +-
.../Dtos/Video/SearchVideosByUpIdFullDto.cs | 62 +--
.../BiliBiliAgent/Dtos/VipPrivilegeType.cs | 8 +
.../BiliBiliAgent/Dtos/VipTask/SignRequest.cs | 17 +-
.../BiliBiliAgent/Interfaces/IAccountApi.cs | 2 +-
.../BiliBiliAgent/Interfaces/IArticleApi.cs | 33 +-
.../BiliBiliAgent/Interfaces/IChargeApi.cs | 4 +-
.../BiliBiliAgent/Interfaces/IDailyTaskApi.cs | 6 +-
.../BiliBiliAgent/Interfaces/IUserInfoApi.cs | 2 +-
.../BiliBiliAgent/Interfaces/IVideoApi.cs | 2 +-
.../Interfaces/IVipBigPointApi.cs | 42 +-
.../BiliBiliAgent/Interfaces/IVipMallApi.cs | 2 +-
.../BiliBiliAgent/Services/IWbiService.cs | 18 +
.../BiliBiliAgent/Services/WbiService.cs | 158 ++++++
.../Extensions/ServiceCollectionExtension.cs | 289 +++++------
.../VipBigPointAppService.cs | 24 +-
.../AccountDomainService.cs | 4 +-
.../ArticleDomainService.cs | 39 +-
.../ChargeDomainService.cs | 4 +-
.../CoinDomainService.cs | 4 +-
.../DonateCoinDomainService.cs | 2 +-
.../Interfaces/IWbiDomainService.cs | 24 -
.../LiveDomainService.cs | 29 +-
.../VideoDomainService.cs | 34 +-
.../VipPrivilegeDomainService.cs | 14 +-
.../WbiDomainService.cs | 162 ------
test/BiliAgentTest/LiveApiTest.cs | 16 +-
test/BiliAgentTest/VideoApiTest.cs | 85 ++--
test/BiliAgentTest/VipApiTest.cs | 107 ----
.../DomainServiceTest/WbiDomainServiceTest.cs | 73 ---
.../AccountApiTests.cs | 38 ++
.../ArticleApiTests.cs | 145 ++++++
.../ChargeApiTest.cs | 69 +++
.../DailyTaskApiTests.cs | 70 +++
.../HomeApiTests.cs | 41 ++
....BiliBiliTool.Agent.FunctionalTests.csproj | 28 ++
.../VipBigPointApiTest.cs | 106 ++++
.../VipMallApiTests.cs | 46 ++
.../WbiServiceTest.cs | 78 +++
45 files changed, 1435 insertions(+), 1059 deletions(-)
create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs
create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs
create mode 100644 src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs
delete mode 100644 src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs
delete mode 100644 src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs
delete mode 100644 test/BiliAgentTest/VipApiTest.cs
delete mode 100644 test/DomainServiceTest/WbiDomainServiceTest.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs
create mode 100644 test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7bc0f5448..e1dd59046 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,66 +1,69 @@
-## 2.0.3
-- PR[#641]:实现浏览会员购页面与观看正片内容功能
-- PR[#685]:部分修复大积分功能
-- Fix:更新过于老旧的UserAgent
-- Fix:更新排行榜api
+## 2.0.4
+- Fix: 尝试修复大会员大积分“账号风险”异常
+- Feature:为agent api创建集成测试
+## 2.0.3
+- PR[#641]:实现浏览会员购页面与观看正片内容功能
+- PR[#685]:部分修复大积分功能
+- Fix:更新过于老旧的UserAgent
+- Fix:更新排行榜api
## 2.0.2
-- PR[#617]:增加专栏投币功能与领取大会员经验的功能
+- PR[#617]:增加专栏投币功能与领取大会员经验的功能
## 2.0.1
- PR[#539]:更新文档
-- PR[#557]:修复直播接口权限不足问题
+- PR[#557]:修复直播接口权限不足问题
## 2.0.0
- Feature[#513]:将基础组件和抽象迁移到nuget包中
-- Fix[#543]:修复部分Api调用报“访问权限不足”
+- Fix[#543]:修复部分Api调用报“访问权限不足”
## 1.0.3
-- Fix #486 : fix release zip error
+- Fix #486 : fix release zip error
## 1.0.2
- Fix #484 : fix read dic config error
- Merge PR #472 : add reverse proxy host for telegram notification
-- Merge PR #483 : update login field for entrypoint
+- Merge PR #483 : update login field for entrypoint
## 1.0.1
- Fix #463 : do not trust user's ck config
- Feature #460 : publish single file when release
- Feature: use new scripts for gh actions's release
-- Feature #473 : let user input when there is no target task in configs
+- Feature #473 : let user input when there is no target task in configs
## 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
+- Fix #446 : Change id type from int to long
## 0.4.6
- Fix: ck list init empty error
-- Feature #440 : use 'apk add' to install dotnet in qinglong
+- Feature #440 : use 'apk add' to install dotnet in qinglong
## 0.4.5
-- Fix #423 : Change int to string to avoid overflow exception
+- Fix #423 : Change int to string to avoid overflow exception
## 0.4.4
- Fix #228 : Try to fix sharing video error
-- Feature: Change default docker image from dockerhub to github
+- Feature: Change default docker image from dockerhub to github
## 0.4.3
- Feature #419 : Add a auto shell script for installing with docker
-- Feature #396 : Publish docker image to GitHub pkg
+- Feature #396 : Publish docker image to GitHub pkg
## 0.4.2
-- Merfe PRs #425 #426 #427 : Enhancement docker things, thx @zclkkk
+- Merfe PRs #425 #426 #427 : Enhancement docker things, thx @zclkkk
## 0.4.1
-- Merge PR #418 : Fix search video api's error, thx @catlair
+- Merge PR #418 : Fix search video api's error, thx @catlair
## 0.4.0
-- 合并PR( #381 #383 ),新增直播间挂机功能,感谢@bakapiano
+- 合并PR( #381 #383 ),新增直播间挂机功能,感谢@bakapiano
## 0.3.2
- Fix( #358 ),获取auth时兼容老版青龙文件路径
- Fix( #364 ),兼容青龙异形response数据类型
- Fix( #366 #361 ),修复一些低级bug
-- Feature( #359 ),兼容读取不到`$QL_DIR`的情况
+- Feature( #359 ),兼容读取不到`$QL_DIR`的情况
## 0.3.1
- Fix( #260 ),在需要的时候encode cookie
-- 更新文档
+- 更新文档
## 0.3.0
- hotfix docker build error
- 合并PR(#341),新增krew部署,感谢@chenliu1993
- 合并PR(##348),更新文档,感谢@jexjws
- 合并PR(#350),修改请求header错误的bug,感谢@catlair
- 合并PR(#353),新增python扫码登录的feature(仅针对青龙),感谢@AFUL1991
-- Feature(#351):重构并新增了扫码登录功能,使之适用于各种部署平台
+- Feature(#351):重构并新增了扫码登录功能,使之适用于各种部署平台
## 0.2.2
- 新增`podman`部署教程
- 合并PR(#264),腾讯云定时任务补充新增的大会员大积分任务,感谢@layui0320
@@ -75,9 +78,9 @@
- Feature(#65):新增TG推送配置并使用代理功能
- Feature(#240):新增gotify推送
- Feature(#259):大会员状态改为枚举类型,当非会员时自动跳过大积分任务
-- Feature:更新、优化docker部署文档
+- Feature:更新、优化docker部署文档
## 0.2.0
-- 新增大会员大积分任务
+- 新增大会员大积分任务
## 0.1.2
- 修复`auto-close-pr.yml`分支错误的bug
- 【#107】新增自动检测并关闭长时无状态issues的actions:no-response.yml
@@ -85,44 +88,44 @@
- HostConfiguration,删除了CommandLine配置源,推荐只使用环境变量,同时更新青龙shell脚本内配置
- 【#169】领取大会员福利任务更改为每日都尝试执行
- 青龙拉库兼容大小写问题
-- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo)
+- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo)
## 0.1.1
- 【#54】优化青龙shell脚本读取仓库目录方式,解决青龙新老版本切换导致出现多个repo目录的bug
- 【#82】【#85】合并外部PR,更新了文档
-- 感谢`JetBrain`提供免费的证书支持
+- 感谢`JetBrain`提供免费的证书支持
## 0.1.0
- 【#62】`codeql-analysis.yml`可以指定检查的文件类型
- 【#61】`publish-image.yml`手动打镜像时支持指定是否打latest的tag
- 【#32】新增企业微信的应用推送,实现微信接受推送消息
-- 优化日志格式
+- 优化日志格式
## 0.0.9
-- 【#47】青龙安装`dotnet`环境,支持arm架构服务器
+- 【#47】青龙安装`dotnet`环境,支持arm架构服务器
## 0.0.8
- 【#55】新增日志推送端:`Microsoft Teams`
-- 【#27】更新README
+- 【#27】更新README
## 0.0.7
- 【#44】兼容青龙最新版本(v2.12.0),修复因青龙调整目录结构导致的bug
-- 更新`publish-image.yml`,只有`release`时才打`latest tag`,手动运行时不打`latest tag`
+- 更新`publish-image.yml`,只有`release`时才打`latest tag`,手动运行时不打`latest tag`
## 0.0.6
- 更新docker镜像的构建
- 【#12】新增配置`Notification:IsSingleAccountSingleNotify`,支持开启每个账号单独推送消息
-- publish-release.yml新增手动输入tag功能
+- publish-release.yml新增手动输入tag功能
## 0.0.5
- 优化推送日志,在标题中显示运行的任务名称
- 新增`CodeQL`workflows,用于检测代码
- 新增`Publish image`workflows,用于发布镜像
- 新增`no-toxic-comments.yml`,用于检测评论
-- 更新`auto-close-pr.yml`,用于修正PR的目标到`develop`
+- 更新`auto-close-pr.yml`,用于修正PR的目标到`develop`
## 0.0.4
-- 【#15】修复`Actions`部署到腾讯云函数时的偶发异常
+- 【#15】修复`Actions`部署到腾讯云函数时的偶发异常
## 0.0.3
- 【#16】修复银瓜子兑换硬币bug
- 【#18】修改[青龙面板](https://github.com/whyour/qinglong)以`Production`环境运行
-- [青龙面板](https://github.com/whyour/qinglong)新增拉取dev先行版功能
+- [青龙面板](https://github.com/whyour/qinglong)新增拉取dev先行版功能
## 0.0.2
- 更新文档
- 天选抽奖新增黑名单功能
-- 批量取关新增白名单功能
+- 批量取关新增白名单功能
## 0.0.1
- 重启项目
-- 支持[青龙面板](https://github.com/whyour/qinglong)部署
+- 支持[青龙面板](https://github.com/whyour/qinglong)部署
diff --git a/Ray.BiliBiliTool.sln b/Ray.BiliBiliTool.sln
index c7f37172c..3406edc2f 100644
--- a/Ray.BiliBiliTool.sln
+++ b/Ray.BiliBiliTool.sln
@@ -1,231 +1,238 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.0.32112.339
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{38736647-2196-417E-8519-C48A012A63D9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Application", "Application", "{98051127-2868-4F5C-9B2C-2150975E05F3}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Domain", "Domain", "{120917DC-474C-448B-9EBB-1B3BA3A20B9D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF21E067-3307-4E7F-8CE8-C695E6B61876}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{E9BDDCBE-A57D-4E3B-8252-708088386ADF}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Console", "src\Ray.BiliBiliTool.Console\Ray.BiliBiliTool.Console.csproj", "{DB227D60-0737-45C2-8CEA-F55FDA711301}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfigTest", "test\ConfigTest\ConfigTest.csproj", "{114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LogTest", "test\LogTest\LogTest.csproj", "{2039BF6A-5EC4-439C-8D2E-77313075843A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{110D3D21-8E9B-45AB-9667-6DA1DB3862AC}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Infrastructure", "src\Ray.BiliBiliTool.Infrastructure\Ray.BiliBiliTool.Infrastructure.csproj", "{7188698C-0A9A-43B2-B3E2-5136B14FDE13}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application", "src\Ray.BiliBiliTool.Application\Ray.BiliBiliTool.Application.csproj", "{3388A58D-91CC-4875-A29F-3E6FC3B44BF5}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application.Contracts", "src\Ray.BiliBiliTool.Application.Contracts\Ray.BiliBiliTool.Application.Contracts.csproj", "{B6AEDD60-9C06-4391-9171-65EBD5E9D77A}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Agent", "src\Ray.BiliBiliTool.Agent\Ray.BiliBiliTool.Agent.csproj", "{D5F9FBCE-31BE-4E80-93E2-183CF029431F}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Config", "src\Ray.BiliBiliTool.Config\Ray.BiliBiliTool.Config.csproj", "{191C48BD-5CB5-42CA-B394-7A4A9BFA6275}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.DomainService", "src\Ray.BiliBiliTool.DomainService\Ray.BiliBiliTool.DomainService.csproj", "{7105652A-B1C1-4F9E-BA38-8034BC8B26B4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}"
- ProjectSection(SolutionItems) = preProject
- .dockerignore = .dockerignore
- .editorconfig = .editorconfig
- .gitignore = .gitignore
- CHANGELOG.md = CHANGELOG.md
- clean.cmd = clean.cmd
- common.props = common.props
- Dockerfile = Dockerfile
- LICENSE = LICENSE
- publish.bat = publish.bat
- README.md = README.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}"
- ProjectSection(SolutionItems) = preProject
- .github\pull.yml = .github\pull.yml
- .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{61613EF4-3644-42D4-A620-70547291FB38}"
- ProjectSection(SolutionItems) = preProject
- .github\workflows\auto-close-pr.yml = .github\workflows\auto-close-pr.yml
- .github\workflows\auto-deploy-tencent-scf.yml = .github\workflows\auto-deploy-tencent-scf.yml
- .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml
- .github\workflows\publish-image.yml = .github\workflows\publish-image.yml
- .github\workflows\publish-release.yml = .github\workflows\publish-release.yml
- .github\workflows\repo-sync.yml = .github\workflows\repo-sync.yml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{A93210FD-27B6-40E4-B08D-391F96CA2754}"
- ProjectSection(SolutionItems) = preProject
- docker\crontab = docker\crontab
- docker\entry.sh = docker\entry.sh
- docker\README.md = docker\README.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A}"
- ProjectSection(SolutionItems) = preProject
- docker\sample\docker-compose.yml = docker\sample\docker-compose.yml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{C0173851-1515-4BE1-A018-84E0B64A6877}"
- ProjectSection(SolutionItems) = preProject
- docs\configuration.md = docs\configuration.md
- docs\donate-list.md = docs\donate-list.md
- docs\questions.md = docs\questions.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencentScf", "tencentScf", "{DD86F293-AE70-46CF-837C-8870D8F51237}"
- ProjectSection(SolutionItems) = preProject
- tencentScf\bootstrap = tencentScf\bootstrap
- tencentScf\index.sh = tencentScf\index.sh
- tencentScf\publish.bat = tencentScf\publish.bat
- tencentScf\publish.sh = tencentScf\publish.sh
- tencentScf\README.md = tencentScf\README.md
- tencentScf\serverless.yml = tencentScf\serverless.yml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "qinglong", "qinglong", "{1C6CC38A-A5D5-41EF-9072-70AEEEA211F7}"
- ProjectSection(SolutionItems) = preProject
- qinglong\dotnet-install.sh = qinglong\dotnet-install.sh
- qinglong\extra.sh = qinglong\extra.sh
- qinglong\ray-dotnet-install.sh = qinglong\ray-dotnet-install.sh
- qinglong\README.md = qinglong\README.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DefaultTasks", "DefaultTasks", "{DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0}"
- ProjectSection(SolutionItems) = preProject
- qinglong\DefaultTasks\bili_dev_task_daily.sh = qinglong\DefaultTasks\bili_dev_task_daily.sh
- qinglong\DefaultTasks\bili_dev_task_liveLottery.sh = qinglong\DefaultTasks\bili_dev_task_liveLottery.sh
- qinglong\DefaultTasks\bili_dev_task_test.sh = qinglong\DefaultTasks\bili_dev_task_test.sh
- qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh
- qinglong\DefaultTasks\bili_task_daily.sh = qinglong\DefaultTasks\bili_task_daily.sh
- qinglong\DefaultTasks\bili_task_liveLottery.sh = qinglong\DefaultTasks\bili_task_liveLottery.sh
- qinglong\DefaultTasks\bili_task_test.sh = qinglong\DefaultTasks\bili_task_test.sh
- qinglong\DefaultTasks\bili_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_task_unfollowBatched.sh
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ISSUE_TEMPLATE", "ISSUE_TEMPLATE", "{830361B7-BCC1-4853-879A-761B0FD86826}"
- ProjectSection(SolutionItems) = preProject
- .github\ISSUE_TEMPLATE\bug-report----.md = .github\ISSUE_TEMPLATE\bug-report----.md
- .github\ISSUE_TEMPLATE\feature-request----.md = .github\ISSUE_TEMPLATE\feature-request----.md
- .github\ISSUE_TEMPLATE\other----.md = .github\ISSUE_TEMPLATE\other----.md
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BiliAgentTest", "test\BiliAgentTest\BiliAgentTest.csproj", "{F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{75A9CC5C-DF92-4D72-A14C-625AA902855B}"
- ProjectSection(SolutionItems) = preProject
- docker\build\buildAndPushImage_multiArch.cmd = docker\build\buildAndPushImage_multiArch.cmd
- docker\build\buildImage.cmd = docker\build\buildImage.cmd
- docker\build\buildImage_amd64.cmd = docker\build\buildImage_amd64.cmd
- docker\build\buildImage_arm64.cmd = docker\build\buildImage_arm64.cmd
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AppServiceTest", "test\AppServiceTest\AppServiceTest.csproj", "{1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DomainServiceTest", "test\DomainServiceTest\DomainServiceTest.csproj", "{26B21C30-7358-4E7B-A73E-2272F10A6CA8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfrastructureTest", "test\InfrastructureTest\InfrastructureTest.csproj", "{90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.Build.0 = Release|Any CPU
- {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.Build.0 = Release|Any CPU
- {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.Build.0 = Release|Any CPU
- {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.Build.0 = Release|Any CPU
- {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.Build.0 = Release|Any CPU
- {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.Build.0 = Release|Any CPU
- {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.Build.0 = Release|Any CPU
- {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.Build.0 = Release|Any CPU
- {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.Build.0 = Release|Any CPU
- {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.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
- {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {38736647-2196-417E-8519-C48A012A63D9} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
- {98051127-2868-4F5C-9B2C-2150975E05F3} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
- {120917DC-474C-448B-9EBB-1B3BA3A20B9D} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
- {DB227D60-0737-45C2-8CEA-F55FDA711301} = {38736647-2196-417E-8519-C48A012A63D9}
- {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
- {2039BF6A-5EC4-439C-8D2E-77313075843A} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
- {110D3D21-8E9B-45AB-9667-6DA1DB3862AC} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
- {7188698C-0A9A-43B2-B3E2-5136B14FDE13} = {110D3D21-8E9B-45AB-9667-6DA1DB3862AC}
- {3388A58D-91CC-4875-A29F-3E6FC3B44BF5} = {98051127-2868-4F5C-9B2C-2150975E05F3}
- {B6AEDD60-9C06-4391-9171-65EBD5E9D77A} = {98051127-2868-4F5C-9B2C-2150975E05F3}
- {D5F9FBCE-31BE-4E80-93E2-183CF029431F} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D}
- {191C48BD-5CB5-42CA-B394-7A4A9BFA6275} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D}
- {7105652A-B1C1-4F9E-BA38-8034BC8B26B4} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D}
- {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
- {61613EF4-3644-42D4-A620-70547291FB38} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}
- {A93210FD-27B6-40E4-B08D-391F96CA2754} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
- {2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A} = {A93210FD-27B6-40E4-B08D-391F96CA2754}
- {DD86F293-AE70-46CF-837C-8870D8F51237} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
- {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
- {DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0} = {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7}
- {830361B7-BCC1-4853-879A-761B0FD86826} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}
- {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
- {75A9CC5C-DF92-4D72-A14C-625AA902855B} = {A93210FD-27B6-40E4-B08D-391F96CA2754}
- {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
- {26B21C30-7358-4E7B-A73E-2272F10A6CA8} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
- {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {197319DA-1148-4A99-847C-8B270B6A29AB}
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.32112.339
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{38736647-2196-417E-8519-C48A012A63D9}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Application", "Application", "{98051127-2868-4F5C-9B2C-2150975E05F3}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Domain", "Domain", "{120917DC-474C-448B-9EBB-1B3BA3A20B9D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF21E067-3307-4E7F-8CE8-C695E6B61876}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{E9BDDCBE-A57D-4E3B-8252-708088386ADF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Console", "src\Ray.BiliBiliTool.Console\Ray.BiliBiliTool.Console.csproj", "{DB227D60-0737-45C2-8CEA-F55FDA711301}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfigTest", "test\ConfigTest\ConfigTest.csproj", "{114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LogTest", "test\LogTest\LogTest.csproj", "{2039BF6A-5EC4-439C-8D2E-77313075843A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{110D3D21-8E9B-45AB-9667-6DA1DB3862AC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Infrastructure", "src\Ray.BiliBiliTool.Infrastructure\Ray.BiliBiliTool.Infrastructure.csproj", "{7188698C-0A9A-43B2-B3E2-5136B14FDE13}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application", "src\Ray.BiliBiliTool.Application\Ray.BiliBiliTool.Application.csproj", "{3388A58D-91CC-4875-A29F-3E6FC3B44BF5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Application.Contracts", "src\Ray.BiliBiliTool.Application.Contracts\Ray.BiliBiliTool.Application.Contracts.csproj", "{B6AEDD60-9C06-4391-9171-65EBD5E9D77A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Agent", "src\Ray.BiliBiliTool.Agent\Ray.BiliBiliTool.Agent.csproj", "{D5F9FBCE-31BE-4E80-93E2-183CF029431F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Config", "src\Ray.BiliBiliTool.Config\Ray.BiliBiliTool.Config.csproj", "{191C48BD-5CB5-42CA-B394-7A4A9BFA6275}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.DomainService", "src\Ray.BiliBiliTool.DomainService\Ray.BiliBiliTool.DomainService.csproj", "{7105652A-B1C1-4F9E-BA38-8034BC8B26B4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}"
+ ProjectSection(SolutionItems) = preProject
+ .dockerignore = .dockerignore
+ .editorconfig = .editorconfig
+ .gitignore = .gitignore
+ CHANGELOG.md = CHANGELOG.md
+ clean.cmd = clean.cmd
+ common.props = common.props
+ Dockerfile = Dockerfile
+ LICENSE = LICENSE
+ publish.bat = publish.bat
+ README.md = README.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}"
+ ProjectSection(SolutionItems) = preProject
+ .github\pull.yml = .github\pull.yml
+ .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{61613EF4-3644-42D4-A620-70547291FB38}"
+ ProjectSection(SolutionItems) = preProject
+ .github\workflows\auto-close-pr.yml = .github\workflows\auto-close-pr.yml
+ .github\workflows\auto-deploy-tencent-scf.yml = .github\workflows\auto-deploy-tencent-scf.yml
+ .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml
+ .github\workflows\publish-image.yml = .github\workflows\publish-image.yml
+ .github\workflows\publish-release.yml = .github\workflows\publish-release.yml
+ .github\workflows\repo-sync.yml = .github\workflows\repo-sync.yml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{A93210FD-27B6-40E4-B08D-391F96CA2754}"
+ ProjectSection(SolutionItems) = preProject
+ docker\crontab = docker\crontab
+ docker\entry.sh = docker\entry.sh
+ docker\README.md = docker\README.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A}"
+ ProjectSection(SolutionItems) = preProject
+ docker\sample\docker-compose.yml = docker\sample\docker-compose.yml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{C0173851-1515-4BE1-A018-84E0B64A6877}"
+ ProjectSection(SolutionItems) = preProject
+ docs\configuration.md = docs\configuration.md
+ docs\donate-list.md = docs\donate-list.md
+ docs\questions.md = docs\questions.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencentScf", "tencentScf", "{DD86F293-AE70-46CF-837C-8870D8F51237}"
+ ProjectSection(SolutionItems) = preProject
+ tencentScf\bootstrap = tencentScf\bootstrap
+ tencentScf\index.sh = tencentScf\index.sh
+ tencentScf\publish.bat = tencentScf\publish.bat
+ tencentScf\publish.sh = tencentScf\publish.sh
+ tencentScf\README.md = tencentScf\README.md
+ tencentScf\serverless.yml = tencentScf\serverless.yml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "qinglong", "qinglong", "{1C6CC38A-A5D5-41EF-9072-70AEEEA211F7}"
+ ProjectSection(SolutionItems) = preProject
+ qinglong\dotnet-install.sh = qinglong\dotnet-install.sh
+ qinglong\extra.sh = qinglong\extra.sh
+ qinglong\ray-dotnet-install.sh = qinglong\ray-dotnet-install.sh
+ qinglong\README.md = qinglong\README.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DefaultTasks", "DefaultTasks", "{DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0}"
+ ProjectSection(SolutionItems) = preProject
+ qinglong\DefaultTasks\bili_dev_task_daily.sh = qinglong\DefaultTasks\bili_dev_task_daily.sh
+ qinglong\DefaultTasks\bili_dev_task_liveLottery.sh = qinglong\DefaultTasks\bili_dev_task_liveLottery.sh
+ qinglong\DefaultTasks\bili_dev_task_test.sh = qinglong\DefaultTasks\bili_dev_task_test.sh
+ qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_dev_task_unfollowBatched.sh
+ qinglong\DefaultTasks\bili_task_daily.sh = qinglong\DefaultTasks\bili_task_daily.sh
+ qinglong\DefaultTasks\bili_task_liveLottery.sh = qinglong\DefaultTasks\bili_task_liveLottery.sh
+ qinglong\DefaultTasks\bili_task_test.sh = qinglong\DefaultTasks\bili_task_test.sh
+ qinglong\DefaultTasks\bili_task_unfollowBatched.sh = qinglong\DefaultTasks\bili_task_unfollowBatched.sh
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ISSUE_TEMPLATE", "ISSUE_TEMPLATE", "{830361B7-BCC1-4853-879A-761B0FD86826}"
+ ProjectSection(SolutionItems) = preProject
+ .github\ISSUE_TEMPLATE\bug-report----.md = .github\ISSUE_TEMPLATE\bug-report----.md
+ .github\ISSUE_TEMPLATE\feature-request----.md = .github\ISSUE_TEMPLATE\feature-request----.md
+ .github\ISSUE_TEMPLATE\other----.md = .github\ISSUE_TEMPLATE\other----.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BiliAgentTest", "test\BiliAgentTest\BiliAgentTest.csproj", "{F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{75A9CC5C-DF92-4D72-A14C-625AA902855B}"
+ ProjectSection(SolutionItems) = preProject
+ docker\build\buildAndPushImage_multiArch.cmd = docker\build\buildAndPushImage_multiArch.cmd
+ docker\build\buildImage.cmd = docker\build\buildImage.cmd
+ docker\build\buildImage_amd64.cmd = docker\build\buildImage_amd64.cmd
+ docker\build\buildImage_arm64.cmd = docker\build\buildImage_arm64.cmd
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AppServiceTest", "test\AppServiceTest\AppServiceTest.csproj", "{1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DomainServiceTest", "test\DomainServiceTest\DomainServiceTest.csproj", "{26B21C30-7358-4E7B-A73E-2272F10A6CA8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfrastructureTest", "test\InfrastructureTest\InfrastructureTest.csproj", "{90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ray.BiliBiliTool.Agent.FunctionalTests", "test\Ray.BiliBiliTool.Agent.FunctionalTests\Ray.BiliBiliTool.Agent.FunctionalTests.csproj", "{16F315CF-056A-4B08-8C3C-A3177EA3CBB9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DB227D60-0737-45C2-8CEA-F55FDA711301}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DB227D60-0737-45C2-8CEA-F55FDA711301}.Release|Any CPU.Build.0 = Release|Any CPU
+ {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2039BF6A-5EC4-439C-8D2E-77313075843A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2039BF6A-5EC4-439C-8D2E-77313075843A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7188698C-0A9A-43B2-B3E2-5136B14FDE13}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3388A58D-91CC-4875-A29F-3E6FC3B44BF5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6AEDD60-9C06-4391-9171-65EBD5E9D77A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D5F9FBCE-31BE-4E80-93E2-183CF029431F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {191C48BD-5CB5-42CA-B394-7A4A9BFA6275}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7105652A-B1C1-4F9E-BA38-8034BC8B26B4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF}.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
+ {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {16F315CF-056A-4B08-8C3C-A3177EA3CBB9}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {38736647-2196-417E-8519-C48A012A63D9} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
+ {98051127-2868-4F5C-9B2C-2150975E05F3} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
+ {120917DC-474C-448B-9EBB-1B3BA3A20B9D} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
+ {DB227D60-0737-45C2-8CEA-F55FDA711301} = {38736647-2196-417E-8519-C48A012A63D9}
+ {114D45C8-E4BB-47EE-89AC-BD1DC6FA3BAD} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
+ {2039BF6A-5EC4-439C-8D2E-77313075843A} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
+ {110D3D21-8E9B-45AB-9667-6DA1DB3862AC} = {AF21E067-3307-4E7F-8CE8-C695E6B61876}
+ {7188698C-0A9A-43B2-B3E2-5136B14FDE13} = {110D3D21-8E9B-45AB-9667-6DA1DB3862AC}
+ {3388A58D-91CC-4875-A29F-3E6FC3B44BF5} = {98051127-2868-4F5C-9B2C-2150975E05F3}
+ {B6AEDD60-9C06-4391-9171-65EBD5E9D77A} = {98051127-2868-4F5C-9B2C-2150975E05F3}
+ {D5F9FBCE-31BE-4E80-93E2-183CF029431F} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D}
+ {191C48BD-5CB5-42CA-B394-7A4A9BFA6275} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D}
+ {7105652A-B1C1-4F9E-BA38-8034BC8B26B4} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D}
+ {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
+ {61613EF4-3644-42D4-A620-70547291FB38} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}
+ {A93210FD-27B6-40E4-B08D-391F96CA2754} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
+ {2F1CB892-336C-4672-8A0A-FBAEB4B9EA8A} = {A93210FD-27B6-40E4-B08D-391F96CA2754}
+ {DD86F293-AE70-46CF-837C-8870D8F51237} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
+ {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
+ {DE60A16C-CA3B-45E9-8A9D-0E91ACEBDEE0} = {1C6CC38A-A5D5-41EF-9072-70AEEEA211F7}
+ {830361B7-BCC1-4853-879A-761B0FD86826} = {73DD457B-E06E-45ED-A6BA-7E3C02F8BDF1}
+ {F6B8ED3A-5428-4D26-8172-8B41FBF0C4CF} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
+ {75A9CC5C-DF92-4D72-A14C-625AA902855B} = {A93210FD-27B6-40E4-B08D-391F96CA2754}
+ {1D9DFF34-71EA-44AE-85B0-1F10C9BA0D81} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
+ {26B21C30-7358-4E7B-A73E-2272F10A6CA8} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
+ {90C1DB73-B3DB-4BE5-AD1A-5248FE47860E} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
+ {16F315CF-056A-4B08-8C3C-A3177EA3CBB9} = {E9BDDCBE-A57D-4E3B-8252-708088386ADF}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {197319DA-1148-4A99-847C-8B270B6A29AB}
+ EndGlobalSection
+EndGlobal
diff --git a/common.props b/common.props
index 4add63019..ca86e1fb3 100644
--- a/common.props
+++ b/common.props
@@ -1,7 +1,7 @@
Ray
- 2.0.3
+ 2.0.4
$(NoWarn);CS1591;CS0436
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs
index 7fd3f3e9d..e2b465fd5 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/AddCoinForArticleRequest.cs
@@ -2,7 +2,7 @@
public class AddCoinForArticleRequest
{
- public AddCoinForArticleRequest(long cvid,long mid,string csrf)
+ public AddCoinForArticleRequest(long cvid, long mid, string csrf)
{
Aid = cvid;
Upid = mid;
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs
index 8d646ffbd..f2b24b85d 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Article/SearchArticlesByUpIdFullFto.cs
@@ -1,6 +1,8 @@
-namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
-public class SearchArticlesByUpIdDto
+namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article;
+
+public class SearchArticlesByUpIdDto : IWrid
{
public long mid { get; set; }
@@ -8,16 +10,12 @@ public class SearchArticlesByUpIdDto
public int ps { get; set; } = 12;
- public string sort { get; set; } = "publish_time";
-
- public long web_location { get; set; } = 1550101;
-
- public string platform { get; set; } = "web";
-}
-
-public class SearchArticlesByUpIdFullDto : SearchArticlesByUpIdDto
-{
+ public string sort { get; set; } = "publish_time";
+
+ public long web_location { get; set; } = 1550101;
+
+ public string platform { get; set; } = "web";
+
public string w_rid { get; set; }
-
public long wts { get; set; }
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs
index 0f388ec9a..338b8f290 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/GetSpaceInfoFullDto.cs
@@ -1,12 +1,11 @@
-namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
-public class GetSpaceInfoDto
-{
- public long mid { get; set; }
-}
-public class GetSpaceInfoFullDto : GetSpaceInfoDto
-{
- public string w_rid { get; set; }
+namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
- public long wts { get; set; }
+public class GetSpaceInfoDto : IWrid
+{
+ public long mid { get; set; }
+
+ public string w_rid { get; set; }
+ public long wts { get; set; }
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs
index 15a7e8f9f..42268dfe7 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/UserInfo.cs
@@ -143,23 +143,19 @@ public class Wallet
public class WbiImg
{
///
- /// https://i0.hdslb.com/bfs/wbi/9cd4224d4fe74c7e9d6963e2ef891688.png
- ///
+ /// img url
+ ///
+ /// https://i0.hdslb.com/bfs/wbi/9cd4224d4fe74c7e9d6963e2ef891688.png
public string img_url { get; set; }
///
- /// https://i0.hdslb.com/bfs/wbi/263655ae2cad4cce95c9c401981b044a.png
- ///
+ /// sub url
+ ///
+ /// https://i0.hdslb.com/bfs/wbi/263655ae2cad4cce95c9c401981b044a.png
public string sub_url { get; set; }
- public string GetImgKey()
- {
- return img_url.Split("wbi/").ToList().Last().Replace(".png", "");
- }
+ public string ImgKey => img_url.Split("wbi/").ToList().Last().Replace(".png", "");
- public string GetSubKey()
- {
- return sub_url.Split("wbi/").ToList().Last().Replace(".png", "");
- }
+ public string SubKey => sub_url.Split("wbi/").ToList().Last().Replace(".png", "");
}
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs
index b06b8a259..d342204e2 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/Video/SearchVideosByUpIdFullDto.cs
@@ -1,47 +1,37 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Ray.Infrastructure.Helpers;
-
-namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video
-{
- public class SearchVideosByUpIdDto
- {
- ///
- /// upId
- ///
- public long mid { get; set; }
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
- ///
- /// pageSize
- ///
- public int ps { get; set; } = 30;
+namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video;
- ///
- /// pageNumber
- ///
- public int pn { get; set; } = 1;
+public class SearchVideosByUpIdDto : IWrid
+{
+ ///
+ /// upId
+ ///
+ public long mid { get; set; }
- public int tid { get; set; } = 0;
+ ///
+ /// pageSize
+ ///
+ public int ps { get; set; } = 30;
- public string keyword { get; set; } = "";
+ ///
+ /// pageNumber
+ ///
+ public int pn { get; set; } = 1;
- public string order { get; set; } = "pubdate";
+ public int tid { get; set; } = 0;
- public string platform { get; set; } = "web";
+ public string keyword { get; set; } = "";
- public int web_location { get; set; } = 1550101;
+ public string order { get; set; } = "pubdate";
- public string order_avoided { get; set; } = "true";
- }
+ public string platform { get; set; } = "web";
- public class SearchVideosByUpIdFullDto: SearchVideosByUpIdDto
- {
- public string w_rid { get; set; } //= "b280d7bc02d653ffa06d874a74e5bfd9"; //todo:应该是md5
+ public int web_location { get; set; } = 1550101;
- //public long wts { get; set; } = TimeStampHelper.DateTimeToTimeStamp(DateTime.Now);
- public long wts { get; set; } //= 1684857205; //todo
- }
+ public string order_avoided { get; set; } = "true";
+
+ public string w_rid { get; set; } //= "b280d7bc02d653ffa06d874a74e5bfd9"; //todo:应该是md5
+ //public long wts { get; set; } = TimeStampHelper.DateTimeToTimeStamp(DateTime.Now);
+ public long wts { get; set; } //= 1684857205; //todo
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs
new file mode 100644
index 000000000..4ad315cb6
--- /dev/null
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipPrivilegeType.cs
@@ -0,0 +1,8 @@
+namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos
+{
+ public enum VipPrivilegeType
+ {
+ BCoinCoupon = 1,
+ MembershipBenefits = 2
+ }
+}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs
index c6ec47532..36fee6276 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Dtos/VipTask/SignRequest.cs
@@ -1,13 +1,8 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask;
-namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask
-{
- public class SignRequest
- {
- public string Statistics { get; set; }= "{\"appId\":1,\"platform\":3,\"version\":\"6.85.0\",\"abtest\":\"\"}";
- }
+public class SignRequest
+{
+ public string csrf { get; set; }
+
+ public string statistics { get; set; }= "{\"appId\":1,\"platform\":3,\"version\":\"6.85.0\",\"abtest\":\"\"}";
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs
index 00ed29a70..42fa70eec 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IAccountApi.cs
@@ -13,6 +13,6 @@ public interface IAccountApi : IBiliBiliApi
///
[Header("Referer", "https://account.bilibili.com/account/coin")]
[HttpGet("/site/getCoin")]
- Task> GetCoinBalance();
+ Task> GetCoinBalanceAsync();
}
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs
index 2019bb33b..88d993863 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IArticleApi.cs
@@ -1,28 +1,18 @@
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video;
using WebApiClientCore.Attributes;
namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces
-{
-
+{
+
[Header("Host", "api.bilibili.com")]
public interface IArticleApi : IBiliBiliApi
- {
- [Header("Content-Type", "application/x-www-form-urlencoded")]
- [Header("Origin", "https://www.bilibili.com")]
- [HttpPost("/x/web-interface/coin/add")]
- Task AddCoinForArticle([FormContent] AddCoinForArticleRequest request, [Header("referer")] string refer = "https://www.bilibili.com/read/cv5806746/?from=search&spm_id_from=333.337.0.0");
-
-
+ {
[Header("Referer", "https://www.bilibili.com/")]
[Header("Origin", "https://space.bilibili.com")]
[HttpGet("/x/space/wbi/article")]
- Task> SearchUpArticlesByUpId(
- [PathQuery] SearchArticlesByUpIdFullDto request);
+ Task> SearchUpArticlesByUpIdAsync([PathQuery] SearchArticlesByUpIdDto request);
///
/// 获取专栏详情
@@ -30,16 +20,17 @@ Task> SearchUpArticlesByUpId(
///
///
[HttpGet("/x/article/viewinfo?id={cvid}")]
- Task> SearchArticleInfo(long cvid);
+ Task> SearchArticleInfoAsync(long cvid);
+ [Header("Content-Type", "application/x-www-form-urlencoded")]
+ [Header("Origin", "https://www.bilibili.com")]
+ [HttpPost("/x/web-interface/coin/add")]
+ Task AddCoinForArticleAsync([FormContent] AddCoinForArticleRequest request, [Header("referer")] string refer = "https://www.bilibili.com/read/cv5806746/?from=search&spm_id_from=333.337.0.0");
[Header("Content-Type", "application/x-www-form-urlencoded")]
[Header("Referer", "https://www.bilibili.com/read/cv{cvid}/?from=search&spm_id_from=333.337.0.0")]
[Header("Origin", "https://www.bilibili.com")]
[HttpPost("/x/article/like?id={cvid}&type=1&csrf={csrf}")]
- Task Like(long cvid, string csrf);
-
- }
-
-
+ Task LikeAsync(long cvid, string csrf);
+ }
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs
index dd159d14b..3a788381e 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IChargeApi.cs
@@ -36,7 +36,7 @@ public interface IChargeApi : IBiliBiliApi
[Header("Referer", "https://www.bilibili.com/")]
[Header("Origin", "https://www.bilibili.com")]
[HttpPost("/x/ugcpay/web/v2/trade/elec/pay/quick")]
- Task> ChargeV2([FormContent] ChargeRequest request);
+ Task> ChargeV2Async([FormContent] ChargeRequest request);
///
/// 充电后留言
@@ -50,7 +50,7 @@ public interface IChargeApi : IBiliBiliApi
[Header("Referer", "https://www.bilibili.com/")]
[Header("Origin", "https://www.bilibili.com")]
[HttpPost("/x/ugcpay/trade/elec/message")]
- Task> ChargeComment([FormContent] ChargeCommentRequest request);
+ Task> ChargeCommentAsync([FormContent] ChargeCommentRequest request);
}
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs
index 085125cda..9a5f1ac1b 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IDailyTaskApi.cs
@@ -18,7 +18,7 @@ public interface IDailyTaskApi : IBiliBiliApi
[Header("Referer", "https://account.bilibili.com/account/home")]
[Header("Origin", "https://account.bilibili.com")]
[HttpGet("/x/member/web/exp/reward")]
- Task> GetDailyTaskRewardInfo();
+ Task> GetDailyTaskRewardInfoAsync();
///
/// 获取通过投币已获取的经验值
@@ -27,7 +27,7 @@ public interface IDailyTaskApi : IBiliBiliApi
[Header("Referer", "https://www.bilibili.com/")]
[Header("Origin", "https://www.bilibili.com")]
[HttpGet("/x/web-interface/coin/today/exp")]
- Task> GetDonateCoinExp();
+ Task> GetDonateCoinExpAsync();
///
/// 获取VIP特权
@@ -36,6 +36,6 @@ public interface IDailyTaskApi : IBiliBiliApi
///
///
[HttpPost("/x/vip/privilege/receive?type={type}&csrf={csrf}")]
- Task ReceiveVipPrivilege(int type, string csrf);
+ Task ReceiveVipPrivilegeAsync(int type, string csrf);
}
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs
index 656972769..11e717f02 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IUserInfoApi.cs
@@ -27,6 +27,6 @@ public interface IUserInfoApi : IBiliBiliApi
/// uid
///
[HttpGet("/x/space/wbi/acc/info")]
- Task> GetSpaceInfo([PathQuery] GetSpaceInfoFullDto request);
+ Task> GetSpaceInfo([PathQuery] GetSpaceInfoDto request);
}
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs
index 5c9ab9053..7a21a4215 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVideoApi.cs
@@ -72,7 +72,7 @@ public interface IVideoApi : IBiliBiliApi
[Header("Origin", "https://space.bilibili.com")]
//[HttpGet("/x/space/wbi/arc/search?mid={upId}&ps={pageSize}&tid=0&pn={pageNumber}&keyword={keyword}&order=pubdate&platform=web&web_location=1550101&order_avoided=true&w_rid=5df06b1c48e2be86a96e9d0f99bf06f4&wts=1684854929")]
[HttpGet("/x/space/wbi/arc/search")]
- Task> SearchVideosByUpId([PathQuery] SearchVideosByUpIdFullDto request);
+ Task> SearchVideosByUpId([PathQuery] SearchVideosByUpIdDto request);
///
/// 通过ssid获取番剧的具体信息
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs
index 3e762e179..64ad1687d 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipBigPointApi.cs
@@ -10,20 +10,32 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces
/// 大会员大积分
///
[Header("Host", "api.bilibili.com")]
- [Header("User-Agent",
- "Mozilla/5.0 (Linux; Android 9; SM-N9700 Build/PQ3A.190605.04081832; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Safari/537.36 Mobile os/android model/SM-N9700 build/7300400 osVer/9 sdkInt/28 network/2 BiliApp/7300400 mobi_app/android channel/alifenfa Buvid/XY77D6C72ECDC63147110C5C8D1DA34D38CD1 sessionID/9795ed5c innerVer/7300400 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 7.30.0 os/android model/SM-N9700 mobi_app/android build/7300400 channel/alifenfa innerVer/7300400 osVer/9 network/2")]
+ [Header("User-Agent", "Mozilla/5.0 (Linux; Android 12; SM-S9080 Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36 os/android model/SM-S9080 build/7760700 osVer/12 sdkInt/32 network/2 BiliApp/7760700 mobi_app/android channel/bili Buvid/XZ286B42466A3AB0A8CC096DCF56101466E9A sessionID/811cdab4 innerVer/7760710 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 7.76.0 os/android model/SM-S9080 mobi_app/android build/7760700 channel/bili innerVer/7760710 osVer/12 network/2\nx-bili-trace-id: ba85aa511a87af24e23a771873662e7d:e23a771873662e7d:0:0")]
[LogFilter]
public interface IVipBigPointApi
- {
+ {
+ ///
+ /// 获取任务列表
+ ///
+ ///
[Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")]
[HttpGet("/x/vip_point/task/combine")]
- Task> GetTaskList();
+ Task> GetTaskListAsync();
-
- [Header("Referer", "https://www.bilibili.com")]
+ ///
+ /// 签到任务
+ ///
+ ///
+ ///
+ [Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")]
[HttpPost("/pgc/activity/score/task/sign")]
- Task Sign([FormContent] SignRequest request);
-
+ Task SignAsync([FormContent] SignRequest request);
+
+ ///
+ /// 领取任务
+ ///
+ ///
+ ///
[Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")]
[HttpPost("/pgc/activity/score/task/receive")]
Task Receive([JsonContent] ReceiveOrCompleteTaskRequest request);
@@ -35,7 +47,7 @@ public interface IVipBigPointApi
[Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")]
[HttpPost("/pgc/activity/score/task/complete")]
- Task Complete([JsonContent] ReceiveOrCompleteTaskRequest request);
+ Task CompleteAsync([JsonContent] ReceiveOrCompleteTaskRequest request);
[Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")]
[HttpPost("/pgc/activity/score/task/complete/v2")]
@@ -48,11 +60,15 @@ public interface IVipBigPointApi
[Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")]
[HttpGet("/x/vip/privilege/my")]
- Task> GetVouchersInfo();
-
+ Task> GetVouchersInfoAsync();
+
+ ///
+ /// 兑换大会员经验
+ ///
+ ///
+ ///
[Header("Referer", "https://big.bilibili.com/mobile/bigPoint/task")]
- // [Header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")]
[HttpPost("/x/vip/experience/add")]
- Task GetVipExperience([FormContent] VipExperienceRequest request);
+ Task ObtainVipExperienceAsync([FormContent] VipExperienceRequest request);
}
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs
index f5f2d5933..44e254d34 100644
--- a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Interfaces/IVipMallApi.cs
@@ -9,5 +9,5 @@ namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
public interface IVipMallApi
{
[HttpPost("/api/activity/fire/common/event/dispatch")]
- Task ViewVipMall([JsonContent] ViewVipMallRequest request);
+ Task ViewVipMallAsync([JsonContent] ViewVipMallRequest request);
}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs
new file mode 100644
index 000000000..291454cb2
--- /dev/null
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/IWbiService.cs
@@ -0,0 +1,18 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
+
+///
+/// 防爬
+///
+public interface IWbiService
+{
+ ///
+ /// 获取WbiKey
+ ///
+ ///
+ Task SetWridAsync(T ob) where T : IWrid;
+
+ WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan = 0);
+}
diff --git a/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs
new file mode 100644
index 000000000..21171f05a
--- /dev/null
+++ b/src/Ray.BiliBiliTool.Agent/BiliBiliAgent/Services/WbiService.cs
@@ -0,0 +1,158 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text.RegularExpressions;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Infrastructure.Helpers;
+
+namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
+
+///
+/// 防爬
+///
+public class WbiService : IWbiService
+{
+ private readonly ILogger _logger;
+ private readonly IUserInfoApi _userInfoApi;
+
+ public WbiService(
+ ILogger logger,
+ IUserInfoApi userInfoApi
+ )
+ {
+ _logger = logger;
+ _userInfoApi = userInfoApi;
+ }
+
+ public async Task SetWridAsync(T request) where T: IWrid
+ {
+ //生成字典
+ Dictionary parameters = ObjectHelper.ObjectToDictionary(request);
+ parameters.Remove(nameof(IWrid.wts));
+ parameters.Remove(nameof(IWrid.w_rid));
+
+ //根据当前用户信息取加密key
+ WbiImg wbi = await GetWbiKeysAsync();
+
+ //生成
+ var re = EncWbi(parameters, wbi.ImgKey, wbi.SubKey);
+
+ request.w_rid = re.w_rid;
+ request.wts = re.wts;
+ }
+
+ ///
+ /// 为请求参数进行 wbi 签名
+ ///
+ ///
+ ///
+ ///
+ ///
+ public WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan = 0)
+ {
+ var re = new WridDto();
+
+ var mixinKey = GetMixinKey(imgKey + subKey);
+
+ if (timespan == 0)
+ {
+ re.wts = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
+ }
+ else
+ {
+ re.wts = timespan;
+ }
+
+ var chrFilter = new Regex("[!'()*]");
+
+ var dic = new Dictionary
+ {
+ { "wts", re.wts.ToString() }
+ };
+
+ foreach (var entry in parameters)
+ {
+ var key = entry.Key;
+ var value = entry.Value.ToString();
+
+ var encodedValue = chrFilter.Replace(value, "");
+
+ dic.Add(Uri.EscapeDataString(key), Uri.EscapeDataString(encodedValue));
+ }
+
+ var keyList = dic.Keys.ToList();
+ keyList.Sort();
+
+ var queryList = new List();
+ foreach (var item in keyList)
+ {
+ var value = dic[item];
+ queryList.Add($"{item}={value}");
+ }
+
+ var queryString = string.Join("&", queryList);
+ var md5Hasher = MD5.Create();
+ var hashStr = queryString + mixinKey;
+ var hashedQueryString = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(hashStr));
+ var wbiSign = BitConverter.ToString(hashedQueryString).Replace("-", "").ToLower();
+
+ re.w_rid = wbiSign;
+
+ return re;
+ }
+
+
+ private async Task GetWbiKeysAsync()
+ {
+ BiliApiResponse apiResponse = await _userInfoApi.LoginByCookie();
+
+ UserInfo useInfo = apiResponse.Data;
+
+ _logger.LogDebug("【img_url】{0}", useInfo.Wbi_img?.img_url);
+ _logger.LogDebug("【sub_url】{0}", useInfo.Wbi_img?.sub_url);
+
+ return useInfo.Wbi_img;
+ }
+
+ ///
+ /// 对 imgKey 和 subKey 进行字符顺序打乱编码
+ ///
+ ///
+ ///
+ private string GetMixinKey(string orig)
+ {
+ int[] mixinKeyEncTab = new int[]
+ {
+ 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
+ 33, 9, 42, 19, 29, 28, 14, 39,12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
+ 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,
+ 36, 20, 34, 44, 52
+ };
+
+ var temp = new StringBuilder();
+ foreach (var index in mixinKeyEncTab)
+ {
+ temp.Append(orig[index]);
+ }
+ return temp.ToString().Substring(0, 32);
+ }
+}
+
+public class WridDto: IWrid
+{
+ public long wts { get; set; }
+
+ public string w_rid { get; set; }
+}
+
+public interface IWrid
+{
+ public long wts { get; set; }
+
+ public string w_rid { get; set; }
+}
diff --git a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs
index 8f5a2c12d..91baf9979 100644
--- a/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs
+++ b/src/Ray.BiliBiliTool.Agent/Extensions/ServiceCollectionExtension.cs
@@ -5,178 +5,179 @@
using System.Net.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Polly;
using Polly.Extensions.Http;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
using Ray.BiliBiliTool.Agent.HttpClientDelegatingHandlers;
using Ray.BiliBiliTool.Agent.QingLong;
using Ray.BiliBiliTool.Config.Options;
-using Ray.BiliBiliTool.Infrastructure;
using Ray.BiliBiliTool.Infrastructure.Cookie;
-namespace Ray.BiliBiliTool.Agent.Extensions
+namespace Ray.BiliBiliTool.Agent.Extensions;
+
+public static class ServiceCollectionExtension
{
- public static class ServiceCollectionExtension
+ ///
+ /// 注册强类型api客户端
+ ///
+ ///
+ ///
+ public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, IConfiguration configuration)
{
- ///
- /// 注册强类型api客户端
- ///
- ///
- ///
- public static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, IConfiguration configuration)
+ //Cookie
+ services.AddSingleton(sp =>
{
- //Cookie
- services.AddSingleton(sp =>
+ var list = new List();
+ var config = sp.GetRequiredService();
+
+ //兼容老版
+ var old = config["BiliBiliCookie:CookieStr"];
+ if (!string.IsNullOrWhiteSpace(old)) list.Add(old);
+
+ var configList = config.GetSection("BiliBiliCookies")
+ .Get>() ?? new List()
+ .Where(x => !string.IsNullOrWhiteSpace(x))
+ .ToList();
+ list.AddRange(configList);
+
+ return new CookieStrFactory(list);
+ });
+ services.AddTransient();
+
+ //全局代理
+ services.SetGlobalProxy(configuration);
+
+ //DelegatingHandler
+ services.Scan(scan => scan
+ .FromAssemblyOf()
+ .AddClasses(classes => classes.AssignableTo())
+ .AsSelf()
+ .WithTransientLifetime()
+ );
+
+ //服务
+ services.AddScoped();
+
+ //bilibli
+ services.AddBiliBiliClientApi("https://api.bilibili.com");
+ services.AddBiliBiliClientApi("https://api.bilibili.com");
+ services.AddBiliBiliClientApi("https://manga.bilibili.com");
+ services.AddBiliBiliClientApi("https://account.bilibili.com");
+ services.AddBiliBiliClientApi("https://api.live.bilibili.com");
+ services.AddBiliBiliClientApi("https://api.bilibili.com");
+ 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);
+
+ // 添加注入
+ services.AddBiliBiliClientApi("https://api.bilibili.com");
+ services.AddBiliBiliClientApi("https://show.bilibili.com");
+
+ //qinglong
+ var qinglongHost = configuration["QL_URL"] ?? "http://localhost:5600";
+ services
+ .AddHttpApi(o =>
{
- var list = new List();
- var config = sp.GetRequiredService();
-
- //兼容老版
- var old = config["BiliBiliCookie:CookieStr"];
- if (!string.IsNullOrWhiteSpace(old)) list.Add(old);
+ o.HttpHost = new Uri(qinglongHost);
+ o.UseDefaultUserAgent = false;
+ })
+ .ConfigureHttpClient((sp, c) =>
+ {
+ c.DefaultRequestHeaders.Add("User-Agent",
+ sp.GetRequiredService>().CurrentValue.UserAgent);
+ })
+ .AddPolicyHandler(GetRetryPolicy());
- var configList = config.GetSection("BiliBiliCookies")
- .Get>() ?? new List()
- .Where(x => !string.IsNullOrWhiteSpace(x))
- .ToList();
- list.AddRange(configList);
+ return services;
+ }
- return new CookieStrFactory(list);
+ ///
+ /// 封装Refit,默认将Cookie添加到Header中
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, string host, bool withCookie = true)
+ where TInterface : class
+ {
+ var uri = new Uri(host);
+ IHttpClientBuilder httpClientBuilder = services
+ .AddHttpApi(o =>
+ {
+ o.HttpHost = uri;
+ o.UseDefaultUserAgent = false;
+ })
+ .ConfigureHttpClient((sp, c) =>
+ {
+ c.DefaultRequestHeaders.Add("User-Agent",
+ sp.GetRequiredService>().CurrentValue.UserAgent);
+ })
+ .AddHttpMessageHandler()
+ .AddPolicyHandler(GetRetryPolicy());
+
+ if (withCookie)
+ httpClientBuilder.ConfigureHttpClient((sp, c) =>
+ {
+ var ck = sp.GetRequiredService();
+ c.DefaultRequestHeaders.Add("Cookie", ck.ToString());
});
- services.AddTransient();
-
- //全局代理
- services.SetGlobalProxy(configuration);
-
- //DelegatingHandler
- services.Scan(scan => scan
- .FromAssemblyOf()
- .AddClasses(classes => classes.AssignableTo())
- .AsSelf()
- .WithTransientLifetime()
- );
-
- //bilibli
- services.AddBiliBiliClientApi("https://api.bilibili.com");
- services.AddBiliBiliClientApi("https://api.bilibili.com");
- services.AddBiliBiliClientApi("https://manga.bilibili.com");
- services.AddBiliBiliClientApi("https://account.bilibili.com");
- services.AddBiliBiliClientApi("https://api.live.bilibili.com");
- services.AddBiliBiliClientApi("https://api.bilibili.com");
- 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);
-
- // 添加注入
- services.AddBiliBiliClientApi("https://api.bilibili.com");
- services.AddBiliBiliClientApi("https://show.bilibili.com");
-
- //qinglong
- var qinglongHost = configuration["QL_URL"] ?? "http://localhost:5600";
- services
- .AddHttpApi(o =>
- {
- o.HttpHost = new Uri(qinglongHost);
- o.UseDefaultUserAgent = false;
- })
- .ConfigureHttpClient((sp, c) =>
- {
- c.DefaultRequestHeaders.Add("User-Agent",
- sp.GetRequiredService>().CurrentValue.UserAgent);
- })
- .AddPolicyHandler(GetRetryPolicy());
- return services;
- }
+ return services;
+ }
- ///
- /// 封装Refit,默认将Cookie添加到Header中
- ///
- ///
- ///
- ///
- ///
- private static IServiceCollection AddBiliBiliClientApi(this IServiceCollection services, string host, bool withCookie = true)
- where TInterface : class
+ ///
+ /// 设置全局代理(如果配置了代理)
+ ///
+ ///
+ ///
+ private static IServiceCollection SetGlobalProxy(this IServiceCollection services, IConfiguration configuration)
+ {
+ string proxyAddress = configuration["Security:WebProxy"];
+ if (proxyAddress.IsNotNullOrEmpty())
{
- var uri = new Uri(host);
- IHttpClientBuilder httpClientBuilder = services
- .AddHttpApi(o =>
- {
- o.HttpHost = uri;
- o.UseDefaultUserAgent = false;
- })
- .ConfigureHttpClient((sp, c) =>
- {
- c.DefaultRequestHeaders.Add("User-Agent",
- sp.GetRequiredService>().CurrentValue.UserAgent);
- })
- .AddHttpMessageHandler()
- .AddPolicyHandler(GetRetryPolicy());
-
- if (withCookie)
- httpClientBuilder.ConfigureHttpClient((sp, c) =>
- {
- var ck = sp.GetRequiredService();
- c.DefaultRequestHeaders.Add("Cookie", ck.ToString());
- });
-
- return services;
- }
+ WebProxy webProxy = new WebProxy();
- ///
- /// 设置全局代理(如果配置了代理)
- ///
- ///
- ///
- private static IServiceCollection SetGlobalProxy(this IServiceCollection services, IConfiguration configuration)
- {
- string proxyAddress = configuration["Security:WebProxy"];
- if (proxyAddress.IsNotNullOrEmpty())
+ //user:password@host:port http proxy only .Tested with tinyproxy-1.11.0-rc1
+ if (proxyAddress.Contains("@"))
{
- WebProxy webProxy = new WebProxy();
+ string userPass = proxyAddress.Split("@")[0];
+ string address = proxyAddress.Split("@")[1];
- //user:password@host:port http proxy only .Tested with tinyproxy-1.11.0-rc1
- if (proxyAddress.Contains("@"))
- {
- string userPass = proxyAddress.Split("@")[0];
- string address = proxyAddress.Split("@")[1];
-
- string proxyUser = "";
- string proxyPass = "";
- if (userPass.Contains(":"))
- {
- proxyUser = userPass?.Split(":")[0];
- proxyPass = userPass?.Split(":")[1];
- }
-
- webProxy.Address = new Uri("http://" + address);
- webProxy.Credentials = new NetworkCredential(proxyUser, proxyPass);
- }
- else
+ string proxyUser = "";
+ string proxyPass = "";
+ if (userPass.Contains(":"))
{
- webProxy.Address = new Uri(proxyAddress);
+ proxyUser = userPass?.Split(":")[0];
+ proxyPass = userPass?.Split(":")[1];
}
- HttpClient.DefaultProxy = webProxy;
+ webProxy.Address = new Uri("http://" + address);
+ webProxy.Credentials = new NetworkCredential(proxyUser, proxyPass);
+ }
+ else
+ {
+ webProxy.Address = new Uri(proxyAddress);
}
- return services;
+ HttpClient.DefaultProxy = webProxy;
}
- static IAsyncPolicy GetRetryPolicy()
- {
- return HttpPolicyExtensions
- .HandleTransientHttpError()
- .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
- .WaitAndRetryAsync(1, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
- retryAttempt)));
- }
+ return services;
+ }
+
+ static IAsyncPolicy GetRetryPolicy()
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(1, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
+ retryAttempt)));
}
}
diff --git a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs
index 6d4f63c81..bd8276b31 100644
--- a/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs
+++ b/src/Ray.BiliBiliTool.Application/VipBigPointAppService.cs
@@ -62,7 +62,7 @@ public VipBigPointAppService(
public async Task VipExpress()
{
_logger.LogInformation("大会员经验领取任务开始");
- var re = await _vipApi.GetVouchersInfo();
+ var re = await _vipApi.GetVouchersInfoAsync();
if (re.Code == 0)
{
var state = re.Data.List.Find(x => x.Type == 9).State;
@@ -85,7 +85,7 @@ public async Task VipExpress()
case 0:
_logger.LogInformation("大会员经验未兑换");
//兑换api
- var response = await _vipApi.GetVipExperience(new VipExperienceRequest()
+ var response = await _vipApi.ObtainVipExperienceAsync(new VipExperienceRequest()
{
csrf = _biliCookie.BiliJct
});
@@ -118,7 +118,7 @@ public override async Task DoTaskAsync(CancellationToken cancellationToken)
return;
}
- var re = await _vipApi.GetTaskList();
+ var re = await _vipApi.GetTaskListAsync();
if (re.Code != 0) throw new Exception(re.ToJsonStr());
@@ -177,11 +177,11 @@ private async Task Sign(VipTaskInfo info)
return info;
}
- var re = await _vipApi.Sign(new SignRequest());
+ var re = await _vipApi.SignAsync(new SignRequest());
if (re.Code != 0) throw new Exception(re.ToJsonStr());
//确认
- var infoResult = await _vipApi.GetTaskList();
+ var infoResult = await _vipApi.GetTaskListAsync();
if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr());
info = infoResult.Data;
@@ -217,7 +217,7 @@ private async Task Bonus(VipTaskInfo info)
//确认
if (re)
{
- var infoResult = await _vipApi.GetTaskList();
+ var infoResult = await _vipApi.GetTaskListAsync();
if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr());
info = infoResult.Data;
bonusTask = GetTarget(info);
@@ -260,7 +260,7 @@ private async Task Privilege(VipTaskInfo info)
//确认
if (re)
{
- var infoResult = await _vipApi.GetTaskList();
+ var infoResult = await _vipApi.GetTaskListAsync();
if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr());
info = infoResult.Data;
privilegeTask = GetTarget(info);
@@ -305,7 +305,7 @@ private async Task ViewAnimate(VipTaskInfo info)
//确认
if (re)
{
- var infoResult = await _vipApi.GetTaskList();
+ var infoResult = await _vipApi.GetTaskListAsync();
if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr());
info = infoResult.Data;
targetTask = GetTarget(info);
@@ -343,7 +343,7 @@ private async Task ViewVipMall(VipTaskInfo info)
}
_logger.LogInformation("开始完成任务");
- var re = await _vipMallApi.ViewVipMall(new ViewVipMallRequest()
+ var re = await _vipMallApi.ViewVipMallAsync(new ViewVipMallRequest()
{
Csrf = _biliCookie.BiliJct
});
@@ -352,7 +352,7 @@ private async Task ViewVipMall(VipTaskInfo info)
//确认
if (re.Code == 0)
{
- var infoResult = await _vipApi.GetTaskList();
+ var infoResult = await _vipApi.GetTaskListAsync();
if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr());
info = infoResult.Data;
targetTask = GetTarget(info);
@@ -490,7 +490,7 @@ private async Task ViewDressMall(VipTaskInfo info)
//确认
if (re)
{
- var infoResult = await _vipApi.GetTaskList();
+ var infoResult = await _vipApi.GetTaskListAsync();
if (infoResult.Code != 0) throw new Exception(infoResult.ToJsonStr());
info = infoResult.Data;
targetTask = GetTarget(info);
@@ -534,7 +534,7 @@ private async Task TryReceive(string taskCode)
private async Task Complete(string taskCode)
{
var request = new ReceiveOrCompleteTaskRequest(taskCode);
- var re = await _vipApi.Complete(request);
+ var re = await _vipApi.CompleteAsync(request);
if (re.Code == 0)
{
_logger.LogInformation("已完成");
diff --git a/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs b/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs
index e6d12dae5..c37ba98b4 100644
--- a/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/AccountDomainService.cs
@@ -88,7 +88,7 @@ public async Task LoginByCookie()
public async Task GetDailyTaskStatus()
{
DailyTaskInfo result = new();
- BiliApiResponse apiResponse = await _dailyTaskApi.GetDailyTaskRewardInfo();
+ BiliApiResponse apiResponse = await _dailyTaskApi.GetDailyTaskRewardInfoAsync();
if (apiResponse.Code == 0)
{
_logger.LogDebug("请求本日任务完成状态成功");
@@ -97,7 +97,7 @@ public async Task GetDailyTaskStatus()
else
{
_logger.LogWarning("获取今日任务完成状态失败:{result}", apiResponse.ToJsonStr());
- result = (await _dailyTaskApi.GetDailyTaskRewardInfo()).Data;
+ result = (await _dailyTaskApi.GetDailyTaskRewardInfoAsync()).Data;
//todo:偶发性请求失败,再请求一次,这么写很丑陋,待用polly再框架层面实现
}
diff --git a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs
index 2ff253492..79ec73510 100644
--- a/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/ArticleDomainService.cs
@@ -10,6 +10,7 @@
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
using Ray.BiliBiliTool.Config.Options;
using Ray.BiliBiliTool.DomainService.Interfaces;
@@ -23,7 +24,7 @@ public class ArticleDomainService : IArticleDomainService
private readonly DailyTaskOptions _dailyTaskOptions;
private readonly ICoinDomainService _coinDomainService;
private readonly IAccountApi _accountApi;
- private readonly IWbiDomainService _wbiDomainService;
+ private readonly IWbiService _wbiService;
///
@@ -42,21 +43,21 @@ public ArticleDomainService(
ILogger logger,
IOptionsMonitor dailyTaskOptions,
ICoinDomainService coinDomainService,
- IAccountApi accountApi, IWbiDomainService wbiDomainService)
+ IAccountApi accountApi, IWbiService wbiService)
{
_articleApi = articleApi;
_biliCookie = biliCookie;
_logger = logger;
_coinDomainService = coinDomainService;
_accountApi = accountApi;
- _wbiDomainService = wbiDomainService;
+ _wbiService = wbiService;
_dailyTaskOptions = dailyTaskOptions.CurrentValue;
}
public async Task LikeArticle(long cvid)
{
- await _articleApi.Like(cvid, _biliCookie.BiliJct);
+ await _articleApi.LikeAsync(cvid, _biliCookie.BiliJct);
}
///
@@ -117,7 +118,7 @@ public async Task AddCoinForArticles()
}
- _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0);
+ _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalanceAsync()).Data.Money ?? 0);
return true;
}
@@ -135,7 +136,7 @@ public async Task AddCoinForArticle(long cvid, long mid)
try
{
var refer = $"https://www.bilibili.com/read/cv{cvid}/?from=search&spm_id_from=333.337.0.0";
- result = await _articleApi.AddCoinForArticle(new AddCoinForArticleRequest(cvid, mid, _biliCookie.BiliJct),
+ result = await _articleApi.AddCoinForArticleAsync(new AddCoinForArticleRequest(cvid, mid, _biliCookie.BiliJct),
refer);
}
catch (Exception)
@@ -183,18 +184,9 @@ private async Task GetRandomArticleFromUp(long mid)
ps = 1,
pn = new Random().Next(1, articleCount + 1)
};
- var w_ridDto = await _wbiDomainService.GetWridAsync(req);
+ await _wbiService.SetWridAsync(req);
- var fullDto = new SearchArticlesByUpIdFullDto()
- {
- mid = mid,
- ps = req.ps,
- pn = req.pn,
- w_rid = w_ridDto.w_rid,
- wts = w_ridDto.wts
- };
-
- BiliApiResponse re = await _articleApi.SearchUpArticlesByUpId(fullDto);
+ BiliApiResponse re = await _articleApi.SearchUpArticlesByUpIdAsync(req);
if (re.Code != 0)
{
@@ -264,16 +256,9 @@ private async Task GetArticleCountOfUp(long mid)
mid = mid
};
- var w_ridDto = await _wbiDomainService.GetWridAsync(req);
-
- var fullDto = new SearchArticlesByUpIdFullDto()
- {
- mid = mid,
- w_rid = w_ridDto.w_rid,
- wts = w_ridDto.wts
- };
+ await _wbiService.SetWridAsync(req);
- BiliApiResponse re = await _articleApi.SearchUpArticlesByUpId(fullDto);
+ BiliApiResponse re = await _articleApi.SearchUpArticlesByUpIdAsync(req);
if (re.Code != 0)
{
@@ -376,7 +361,7 @@ private async Task IsCanDonate(long cvid)
if (!_alreadyDonatedCoinCountCatch.TryGetValue(cvid.ToString(), out int multiply))
{
- multiply = (await _articleApi.SearchArticleInfo(cvid)).Data.Coin;
+ multiply = (await _articleApi.SearchArticleInfoAsync(cvid)).Data.Coin;
_alreadyDonatedCoinCountCatch.TryAdd(cvid.ToString(), multiply);
}
diff --git a/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs
index 37fec6205..486d26f56 100644
--- a/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/ChargeDomainService.cs
@@ -88,7 +88,7 @@ public async Task Charge(UserInfo userInfo)
var request = new ChargeRequest(couponBalance, long.Parse(targetUpId), _cookie.BiliJct);
//BiliApiResponse response = await _chargeApi.Charge(decimal.ToInt32(couponBalance * 10), _dailyTaskOptions.AutoChargeUpId, _cookieOptions.UserId, _cookieOptions.BiliJct);
- BiliApiResponse response = await _chargeApi.ChargeV2(request);
+ BiliApiResponse response = await _chargeApi.ChargeV2Async(request);
if (response.Code == 0)
{
@@ -123,7 +123,7 @@ public async Task ChargeComments(string orderNum)
{
var comment = _dailyTaskOptions.ChargeComment ?? "";
var request = new ChargeCommentRequest(orderNum, comment, _cookie.BiliJct);
- await _chargeApi.ChargeComment(request);
+ await _chargeApi.ChargeCommentAsync(request);
_logger.LogInformation("【留言】{comment}", comment);
}
diff --git a/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs
index 4eb8c6461..c8228ab2d 100644
--- a/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/CoinDomainService.cs
@@ -27,7 +27,7 @@ IDailyTaskApi dailyTaskApi
///
public async Task GetCoinBalance()
{
- var response = await _accountApi.GetCoinBalance();
+ var response = await _accountApi.GetCoinBalanceAsync();
return response.Data.Money ?? 0;
}
@@ -47,7 +47,7 @@ public async Task GetDonatedCoins()
///
private async Task GetDonateCoinExp()
{
- return (await _dailyTaskApi.GetDonateCoinExp()).Data;
+ return (await _dailyTaskApi.GetDonateCoinExpAsync()).Data;
}
#endregion
}
diff --git a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs
index c989c595f..7e3eb9b70 100644
--- a/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs
@@ -128,7 +128,7 @@ public async Task AddCoinsForVideos()
else
_logger.LogInformation("投币尝试超过10次,已终止");
- _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalance()).Data.Money ?? 0);
+ _logger.LogInformation("【硬币余额】{coin}", (await _accountApi.GetCoinBalanceAsync()).Data.Money ?? 0);
}
///
diff --git a/src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs b/src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs
deleted file mode 100644
index a865fe5ea..000000000
--- a/src/Ray.BiliBiliTool.DomainService/Interfaces/IWbiDomainService.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
-
-namespace Ray.BiliBiliTool.DomainService.Interfaces
-{
- ///
- /// 账户
- ///
- public interface IWbiDomainService : IDomainService
- {
- ///
- /// 获取WbiKey
- ///
- ///
- Task GetWridAsync(object ob);
-
- Task GetWbiKeysAsync();
-
- string GetMixinKey(string orig);
-
- WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan = 0);
- }
-}
diff --git a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs
index 6cf387596..7acdc3ec3 100644
--- a/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/LiveDomainService.cs
@@ -11,6 +11,7 @@
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Live;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Relation;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
using Ray.BiliBiliTool.Config.Options;
using Ray.BiliBiliTool.DomainService.Dtos;
using Ray.BiliBiliTool.DomainService.Interfaces;
@@ -33,7 +34,7 @@ public class LiveDomainService : ILiveDomainService
private readonly DailyTaskOptions _dailyTaskOptions;
private readonly SecurityOptions _securityOptions;
private readonly BiliCookie _biliCookie;
- private readonly IWbiDomainService _wbiDomainService;
+ private readonly IWbiService _wbiService;
public LiveDomainService(ILogger logger,
ILiveApi liveApi,
@@ -44,7 +45,7 @@ public LiveDomainService(ILogger logger,
IOptionsMonitor liveLotteryTaskOptions,
IOptionsMonitor liveFansMedalTaskOptions,
IOptionsMonitor securityOptions,
- IWbiDomainService wbiDomainService,
+ IWbiService wbiService,
BiliCookie biliCookie)
{
_logger = logger;
@@ -56,7 +57,7 @@ public LiveDomainService(ILogger logger,
_dailyTaskOptions = dailyTaskOptions.CurrentValue;
_liveFansMedalTaskOptions = liveFansMedalTaskOptions.CurrentValue;
_securityOptions = securityOptions.CurrentValue;
- _wbiDomainService = wbiDomainService;
+ _wbiService = wbiService;
_biliCookie = biliCookie;
}
@@ -413,16 +414,9 @@ public async Task SendDanmakuToFansMedalLive()
{
mid = liveHostUserId
};
+ await _wbiService.SetWridAsync(req);
-
- var w_ridDto = await _wbiDomainService.GetWridAsync(req);
- var fullDto = new GetSpaceInfoFullDto()
- {
- mid = liveHostUserId,
- w_rid = w_ridDto.w_rid,
- wts = w_ridDto.wts
- };
- var spaceInfo = await _userInfoApi.GetSpaceInfo(fullDto);
+ var spaceInfo = await _userInfoApi.GetSpaceInfo(req);
if (spaceInfo.Code != 0)
{
_logger.LogError("【获取直播间信息】失败");
@@ -597,16 +591,9 @@ private async Task> GetFansMedalInfoList()
{
mid = liveHostUserId
};
+ await _wbiService.SetWridAsync(req);
-
- var w_ridDto = await _wbiDomainService.GetWridAsync(req);
- var fullDto = new GetSpaceInfoFullDto()
- {
- mid = liveHostUserId,
- w_rid = w_ridDto.w_rid,
- wts = w_ridDto.wts
- };
- var spaceInfo = await _userInfoApi.GetSpaceInfo(fullDto);
+ var spaceInfo = await _userInfoApi.GetSpaceInfo(req);
if (spaceInfo.Code != 0)
{
_logger.LogError("【获取空间信息】失败");
diff --git a/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs b/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs
index 90c3d3925..35a809451 100644
--- a/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/VideoDomainService.cs
@@ -8,6 +8,7 @@
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
using Ray.BiliBiliTool.Config;
using Ray.BiliBiliTool.Config.Options;
using Ray.BiliBiliTool.DomainService.Dtos;
@@ -28,7 +29,7 @@ public class VideoDomainService : IVideoDomainService
private readonly IRelationApi _relationApi;
private readonly IVideoApi _videoApi;
private readonly IVideoWithoutCookieApi _videoWithoutCookieApi;
- private readonly IWbiDomainService _wbiDomainService;
+ private readonly IWbiService _wbiService;
public VideoDomainService(
ILogger logger,
@@ -39,7 +40,7 @@ public VideoDomainService(
IRelationApi relationApi,
IVideoApi videoApi,
IVideoWithoutCookieApi videoWithoutCookieApi,
- IWbiDomainService wbiDomainService
+ IWbiService wbiService
)
{
_logger = logger;
@@ -47,7 +48,7 @@ IWbiDomainService wbiDomainService
_relationApi = relationApi;
_videoApi = videoApi;
_videoWithoutCookieApi = videoWithoutCookieApi;
- _wbiDomainService = wbiDomainService;
+ _wbiService = wbiService;
_biliBiliCookie = biliBiliCookie;
_expDic = dicOptions.Get(Constants.OptionsNames.ExpDictionaryName);
_dailyTaskOptions = dailyTaskOptions.CurrentValue;
@@ -86,20 +87,9 @@ public async Task GetRandomVideoOfUp(long upId, int total)
ps = 1,
pn= new Random().Next(1, total + 1)
};
+ await _wbiService.SetWridAsync(req);
- var w_ridDto = await _wbiDomainService.GetWridAsync(req);
-
- var fullDto = new SearchVideosByUpIdFullDto
- {
- mid = upId,
- ps = req.ps,
- pn = req.pn,
-
- w_rid = w_ridDto.w_rid,
- wts = w_ridDto.wts,
- };
-
- BiliApiResponse re = await _videoApi.SearchVideosByUpId(fullDto);
+ BiliApiResponse re = await _videoApi.SearchVideosByUpId(req);
if (re.Code != 0)
{
@@ -120,17 +110,9 @@ public async Task GetVideoCountOfUp(long upId)
{
mid = upId
};
+ await _wbiService.SetWridAsync(req);
- var w_ridDto = await _wbiDomainService.GetWridAsync(req);
-
- var fullDto = new SearchVideosByUpIdFullDto
- {
- mid = upId,
- w_rid = w_ridDto.w_rid,
- wts = w_ridDto.wts,
- };
-
- BiliApiResponse re = await _videoApi.SearchVideosByUpId(fullDto);
+ BiliApiResponse re = await _videoApi.SearchVideosByUpId(req);
if (re.Code != 0)
{
throw new Exception(re.Message);
diff --git a/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs b/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs
index 2740c9ffe..b64759c7f 100644
--- a/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs
+++ b/src/Ray.BiliBiliTool.DomainService/VipPrivilegeDomainService.cs
@@ -70,8 +70,8 @@ public async Task ReceiveVipPrivilege(UserInfo userInfo)
}
*/
- var suc1 = await ReceiveVipPrivilege(1);
- var suc2 = await ReceiveVipPrivilege(2);
+ var suc1 = await ReceiveVipPrivilege(VipPrivilegeType.BCoinCoupon);
+ var suc2 = await ReceiveVipPrivilege(VipPrivilegeType.MembershipBenefits);
if (suc1 | suc2) return true;
return false;
@@ -83,9 +83,9 @@ public async Task ReceiveVipPrivilege(UserInfo userInfo)
/// 领取大会员每月赠送福利
///
/// 1.大会员B币券;2.大会员福利
- private async Task ReceiveVipPrivilege(int type)
+ private async Task ReceiveVipPrivilege(VipPrivilegeType type)
{
- var response = await _dailyTaskApi.ReceiveVipPrivilege(type, _biliBiliCookie.BiliJct);
+ var response = await _dailyTaskApi.ReceiveVipPrivilegeAsync((int)type, _biliBiliCookie.BiliJct);
var name = GetPrivilegeName(type);
_logger.LogInformation("【领取】{name}", name);
@@ -108,14 +108,14 @@ private async Task ReceiveVipPrivilege(int type)
///
///
///
- private string GetPrivilegeName(int type)
+ private string GetPrivilegeName(VipPrivilegeType type)
{
switch (type)
{
- case 1:
+ case VipPrivilegeType.BCoinCoupon:
return "年度大会员每月赠送的B币券";
- case 2:
+ case VipPrivilegeType.MembershipBenefits:
return "大会员福利/权益";
}
diff --git a/src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs b/src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs
deleted file mode 100644
index 5700da450..000000000
--- a/src/Ray.BiliBiliTool.DomainService/WbiDomainService.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Security.Cryptography;
-using System.Text.RegularExpressions;
-using System.Text;
-using System.Threading.Tasks;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using Ray.BiliBiliTool.Agent;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Relation;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
-using Ray.BiliBiliTool.Config;
-using Ray.BiliBiliTool.Config.Options;
-using Ray.BiliBiliTool.DomainService.Interfaces;
-using System.Reflection;
-using Ray.BiliBiliTool.Infrastructure.Helpers;
-
-namespace Ray.BiliBiliTool.DomainService
-{
- ///
- /// 账户
- ///
- public class WbiDomainService : IWbiDomainService
- {
- private readonly ILogger _logger;
- private readonly IDailyTaskApi _dailyTaskApi;
- private readonly IUserInfoApi _userInfoApi;
- private readonly IRelationApi _relationApi;
- private readonly UnfollowBatchedTaskOptions _unfollowBatchedTaskOptions;
- private readonly BiliCookie _cookie;
-
- public WbiDomainService(
- ILogger logger,
- IDailyTaskApi dailyTaskApi,
- BiliCookie cookie,
- IUserInfoApi userInfoApi,
- IRelationApi relationApi,
- IOptionsMonitor unfollowBatchedTaskOptions
- )
- {
- _logger = logger;
- _dailyTaskApi = dailyTaskApi;
- _cookie = cookie;
- _userInfoApi = userInfoApi;
- _relationApi = relationApi;
- _unfollowBatchedTaskOptions = unfollowBatchedTaskOptions.CurrentValue;
- }
-
- public async Task GetWridAsync(object ob)
- {
- var parameters = ObjectHelper.ObjectToDictionary(ob);
-
- var wbi = await GetWbiKeysAsync();
-
- var re = EncWbi(parameters, wbi.GetImgKey(), wbi.GetSubKey());
-
- return re;
- }
-
- public async Task GetWbiKeysAsync()
- {
- BiliApiResponse apiResponse = await _userInfoApi.LoginByCookie();
-
- UserInfo useInfo = apiResponse.Data;
-
- _logger.LogDebug("【img_url】{0}", useInfo.Wbi_img?.img_url);
- _logger.LogDebug("【sub_url】{0}", useInfo.Wbi_img?.sub_url);
-
- return useInfo.Wbi_img;
- }
-
- ///
- /// 对 imgKey 和 subKey 进行字符顺序打乱编码
- ///
- ///
- ///
- public string GetMixinKey(string orig)
- {
- int[] mixinKeyEncTab = new int[]
- {
- 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
- 33, 9, 42, 19, 29, 28, 14, 39,12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
- 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,
- 36, 20, 34, 44, 52
- };
-
- var temp = new StringBuilder();
- foreach (var index in mixinKeyEncTab)
- {
- temp.Append(orig[index]);
- }
- return temp.ToString().Substring(0, 32);
- }
-
- ///
- /// 为请求参数进行 wbi 签名
- ///
- ///
- ///
- ///
- ///
- public WridDto EncWbi(Dictionary parameters, string imgKey, string subKey, long timespan=0)
- {
- WridDto re=new WridDto();
-
- var mixinKey = GetMixinKey(imgKey + subKey);
-
- if (timespan == 0)
- {
- re.wts = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
- }
- else
- {
- re.wts = timespan;
- }
-
- var chrFilter = new Regex("[!'()*]");
-
- var dic=new Dictionary();
- dic.Add("wts", re.wts.ToString());
-
- foreach (var entry in parameters)
- {
- var key = entry.Key;
- var value = entry.Value.ToString();
-
- var encodedValue = chrFilter.Replace(value, "");
-
- dic.Add(Uri.EscapeDataString(key), Uri.EscapeDataString(encodedValue));
- }
-
- var keyList= dic.Keys.ToList();
- keyList.Sort();
-
- var queryList = new List();
- foreach (var item in keyList)
- {
- var value = dic[item];
- queryList.Add($"{item}={value}");
- }
-
- var queryString = string.Join("&", queryList);
- var md5Hasher = MD5.Create();
- var hashStr = queryString + mixinKey;
- var hashedQueryString = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(hashStr));
- var wbiSign = BitConverter.ToString(hashedQueryString).Replace("-", "").ToLower();
-
- re.w_rid = wbiSign;
-
- return re;
- }
- }
-
- public class WridDto
- {
- public long wts { get; set; }
-
- public string w_rid { get; set; }
- }
-}
diff --git a/test/BiliAgentTest/LiveApiTest.cs b/test/BiliAgentTest/LiveApiTest.cs
index 5cbf686d8..6aabd4b27 100644
--- a/test/BiliAgentTest/LiveApiTest.cs
+++ b/test/BiliAgentTest/LiveApiTest.cs
@@ -10,7 +10,7 @@
using System.Threading.Tasks;
using Ray.BiliBiliTool.Infrastructure.Cookie;
using Xunit;
-using Ray.BiliBiliTool.DomainService.Interfaces;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
namespace BiliAgentTest
{
@@ -132,25 +132,17 @@ public async Task GetSpaceInfo_Normal_Success()
var api = scope.ServiceProvider.GetRequiredService();
var biliCookie = scope.ServiceProvider.GetRequiredService();
- var domainService = scope.ServiceProvider.GetRequiredService();
+ var wbiService = scope.ServiceProvider.GetRequiredService();
var req = new GetSpaceInfoDto()
{
mid = 919174L
};
- var w_ridDto = await domainService.GetWridAsync(req);
-
- var fullDto = new GetSpaceInfoFullDto()
- {
- mid = 919174L,
- w_rid = w_ridDto.w_rid,
- wts = w_ridDto.wts
- };
-
+ await wbiService.SetWridAsync(req);
- BiliApiResponse re = api.GetSpaceInfo(fullDto).Result;
+ BiliApiResponse re = api.GetSpaceInfo(req).Result;
Assert.True(re.Code == 0);
Assert.NotNull(re.Data);
diff --git a/test/BiliAgentTest/VideoApiTest.cs b/test/BiliAgentTest/VideoApiTest.cs
index 512d35133..4058926a2 100644
--- a/test/BiliAgentTest/VideoApiTest.cs
+++ b/test/BiliAgentTest/VideoApiTest.cs
@@ -1,69 +1,64 @@
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 System;
-using System.Diagnostics;
using System.Threading.Tasks;
using Ray.BiliBiliTool.Infrastructure.Cookie;
using Xunit;
-namespace BiliAgentTest
+namespace BiliAgentTest;
+
+public class VideoApiTest
{
- public class VideoApiTest
+ public VideoApiTest()
{
- public VideoApiTest()
- {
- Program.CreateHost(new[] { "--ENVIRONMENT=Development" });//Ĭ��Prd����������ָ��ΪDev���Զ�ȡ���û���������
- }
+ Program.CreateHost(new[] { "--ENVIRONMENT=Development" });
+ }
- [Fact]
- public void GetLiveWalletStatus_Normal_Success()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
+ [Fact]
+ public void GetLiveWalletStatus_Normal_Success()
+ {
+ using var scope = Global.ServiceProviderRoot.CreateScope();
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
+ var ck = scope.ServiceProvider.GetRequiredService();
+ var api = scope.ServiceProvider.GetRequiredService();
- var req = new GetAlreadyDonatedCoinsRequest(248097491);
- BiliApiResponse? re = api.GetDonatedCoinsForVideo(req).Result;
+ var req = new GetAlreadyDonatedCoinsRequest(248097491);
+ BiliApiResponse? re = api.GetDonatedCoinsForVideo(req).Result;
- if (ck.Count > 0)
- {
- Assert.True(re.Code == 0 && re.Data.Multiply >= 0);
- }
- else
- {
- Assert.False(re.Code != 0);
- }
+ if (ck.Count > 0)
+ {
+ Assert.True(re.Code == 0 && re.Data.Multiply >= 0);
}
-
- [Fact]
- public async Task GetBangumiTest()
+ else
{
+ Assert.False(re.Code != 0);
+ }
+ }
+
+ [Fact]
+ public async Task GetBangumiTest()
+ {
- using var scope = Global.ServiceProviderRoot.CreateScope();
+ using var scope = Global.ServiceProviderRoot.CreateScope();
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
- var req = await api.GetBangumiBySsid(46508);
+ var ck = scope.ServiceProvider.GetRequiredService();
+ var api = scope.ServiceProvider.GetRequiredService();
+ var req = await api.GetBangumiBySsid(46508);
- Assert.Equal(0,req.Code);
- }
-
- [Fact]
- public async Task GetRandomVideoOfRanking()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
+ Assert.Equal(0,req.Code);
+ }
+
+ [Fact]
+ public async Task GetRandomVideoOfRanking()
+ {
+ using var scope = Global.ServiceProviderRoot.CreateScope();
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
- var req = await api.GetRegionRankingVideosV2();
+ var ck = scope.ServiceProvider.GetRequiredService();
+ var api = scope.ServiceProvider.GetRequiredService();
+ var req = await api.GetRegionRankingVideosV2();
- Assert.Equal(0, req.Code);
- }
+ Assert.Equal(0, req.Code);
}
}
diff --git a/test/BiliAgentTest/VipApiTest.cs b/test/BiliAgentTest/VipApiTest.cs
deleted file mode 100644
index 793fa0531..000000000
--- a/test/BiliAgentTest/VipApiTest.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System.Threading.Tasks;
-using Xunit;
-using Microsoft.Extensions.DependencyInjection;
-using Ray.BiliBiliTool.Agent;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask;
-using Ray.BiliBiliTool.Console;
-using Ray.BiliBiliTool.Infrastructure;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
-using Xunit.Abstractions;
-using System;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall;
-
-namespace BiliAgentTest;
-
-public class VipApiTest
-{
- private readonly ITestOutputHelper _output;
- public VipApiTest(ITestOutputHelper output)
- {
- _output = output;
- Program.CreateHost(new[] { "--ENVIRONMENT=Development" });
- }
-
- [Fact]
- public async Task SignTaskTest()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
-
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
-
- var re = await api.Sign(new SignRequest()
- {
- // Csrf = ck.BiliJct
- });
- _output.WriteLine(re.ToJsonStr());
- Assert.Equal(0, re.Code);
- }
-
- [Fact]
- public async Task VipInfoTest()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
-
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
-
- var re = await api.GetVouchersInfo();
- if (re.Code == 0)
- {
- var info = re.Data.List.Find(x => x.Type == 9);
- if (info != null)
- {
- _output.WriteLine(info.State.ToString());
- }
- else
- {
- _output.WriteLine("error");
- }
- }
- }
-
-
- [Fact]
- public async Task GetVipExperienceTest()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
-
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
- var re = await api.GetVipExperience(new VipExperienceRequest()
- {
- csrf = ck.BiliJct
- });
-
- _output.WriteLine(re.Message);
- }
-
- [Fact]
- public async Task ViewVipMallTest()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
-
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
- // var test = await api.ViewvipMall("{\r\n\"csrf\":\"33e5d4564b6b69cb4ed829bc404158cb\",\r\n\"eventId\":\"hevent_oy4b7h3epeb\"\r\n}");
- var re = await api.ViewVipMall(new ViewVipMallRequest()
- {
- Csrf = ck.BiliJct,
- EventId = "hevent_oy4b7h3epeb"
- });
- _output.WriteLine(re.Message);
-
- }
-
- [Fact]
- public async Task DressViewTest()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
-
- var ck = scope.ServiceProvider.GetRequiredService();
- var api = scope.ServiceProvider.GetRequiredService();
- var re = await api.Complete(new ReceiveOrCompleteTaskRequest(
- "dress-view"));
- _output.WriteLine(re.Message);
- }
-}
diff --git a/test/DomainServiceTest/WbiDomainServiceTest.cs b/test/DomainServiceTest/WbiDomainServiceTest.cs
deleted file mode 100644
index 2ae0008db..000000000
--- a/test/DomainServiceTest/WbiDomainServiceTest.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
-using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video;
-using Ray.BiliBiliTool.Infrastructure.Helpers;
-using Ray.Infrastructure.Helpers;
-
-namespace DomainServiceTest
-{
- public class WbiDomainServiceTest
- {
- public WbiDomainServiceTest()
- {
- Program.CreateHost(new[] { "--ENVIRONMENT=Development" });
- }
-
- [Fact]
- public async Task EncWbi_Test()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
- var config = Global.ConfigurationRoot;
- var domainService = scope.ServiceProvider.GetRequiredService();
-
- var upId = 1585227649;
-
- var req = new SearchVideosByUpIdDto()
- {
- mid = upId,
- ps = 30,
- tid = 0,
- pn = 1,
- keyword = "",
- order = "pubdate",
- platform = "web",
- web_location = 1550101,
- order_avoided = "true"
- };
-
- //var wbiDto= await domainService.GetWbiKeysAsync();
- WbiImg wbiDto= new WbiImg()
- {
- img_url = "https://i0.hdslb.com/bfs/wbi/9cd4224d4fe74c7e9d6963e2ef891688.png",
- sub_url = "https://i0.hdslb.com/bfs/wbi/263655ae2cad4cce95c9c401981b044a.png"
- };
- var dic = ObjectHelper.ObjectToDictionary(req);
- //dic.Remove("keyword");
- var re = domainService.EncWbi(dic, wbiDto.GetImgKey(),wbiDto.GetSubKey(), 1684866934);
-
- Assert.Equal(re.w_rid, "8dca01c5633c1ed8cda9566b8502ca03");
- }
-
- [Fact]
- public async Task EncWbi_Test2()
- {
- using var scope = Global.ServiceProviderRoot.CreateScope();
- var domainService = scope.ServiceProvider.GetRequiredService();
-
- WbiImg wbiDto = new WbiImg()
- {
- img_url= "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png",
- sub_url = "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png"
- };
- var dic = new Dictionary()
- {
- {"foo", "114"},
- {"bar", "514"},
- {"baz", "1919810"},
- };
- var re = domainService.EncWbi(dic, wbiDto.GetImgKey(), wbiDto.GetSubKey(), 1684746387);
-
- Assert.Equal(re.w_rid, "d3cbd2a2316089117134038bf4caf442");
- }
- }
-}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs
new file mode 100644
index 000000000..dbb419d08
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/AccountApiTests.cs
@@ -0,0 +1,38 @@
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Console;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class AccountApiTests
+{
+ private readonly IAccountApi _api;
+
+ public AccountApiTests()
+ {
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _api = host.Services.GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetCoinBalance_Normal_GetCoinBalance()
+ {
+ // Act
+ BiliApiResponse re = await _api.GetCoinBalanceAsync();
+
+ // Arrange
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Money.Should().IsNotNull();
+ }
+}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs
new file mode 100644
index 000000000..9697c19df
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ArticleApiTests.cs
@@ -0,0 +1,145 @@
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Article;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
+using Ray.BiliBiliTool.Console;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class ArticleApiTests
+{
+ private readonly IArticleApi _api;
+
+ private readonly BiliCookie _ck;
+ private readonly IWbiService _wbiService;
+
+ public ArticleApiTests()
+ {
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _ck = host.Services.GetRequiredService();
+ _wbiService = host.Services.GetRequiredService();
+ _api = host.Services.GetRequiredService();
+ }
+
+ #region SearchUpArticlesByUpIdAsync
+
+ [Fact]
+ public async Task SearchUpArticlesByUpIdAsync_InputId_GetResultSuccess()
+ {
+ // Arrange
+ var mid = 1585227649;
+ var req = new SearchArticlesByUpIdDto()
+ {
+ mid = mid,
+ };
+ await _wbiService.SetWridAsync(req);
+
+ // Act
+ BiliApiResponse re = await _api.SearchUpArticlesByUpIdAsync(req);
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Count.Should().BeGreaterThan(0);
+ }
+
+ #endregion
+
+ #region SearchArticleInfoAsync
+
+ [Fact]
+ public async Task SearchArticleInfoAsync_ValidId_GetResultSuccess()
+ {
+ // Arrange
+ var cvid = 34150576;
+
+ // Act
+ var re = await _api.SearchArticleInfoAsync(cvid);
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Mid.Should().BeGreaterThan(0);
+ re.Data.Like.Should().BeGreaterThanOrEqualTo(1);
+ }
+
+ [Fact]
+ public async Task SearchArticleInfoAsync_InvalidId_NoResult()
+ {
+ // Arrange
+ var cvid = 123;
+
+ // Act
+ var re = await _api.SearchArticleInfoAsync(cvid);
+
+ // Assert
+ re.Code.Should().Be(-404);
+ re.Data.Should().IsNull();
+ re.Message.Should().BeEquivalentTo("啥都木有");
+ }
+
+ #endregion
+
+
+ #region AddCoinForArticleAsync
+
+ [Fact]
+ public async Task AddCoinForArticleAsync_CoinSelf_Fail()
+ {
+ // Arrange
+ var selfCvId = 34150576;//todo
+ var req = new AddCoinForArticleRequest(selfCvId, long.Parse(_ck.UserId), _ck.BiliJct);
+
+ // Act
+ BiliBiliAgent.Dtos.BiliApiResponse re = await _api.AddCoinForArticleAsync(req);
+
+ // Assert
+ re.Code.Should().Be(34002);
+ re.Message.Should().BeEquivalentTo("up主不能自己投币");
+ }
+
+ [Fact]
+ public async Task AddCoinForArticleAsync_Normal_Success()
+ {
+ // Arrange
+ var cvId = 34049005;//todo
+ var upId = 25150765;//todo
+ var req = new AddCoinForArticleRequest(cvId, upId, _ck.BiliJct);
+
+ // Act
+ BiliBiliAgent.Dtos.BiliApiResponse re = await _api.AddCoinForArticleAsync(req);
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Message.Should().BeEquivalentTo("0");
+ }
+
+ #endregion
+
+ #region LikeAsync
+
+ [Fact]
+ public async Task LikeAsync_AlreadyLike_GetResultSuccess()
+ {
+ // Arrange
+ var cvid = 34150576;
+
+ // Act
+ var re = await _api.LikeAsync(cvid, _ck.BiliJct);
+
+ // Assert
+ re.Code.Should().Be(65006);
+ re.Data.Should().BeNull();
+ re.Message.Should().BeEquivalentTo("已赞过");
+ }
+
+ #endregion
+
+}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs
new file mode 100644
index 000000000..086a6e6b9
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/ChargeApiTest.cs
@@ -0,0 +1,69 @@
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Console;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class ChargeApiTest
+{
+ private readonly IChargeApi _target;
+
+ private readonly BiliCookie _ck;
+
+ public ChargeApiTest()
+ {
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _ck = host.Services.GetRequiredService();
+ _target = host.Services.GetRequiredService();
+ }
+
+ #region ChargeV2Async
+
+ [Fact]
+ public async void ChargeV2Async_SendRequest_NotEnough()
+ {
+ // Arrange
+ var upId = 220893216;
+ var req = new ChargeRequest(2, upId, _ck.BiliJct);
+
+ // Act
+ BiliApiResponse re = await _target.ChargeV2Async(req);
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Status.Should().Be(-4);
+ re.Data.Msg.Should().BeEquivalentTo("bp.to.battery http failed, invalid args, errNo=800409904: B ");
+ }
+
+ #endregion
+
+ #region ChargeCommentAsync
+
+ [Fact]
+ public async void ChargeCommentAsync_SendRequest_SetWridSuccess()
+ {
+ // Arrange
+ var upId = 220893216;
+ var req = new ChargeRequest(2, upId, _ck.BiliJct);
+
+ // Act
+ BiliApiResponse re = await _target.ChargeV2Async(req);
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Status.Should().Be(-4);
+ re.Data.Msg.Should().BeEquivalentTo("bp.to.battery http failed, invalid args, errNo=800409904: B ");
+ }
+
+ #endregion
+
+}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs
new file mode 100644
index 000000000..f4cc92653
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/DailyTaskApiTests.cs
@@ -0,0 +1,70 @@
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Console;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class DailyTaskApiTests
+{
+ private readonly IDailyTaskApi _api;
+
+ private readonly BiliCookie _ck;
+
+ public DailyTaskApiTests()
+ {
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _ck = host.Services.GetRequiredService();
+ _api = host.Services.GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetDailyTaskRewardInfo_Normal_Success()
+ {
+ // Act
+ BiliApiResponse re = await _api.GetDailyTaskRewardInfoAsync();
+
+ // Arrange
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Should().NotBeNull();
+ }
+
+ [Fact]
+ public async Task GetDonateCoinExp_Normal_Success()
+ {
+ // Act
+ BiliApiResponse re = await _api.GetDonateCoinExpAsync();
+
+ // Arrange
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Should().BeGreaterThanOrEqualTo(0);
+ }
+
+ [Fact]
+ public async Task ReceiveVipPrivilege_Normal_Success()
+ {
+ // Act
+ BiliApiResponse re = await _api.ReceiveVipPrivilegeAsync((int)VipPrivilegeType.BCoinCoupon, _ck.BiliJct);
+
+ // Arrange
+
+ // Assert
+ re.Code.Should().BeOneOf(new List
+ {
+ 0,
+ 73319, //todo: sort out meannings
+ });
+ }
+}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs
new file mode 100644
index 000000000..8c8cdab6c
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/HomeApiTests.cs
@@ -0,0 +1,41 @@
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Console;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class HomeApiTests
+{
+ private readonly IHomeApi _api;
+
+ private readonly BiliCookie _ck;
+
+ public HomeApiTests()
+ {
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _ck = host.Services.GetRequiredService();
+ _api = host.Services.GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetHomePageAsync_Normal_Success()
+ {
+ // Act
+ HttpResponseMessage re = await _api.GetHomePageAsync(_ck.ToString());
+
+ // Arrange
+ var page = await re.Content.ReadAsStringAsync();
+
+ // Assert
+ re.IsSuccessStatusCode.Should().BeTrue();
+ page.Should().Contain("哔哩哔哩 (゜-゜)つロ 干杯~-bilibili");
+ }
+}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj b/test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj
new file mode 100644
index 000000000..b5c2eb240
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/Ray.BiliBiliTool.Agent.FunctionalTests.csproj
@@ -0,0 +1,28 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs
new file mode 100644
index 000000000..36faaa229
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipBigPointApiTest.cs
@@ -0,0 +1,106 @@
+using Microsoft.Extensions.DependencyInjection;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.VipTask;
+using Ray.BiliBiliTool.Console;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Xunit.Abstractions;
+using Microsoft.Extensions.Hosting;
+using FluentAssertions;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class VipBigPointApiTest
+{
+ private readonly IVipBigPointApi _api;
+
+ private readonly ITestOutputHelper _output;
+ private readonly BiliCookie _ck;
+
+ public VipBigPointApiTest(ITestOutputHelper output)
+ {
+ _output = output;
+
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _ck = host.Services.GetRequiredService();
+ _api = host.Services.GetRequiredService();
+ }
+
+ [Fact]
+ public async Task GetTaskListAsync_Normal_Success()
+ {
+ // Arrange
+ // Act
+ BiliApiResponse re = await _api.GetTaskListAsync();
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.Should().NotBeNull();
+ re.Data.Task_info.Modules.Should().HaveCountGreaterThan(0);
+ }
+
+ [Fact]
+ public async Task SignAsync_Normal_Success()
+ {
+ // Arrange
+ var req = new SignRequest()
+ {
+ csrf = _ck.BiliJct
+ };
+
+ // Act
+ BiliApiResponse re = await _api.SignAsync(req);
+ _output.WriteLine(re.ToJsonStr());
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Message.Should().BeEquivalentTo("success");
+ }
+
+ [Fact]
+ public async Task GetVouchersInfoAsync_Normal_Success()
+ {
+ // Arrange
+ // Act
+ var re = await _api.GetVouchersInfoAsync();
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Data.List.Should().Contain(x => x.Type == 9);
+ }
+
+
+ [Fact]
+ public async Task GetVipExperienceAsync_Normal_Success()
+ {
+ // Arrange
+ var req = new VipExperienceRequest()
+ {
+ csrf = _ck.BiliJct
+ };
+
+ // Act
+ BiliApiResponse re = await _api.ObtainVipExperienceAsync(req);
+
+ // Assert
+ re.Code.Should().Be(0);
+ }
+
+ [Fact]
+ public async Task CompleteAsync_Normal_Success()
+ {
+ // Arrange
+ var req = new ReceiveOrCompleteTaskRequest("dress-view");
+
+ // Act
+ var re = await _api.CompleteAsync(req);
+
+ // Assert
+ re.Code.Should().Be(0);
+ }
+}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs
new file mode 100644
index 000000000..6d781240f
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/VipMallApiTests.cs
@@ -0,0 +1,46 @@
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.ViewMall;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Interfaces;
+using Ray.BiliBiliTool.Console;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class VipMallApiTests
+{
+ private readonly IVipMallApi _api;
+
+ private readonly BiliCookie _ck;
+
+ public VipMallApiTests()
+ {
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _ck = host.Services.GetRequiredService();
+ _api = host.Services.GetRequiredService();
+ }
+
+ [Fact]
+ public async Task ViewVipMallAsync_Normal_Success()
+ {
+ // Arrange
+ var req = new ViewVipMallRequest()
+ {
+ Csrf = _ck.BiliJct
+ };
+
+ // Act
+ BiliApiResponse re = await _api.ViewVipMallAsync(req);
+
+ // Assert
+ re.Code.Should().Be(0);
+ re.Message.Should().BeEquivalentTo("SUCCESS");
+ }
+}
diff --git a/test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs b/test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs
new file mode 100644
index 000000000..e23e6649c
--- /dev/null
+++ b/test/Ray.BiliBiliTool.Agent.FunctionalTests/WbiServiceTest.cs
@@ -0,0 +1,78 @@
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Video;
+using Ray.BiliBiliTool.Agent.BiliBiliAgent.Services;
+using Ray.BiliBiliTool.Console;
+
+namespace Ray.BiliBiliTool.Agent.FunctionalTests;
+
+public class WbiServiceTest
+{
+ private readonly IWbiService _target;
+
+ public WbiServiceTest()
+ {
+ var envs = new List
+ {
+ "--ENVIRONMENT=Development",
+ //"HTTP_PROXY=localhost:8888",
+ //"HTTPS_PROXY=localhost:8888"
+ };
+ IHost host = Program.CreateHost(envs.ToArray());
+ _target = host.Services.GetRequiredService();
+ }
+
+ [Fact]
+ public async void SetWridAsync_SendRequest_SetWridSuccess()
+ {
+ // Arrange
+ var upId = 1585227649;
+ var req = new SearchVideosByUpIdDto()
+ {
+ mid = upId,
+ ps = 30,
+ tid = 0,
+ pn = 1,
+ keyword = "",
+ order = "pubdate",
+ platform = "web",
+ web_location = 1550101,
+ order_avoided = "true"
+ };
+
+ // Act
+ await _target.SetWridAsync(req);
+
+ // Assert
+ req.w_rid.Should().NotBeNullOrWhiteSpace();
+ req.wts.Should().NotBe(0);
+ }
+
+ [Fact]
+ public void EncWbi_InputParams_GetCorrectWbiResult()
+ {
+ // Arrange
+ var wbiDto = new WbiImg()
+ {
+ img_url = "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png",
+ sub_url = "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png"
+ };
+ var dic = new Dictionary()
+ {
+ {"foo", "114"},
+ {"bar", "514"},
+ {"baz", "1919810"},
+ };
+ var timeSpan = 1684746387;
+ var expectResult = "d3cbd2a2316089117134038bf4caf442";
+
+ // Act
+ var re = _target.EncWbi(dic, wbiDto.ImgKey, wbiDto.SubKey, timeSpan);
+
+ // Assert
+ re.w_rid.Should().BeEquivalentTo(expectResult);
+ re.wts.Should().Be(timeSpan);
+ }
+}