diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index dc42c28c4..0ecc3883a 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -1,19 +1,25 @@ -name: No Response - +name: Close Stale Issues on: - # workflow_dispatch: - issue_comment: - types: [created] schedule: - - cron: '7 4,10 * * *' + - cron: "0 8 * * *" # 每天的 00:00 运行 + workflow_dispatch: + +permissions: + contents: read + issues: write + pull-requests: write jobs: - noResponse: + close_stale_issues: runs-on: ubuntu-latest steps: - - uses: lee-dohm/no-response@v0.5.0 + - name: Close Stale Issues + uses: actions/stale@v5 with: - token: ${{ github.token }} - # closeComment: This issue has been automatically closed due to no response from the original author. Please feel free to reopen it if you have more information that can help us investigate the issue further. - daysUntilClose: 3 - responseRequiredLabel: needs-more-info + days-before-stale: 3 # 3 天不活跃后标记Stale + days-before-close: 3 # 标记Stale后3天不活跃则关闭问题 + stale-issue-label: "Stale" # 标记为 "Stale" 的问题 + stale-issue-message: "🕸️ This has been inactive for 3 days, please confirm if it still needs attention~~" # Comment added + close-issue-message: "🚫 This has been inactive for too long and is now closed, feel free to reopen it if needed!" # Comment added + only-labels: "needs-more-info" # 只处理标签为 "help wanted" 的问题 + repo-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/publish-image.yml b/.github/workflows/publish-image.yml index cd0abf31d..6db05d57c 100644 --- a/.github/workflows/publish-image.yml +++ b/.github/workflows/publish-image.yml @@ -33,8 +33,8 @@ jobs: if [ "${{ github.event.release.tag_name }}" ] ; then TargetVersion=${{ github.event.release.tag_name }} fi - if [ "${{ github.event.inputs.manualTag }}" ] ; then - TargetVersion=${{ github.event.inputs.manualTag }} + then + TargetVersion=$(echo "$GITHUB_REF" | sed 's/refs\/tags\///') fi echo "TargetVersion: $TargetVersion" echo "TargetVersion=$TargetVersion" >> $GITHUB_OUTPUT diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 8025a8030..2c61c1ee5 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -1,13 +1,8 @@ # 打包发布Release - name: Publish release on: workflow_dispatch: - inputs: - version: - description: '版本号' - required: true permissions: contents: write @@ -15,48 +10,39 @@ permissions: jobs: build: - name: publish relesae + name: Publish Release if: ${{ github.repository == 'RayWangQvQ/BiliBiliToolPro' }} runs-on: ubuntu-latest steps: - - name: Checkout code + - name: Checkout Code uses: actions/checkout@v3 - with: - ref: ${{ github.event.inputs.version }} - - name: Setup .NET + - name: Setup .NET Core uses: actions/setup-dotnet@v3 with: - dotnet-version: 6.0.x + dotnet-version: '6.0.x' - - name: Publish and zip + - name: Publish and Zip Release run: | - pwd && ls cd ./scripts chmod +x ./publish.sh - . publish.sh --runtime all + ./publish.sh --runtime all - - name: Get release content - id: release_content + - name: Extract Release Notes + id: release_notes run: | - cd ${{ github.workspace }} - pwd && ls - content=$(tac ./CHANGELOG.md | grep -m1 "##" -B 1000 | tac) - echo "Release content: $content" - echo "release_content<> $GITHUB_OUTPUT - echo "$content" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT + content=$(grep -m1 "##" -A 1000 ./CHANGELOG.md) + echo "::set-output name=content::$content" - - name: Upload release asset - id: upload-release-asset + - name: Create Release uses: softprops/action-gh-release@v1 with: - files: ./src/Ray.BiliBiliTool.Console/bin/Publish/*.zip + files: './src/Ray.BiliBiliTool.Console/bin/Publish/*.zip' token: ${{ secrets.GITHUB_TOKEN }} - name: BiliBiliToolPro-V${{ github.event.inputs.version }} + name: "BiliBiliToolPro-V${{ github.event.inputs.version }}" tag_name: ${{ github.event.inputs.version }} - body: ${{ steps.release_content.outputs.release_content }} + body: ${{ steps.release_notes.outputs.content }} discussion_category_name: Announcements generate_release_notes: true fail_on_unmatched_files: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bc0f5448..75a27341d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,59 +1,62 @@ -## 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 @@ -85,7 +88,7 @@ - HostConfiguration,删除了CommandLine配置源,推荐只使用环境变量,同时更新青龙shell脚本内配置 - 【#169】领取大会员福利任务更改为每日都尝试执行 - 青龙拉库兼容大小写问题 -- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo) +- 【#197】合并PR,新增了阅读漫画功能到每日任务中(@ChanceLuo) ## 0.1.1 - 【#54】优化青龙shell脚本读取仓库目录方式,解决青龙新老版本切换导致出现多个repo目录的bug - 【#82】【#85】合并外部PR,更新了文档 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..6b4fbb7df 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 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 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..d65f76cd4 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..4c21ccb53 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..3ace91093 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); + } +}