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