pull file
Some checks failed
CodeQL / Analyze (csharp) (push) Has been cancelled
Close Stale Issues / close_stale_issues (push) Has been cancelled
repo-sync / repo-sync (push) Has been cancelled
auto-deploy-tencent-scf / pre-check (push) Has been cancelled
auto-deploy-tencent-scf / deploy serverless (push) Has been cancelled

This commit is contained in:
2026-02-11 23:32:56 +08:00
commit e519cac94e
656 changed files with 45058 additions and 0 deletions

18
.config/dotnet-tools.json Normal file
View File

@@ -0,0 +1,18 @@
{
"version": 1,
"isRoot": true,
"tools": {
"csharpier": {
"version": "1.0.3",
"commands": [
"csharpier"
]
},
"husky": {
"version": "0.7.2",
"commands": [
"husky"
]
}
}
}

15
.dockerignore Normal file
View File

@@ -0,0 +1,15 @@
# .dockerignore
.git
.gitattributes
.gitignore
.github
.editorconfig
README.md
Dockerfile
[b|B]in
[O|o]bj

260
.editorconfig Normal file
View File

@@ -0,0 +1,260 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
# Default settings:
# A newline ending every file
# Use CRLF line break
# Use 4 spaces as indentation
[*]
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4
# Json config files
[*.json]
indent_size = 2
# Yaml config files
[*.{yml,yaml}]
indent_size = 2
# Xml project files
[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
indent_size = 2
# Xml config files
[*.{props,targets,config,nuspec}]
indent_size = 2
# c# 文件
[*.cs]
#### Core EditorConfig 选项 ####
# 缩进和间距
indent_size = 4
indent_style = space
tab_width = 4
# 新行首选项
end_of_line = lf
insert_final_newline = false
#### .NET 编码约定 ####
# 组织 Using
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
file_header_template = unset
# this. 和 Me. 首选项
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false
# 语言关键字与 bcl 类型首选项
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true
# 括号首选项
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
# 修饰符首选项
dotnet_style_require_accessibility_modifiers = for_non_interface_members
# 表达式级首选项
dotnet_style_coalesce_expression = true
dotnet_style_collection_initializer = true
dotnet_style_explicit_tuple_names = true
dotnet_style_namespace_match_folder = true
dotnet_style_null_propagation = true
dotnet_style_object_initializer = true
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true
dotnet_style_prefer_collection_expression = when_types_loosely_match
dotnet_style_prefer_compound_assignment = true
dotnet_style_prefer_conditional_expression_over_assignment = true
dotnet_style_prefer_conditional_expression_over_return = true
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
dotnet_style_prefer_inferred_anonymous_type_member_names = true
dotnet_style_prefer_inferred_tuple_names = true
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
dotnet_style_prefer_simplified_boolean_expressions = true
dotnet_style_prefer_simplified_interpolation = true
# 字段首选项
dotnet_style_readonly_field = true
# 参数首选项
dotnet_code_quality_unused_parameters = all
# 禁止显示首选项
dotnet_remove_unnecessary_suppression_exclusions = none
# 新行首选项
dotnet_style_allow_multiple_blank_lines_experimental = true
dotnet_style_allow_statement_immediately_after_block_experimental = true
#### c# 编码约定 ####
# var 首选项
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = true
# Expression-bodied 成员
csharp_style_expression_bodied_accessors = true
csharp_style_expression_bodied_constructors = false
csharp_style_expression_bodied_indexers = true
csharp_style_expression_bodied_lambdas = true
csharp_style_expression_bodied_local_functions = false
csharp_style_expression_bodied_methods = true
csharp_style_expression_bodied_operators = false
csharp_style_expression_bodied_properties = true
# 模式匹配首选项
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_extended_property_pattern = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_switch_expression = true
# Null 检查首选项
csharp_style_conditional_delegate_call = true
# 修饰符首选项
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
csharp_style_prefer_readonly_struct = true
csharp_style_prefer_readonly_struct_member = true
# 代码块首选项
csharp_prefer_braces = when_multiline
csharp_prefer_simple_using_statement = true
csharp_style_namespace_declarations = file_scoped
csharp_style_prefer_method_group_conversion = true
csharp_style_prefer_primary_constructors = true
csharp_style_prefer_top_level_statements = true
# 表达式级首选项
csharp_prefer_simple_default_expression = true
csharp_style_deconstructed_variable_declaration = true
csharp_style_implicit_object_creation_when_type_is_apparent = true
csharp_style_inlined_variable_declaration = true
csharp_style_prefer_index_operator = true
csharp_style_prefer_local_over_anonymous_function = true
csharp_style_prefer_null_check_over_type_check = true
csharp_style_prefer_range_operator = true
csharp_style_prefer_tuple_swap = true
csharp_style_prefer_utf8_string_literals = true
csharp_style_throw_expression = true
csharp_style_unused_value_assignment_preference = discard_variable
csharp_style_unused_value_expression_statement_preference = discard_variable
# "using" 指令首选项
csharp_using_directive_placement = outside_namespace
# 新行首选项
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
csharp_style_allow_embedded_statements_on_same_line_experimental = true
#### C# 格式规则 ####
# 新行首选项
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
# 缩进首选项
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# 空格键首选项
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# 包装首选项
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### 命名样式 ####
# 命名规则
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
# 符号规范
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =
# 命名样式
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case

View File

@@ -0,0 +1,63 @@
---
name: Bug report缺陷
about: 缺陷或异常
title: "【Bug】<请在标题中清晰地概述你要反馈的异常或缺陷>"
labels: ''
assignees: ''
---
<!-- 请完整填写如下信息 -->
<!-- 勾选项可以在提交之后,进行勾选 -->
### 版本
BiliTool版本号`x.x.x`
### 确认
- [ ] 是的,我已搜索并确认,没有其他相同的议题
- [ ] 是的,我确认,已尝试升级到最新版,但未解决
### 服务器架构
- [ ] x64
- [ ] arm64
- [ ] arm
- [ ] 其他(请在下面补充)
### 服务器系统
- [ ] Windows
- [ ] macOS
- [ ] Linux
- [ ] Debian
- [ ] Ubuntu
- [ ] Windows
- [ ] Alpine
- [ ] Centos
- [ ] 其他(请在下面补充)
### 选择的BiliTool运行模式
- [ ] docker
- [ ] podman
- [ ] 下载的Release包
- [ ] 其他(请在下面补充)
### 问题描述
<!-- 请在下方清晰的描述所您所遇到的问题 -->
<这里>
### 日志信息
<!-- 请在下方贴出Debug级别的日志信息以便更高效的确定和解决问题 -->
<details>
```
<这里>
```
</details>

View File

@@ -0,0 +1,93 @@
---
name: 【QingLong】Bug report缺陷
about: 缺陷或异常(青龙专属)
title: "【Bug】【青龙】<请在标题中清晰地概述你要反馈的异常或缺陷>"
labels: ''
assignees: ''
---
<!-- 请完整填写如下信息 -->
<!-- 勾选项可以在提交之后,进行勾选 -->
### 版本
BiliTool版本号`x.x.x`
青龙版本号:`x.x.x`
### 确认
- [ ] 是的,我已搜索并确认,没有其他相同的议题
- [ ] 是的我确认已尝试升级bilitool到最新版但未解决
- [ ] 是的,我确认,已尝试升级青龙到最新版,但未解决
### 服务器架构
- [ ] x64
- [ ] arm64
- [ ] arm
- [ ] 其他(请在下面补充)
### 服务器系统
- [ ] Windows
- [ ] macOS
- [ ] Linux
- [ ] Debian
- [ ] Ubuntu
- [ ] Windows
- [ ] Alpine
- [ ] Centos
- [ ] 其他(请在下面补充)
### 青龙容器类型
- [ ] Docker
- [ ] Podman
- [ ] 其他(请在下面补充)
### 青龙镜像
- [ ] whyour/qinglong:latestAlpine
- [ ] whyour/qinglong:debianDebian
### 选择的BiliTool运行模式
- [ ] dotnet
- [ ] bilitool
### 如果是青龙拉库相关bug请贴出拉库方式截图
- [ ]
- [ ] 是,截图如下
### 如果是缺失文件相关bug请贴出容器内文件路径信息
- [ ]
- [ ] 是,信息如下
查看方式参考文档:[提示文件不存在或路径异常怎么排查](https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/qinglong/README.md#43-提示文件不存在或路径异常怎么排查)
BiliTool仓库文件路径`<粘贴路径>`
脚本文件路径:`<粘贴路径>`
<这里贴截图>
### 问题描述
<!-- 请在下方清晰的描述所您所遇到的问题 -->
<这里>
### 日志信息
<!-- 请在下方贴出Debug级别的日志信息以便更高效的确定和解决问题 -->
<details>
```
<这里>
```
</details>

View File

@@ -0,0 +1,21 @@
---
name: Feature request建议
about: 建议或需求
title: "【建议】<请在标题中清晰地概述你的建议>"
labels: 建议/enhancement
assignees: ''
---
<!-- 请完整填写如下信息 -->
<!-- 勾选项可以在提交之后,进行勾选 -->
### 确认
- [ ] 是的,我已搜索并确认,没有其他相同的议题
### 建议内容
<!-- 请清晰的描述您的需求或建议 -->
<!-- 如果可以,请描述您认为可行的解决方案 -->
<这里>

18
.github/ISSUE_TEMPLATE/other----.md vendored Normal file
View File

@@ -0,0 +1,18 @@
---
name: Other其他
about: 既不是Bug也不是建议的或不能确定的其他议题
title: "【其他】<请在标题中清晰地概述内容>"
labels: ''
assignees: ''
---
### 确认
- [ ] 是的我确认要选Other因为我的内容既不是Bug也不是Feature
- [ ] 是的,我已搜索并确认,没有其他相同的议题
### 描述
<!-- 请在下方清晰的描述您的内容 -->
<这里>

5
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,5 @@
<!-- 请详细描述你要PR的内容 -->
### 内容
<请描述您将贡献的内容>

6
.github/pull.yml vendored Normal file
View File

@@ -0,0 +1,6 @@
version: "1"
rules: # Array of rules
- base: main # Required. Target branch
upstream: RayWangQvQ:main # Required. Must be in the same fork network.
mergeMethod: hardreset # Optional, one of [none, merge, squash, rebase, hardreset], Default: hardreset.
mergeUnstable: true # Optional, merge pull request even when the mergeable_state is not clean. Default: true

View File

@@ -0,0 +1,54 @@
# https://github.com/June1991/serverless-express
name: auto-deploy-tencent-scf
on:
workflow_dispatch:
schedule:
- cron: "0 2 * * 1,3,5" # 每周一、三、五的10点
env:
IsAutoDeployTencentScf: ${{ secrets.IS_AUTO_DEPLOY_TENCENT_SCF }} # 是否开启自动部署云函数
jobs:
pre-check:
runs-on: ubuntu-latest
outputs:
result: ${{ steps.check.outputs.result }} # 不能直接传递secrets的值否则会被skip需要转一下
steps:
- id: check
run: |
[ ${{ github.event_name }} == 'workflow_dispatch' -o true == "${{ env.IsAutoDeployTencentScf }}" ] && echo "result=开启" >> $GITHUB_OUTPUT || echo "result=关闭" >> $GITHUB_OUTPUT
deploy:
name: deploy serverless
runs-on: ubuntu-latest
needs: pre-check
# if: env.IsAutoDeployTencentScf=='true' # 这里job.if读取不到env或secrets很坑...但是发现可以读到needs的outputs值
if: needs.pre-check.outputs.result=='开启'
steps:
- name: clone local repository
uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 16.x
- name: install serverless
run: npm i -g serverless-cloud-framework
- name: deploy serverless
run: |
cd ./tencentScf
echo "开始配置云函数:"
echo "$Tencent_Serverless_Yml"
[ -z "$Tencent_Serverless_Yml" ] && echo "未配置serverless.yml使用默认值" || echo "$Tencent_Serverless_Yml" > serverless.yml
echo "开始发布项目"
chmod +x publish.sh
./publish.sh
echo "开始部署到云函数"
scf deploy
env: # 环境变量
STAGE: dev #您的部署环境
SERVERLESS_PLATFORM_VENDOR: tencent # serverless海外默认为aws部署配置为腾讯部署
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }} # 您的腾讯云账号sercret ID
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }} # 您的腾讯云账号sercret key
Tencent_Serverless_Yml: ${{ secrets.TENCENT_SERVERLESS_YML }} # 云函数配置(区域、环境变量、触发器等)

78
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,78 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ main, develop, release/* ]
paths:
- '**/*.js'
- '**/*.cs'
- '**/*.cshtml'
- '**/*.csproj'
pull_request:
# The branches below must be a subset of the branches above
branches: [ main, develop ]
paths:
- '**/*.js'
- '**/*.cs'
- '**/*.cshtml'
- '**/*.csproj'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

13
.github/workflows/no-toxic-comments.yml vendored Normal file
View File

@@ -0,0 +1,13 @@
name: Check Toxic Comments
on: [issue_comment, pull_request_review]
jobs:
toxic_check:
runs-on: ubuntu-latest
name: Safe space
steps:
- uses: actions/checkout@v2
- name: Safe space - action step
uses: charliegerard/safe-space@master
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

87
.github/workflows/publish-image.yml vendored Normal file
View File

@@ -0,0 +1,87 @@
name: Publish image
on:
workflow_dispatch:
inputs:
autoWithLatestTag:
description: 'Auto Add Latest Tag'
required: true
default: true
type: boolean
release:
types: [created]
env:
DOCKERHUB_USERNAME : ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_PASSWORD : ${{ secrets.DOCKERHUB_PASSWORD }}
GHCR_USERNAME: ${{ github.repository_owner }}
GHCR_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
DOCKER_IMG_NAME: "zai7lou/bili_tool_web"
GHC_IMG_NAME: "ghcr.io/raywangqvq/bili_tool_web"
jobs:
PublishImage:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: GetTargetVersion
id: getTargetVersion
run: |
TargetVersion=""
if [ "${{ github.event.release.tag_name }}" ] ; then
TargetVersion=${{ github.event.release.tag_name }}
else
TargetVersion=$(grep -oP '(?<=<Version>).*?(?=<\/Version>)' ./common.props)
fi
echo "TargetVersion: $TargetVersion"
echo "TargetVersion=$TargetVersion" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ env.DOCKERHUB_USERNAME }}
password: ${{ env.DOCKERHUB_PASSWORD }}
- name: Log in to ghcr
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ env.GHCR_USERNAME }}
password: ${{ env.GHCR_PASSWORD }}
- name: Generate tags
id: tags
run: |
targetVersion="${{ steps.getTargetVersion.outputs.TargetVersion }}"
dockerTagWithVersion="${{ env.DOCKER_IMG_NAME }}:$targetVersion"
ghcrTagWithVersion="${{ env.GHC_IMG_NAME }}:$targetVersion"
dockerTagWithLatest=""
ghcrTagWithLatest=""
if [ "${{ github.event.inputs.autoWithLatestTag }}" == "true" ] || [ ${{ github.event.release.created_at }} ]; then
dockerTagWithLatest="${{ env.DOCKER_IMG_NAME }}:latest"
ghcrTagWithLatest="${{ env.GHC_IMG_NAME }}:latest"
fi
echo "dockerTagWithVersion=$dockerTagWithVersion" >> $GITHUB_OUTPUT
echo "ghcrTagWithVersion=$ghcrTagWithVersion" >> $GITHUB_OUTPUT
echo "dockerTagWithLatest=$dockerTagWithLatest" >> $GITHUB_OUTPUT
echo "ghcrTagWithLatest=$ghcrTagWithLatest" >> $GITHUB_OUTPUT
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ steps.tags.outputs.dockerTagWithVersion }}
${{ steps.tags.outputs.ghcrTagWithVersion }}
${{ steps.tags.outputs.dockerTagWithLatest }}
${{ steps.tags.outputs.ghcrTagWithLatest }}

45
.github/workflows/publish-release.yml vendored Normal file
View File

@@ -0,0 +1,45 @@
name: Publish release
on:
workflow_dispatch:
permissions:
contents: write
discussions: write
jobs:
build:
name: Publish Release
if: ${{ github.repository == 'RayWangQvQ/BiliBiliToolPro' }}
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Setup .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: '8.0.x'
- name: Publish and Zip Release
run: |
cd ./scripts
chmod +x ./publish.sh
./publish.sh --runtime all
- name: Read Version
id: version
run: echo "version=$(cat ./src/Ray.BiliBiliTool.Console/bin/Publish/version.txt)" >> $GITHUB_OUTPUT
- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: './src/Ray.BiliBiliTool.Console/bin/Publish/*.zip'
token: ${{ secrets.GITHUB_TOKEN }}
name: "BiliBiliToolPro-V${{ steps.version.outputs.version }}"
tag_name: ${{ steps.version.outputs.version }}
body_path: './src/Ray.BiliBiliTool.Console/bin/Publish/release_notes.md'
discussion_category_name: Announcements
generate_release_notes: true
fail_on_unmatched_files: true

28
.github/workflows/repo-sync.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
# 自动同步上游仓库
name: repo-sync
on:
workflow_dispatch:
schedule:
- cron: '0 1 * * 1,3,5'
# UTC时区比我们东八区早8小时上面示例为每周一、三、五的9点。
jobs:
repo-sync:
if: ${{ github.repository != 'RayWangQvQ/BiliBiliToolPro' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
- name: repo-sync
uses: repo-sync/github-sync@v2
with:
source_repo: "https://github.com/RayWangQvQ/BiliBiliToolPro.git"
source_branch: "main"
destination_branch: "main"
sync_tags: "true"
github_token: ${{ secrets.PAT }}

25
.github/workflows/stale-issues.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: Close Stale Issues
on:
schedule:
- cron: "0 8 * * *" # 每天的 00:00 运行
workflow_dispatch:
permissions:
contents: read
issues: write
pull-requests: write
jobs:
close_stale_issues:
runs-on: ubuntu-latest
steps:
- name: Close Stale Issues
uses: actions/stale@v5
with:
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 }}

30
.github/workflows/tag.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Tag
on:
pull_request:
types:
- closed
branches:
- main
jobs:
tag:
name: add tag
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Get current version
id: current_version
run: |
version=$(grep -oP '(?<=<Version>).*?(?=<\/Version>)' ./common.props)
echo "Curent version: $version"
echo "current_version=$version" >> $GITHUB_OUTPUT
- name: Tag and push
run: |
new_tag="${{ steps.current_version.outputs.current_version }}"
git tag -f "$new_tag"
git push -f origin "$new_tag"

19
.github/workflows/verify-pr.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: VerifyPR
on:
pull_request_target:
types: [opened, edited]
jobs:
checkTargetBranch:
runs-on: ubuntu-latest
steps:
- uses: Vankka/pr-target-branch-action@v3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
target: main
change-to: develop
exclude: RayWangQvQ/BiliBiliToolPro:develop
comment: |
Your PR was set to `main`, but PRs should be sent to `develop`
The base branch of this PR has been automatically changed to `develop`, please check that there are no merge conflicts.

382
.gitignore vendored Normal file
View File

@@ -0,0 +1,382 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
#
.idea/
tencentScf/.env
.obsidian
# vs code
.vscode
# krew
krew/bilipro
krew/cmd/kubectl-bilipro
krew/kustomization.yaml
bilipro
krew/pkg/utils/fixtures
kustomization.yaml
# cookie config
**/Ray.BiliBiliTool.Console/cookies.json
**/Ray.BiliBiliTool.Web/config/cookies.json
# ut
coveragereport
# bruno
bruno/.env
# db
src/**/BiliBiliTool.db*

5
.husky/pre-commit Normal file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
echo "This is pre commit"
dotnet husky run --group pre-commit

27
.husky/task-runner.json Normal file
View File

@@ -0,0 +1,27 @@
{
"$schema": "https://alirezanet.github.io/Husky.Net/schema.json",
"tasks": [
{
"name": "welcome-message-example",
"command": "bash",
"args": [ "-c", "echo Husky.Net is awesome!" ],
"windows": {
"command": "cmd",
"args": ["/c", "echo Husky.Net is awesome!" ]
}
},
{
"name": "csharpier-install",
"group": "pre-commit",
"command": "dotnet",
"args": [ "tool", "install", "csharpier" ]
},
{
"name": "csharpier-fotmat",
"group": "pre-commit",
"command": "dotnet",
"args": [ "csharpier", "format", "${staged}" ],
"include": [ "**/*.cs" ]
}
]
}

218
CHANGELOG.md Normal file
View File

@@ -0,0 +1,218 @@
## 3.8.2
- Fix[#1026]: 更新文档
## 3.8.1
- Fix[#1005]: 更新文档
## 3.8.0
- Feature: 使推送的更版本号信息更简洁
- Fix[#998]: 修复企业微信 App 推送缺少 access_token 问题
- Fix[#996]: 修复 Server 酱推送标题不能为空的问题
- Fix[#669]: 企业微信默认消息类型从 markdown 改为 text
## 3.7.0
- Fix[#989]: 修复钉钉推送标题不能为空的问题
## 3.6.0
- Feature[#961]: Web 项目新增推送功能
- Feature[#961]: 升级 Serilog Pkg
- Feature: 使用中心化包管理
## 3.5.0
- Feature[#924]: 新增 Sqlite 配置源
- Feature[#924]: 新增在线配置页
- Feature[#924]: 根据任务拆分配置
- Feature[#924]: 实现开启、关闭任务功能
- Feature[#924]: 实现修改 Cron 定时时间功能
- Feature: 定时任务页改为默认50条
- Feature: 更新配置文档
## 3.4.0
- Feature: 优化登录失败时的提示信息
- Feature: 更新推送的文档说明
## 3.3.0
- Feature[#935]: Web 新增登录功能
- Feature[#935]: Web 新增修改密码功能
- Feature[#935]: 更新文档
- Feature: 更新开源协议为 GNU GPLv3
- Feature: 拆分原本的 Daily 任务
- Doc: 更新文档
- Feature: 升级 csharpier
- Feature: 变更默认数据库文件位置到 /app/config 下
## 3.2.0
- Fix: 修复大会员大积分签到任务
- Fix: 修复大会员大积分的签到和浏览追番频道任务
- Feature[#901]: 实现大会员大积分的浏览影视频道页任务
- Feature[#921]: 新增大会员大积分的观看剧集 bruno 信息
- Feature: 鉴权不再兼容老版本青龙(老版本需要手动添加 bili cookie
- Feature: 修复 warnings
- Feature: 移除无用的using
- Fix: 修复 VerifyPR CI/CD 流水线
- Feature: README 添加 Trending 信息
## 3.1.0
- Feature[#842]: 对接青龙新的 OpenAPI实现青龙版 Bili 登录后自动存储 Cookie
- Feature[#842]: 兼容老版本青龙的文件鉴权方式
- Feature[#842]: 新增新版青龙添加鉴权的说明文档
- Feature[#820]: 更新文档解决配置文件边缘场景下的刷新问题
- Fix[#863]: 修复青龙尝试修复异常任务
- Fix[#879]: 移除文档内过期的加速器地址
- Feature: 开启 Nullable 特性,在编译阶段检查潜在的 NullReferenceException 问题
- Feature: 临时取消 Null warning
- Fix: Bruno 脚本错误
- Fix: 尝试修复发布包时 CI/CD 丢失 change log 问题
## 3.0.0
- Feature[#884]: 上线 bili_tool_web
- Fix[#875]: 青龙检测 dotnet 版本只需要大于等于 8.0
- Fix[#876]: 升级 VipBigPoint 接口,解决风控
- Fix[#881]: 升级 LiveLottery 接口,解决风控
## 2.2.2
- Code refactor
- Integration Husky.Net and CSharpier
## 2.2.1
- Fix[#847]: DefaultRequestHeaders can not be null or empty with dotnet 8
- Fix[#849]: Temporary disable PublishTrimmed
## 2.2.0
- Migrate from dotnet 6.0 to dotnet 8.0
- Add Bruno to document the APIs
- Fix[#824]: Log cookie when qinglong save env failed
- Fix[#648]: Set DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 in qinglong to ignore random "Couldn't find a valid ICU package" issue
## 2.1.3
- Code refactor
- Fix[#791]修复VipBigPoint任务异常导致终止的问题
## 2.1.2
- Feature: enhancement CICD scripts
- Fix[#728]: compatible with qinglong history versions
## 2.1.1
- Feature: listen ctrl+c at the very beginning
- Fix: fix qinglong read cron error
## 2.1.0
- Feature[#691]: 重构并优化基于qinglong的部署方式尝试解决偶发的安装失败的问题
- Feature[#670]: 新增针对App的AppUserAgent配置项用于解决大会员大积分异常问题
- Fix: 修复CICD发布脚本错误
## 2.0.5
- Fix[#260]: 再次尝试修复大会员大积分“账号风险”异常
## 2.0.4
- Fix: 尝试修复大会员大积分“账号风险”异常
- Feature为agent api创建集成测试
## 2.0.3
- PR[#641]:实现浏览会员购页面与观看正片内容功能
- PR[#685]:部分修复大积分功能
- Fix更新过于老旧的UserAgent
- Fix更新排行榜api
## 2.0.2
- PR[#617]:增加专栏投币功能与领取大会员经验的功能
## 2.0.1
- PR[#539]:更新文档
- PR[#557]:修复直播接口权限不足问题
## 2.0.0
- Feature[#513]将基础组件和抽象迁移到nuget包中
- Fix[#543]修复部分Api调用报“访问权限不足”
## 1.0.3
- 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
## 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
## 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
## 0.4.6
- Fix: ck list init empty error
- Feature #440 : use 'apk add' to install dotnet in qinglong
## 0.4.5
- 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
## 0.4.3
- Feature #419 : Add a auto shell script for installing with docker
- Feature #396 : Publish docker image to GitHub pkg
## 0.4.2
- Merfe PRs #425 #426 #427 : Enhancement docker things, thx @zclkkk
## 0.4.1
- Merge PR #418 : Fix search video api's error, thx @catlair
## 0.4.0
- 合并PR #381 #383 ),新增直播间挂机功能,感谢@bakapiano
## 0.3.2
- Fix( #358 )获取auth时兼容老版青龙文件路径
- Fix( #364 )兼容青龙异形response数据类型
- Fix( #366 #361 )修复一些低级bug
- Feature( #359 ),兼容读取不到`$QL_DIR`的情况
## 0.3.1
- Fix( #260 )在需要的时候encode cookie
- 更新文档
## 0.3.0
- hotfix docker build error
- 合并PR#341新增krew部署感谢@chenliu1993
- 合并PR##348),更新文档,感谢@jexjws
- 合并PR#350修改请求header错误的bug感谢@catlair
- 合并PR#353新增python扫码登录的feature仅针对青龙感谢@AFUL1991
- Feature#351):重构并新增了扫码登录功能,使之适用于各种部署平台
## 0.2.2
- 新增`podman`部署教程
- 合并PR#264),腾讯云定时任务补充新增的大会员大积分任务,感谢@layui0320
- 合并PR#262更新docker的entry.sh感谢@syrinka
- 合并PR#308 #312新增Chart部署感谢@chenliu1993
- 合并PR#309新增lv6后开启白嫖模式的配置多账号时可以实现不足lv6的继续投币达到lv6的开始白嫖感谢@cluom
- 优化青龙安装dotnet的脚本改为使用官方`dotnet-install.sh`脚本安装(之前测试网络不通,后发现--no-cdn可以
- 优化青龙的执行脚本提取公共部分并且在执行前会尝试安装一次dotnet会清理一次缓存
## 0.2.1
- 合并PR#253#257),更新文档(@layui0320
- 合并PR#256重构docker运行是cron构建方式并优化读取环境变量的方式@syrinka
- Feature(#65)新增TG推送配置并使用代理功能
- Feature(#240)新增gotify推送
- Feature(#259):大会员状态改为枚举类型,当非会员时自动跳过大积分任务
- Feature更新、优化docker部署文档
## 0.2.0
- 新增大会员大积分任务
## 0.1.2
- 修复`auto-close-pr.yml`分支错误的bug
-#107】新增自动检测并关闭长时无状态issues的actionsno-response.yml
-#73】【#105】【#108】更新、纠正文档内容
- HostConfiguration删除了CommandLine配置源推荐只使用环境变量同时更新青龙shell脚本内配置
-#169】领取大会员福利任务更改为每日都尝试执行
- 青龙拉库兼容大小写问题
-#197】合并PR新增了阅读漫画功能到每日任务中@ChanceLuo
## 0.1.1
-#54】优化青龙shell脚本读取仓库目录方式解决青龙新老版本切换导致出现多个repo目录的bug
-#82】【#85】合并外部PR更新了文档
- 感谢`JetBrain`提供免费的证书支持
## 0.1.0
-#62`codeql-analysis.yml`可以指定检查的文件类型
-#61`publish-image.yml`手动打镜像时支持指定是否打latest的tag
-#32】新增企业微信的应用推送,实现微信接受推送消息
- 优化日志格式
## 0.0.9
-#47】青龙安装`dotnet`环境支持arm架构服务器
## 0.0.8
-#55】新增日志推送端:`Microsoft Teams`
-#27】更新README
## 0.0.7
-#44】兼容青龙最新版本v2.12.0修复因青龙调整目录结构导致的bug
- 更新`publish-image.yml`,只有`release`时才打`latest tag`,手动运行时不打`latest tag`
## 0.0.6
- 更新docker镜像的构建
-#12】新增配置`Notification:IsSingleAccountSingleNotify`,支持开启每个账号单独推送消息
- publish-release.yml新增手动输入tag功能
## 0.0.5
- 优化推送日志,在标题中显示运行的任务名称
- 新增`CodeQL`workflows用于检测代码
- 新增`Publish image`workflows用于发布镜像
- 新增`no-toxic-comments.yml`,用于检测评论
- 更新`auto-close-pr.yml`用于修正PR的目标到`develop`
## 0.0.4
-#15】修复`Actions`部署到腾讯云函数时的偶发异常
## 0.0.3
-#16】修复银瓜子兑换硬币bug
-#18】修改[青龙面板](https://github.com/whyour/qinglong)以`Production`环境运行
- [青龙面板](https://github.com/whyour/qinglong)新增拉取dev先行版功能
## 0.0.2
- 更新文档
- 天选抽奖新增黑名单功能
- 批量取关新增白名单功能
## 0.0.1
- 重启项目
- 支持[青龙面板](https://github.com/whyour/qinglong)部署

80
Directory.Packages.props Normal file
View File

@@ -0,0 +1,80 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<!-- Microsoft Extensions -->
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="8.0.18" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.3" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<!-- Entity Framework -->
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.18" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Abstractions" Version="8.0.18" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.18" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.18" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.18" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.18" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.18" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
<PackageVersion Include="EFCore.NamingConventions" Version="8.0.3" />
<!-- ASP.NET Core -->
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.18" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.18" />
<!-- Serilog -->
<PackageVersion Include="Serilog" Version="4.3.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.3" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="8.0.0" />
<PackageVersion Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="8.0.4" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.SQLite.Microsoft" Version="1.0.0" />
<!-- Ray Serilog Sinks -->
<PackageVersion Include="Ray.Serilog.Sinks.CoolPushBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.DingTalkBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.GotifyBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.MicrosoftTeamsBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.OtherApiBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.PushPlusBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.ServerChanBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.TelegramBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.WorkWeiXinAppBatched" Version="0.1.5" />
<PackageVersion Include="Ray.Serilog.Sinks.WorkWeiXinBatched" Version="0.1.5" />
<!-- Quartz -->
<PackageVersion Include="Quartz" Version="3.14.0" />
<PackageVersion Include="Quartz.AspNetCore" Version="3.14.0" />
<PackageVersion Include="Quartz.Serialization.SystemTextJson" Version="3.14.0" />
<PackageVersion Include="AppAny.Quartz.EntityFrameworkCore.Migrations.SQLite" Version="0.5.1" />
<PackageVersion Include="CronExpressionDescriptor" Version="2.44.0" />
<!-- Other packages - 修复版本兼容性问题 -->
<PackageVersion Include="Ray.Infrastructure" Version="0.0.26" />
<PackageVersion Include="Scrutor" Version="6.1.0" />
<PackageVersion Include="WebApiClientCore" Version="2.1.5" />
<PackageVersion Include="QRCoder" Version="1.6.0" />
<PackageVersion Include="MudBlazor" Version="8.6.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="8.1.4" />
<PackageVersion Include="Rougamo.Fody" Version="5.0.1" />
<PackageVersion Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
<!-- Test packages -->
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.1" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="FluentAssertions" Version="8.5.0" />
</ItemGroup>
</Project>

38
Dockerfile Normal file
View File

@@ -0,0 +1,38 @@
#See https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 8080
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /code
COPY ["Directory.Packages.props", "./"]
COPY ["src/Ray.BiliBiliTool.Web/Ray.BiliBiliTool.Web.csproj", "src/Ray.BiliBiliTool.Web/"]
COPY ["src/Ray.BiliBiliTool.Web.Client/Ray.BiliBiliTool.Web.Client.csproj", "src/Ray.BiliBiliTool.Web.Client/"]
COPY ["src/Ray.BiliBiliTool.Application/Ray.BiliBiliTool.Application.csproj", "src/Ray.BiliBiliTool.Application/"]
COPY ["src/Ray.BiliBiliTool.Application.Contracts/Ray.BiliBiliTool.Application.Contracts.csproj", "src/Ray.BiliBiliTool.Application.Contracts/"]
COPY ["src/Ray.BiliBiliTool.Domain/Ray.BiliBiliTool.Domain.csproj", "src/Ray.BiliBiliTool.Domain/"]
COPY ["src/Ray.BiliBiliTool.DomainService/Ray.BiliBiliTool.DomainService.csproj", "src/Ray.BiliBiliTool.DomainService/"]
COPY ["src/Ray.BiliBiliTool.Config/Ray.BiliBiliTool.Config.csproj", "src/Ray.BiliBiliTool.Config/"]
COPY ["src/Ray.BiliBiliTool.Agent/Ray.BiliBiliTool.Agent.csproj", "src/Ray.BiliBiliTool.Agent/"]
COPY ["src/Ray.BiliBiliTool.Infrastructure/Ray.BiliBiliTool.Infrastructure.csproj", "src/Ray.BiliBiliTool.Infrastructure/"]
COPY ["src/Ray.BiliBiliTool.Infrastructure.EF/Ray.BiliBiliTool.Infrastructure.EF.csproj", "src/Ray.BiliBiliTool.Infrastructure.EF/"]
COPY ["src/BlazingQuartz.Core/BlazingQuartz.Core.csproj", "src/BlazingQuartz.Core/"]
COPY ["src/BlazingQuartz.Jobs/BlazingQuartz.Jobs.csproj", "src/BlazingQuartz.Jobs/"]
COPY ["src/BlazingQuartz.Jobs.Abstractions/BlazingQuartz.Jobs.Abstractions.csproj", "src/BlazingQuartz.Jobs.Abstractions/"]
RUN dotnet restore "src/Ray.BiliBiliTool.Web/Ray.BiliBiliTool.Web.csproj"
COPY . .
WORKDIR "/code/src/Ray.BiliBiliTool.Web"
RUN dotnet build "Ray.BiliBiliTool.Web.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Ray.BiliBiliTool.Web.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY docker/entrypoint.sh /app/entrypoint.sh
RUN rm -rf /var/lib/apt/lists/* \
&& chmod +x /app/entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]

674
LICENSE Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

276
README.md Normal file
View File

@@ -0,0 +1,276 @@
![2233](docs/imgs/2233.png)
<div align="center">
<h1 align="center">
BiliTool
</h1>
[![GitHub Stars](https://img.shields.io/github/stars/RayWangQvQ/BiliBiliToolPro?style=flat-square)](https://github.com/RayWangQvQ/BiliBiliToolPro/stargazers)
[![GitHub Forks](https://img.shields.io/github/forks/RayWangQvQ/BiliBiliToolPro?style=flat-square)](https://github.com/RayWangQvQ/BiliBiliToolPro/network)
[![GitHub Issues](https://img.shields.io/github/issues/RayWangQvQ/BiliBiliToolPro?style=flat-square)](https://github.com/RayWangQvQ/BiliBiliToolPro/issues)
[![GitHub Contributors](https://img.shields.io/github/contributors/RayWangQvQ/BiliBiliToolPro?style=flat-square)](https://github.com/RayWangQvQ/BiliBiliToolPro/graphs/contributors)
[![GitHub All Releases](https://img.shields.io/github/downloads/RayWangQvQ/BiliBiliToolPro/total?style=flat-square)](https://github.com/RayWangQvQ/BiliBiliToolPro/releases)
[![GitHub Release (latest SemVer)](https://img.shields.io/github/v/release/RayWangQvQ/BiliBiliToolPro?style=flat-square)](https://github.com/RayWangQvQ/BiliBiliToolPro/releases)
[![GitHub License](https://img.shields.io/github/license/RayWangQvQ/BiliBiliToolPro?style=flat-square)](https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/LICENSE)
<a href="https://trendshift.io/repositories/3329" target="_blank">
<img src="https://trendshift.io/api/badge/repositories/3329" alt="RayWangQvQ%2FBiliBiliToolPro | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/>
</a>
</div>
**BiliTool 是一个自动执行任务的工具,当我们忘记做某项任务时,它会像一个贴心小助手,按照我们预先吩咐它的命令,在指定频率、时间范围内帮助我们完成计划的任务。**
**BiliTool is an automated task execution tool that acts as a helpful assistant, following pre-configured commands to complete planned tasks within specified frequencies and timeframes when we forget to do them.**
主要功能如下:
- **扫码登录自动更新cookie**
- **每日获取满额升级经验登录、投币、点赞、分享视频支持指定up主**
- **直播间挂机**
- **每天漫画签到**
- **每天直播签到**
- **直播中心银瓜子兑换为硬币**
- **每月领取大会员赠送的 5 张 B 币券和福利(忘记或者不领就浪费了哦)**
- **每月领取大会员漫画福利**
- **月底在 B 币券过期前进行充电支持指定想要支持的up主如果没有喜欢的up也可以为自己充个电啊做个用爱为自己发电的人~**
- **直播中心天选时刻自动参与抽奖**
- **批量取关**
- **大会员大积分任务**
- **支持多账号**
- **理论上支持所有远端的日志推送默认支持推送到Telegram、企业微信、钉钉、PushPlus、Server酱、酷推另外也支持自定义推送到任意api**
---
[目录]
<!-- TOC depthFrom:2 -->
- [1. 如何使用](#1-如何使用)
- [1.1. 部署 BiliTool](#11-部署-bilitool)
- [1.1.1. 方案一:免费在线容器](#111-方案一免费在线容器)
- [1.1.2. 方式二:青龙](#112-方式二青龙)
- [1.1.3. 方式三Docker 或 Podman 运行](#113-方式三docker-或-podman-运行)
- [1.1.4. 方式四:下载程序包到本地或服务器运行](#114-方式四下载程序包到本地或服务器运行)
- [1.1.5. 方式五Chart部署](#115-方式五chart部署)
- [1.2. 消息推送(可选)](#12-消息推送可选)
- [2. 功能任务说明](#2-功能任务说明)
- [3. 个性化自定义配置](#3-个性化自定义配置)
- [4. 多账号支持](#4-多账号支持)
- [5. 常见问题](#5-常见问题)
- [6. 版本发布及更新](#6-版本发布及更新)
- [7. 成为开源贡献成员](#7-成为开源贡献成员)
- [7.1. 贡献代码](#71-贡献代码)
- [7.2. 贡献文档](#72-贡献文档)
- [8. 捐赠支持](#8-捐赠支持)
- [9. 其他](#9-其他)
<!-- /TOC -->
---
**Github 仓库地址:[RayWangQvQ/BiliBiliToolPro](https://github.com/RayWangQvQ/BiliBiliToolPro)**
**注意:**
- **本应用仅用于学习和测试,作者本人并不对其负责,请于运行测试完成后自行删除,请勿滥用!**
- **所有代码都是开源且透明的,任何人均可查看,程序不会保存或滥用任何用户的个人信息**
- **应用内几乎所有功能都开放了配置如任务开关、日期、id等详细信息可阅读配置文档**
运行图示:
<p align="center">
<img src="docs/imgs/web-schedules.png" alt="运行图示" width="800" />
<br/>
<img src="docs/imgs/web-schedules-log.png" alt="运行日志" width="800" />
<br/>
<img src="docs/imgs/web-configs.png" alt="运行日志" width="800" />
<br/>
</p>
## 1. 如何使用
BiliTool 实现自动完成任务的原理是通过调用一系列开放的api实现的。
**要使用 BiliTool很简单按照下面教程部署完成运行后扫码登录即可。**
### 1.1. 部署 BiliTool
支持多种部署方式,以下选择任一适合自己的方式即可。
#### 1.1.1. 方案一:免费在线容器
有很多平台会提供一定免费额度的在线容器,基于官方镜像,部署 BiliTool 很容易。
以下以 ClawCloud 为例,其他平台操作类似:
[>>ClawCloud 部署教程](docs/claw-cloud.md)
#### 1.1.2. 方式二:青龙
[>>青龙部署教程](qinglong/README.md)
#### 1.1.3. 方式三Docker 或 Podman 运行
[>>Docker 部署说明](docker/README.md)
[>>Podman 部署说明](podman/README.md)
#### 1.1.4. 方式四:下载程序包到本地或服务器运行
[>>本地部署说明](docs/runInLocal.md)
#### 1.1.5. 方式五Chart部署
[>>Chart部署说明](helm/README.md)
### 1.2. 消息推送(可选)
如果配置了推送,执行成功后,指定的接收端会收到推送消息,推送效果如下所示:
<p align="center">
<img src="docs/imgs/push-tg.png" alt="Telegram推送图示" width="300">
</p>
目前默认支持**Telegram推送、PushPlus推送、企业微信应用推送、企业微信推送、钉钉推送、Microsoft Teams推送、Server酱推送和酷推QQ推送**以上顺序即为个人推荐的排序如果需要推送到其他端也可以配置为任意的可以接受消息的Api地址关于如何配置推送请详见下面的**个性化自定义配置**章节。
推送配置见:[confifuration](/docs/configuration.md)
## 2. 功能任务说明
这里的**任务**是指一组功能的集合,是工具每次运行的最小单位。
任务列表如下:
|    任务名     |      Code       |                                                功能                                                 | 推荐运行频率 |
| :--------: | :-------------: | :-----------------------------------------------------------------------------------------------: | :--------------: |
| 扫码登录 | Login | 使用app扫码登录用于第一次运行时初始化cookie或cookie过期时的更新。不同平台会将cookie存储到不同地方 |       手动         |
| 每日任务 | Daily | 完成每日任务获取满额65点经验登录、观看视频、分享视频、投币快速升级Lv6 | 每天一次 |
| 天选时刻抽奖 | LiveLottery | 直播中心天选时刻抽奖,大部分抽奖都需要关注主播,介意的不要开启 | 每天0-4次 |
| 批量取关 | UnfollowBatched | 批量取关指定分组下的所有关注(主要用于清理天选抽奖而产生的关注) | 手动运行 |
| 大会员大积分 |   VipBigPoint   | 大会员大积分任务(签到、浏览、观看) | 每天一次,建议凌晨 |
| 直播间挂机 | LiveFansMedal | 直播间挂机 | 每天一次 |
| 漫画任务 | Manga | 漫画签到、阅读 | 每天一次 |
| 领取大会员漫画权益 | MangaPrivilege | 领取大会员的漫画权益 | 每天一次 |
| 银瓜子兑换硬币 | Silver2Coin | 使用银瓜子换取硬币 | 每天一次 |
| 免费B币券充电 | Charge | 大会员每31天可免费领取一张5B币券可用于给除自己以外的UP充电 | 每天一次 |
| 领取大会员福利 | VipPrivilege | 领取大会员福利 | 每天一次 |
| 测试Cookie | Test | 测试Cookie是否正常 | 手动运行 |
## 3. 个性化自定义配置
[>>点击查看配置说明文档](docs/configuration.md)
## 4. 多账号支持
部署成功后直接去运行扫码登录任务扫码成功后应用会自动更新或添加cookie。
青龙平台会添加环境变量里Key 为 `Ray_BiliBiliCookies__0``Ray_BiliBiliCookies__1``Ray_BiliBiliCookies__2`...
其他平台默认会添加到名为cookies.json的账号配置文件中
```
{
"BiliBiliCookies": [
"cookie1",
"cookie2",
"...",
],
}
```
## 5. 常见问题
[>>点击查看常见问题文档](docs/questions.md)
[Issues议题](https://github.com/RayWangQvQ/BiliBiliToolPro/issues)板块可以用来提交**Bug**和**建议**
[Discussions讨论](https://github.com/RayWangQvQ/BiliBiliToolPro/discussions)板块可以用来**提问**和**讨论**。
大部分问题其实都可以在文档、议题和讨论中找到答案。
所以如果你有疑问,
* 请先确认是否可以通过升级到最新版本解决
* 然后搜索文档(特别是配置说明文档和常见问题文档)、议题和讨论,查看是否已有其他人遇到相同问题、是否已有解决方案
如果确认还未解决,可以自己提交 Issue或发布 Discussions 与大家一起探讨,我会尽快确认并解决。
关于如何正确的提交Issue请详见**常见问题文档**)。
## 6. 版本发布及更新
当前正处于稳定的迭代开发中,详细待更新和计划内容可参见 [Projects](https://github.com/RayWangQvQ/BiliBiliToolPro/projects) 和 [Issues](https://github.com/RayWangQvQ/BiliBiliToolPro/issues) 。
想要有重要更新时收到通知的话,可以把仓库右上角的`Star`按钮点亮。
## 7. 成为开源贡献成员
### 7.1. 贡献代码
如果你有好的想法,欢迎向仓库贡献你的代码,贡献步骤:
* 搜索查看 Issue确定是否已有人提过同类问题
* 对于不确定的主题为避免code结束后PR不被接受可以先新建 Issue描述问题或建议讨论清楚后再动手编码
* 如果确认自己可以解决,请 Fork 仓库后,在**develop 分支**进行编码开发,完成后**提交 PR 到 develop 分支**
我会尽快进行代码审核,测试成功后会合并入 main 主分支,提前感谢您的贡献。
### 7.2. 贡献文档
文档部分由于我个人精力有限(写文档比写代码累多了),所以有些地方写的很简略,甚至有遗漏和错别字,不能贡献代码的朋友也欢迎来一起维护文档,欢迎 PR 来纠正我,一样都算是对开源做贡献了。
## 8. 捐赠支持
个人维护开源不易
如果觉得我写的程序对你小有帮助
或者,就是单纯的想集资给我买瓶霸王增发液
那么下面的赞赏码可以扫一扫啦
(赞赏时记得留下【昵称】和【留言】~ 另外我发现很多留言想要进群或者加好友的,一定一定要记得留下微信号哈,微信赞赏页面是看不到微信号的)
**☟☟☟ 扫码自动赞赏 1 元:☟☟☟**
![赞赏码](docs/imgs/donate.jpg)
> 项目中的优先支持的UP主的配置项默认是作者的 UpId (只是作为了 JSON 配置文件的默认值代码是干净的需要更改的话直接修改相应配置即可secrets或环境变量等各种方式都行
当然,不改的话,也算是另一种捐赠支持作者的方式啦。
感谢支持~
## 9. 其他
`API`参考:
- [www.bilibili.com](https://www.bilibili.com/)
- [SocialSisterYi/bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)
- [JunzhouLiu/BILIBILI-HELPER](https://github.com/JunzhouLiu/BILIBILI-HELPER)
Thanks to `JetBrains` for the free certificate support:
<p align="center">
<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/ReSharper.svg" alt="ReSharper logo" width="200">
</p>
Thanks to [YxVM](https://yxvm.com/aff.php?aff=668) & [NodeSeekDev](https://github.com/NodeSeekDev/NodeSupport) for sponsoring the server for testing support:
<p align="center">
<a href="https://yxvm.com/aff.php?aff=668">
<img src="docs/imgs/node-support.png" alt="YxVm logo" width="200">
</a>
</p>
Thanks to [DartNode](https://dartnode.com?aff=FriskyGopher833) for sponsoring the server for testing support:
[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com "Powered by DartNode - Free VPS for Open Source")
Thank you for your star to this project:
[![Star History Chart](https://api.star-history.com/svg?repos=RayWangQvQ/BiliBiliToolPro&type=Date)](https://www.star-history.com/#RayWangQvQ/BiliBiliToolPro&Date)

294
Ray.BiliBiliTool.sln Normal file
View File

@@ -0,0 +1,294 @@

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
common.props = common.props
Dockerfile = Dockerfile
LICENSE = LICENSE
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
.github\workflows\tag.yml = .github\workflows\tag.yml
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{A93210FD-27B6-40E4-B08D-391F96CA2754}"
ProjectSection(SolutionItems) = preProject
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\bug-report-qinglong----.md = .github\ISSUE_TEMPLATE\bug-report-qinglong----.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\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("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ray.BiliBiliTool.Agent.FunctionalTests", "test\Ray.BiliBiliTool.Agent.FunctionalTests\Ray.BiliBiliTool.Agent.FunctionalTests.csproj", "{16F315CF-056A-4B08-8C3C-A3177EA3CBB9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{2B5FD099-CC28-4FBC-9F20-F20300C5DFD2}"
ProjectSection(SolutionItems) = preProject
scripts\clean.cmd = scripts\clean.cmd
scripts\publish.bat = scripts\publish.bat
scripts\publish.ps1 = scripts\publish.ps1
scripts\publish.sh = scripts\publish.sh
scripts\ut.ps1 = scripts\ut.ps1
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ray.BiliBiliTool.Web.Client", "src\Ray.BiliBiliTool.Web.Client\Ray.BiliBiliTool.Web.Client.csproj", "{5772E00F-271F-4B25-8B10-A3C24D8D3E10}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ray.BiliBiliTool.Web", "src\Ray.BiliBiliTool.Web\Ray.BiliBiliTool.Web.csproj", "{189F1FF4-2BFA-4F91-A6B2-00D00AC2910C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazingQuartz.Core", "src\BlazingQuartz.Core\BlazingQuartz.Core.csproj", "{C947CA59-157C-47F0-A842-7912FACDADA7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazingQuartz.Jobs.Abstractions", "src\BlazingQuartz.Jobs.Abstractions\BlazingQuartz.Jobs.Abstractions.csproj", "{5792B0A0-A3F5-461D-AD44-8E8778298BE4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazingQuartz.Jobs", "src\BlazingQuartz.Jobs\BlazingQuartz.Jobs.csproj", "{1F93A755-60A6-4B14-A522-633A732F3B91}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ray.BiliBiliTool.Domain", "src\Ray.BiliBiliTool.Domain\Ray.BiliBiliTool.Domain.csproj", "{C1334E67-CCF9-4F5B-9C1F-B9516A8270AB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ray.BiliBiliTool.Infrastructure.EF", "src\Ray.BiliBiliTool.Infrastructure.EF\Ray.BiliBiliTool.Infrastructure.EF.csproj", "{59583288-CE93-42A4-AC9F-67DE347A02A1}"
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
{5772E00F-271F-4B25-8B10-A3C24D8D3E10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5772E00F-271F-4B25-8B10-A3C24D8D3E10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5772E00F-271F-4B25-8B10-A3C24D8D3E10}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5772E00F-271F-4B25-8B10-A3C24D8D3E10}.Release|Any CPU.Build.0 = Release|Any CPU
{189F1FF4-2BFA-4F91-A6B2-00D00AC2910C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{189F1FF4-2BFA-4F91-A6B2-00D00AC2910C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{189F1FF4-2BFA-4F91-A6B2-00D00AC2910C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{189F1FF4-2BFA-4F91-A6B2-00D00AC2910C}.Release|Any CPU.Build.0 = Release|Any CPU
{C947CA59-157C-47F0-A842-7912FACDADA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C947CA59-157C-47F0-A842-7912FACDADA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C947CA59-157C-47F0-A842-7912FACDADA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C947CA59-157C-47F0-A842-7912FACDADA7}.Release|Any CPU.Build.0 = Release|Any CPU
{5792B0A0-A3F5-461D-AD44-8E8778298BE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5792B0A0-A3F5-461D-AD44-8E8778298BE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5792B0A0-A3F5-461D-AD44-8E8778298BE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5792B0A0-A3F5-461D-AD44-8E8778298BE4}.Release|Any CPU.Build.0 = Release|Any CPU
{1F93A755-60A6-4B14-A522-633A732F3B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F93A755-60A6-4B14-A522-633A732F3B91}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F93A755-60A6-4B14-A522-633A732F3B91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F93A755-60A6-4B14-A522-633A732F3B91}.Release|Any CPU.Build.0 = Release|Any CPU
{C1334E67-CCF9-4F5B-9C1F-B9516A8270AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C1334E67-CCF9-4F5B-9C1F-B9516A8270AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C1334E67-CCF9-4F5B-9C1F-B9516A8270AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C1334E67-CCF9-4F5B-9C1F-B9516A8270AB}.Release|Any CPU.Build.0 = Release|Any CPU
{59583288-CE93-42A4-AC9F-67DE347A02A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{59583288-CE93-42A4-AC9F-67DE347A02A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{59583288-CE93-42A4-AC9F-67DE347A02A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{59583288-CE93-42A4-AC9F-67DE347A02A1}.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}
{2B5FD099-CC28-4FBC-9F20-F20300C5DFD2} = {F3DE0D72-426B-4AD9-B3ED-3343CF4223F1}
{5772E00F-271F-4B25-8B10-A3C24D8D3E10} = {38736647-2196-417E-8519-C48A012A63D9}
{189F1FF4-2BFA-4F91-A6B2-00D00AC2910C} = {38736647-2196-417E-8519-C48A012A63D9}
{C947CA59-157C-47F0-A842-7912FACDADA7} = {98051127-2868-4F5C-9B2C-2150975E05F3}
{5792B0A0-A3F5-461D-AD44-8E8778298BE4} = {98051127-2868-4F5C-9B2C-2150975E05F3}
{1F93A755-60A6-4B14-A522-633A732F3B91} = {98051127-2868-4F5C-9B2C-2150975E05F3}
{C1334E67-CCF9-4F5B-9C1F-B9516A8270AB} = {120917DC-474C-448B-9EBB-1B3BA3A20B9D}
{59583288-CE93-42A4-AC9F-67DE347A02A1} = {110D3D21-8E9B-45AB-9667-6DA1DB3862AC}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {197319DA-1148-4A99-847C-8B270B6A29AB}
EndGlobalSection
EndGlobal

8
bruno/.env.sample Normal file
View File

@@ -0,0 +1,8 @@
phone=
pwd=
mid=
buvid=
csrf=
access_key=
cookieStr=
device_id=

View File

@@ -0,0 +1,3 @@
meta {
name: space
}

View File

@@ -0,0 +1,42 @@
meta {
name: wbi-acc-info
type: http
seq: 1
}
get {
url: https://api.bilibili.com/x/space/wbi/acc/info?mid=23947287&token&platform=web&web_location=1550101&dm_img_list=[]&dm_img_str=V2ViR0wgMS4wIChPcGVuR0wgRVMgMi4wIENocm9taXVtKQ&dm_cover_img_str=QU5HTEUgKEFNRCwgQU1EIFJhZGVvbihUTSkgR3JhcGhpY3MgKDB4MDAwMDE2MzgpIERpcmVjdDNEMTEgdnNfNV8wIHBzXzVfMCwgRDNEMTEpR29vZ2xlIEluYy4gKEFNRC&dm_img_inter={"ds":[],"wh":[5563,4171,107],"of":[66,132,66]}&w_webid=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcG1faWQiOiIzMzMuMTM4NyIsImJ1dmlkIjoiQ0VGODNDQjAtMzY2NC0zNDU4LTI5RTctRTJFOENCQjY0NzlCNjU2MjFpbmZvYyIsInVzZXJfYWdlbnQiOiJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTM3LjAuMC4wIFNhZmFyaS81MzcuMzYgRWRnLzEzNy4wLjAuMCIsImJ1dmlkX2ZwIjoiMDNjNGYyNWQyZTlmMDZkNjU4NzJlMmVhNTdiMjJmMzkiLCJiaWxpX3RpY2tldCI6ImV5SmhiR2NpT2lKSVV6STFOaUlzSW10cFpDSTZJbk13TXlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUzTkRjM01qYzVORGdzSW1saGRDSTZNVGMwTnpRMk9EWTRPQ3dpY0d4MElqb3RNWDAuQmVkeFFPX3VZMllldFVFb0FvWE5hellBNzFTTkdhc0JtSkNnaFFsVy1iTSIsImNyZWF0ZWRfYXQiOjE3NDc0Njg4NDEsInR0bCI6ODY0MDAsInVybCI6Ii8yMzk0NzI4NyIsInJlc3VsdCI6MCwiaXNzIjoiZ2FpYSIsImlhdCI6MTc0NzQ2ODg0MX0.IhLw1v9Auwys4SFZ7PFaTXgkVqodmz67ZdVPORbnmcw3rxirilDqngVFpr3AYjUQ8hx-gmGTrMgeus12QE4zn9ql-wjTRKzbi9G2WEzDKEwHMNBKVIepaSZqHYIbKBwWsjqdEL9paDeRDpPiZ37YJ4YMKNsFfEP2yC_4ke2_KS2cgfSaaOhaXtXfEZortr_KvKWhY3gtJKC77HqEerZEID5hda8oqCTxZbb7gV7DDuncJ803K9H5ezWn-8a-y3eSdpbBB8Td5-u8At9mhHVgrKcODM7gi-Lhbnb86m7p4yyBoPs_iucDQJSGvs9Lijio57bL60Qm6_mIz0p49rzFWA&w_rid=160dcf0623b0733688e8940d2f6763e3&wts=1747468845
body: none
auth: inherit
}
params:query {
mid: 23947287
token:
platform: web
web_location: 1550101
dm_img_list: []
dm_img_str: V2ViR0wgMS4wIChPcGVuR0wgRVMgMi4wIENocm9taXVtKQ
dm_cover_img_str: QU5HTEUgKEFNRCwgQU1EIFJhZGVvbihUTSkgR3JhcGhpY3MgKDB4MDAwMDE2MzgpIERpcmVjdDNEMTEgdnNfNV8wIHBzXzVfMCwgRDNEMTEpR29vZ2xlIEluYy4gKEFNRC
dm_img_inter: {"ds":[],"wh":[5563,4171,107],"of":[66,132,66]}
w_webid: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcG1faWQiOiIzMzMuMTM4NyIsImJ1dmlkIjoiQ0VGODNDQjAtMzY2NC0zNDU4LTI5RTctRTJFOENCQjY0NzlCNjU2MjFpbmZvYyIsInVzZXJfYWdlbnQiOiJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTM3LjAuMC4wIFNhZmFyaS81MzcuMzYgRWRnLzEzNy4wLjAuMCIsImJ1dmlkX2ZwIjoiMDNjNGYyNWQyZTlmMDZkNjU4NzJlMmVhNTdiMjJmMzkiLCJiaWxpX3RpY2tldCI6ImV5SmhiR2NpT2lKSVV6STFOaUlzSW10cFpDSTZJbk13TXlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUzTkRjM01qYzVORGdzSW1saGRDSTZNVGMwTnpRMk9EWTRPQ3dpY0d4MElqb3RNWDAuQmVkeFFPX3VZMllldFVFb0FvWE5hellBNzFTTkdhc0JtSkNnaFFsVy1iTSIsImNyZWF0ZWRfYXQiOjE3NDc0Njg4NDEsInR0bCI6ODY0MDAsInVybCI6Ii8yMzk0NzI4NyIsInJlc3VsdCI6MCwiaXNzIjoiZ2FpYSIsImlhdCI6MTc0NzQ2ODg0MX0.IhLw1v9Auwys4SFZ7PFaTXgkVqodmz67ZdVPORbnmcw3rxirilDqngVFpr3AYjUQ8hx-gmGTrMgeus12QE4zn9ql-wjTRKzbi9G2WEzDKEwHMNBKVIepaSZqHYIbKBwWsjqdEL9paDeRDpPiZ37YJ4YMKNsFfEP2yC_4ke2_KS2cgfSaaOhaXtXfEZortr_KvKWhY3gtJKC77HqEerZEID5hda8oqCTxZbb7gV7DDuncJ803K9H5ezWn-8a-y3eSdpbBB8Td5-u8At9mhHVgrKcODM7gi-Lhbnb86m7p4yyBoPs_iucDQJSGvs9Lijio57bL60Qm6_mIz0p49rzFWA
w_rid: 160dcf0623b0733688e8940d2f6763e3
wts: 1747468845
}
headers {
accept: */*
accept-language: en
dnt: 1
origin: https://space.bilibili.com
priority: u=1, i
referer: https://space.bilibili.com/23947287
sec-ch-ua: "Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-site
user-agent: {{user-agent}}
Cookie: {{cookieStr}}
}

View File

@@ -0,0 +1,3 @@
meta {
name: vip
}

View File

@@ -0,0 +1,3 @@
meta {
name: vip_center
}

View File

@@ -0,0 +1,3 @@
meta {
name: sign_in
}

View File

@@ -0,0 +1,88 @@
meta {
name: three_days_sign
type: http
seq: 1
}
get {
url: https://api.bilibili.com/x/vip/vip_center/sign_in/three_days_sign?access_key={{access_key}}&appkey={{appKey}}&build=8451100&csrf={{csrf}}&device=phone&disable_rcmd=0&mobi_app=android&platform=android&statistics={"appId":1,"platform":3,"version":"8.45.1","abtest":""}&t=1748747431084&ts=1748747431&web_location=666.146&sign=e95c76f976aed346f84cdc7098f8c35e
body: none
auth: inherit
}
params:query {
access_key: {{access_key}}
appkey: {{appKey}}
build: 8451100
csrf: {{csrf}}
device: phone
disable_rcmd: 0
mobi_app: android
platform: android
statistics: {"appId":1,"platform":3,"version":"8.45.1","abtest":""}
t: 1748747431084
ts: 1748747431
web_location: 666.146
sign: e95c76f976aed346f84cdc7098f8c35e
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
accept: application/json, text/plain, */*
bili-http-engine: ignet
buvid: {{buvid}}
native_api_from: h5
referer: https://big.bilibili.com/mobile/index
user-agent: {{user-agent}}
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-metadata-legal-region: CN
x-bili-mid: {{mid}}
x-bili-net-bin: DQAAgL8gAQ
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDg3NzU1OTksImlhdCI6MTc0ODc0NjQ5OSwiYnV2aWQiOiJYVUE1NjUxQTlFREY3Mzg3MTUzQTk0NUNERTk2Q0FEQ0I2MDAwIn0.k0x2o3e2Q3W-6Wzc56IhbLgSjDKTaAuUV9om7K213fI
x-bili-trace-id: 25ad3d0de58f794c18d1a884fc683bc4:18d1a884fc683bc4:0:0
}
docs {
Response sample:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"big_point": {
"point": 405,
"expire_point": 0,
"expire_time": 0,
"expire_days": 0
},
"three_day_sign": {
"previous_vip_status": 0,
"vip_status": 1,
"day": 5,
"signed": false,
"count": 2,
"has_coupon": false,
"countdown": 0,
"icon": "",
"score": 5,
"vip_score": 5,
"explain": "",
"exp_value": 3,
"received_coupon": false,
"day1_icon": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day1_icon.png",
"day2_icon": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day2_icon.png",
"day3_icon": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_icon.png",
"day3_icon_vip": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_icon_vip.png",
"day3_win_img": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_win_img.png",
"day3_win_img_vip": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_win_img_vip.png",
"day3_icon_received": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_icon_received.png",
"day3_icon_vip_received": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_icon_vip_received.png",
"duration": 7
}
}
}
```
}

View File

@@ -0,0 +1,3 @@
meta {
name: web
}

View File

@@ -0,0 +1,3 @@
meta {
name: vip_center
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
meta {
name: app.bilibili.com
}
script:pre-request {
const CryptoJS = require('crypto-js');
console.log("start");
const md5 = (str) => CryptoJS.MD5(str).toString(CryptoJS.enc.Hex);
const replacePlaceholders = (body) => {
for (const key in body) {
if (typeof body[key] === 'string') {
// Check if value contains {{}} placeholders
const matches = body[key].match(/{{(.*?)}}/g);
if (matches) {
matches.forEach(match => {
const placeholder = match.slice(2, -2); // Remove the {{ and }}
const value = bru.getEnvVar(placeholder);
body[key] = body[key].replace(match, value);
});
}
}
}
};
function appSign(params, appkey, appsec) {
params.appkey = appkey;
delete body.sign;
const sortedKeys = Object.keys(params).sort();
const sortedParams = sortedKeys.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&');
console.log(sortedParams);
return md5(sortedParams + appsec);
}
const body = req.getBody();
if (body && body.hasOwnProperty('sign')) {
replacePlaceholders(body);
const sign = appSign(body, bru.getEnvVar("appKey"), bru.getEnvVar("appSec"));
console.log("calculate sign:" + sign);
body.sign = sign;
}
req.setBody(body);
}

View File

@@ -0,0 +1,96 @@
meta {
name: receive
type: http
seq: 1
}
post {
url: https://app.bilibili.com/pgc/activity/deliver/material/receive
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: e04d2e05
env: prod
app-key: android64
user-agent: {{user-agent}}
x-bili-trace-id: 0564afa825e0e1ec59164fe59367755a:59164fe59367755a:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NzI2NDcsImlhdCI6MTczNTc0MzU0NywiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.eafhpooLoe2q6cA45_Xrgq1VO-y490pxP5gwJ4qm_ik
bili-http-engine: cronet
Cookie: {{cookieStr}}
}
body:form-urlencoded {
activity_code:
appkey: {{appKey}}
build: {{build}}
c_locale: zh_CN
channel: bili
disable_rcmd: 0
ep_id: 328482
from_spmid: activity.h5.0.0
mobi_app: android
platform: android
s_locale: zh_CN
season_id: 12548
spmid: united.player-video-detail.0.0
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
ts: 1736179521
sign: 132d2532467ef649a925aece247cdb4b
access_key: {{access_key}}
}
docs {
终端APP
作用:开始大会员赚大积分任务-观看剧集内容
入口:
- 我的->会员中心->赚大积分->查看8项任务点击“观看剧集内容”选择视频后触发
传入剧集的id会返回task_id和token用于标识该次观看任务
该sample的视频为《让子弹飞》
完整的观看剧集内容任务调用接口如下:
- 领取app.bilibili.com/pgc/activity/score/task/receive/v2
- 开始app.bilibili.com/pgc/activity/deliver/material/receive
- 上报完成app.bilibili.com/pgc/activity/deliver/task/complete
Response Sample:
```json
{
"code": 0,
"data": {
"closeType": "close_win",
"container": [],
"showTime": "",
"watch_count_down_cfg": {
"action": "url",
"closeType": "close_win",
"complete_status_desc": "大积分已到账",
"complete_status_jump_url": "https://big.bilibili.com/mobile/bigPoint?navhide=1&closable=1",
"count_down_status_desc": "看${time}获大积分",
"login": true,
"milliseconds": 600000,
"pause_status_desc": "计时暂停",
"showTime": "ENTER",
"task_id": "4320003",
"token": "67ba5888e7"
}
},
"message": "success"
}
```
}

View File

@@ -0,0 +1,70 @@
meta {
name: complete-ogv
type: http
seq: 2
}
post {
url: https://app.bilibili.com/pgc/activity/deliver/task/complete
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: e04d2e05
env: prod
app-key: android64
user-agent: {{user-agent}}
x-bili-trace-id: a301946d9621645a707b40973f67755c:707b40973f67755c:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NzI2NDcsImlhdCI6MTczNTc0MzU0NywiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.eafhpooLoe2q6cA45_Xrgq1VO-y490pxP5gwJ4qm_ik
bili-http-engine: cronet
Cookie: {{cookieStr}}
}
body:form-urlencoded {
build: {{build}}
c_locale: zh_CN
channel: bili
disable_rcmd: 0
mobi_app: android
platform: android
s_locale: zh_CN
statistics: {{statistics}}
access_key: {{access_key}}
ts: 1735744760
sign: 2292d647d9b3f6dbd2f99b5a90cbddaf
appkey: {{appKey}}
task_id: 4320003
task_sign: 95cbef871100151e526fa5580534a364
timestamp: 1748884714621
token: 67ba5888e7
}
docs {
终端APP
作用:上报完成大会员赚大积分任务-观看剧集内容
入口:
- 我的->会员中心->赚大积分->查看8项任务点击“观看剧集内容”挑选视频观看10分钟后自动触发
传入剧集的id会返回task_id和token用于标识该次观看任务
task_sign必传与sign的生成方式相同。即先排除掉task_sign和sign生成签名后赋值给task_sign然后在签名一次得到sign
且只能调用成功一次第二次及之后会返回400
完整的观看剧集内容任务调用接口如下:
- 领取app.bilibili.com/pgc/activity/score/task/receive/v2
- 开始app.bilibili.com/pgc/activity/deliver/material/receive
- 上报完成app.bilibili.com/pgc/activity/deliver/task/complete
}

View File

@@ -0,0 +1,66 @@
meta {
name: complete
type: http
seq: 1
}
post {
url: https://app.bilibili.com/pgc/activity/deliver/task/complete
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: e04d2e05
env: prod
app-key: android64
user-agent: {{user-agent}}
x-bili-trace-id: a301946d9621645a707b40973f67755c:707b40973f67755c:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NzI2NDcsImlhdCI6MTczNTc0MzU0NywiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.eafhpooLoe2q6cA45_Xrgq1VO-y490pxP5gwJ4qm_ik
bili-http-engine: cronet
Cookie: {{cookieStr}}
}
body:form-urlencoded {
build: {{build}}
c_locale: zh_CN
channel: bili
disable_rcmd: 0
mobi_app: android
platform: android
s_locale: zh_CN
statistics: {{statistics}}
access_key: {{access_key}}
ts: 1735744760
sign: 2292d647d9b3f6dbd2f99b5a90cbddaf
appkey: {{appKey}}
position: tv_channel
win_id: bigscore-filmtab
}
docs {
终端APP
作用:上报完成大会员赚大积分任务-浏览追番频道页、浏览影视频道页(观看剧集内容接口相同,但入参不同,在另一个接口)
入口:
- 我的->会员中心->赚大积分->查看8项任务点击跳转后自动触发
完整的观看剧集内容任务调用接口如下:
- 领取app.bilibili.com/pgc/activity/score/task/receive/v2
- 上报完成app.bilibili.com/pgc/activity/deliver/task/complete
入参position:
- animatetab: jp_channel
- filmtab: tv_channel
}

View File

@@ -0,0 +1,73 @@
meta {
name: dressbuyamount
type: http
seq: 3
}
post {
url: https://api.bilibili.com/pgc/activity/score/task/receive/v2
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
native_api_from: h5
buvid: {{buvid}}
accept: application/json, text/plain, */*
referer: https://big.bilibili.com/mobile/bigPoint/task
user-agent: {{user-agent}}
x-bili-trace-id: 39dab959605906ee420167e8af677533:420167e8af677533:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NjI4NDksImlhdCI6MTczNTczMzc0OSwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.EIrjYHrmFeTJXZjxsWki_ZloVvL9IK_aDgpqslMASy0
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
appKey: {{appKey}}
appkey: {{appKey}}
bili_local_id: {{device_id}}
build: 7720200
buvid: {{buvid}}
channel: yingyongbao
containerName: AbstractWebActivity
csrf: {{csrf}}
device: phone
deviceId: f9abaee74692f9e9
deviceName: samsungNexus
devicePlatform: Android10samsungNexus
device_id: {{device_id}}
device_name: samsungNexus
device_platform: Android10samsungNexus
disable_rcmd: 0
fingerprint: {{device_id}}
isPad: false
localFingerprint: {{device_id}}
local_id: {{buvid}}
mobi_app: android
modelName: Nexus
networkState: 2
networkstate: 2
osVer: 10
platform: android
sessionID: 92c5ad7a
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
statusBarHeight: 77
taskCode: dressbuyamount
ts: 1735734245
sign: 293cc4d525cf41cfb8adb69f42185ec0:
}
docs {
终端APP
作用:领取大会员赚大积分任务-购买指定装扮商品
入口:
- 我的->会员中心->赚大积分->查看8项任务->领取任务
}

View File

@@ -0,0 +1,79 @@
meta {
name: ogvwatchnew
type: http
seq: 4
}
post {
url: https://app.bilibili.com/pgc/activity/score/task/receive/v2
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
native_api_from: h5
buvid: {{buvid}}
accept: application/json, text/plain, */*
referer: https://big.bilibili.com/mobile/bigPoint/task
user-agent: {{user-agent}}
x-bili-trace-id: 9e3ed57f35a83d4edb8160805867752f:db8160805867752f:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NjE2NjQsImlhdCI6MTczNTczMjU2NCwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.YVtwH53dLJ1l6n6aFcvwNZ4MBkgnBPtxE8UfD7u9J4I
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
appKey: {{appKey}}
appkey: {{appKey}}
bili_local_id: {{device_id}}
build: 7720200
buvid: {{buvid}}
channel: yingyongbao
containerName: AbstractWebActivity
csrf: {{csrf}}
device: phone
deviceId: f9abaee74692f9e9
deviceName: samsungNexus
devicePlatform: Android10samsungNexus
device_id: {{device_id}}
device_name: samsungNexus
device_platform: Android10samsungNexus
disable_rcmd: 0
fingerprint: {{device_id}}
isPad: false
localFingerprint: {{device_id}}
local_id: {{buvid}}
mobi_app: android
modelName: Nexus
networkState: 2
networkstate: 2
osVer: 10
platform: android
sessionID: 120548f6
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
statusBarHeight: 77
taskCode: ogvwatchnew
ts: 1735733021
sign: 5cc38f578700cfdb506f7e489abdf442:
}
docs {
终端APP
作用:领取大会员赚大积分任务-观看剧集内容
入口:
- 我的->会员中心->赚大积分->查看8项任务->领取任务
完整的观看剧集内容任务调用接口如下:
- 领取app.bilibili.com/pgc/activity/score/task/receive/v2
- 开始app.bilibili.com/pgc/activity/deliver/material/receive
- 上报完成app.bilibili.com/pgc/activity/deliver/task/complete
}

View File

@@ -0,0 +1,73 @@
meta {
name: tvodbuy
type: http
seq: 2
}
post {
url: https://api.bilibili.com/pgc/activity/score/task/receive/v2
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
native_api_from: h5
buvid: {{buvid}}
accept: application/json, text/plain, */*
referer: https://big.bilibili.com/mobile/bigPoint/task
user-agent: {{user-agent}}
x-bili-trace-id: 39dab959605906ee420167e8af677533:420167e8af677533:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NjI4NDksImlhdCI6MTczNTczMzc0OSwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.EIrjYHrmFeTJXZjxsWki_ZloVvL9IK_aDgpqslMASy0
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
appKey: {{appKey}}
appkey: {{appKey}}
bili_local_id: {{device_id}}
build: 7720200
buvid: {{buvid}}
channel: yingyongbao
containerName: AbstractWebActivity
csrf: {{csrf}}
device: phone
deviceId: f9abaee74692f9e9
deviceName: samsungNexus
devicePlatform: Android10samsungNexus
device_id: {{device_id}}
device_name: samsungNexus
device_platform: Android10samsungNexus
disable_rcmd: 0
fingerprint: {{device_id}}
isPad: false
localFingerprint: {{device_id}}
local_id: {{buvid}}
mobi_app: android
modelName: Nexus
networkState: 2
networkstate: 2
osVer: 10
platform: android
sessionID: 92c5ad7a
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
statusBarHeight: 77
taskCode: tvodbuy
ts: 1735734245
sign: 293cc4d525cf41cfb8adb69f42185ec0:
}
docs {
终端APP
作用:领取大会员赚大积分任务-购买单点付费影片
入口:
- 我的->会员中心->赚大积分->查看8项任务->领取任务
}

View File

@@ -0,0 +1,73 @@
meta {
name: vipmallbuy
type: http
seq: 1
}
post {
url: https://app.bilibili.com/pgc/activity/score/task/receive/v2
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
native_api_from: h5
buvid: {{buvid}}
accept: application/json, text/plain, */*
referer: https://big.bilibili.com/mobile/bigPoint/task
user-agent: {{user-agent}}
x-bili-trace-id: 9e3ed57f35a83d4edb8160805867752f:db8160805867752f:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NjE2NjQsImlhdCI6MTczNTczMjU2NCwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.YVtwH53dLJ1l6n6aFcvwNZ4MBkgnBPtxE8UfD7u9J4I
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
appKey: {{appKey}}
appkey: {{appKey}}
bili_local_id: {{device_id}}
build: 7720200
buvid: {{buvid}}
channel: yingyongbao
containerName: AbstractWebActivity
csrf: {{csrf}}
device: phone
deviceId: f9abaee74692f9e9
deviceName: samsungNexus
devicePlatform: Android10samsungNexus
device_id: {{device_id}}
device_name: samsungNexus
device_platform: Android10samsungNexus
disable_rcmd: 0
fingerprint: {{device_id}}
isPad: false
localFingerprint: {{device_id}}
local_id: {{buvid}}
mobi_app: android
modelName: Nexus
networkState: 2
networkstate: 2
osVer: 10
platform: android
sessionID: 120548f6
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
statusBarHeight: 77
taskCode: vipmallbuy
ts: 1735733021
sign: 5cc38f578700cfdb506f7e489abdf442:
}
docs {
终端APP
作用:领取大会员赚大积分任务-购买指定会员购商品
入口:
- 我的->会员中心->赚大积分->查看8项任务->领取任务
}

View File

@@ -0,0 +1,76 @@
meta {
name: end
type: http
seq: 1
}
post {
url: https://app.bilibili.com/x/report/heartbeat/mobile
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: e04d2e05
env: prod
app-key: android64
user-agent: {{user-agent}}
x-bili-trace-id: 2c64470432d0c5346a475a449467755d:6a475a449467755d:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NzI2NDcsImlhdCI6MTczNTc0MzU0NywiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.eafhpooLoe2q6cA45_Xrgq1VO-y490pxP5gwJ4qm_ik
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
actual_played_time: 548
aid: 726710400
appkey: {{appKey}}
auto_play: 99
build: 7720200
c_locale: zh_CN
channel: yingyongbao
cid: 785731972
disable_rcmd: 0
epid: 511578
epid_status: 13
extra: {"from_outer_spmid":"activity.h5.0.0"}
from: 12
from_spmid: united.player-video-detail.player.continue
last_play_progress_time: 638
list_play_time: 0
max_play_progress_time: 638
mid: {{mid}}
miniplayer_play_time: 0
mobi_app: android
network_type: 1
paused_time: 0
platform: android
play_mode: 1
play_status: 1
play_type:
played_time: 548
quality: 64
report_flow_data:
s_locale: zh_CN
session: 2edcb8dc8ff0b6f13dd685a23aff692b72bf2869
sid: 41410
spmid: united.player-video-detail.0.0
start_ts: 1735744223
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
sub_type: 1
total_time: 548
track_id:
ts: 1735744771
type: 4
user_status: 1
video_duration: 1450
sign: 1021d178fb342c0c48617d3692c97d46
}

View File

@@ -0,0 +1,76 @@
meta {
name: start
type: http
seq: 2
}
post {
url: https://app.bilibili.com/x/report/heartbeat/mobile
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: e04d2e05
env: prod
app-key: android64
user-agent: {{user-agent}}
x-bili-trace-id: 8fcda5ac30f6510905b2834bbb67755a:05b2834bbb67755a:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3NzI2NDcsImlhdCI6MTczNTc0MzU0NywiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.eafhpooLoe2q6cA45_Xrgq1VO-y490pxP5gwJ4qm_ik
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
actual_played_time: 0
aid: 726710400
appkey: {{appKey}}
auto_play: 99
build: 7720200
c_locale: zh_CN
channel: yingyongbao
cid: 785731972
disable_rcmd: 0
epid: 511578
epid_status: 13
extra: {"from_outer_spmid":"activity.h5.0.0"}
from: 12
from_spmid: united.player-video-detail.player.continue
last_play_progress_time: 0
list_play_time: 0
max_play_progress_time: 0
mid: {{mid}}
miniplayer_play_time: 0
mobi_app: android
network_type: 1
paused_time: 0
platform: android
play_mode: 1
play_status: 1
play_type:
played_time: 0
quality: 64
report_flow_data:
s_locale: zh_CN
session: 2edcb8dc8ff0b6f13dd685a23aff692b72bf2869
sid: 41410
spmid: united.player-video-detail.0.0
start_ts: 0
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
sub_type: 1
total_time: 0
track_id:
ts: 1735744223
type: 4
user_status: 1
video_duration: 1450
sign: 37b0acd3bab7b40a082ce510041a0a2b
}

View File

@@ -0,0 +1,40 @@
meta {
name: sign
type: http
seq: 1
}
post {
url: https://api.bilibili.com/pgc/activity/score/task/sign
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
native_api_from: h5
buvid: {{buvid}}
accept: application/json, text/plain, */*
referer: https://big.bilibili.com/mobile/index?exp_symbol=release_version&oflAb=1
user-agent: {{user-agent}}
x-bili-trace-id: 9c642fae280ce80077653eef826774e3:77653eef826774e3:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzgxMTEsImlhdCI6MTczNTcwOTAxMSwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.J28IlxZ6SjllQEQkq_OvFUiRYAEL2VhQG_WWBcmNppE
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
appkey: {{appKey}}
csrf: {{csrf}}
disable_rcmd: 0
mobi_app: android
platform: android
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
ts: 1735713546
sign: aeaeff881a147dd5cd2c6e24df9dc21b
}

View File

@@ -0,0 +1,41 @@
meta {
name: add
type: http
seq: 2
}
post {
url: https://big.bilibili.com/x/vip/experience/add
body: formUrlEncoded
auth: none
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
native_api_from: h5
buvid: {{buvid}}
accept: application/json, text/plain, */*
referer: https://big.bilibili.com/mobile/index?exp_symbol=release_version&oflAb=1
user-agent: {{user-agent}}
x-bili-trace-id: 46656ec97cb019beac1da03fd56774d6:ac1da03fd56774d6:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzgxMTEsImlhdCI6MTczNTcwOTAxMSwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.J28IlxZ6SjllQEQkq_OvFUiRYAEL2VhQG_WWBcmNppE
bili-http-engine: cronet
}
body:form-urlencoded {
access_key: {{access_key}}
appkey: {{appKey}}
buvid: {{buvid}}
csrf: {{csrf}}
disable_rcmd: 0
mobi_app: android
platform: android
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
ts: 1735710395
sign: 694521e34b88ec0593a8cc3edbc4e117
}

9
bruno/bruno.json Normal file
View File

@@ -0,0 +1,9 @@
{
"version": "1",
"name": "Bili",
"type": "collection",
"ignore": [
"node_modules",
".git"
]
}

View File

@@ -0,0 +1,16 @@
vars {
phone: {{process.env.phone}}
pwd: {{process.env.pwd}}
mid: {{process.env.mid}}
buvid: {{process.env.buvid}}
csrf: {{process.env.csrf}}
appKey: 1d8b6e7d45233436
access_key: {{process.env.access_key}}
cookieStr: {{process.env.cookieStr}}
user-agent: Mozilla/5.0 (Linux; Android 10; Nexus Build/KOT49H; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.186 Mobile Safari/537.36 os/android model/Nexus build/7720200 osVer/10 sdkInt/29 network/2 BiliApp/7720200 mobi_app/android channel/yingyongbao Buvid/{{buvid}} sessionID/92c5ad7a innerVer/7720210 c_locale/zh_CN s_locale/zh_CN disable_rcmd/0 7.72.0 os/android model/Nexus mobi_app/android build/7720200 channel/yingyongbao innerVer/7720210 osVer/10 network/2
device_id: {{process.env.device_id}}
user-agent-simple: 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 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
appSec: 560c52ccd288fed045859ed18bffd973
build: 8451100
statistics: {"appId":1,"platform":3,"version":"8.45.1","abtest":""}
}

View File

@@ -0,0 +1,314 @@
meta {
name: combine
type: http
seq: 2
}
get {
url: https://mall.bilibili.com/x/vip_point/task/combine?access_key={{access_key}}&appKey={{appKey}}&bili_local_id=910f57d9d7feaf6928e592860452d06b202505211207597aa9050a2e5c31f431&brand=Samsung&build={{build}}&buvid={{buvid}}&channel=bili&containerName=AbstractWebActivity&csrf={{csrf}}&device=phone&deviceId={{device_id}}&deviceName=SamsungSM-A5560&devicePlatform=Android12SamsungSM-A5560&device_id={{device_id}}&device_name=SamsungSM-A5560&device_platform=Android12SamsungSM-A5560&disable_rcmd=0&fingerprint=910f57d9d7feaf6928e592860452d06b202505211207597aa9050a2e5c31f431&isPad=false&localFingerprint=910f57d9d7feaf6928e592860452d06b202505211207597aa9050a2e5c31f431&local_id=XUA5651A9EDF7387153A945CDE96CADCB6000&mobi_app=android&modelName=SM-A5560&networkState=2&networkstate=2&osVer=12&platform=android&sessionID=01db4bc0&statistics={"appId":1,"platform":3,"version":"8.45.1","abtest":""}&statusBarHeight=72&ts=1748764069&sign=de7e2667157cccf4af3def524b6796e0
body: none
auth: inherit
}
params:query {
access_key: {{access_key}}
appKey: {{appKey}}
bili_local_id: 910f57d9d7feaf6928e592860452d06b202505211207597aa9050a2e5c31f431
brand: Samsung
build: {{build}}
buvid: {{buvid}}
channel: bili
containerName: AbstractWebActivity
csrf: {{csrf}}
device: phone
deviceId: {{device_id}}
deviceName: SamsungSM-A5560
devicePlatform: Android12SamsungSM-A5560
device_id: {{device_id}}
device_name: SamsungSM-A5560
device_platform: Android12SamsungSM-A5560
disable_rcmd: 0
fingerprint: 910f57d9d7feaf6928e592860452d06b202505211207597aa9050a2e5c31f431
isPad: false
localFingerprint: 910f57d9d7feaf6928e592860452d06b202505211207597aa9050a2e5c31f431
local_id: XUA5651A9EDF7387153A945CDE96CADCB6000
mobi_app: android
modelName: SM-A5560
networkState: 2
networkstate: 2
osVer: 12
platform: android
sessionID: 01db4bc0
statistics: {"appId":1,"platform":3,"version":"8.45.1","abtest":""}
statusBarHeight: 72
ts: 1748764069
sign: de7e2667157cccf4af3def524b6796e0
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
accept: application/json, text/plain, */*
bili-http-engine: ignet
buvid: {{buvid}}
content-type: application/json
native_api_from: h5
referer: https://big.bilibili.com/mobile/bigPoint/task
user-agent: {{user-agent}}
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-metadata-legal-region: CN
x-bili-mid: 341688380
x-bili-net-bin: DQAAgL8gAQ
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDg3NzU1OTksImlhdCI6MTc0ODc0NjQ5OSwiYnV2aWQiOiJYVUE1NjUxQTlFREY3Mzg3MTUzQTk0NUNERTk2Q0FEQ0I2MDAwIn0.k0x2o3e2Q3W-6Wzc56IhbLgSjDKTaAuUV9om7K213fI
x-bili-trace-id: d605d9f1dc3818a42f3a22b5c4683c05:2f3a22b5c4683c05:0:0
}
docs {
终端APP
作用:获取大会员赚大积分的任务列表
入口:
- 我的->会员中心->赚大积分->查看8项任务
Response sample:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"vip_info": {
"type": 2,
"status": 1,
"due_date": 1779033600000,
"vip_pay_type": 0,
"label": {
"path": "http://i0.hdslb.com/bfs/vip/label_annual.png",
"text_color": "",
"bg_style": 0,
"bg_color": "",
"border_color": "",
"use_img_label": false,
"img_label_uri_hans": "",
"img_label_uri_hant": "",
"img_label_uri_hans_static": "",
"img_label_uri_hant_static": ""
},
"start_time": 1657418210,
"paid_type": 0,
"mid": 341688380,
"role": 3,
"tv_vip_status": 0,
"tv_vip_pay_type": 0,
"tv_due_date": 0,
"vip_recent_time": 1747398345
},
"point_info": {
"point": 415,
"expire_point": 0,
"expire_time": 0,
"expire_days": 0
},
"task_info": {
"modules": [{
"module_title": "福利任务",
"common_task_item": [{
"task_code": "bonus",
"state": 3,
"title": "大会员福利大积分",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220607/b66bfe4ccfd6bed05bdb54008ff5c7aa/IbtMl6R3yt.png",
"subtitle": "大会员/年度大会员\u003cbr /\u003e\u003cspan class=\"active\"\u003e+100/200大积分",
"explain": "在期大会员可领取100大积分在期年度大会员可领取200大积分每人限领1次。如当身份为大会员时已领取过本任务大积分则后续成为年度大会员也无法补领取差值大积分。",
"vip_limit": 1,
"complete_times": 1,
"max_times": 1,
"recall_num": 0
}]
}, {
"module_title": "体验任务",
"common_task_item": [{
"task_code": "privilege",
"state": 3,
"title": "浏览大会员权益页面",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220607/b66bfe4ccfd6bed05bdb54008ff5c7aa/IbtMl6R3yt.png",
"subtitle": "\u003cspan class=\"active\"\u003e+50大积分\u003c/span\u003e",
"explain": "从本任务入口跳转至大会员权益页浏览后可得50大积分每人限完成1次。",
"link": "https://big.bilibili.com/mobile/rights?closable=1\u0026navhide=1",
"vip_limit": 0,
"complete_times": 1,
"max_times": 1,
"recall_num": 0
}]
}, {
"module_title": "日常任务",
"module_sub_title": "截止至06-01 23:59:59",
"common_task_item": [{
"task_code": "dress-view",
"state": 1,
"title": "浏览装扮商城主页",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20230316/b66bfe4ccfd6bed05bdb54008ff5c7aa/d8FFfwIwFC.png",
"subtitle": "\u003cspan class=\"active\"\u003e+10大积分\u003c/span\u003e",
"explain": "从本任务入口跳转至装扮商城主页即可完成任务每人限完成1次。",
"link": "https://www.bilibili.com/h5/mall/home?f_source=vip\u0026navhide=1",
"vip_limit": 1,
"complete_times": 0,
"max_times": 1,
"recall_num": 0
}, {
"task_code": "vipmallview",
"state": 1,
"title": "浏览会员购页面10秒",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220613/b66bfe4ccfd6bed05bdb54008ff5c7aa/RnlARrUdOY.png",
"subtitle": "\u003cspan class=\"active\"\u003e+10大积分\u003c/span\u003e",
"explain": "从本任务入口跳转至会员购页面并连续浏览页面达10秒可得10大积分每天可完成1次。如浏览过程中离开会员购页面则中断计时任务判定失败需重新从本任务入口再次跳转。",
"link": "bilibili://mall/home?msource=member_integral_browse\u0026action=browse_all\u0026eventId=hevent_oy4b7h3epeb\u0026eventTime=10\u0026showCountDown=2\u0026taskName1=%E6%B5%8F%E8%A7%8810%E7%A7%92\u0026taskName1Placeholder=%E6%B5%8F%E8%A7%88%25ss\u0026taskName2=%E5%BE%97%E7%A7%AF%E5%88%86\u0026taskEndText=%E4%BB%BB%E5%8A%A1%E5%AE%8C%E6%88%90",
"vip_limit": 1,
"complete_times": 0,
"max_times": 1,
"recall_num": 0
}, {
"task_code": "vipmallbuy",
"state": 0,
"title": "购买指定会员购商品",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220613/b66bfe4ccfd6bed05bdb54008ff5c7aa/RnlARrUdOY.png",
"subtitle": "实付1元\u003cspan class=\"active\"\u003e+10大积分\u003c/span\u003e当前0/2000",
"explain": "领取本任务后,当天内购买会员购商品的首笔订单(除魔力赏/一番赏/票务/先行预定订单外可获得大积分每实付1元+10大积分每天上限2000大积分。本任务不支持先行购买后补领取大积分。如用户通过购买会员购商品获得了本任务大积分后续将购买的商品退款则同时会扣除当时获得的任务大积分。如购买商品获得大积分后的当天内产生退款则大积分扣除后当天无法再完成此任务。",
"link": "bilibili://mall/home?msource=member_integral_buy",
"vip_limit": 1,
"complete_times": 0,
"max_times": 20000,
"recall_num": 0
}, {
"task_code": "animatetab",
"state": 1,
"title": "浏览追番频道页10秒",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220607/b66bfe4ccfd6bed05bdb54008ff5c7aa/uOwc1tuJwm.png",
"subtitle": "\u003cspan class=\"active\"\u003e+10大积分\u003c/span\u003e",
"explain": "从本任务入口跳转至追番频道页并连续浏览页面达10秒可得10大积分每天可完成1次。如浏览过程中离开追番频道页则中断计时任务判定失败需重新从本任务入口再次跳转。",
"link": "bilibili://home?bottom_tab_id=home\u0026tab_id=bangumi\u0026vip_task_countdown=10000\u0026win_id=bigscore-animatetab",
"vip_limit": 1,
"complete_times": 0,
"max_times": 1,
"recall_num": 0
}, {
"task_code": "filmtab",
"state": 1,
"title": "浏览影视频道页10秒",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220607/b66bfe4ccfd6bed05bdb54008ff5c7aa/bWPJRBuMh3.png",
"subtitle": "\u003cspan class=\"active\"\u003e+10大积分\u003c/span\u003e",
"explain": "从本任务入口跳转至影视频道页并连续浏览页面达10秒可得10大积分每天可完成1次。如浏览过程中离开影视频道页则中断计时任务判定失败需重新从本任务入口再次跳转。",
"link": "bilibili://home?bottom_tab_id=home\u0026tab_id=bilibili://pgc/cinema-tab\u0026vip_task_countdown=10000\u0026win_id=bigscore-filmtab",
"vip_limit": 1,
"complete_times": 0,
"max_times": 1,
"recall_num": 0
}, {
"task_code": "ogvwatchnew",
"state": 0,
"title": "观看剧集内容",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220607/b66bfe4ccfd6bed05bdb54008ff5c7aa/6prGo240Md.png",
"subtitle": "观看任一剧集达10分钟\u003cspan class=\"active\"\u003e+40大积分\u003c/span\u003e",
"explain": "领取本任务后,当天内单次观看番剧/国创/电影/电视剧/综艺/纪录片的任一视频的连续时长达到10分钟可得40大积分。单次观看行为需连续达10分钟切换至其他视频内容会导致观看时长重新计数。仅大陆版手机端APP可领取、可完成任务。",
"link": "https://www.bilibili.com/blackboard/activity-NUbGzdNJpz.html?msource=jifen",
"vip_limit": 1,
"complete_times": 0,
"max_times": 1,
"recall_num": 0
}, {
"task_code": "tvodbuy",
"state": 0,
"title": "购买单点付费影片",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20220607/b66bfe4ccfd6bed05bdb54008ff5c7aa/6prGo240Md.png",
"subtitle": "会员特价/独家付费任意影片\u003cbr /\u003e\u003cspan class=\"active\"\u003e+70大积分\u003c/span\u003e",
"explain": "领取本任务后当天内购买任意1部会员特价/独家付费的影片可得70大积分每天上限70大积分。",
"link": "https://www.bilibili.com/blackboard/activity-F6sCMq4w92.html?msource=jifen",
"vip_limit": 1,
"complete_times": 0,
"max_times": 1,
"recall_num": 0
}, {
"task_code": "dressbuyamount",
"state": 0,
"title": "购买指定装扮商品",
"icon": "https://i0.hdslb.com/bfs/activity-plat/static/20230316/b66bfe4ccfd6bed05bdb54008ff5c7aa/d8FFfwIwFC.png",
"subtitle": "实付1元\u003cspan class=\"active\"\u003e+10大积分\u003c/span\u003e当前0/1000",
"explain": "领取本任务后,当天内购买装扮商城商品的订单(除装扮赏/祈愿/数字藏品订单外可获得大积分每实付1元+10大积分每天上限1000大积分。本任务不支持先行购买后补领取大积分。",
"link": "https://www.bilibili.com/h5/mall/home?navhide=1\u0026f_source=vip\u0026from=vipzx.shop",
"vip_limit": 1,
"complete_times": 0,
"max_times": 10000,
"recall_num": 0
}]
}],
"sing_task_item": {
"histories": [{
"day": "2025-05-26",
"signed": false,
"score": 0
}, {
"day": "2025-05-27",
"signed": false,
"score": 0
}, {
"day": "2025-05-28",
"signed": false,
"score": 0
}, {
"day": "2025-05-29",
"signed": false,
"score": 0
}, {
"day": "2025-05-30",
"signed": false,
"score": 0
}, {
"day": "2025-05-31",
"signed": false,
"score": 0
}, {
"day": "2025-06-01",
"signed": false,
"score": 5,
"is_today": true
}, {
"day": "2025-06-02",
"signed": false,
"score": 5
}, {
"day": "2025-06-03",
"signed": false,
"score": 5
}, {
"day": "2025-06-04",
"signed": false,
"score": 5
}, {
"day": "2025-06-05",
"signed": false,
"score": 5
}, {
"day": "2025-06-06",
"signed": false,
"score": 5
}, {
"day": "2025-06-07",
"signed": false,
"score": 10
}],
"count": 0,
"base_score": 5
},
"score_month": 10,
"score_limit": 10000,
"exp_value": 3
},
"current_ts": 1748764070,
"integration_task": false
}
}
```
`build`版本号不同,会返回不同的结果。
}

View File

@@ -0,0 +1,3 @@
meta {
name: mall.bilibili.com
}

View File

@@ -0,0 +1,115 @@
meta {
name: sign2
type: http
seq: 1
}
post {
url: https://mall.bilibili.com/pgc/activity/score/task/sign2?mobi_app=android&csrf={{csrf}}&platform=android
body: json
auth: inherit
}
params:query {
mobi_app: android
csrf: {{csrf}}
platform: android
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
accept: application/json, text/plain, */*
bili-http-engine: ignet
buvid: {{buvid}}
content-type: application/json; charset=utf-8
guestid: 24675260415603
native_api_from: h5
referer: https://big.bilibili.com/mobile/index
user-agent: {{user-agent}}
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-metadata-legal-region: CN
x-bili-mid: {{mid}}
x-bili-net-bin: DQAAgL8gAQ
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDg0NzM4MTEsImlhdCI6MTc0ODQ0NDcxMSwiYnV2aWQiOiJYVUE1NjUxQTlFREY3Mzg3MTUzQTk0NUNERTk2Q0FEQ0I2MDAwIn0.IvpforrVemmRAvyQF7svr4fd-RnfP_lEt6g6pWt4AGk
x-bili-trace-id: 0d6c319f356dbc6191becbf764683728:91becbf764683728:0:0
}
body:json {
{
"t": 1748445354567,
"device": "phone",
"ts": 1748445354
}
}
docs {
Response sample:
```json
{
"code": 0,
"data": {
"count": 2,
"countdown": 0,
"day3WinImg": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_win_img.png",
"day3WinImgVip": "https://i0.hdslb.com/bfs/activity-plat/static/4cefecc6742f8995a6bd22402a6d0b8b/day3_win_img_vip.png",
"duration": 7,
"goods": [
{
"picture": "https://i0.hdslb.com/bfs/activity-plat/d3df8012062c6996c26f989ed6a4f0752e5d5049.png",
"sale": 128888,
"title": "御坂美琴&食蜂操祈 大霸星祭Ver. 手办"
},
{
"picture": "https://i0.hdslb.com/bfs/activity-plat/245337f3c305886e4937430335218f2d7bf92362.jpg",
"sale": 39,
"title": "暗黑不朽积分兑换礼包"
},
{
"picture": "https://i0.hdslb.com/bfs/activity-plat/b782d7228e8a58d2562d26f33448a50519ce4ec5.png",
"sale": 33600,
"title": "BEMOE 初音未来 樱花未来 可爱体UWA系列 毛绒4wa"
}
],
"hasCoupon": false,
"score": 5,
"seasons": [
{
"badge": "独家",
"badgeType": 1,
"cover": "http://i0.hdslb.com/bfs/bangumi/6a04c87e990ab74cd8d555ef45a863de0993b161.png",
"ratingScore": 9.8,
"seasonId": 5398,
"seasonType": 1,
"subtitle": "不一样的热血动画",
"title": "JOJO的奇妙冒险 不灭钻石"
},
{
"badge": "大会员",
"badgeType": 0,
"cover": "http://i0.hdslb.com/bfs/bangumi/6d8bd12e0e1ab2d4d5e8567bdba18240e75d7a1b.jpg",
"ratingScore": 9.8,
"seasonId": 6262,
"seasonType": 1,
"subtitle": "不想来笑一下吗?",
"title": "蜡笔小新 第二季(中文)"
},
{
"badge": "出品",
"badgeType": 1,
"cover": "https://i0.hdslb.com/bfs/bangumi/image/08bf0c1e24e454de51b58d1e26c0a9aecbe9b0c1.png",
"ratingScore": 0.0,
"seasonId": 46585,
"seasonType": 4,
"subtitle": "末世如何才能生存",
"title": "灵笼 第二季"
}
],
"vipScore": 5,
"vipStatus": 1
},
"message": "success"
}
```
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,26 @@
meta {
name: key
type: http
seq: 1
}
get {
url: https://passport.bilibili.com/x/passport-login/web/key
body: none
auth: none
}
headers {
Host: passport.bilibili.com
buvid: {{buvid}}
env: prod
app-key: android64
user-agent: Mozilla/5.0 BiliDroid/7.72.0 (bbcallen@gmail.com) os/android model/Nexus mobi_app/android build/7720200 channel/yingyongbao innerVer/7720210 osVer/10 network/2
x-bili-trace-id: 43e1a54f60cfbf0bb9788d4d9e6774bf:b9788d4d9e6774bf:0:0
x-bili-aurora-eid:
x-bili-mid:
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzI4OTIsImlhdCI6MTczNTcwMzc5MiwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.hEDtIHZoN5Wyoja2hNuPcfy-laa1r05ObiEhJ5gPSt4
bili-http-engine: cronet
}

View File

@@ -0,0 +1,49 @@
meta {
name: simple
type: http
seq: 1
}
get {
url: https://passport.bilibili.com/x/relation/followings/simple?_device=android&_hwid=e0N3QnRBJEV0QiEXaxdrXG8LPgw1UDECYFU0AWJTZQ&access_key={{access_key}}&appkey={{appKey}}&build=7720200&c_locale=zh_CN&channel=yingyongbao&disable_rcmd=0&mobi_app=android&platform=android&s_locale=zh_CN&src=yingyongbao&statistics={"appId":1,"platform":3,"version":"7.72.0","abtest":""}&trace_id=20250101120700037&ts=1735704457&version=7.72.0.7720200&sign=3a7ddaa98dbf792b654bdaabdf3dcd1d
body: none
auth: none
}
params:query {
_device: android
_hwid: e0N3QnRBJEV0QiEXaxdrXG8LPgw1UDECYFU0AWJTZQ
access_key: {{access_key}}
appkey: {{appKey}}
build: 7720200
c_locale: zh_CN
channel: yingyongbao
disable_rcmd: 0
mobi_app: android
platform: android
s_locale: zh_CN
src: yingyongbao
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
trace_id: 20250101120700037
ts: 1735704457
version: 7.72.0.7720200
sign: 3a7ddaa98dbf792b654bdaabdf3dcd1d
}
headers {
Host: api.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: 3160e892
env: prod
app-key: android64
user-agent: Mozilla/5.0 BiliDroid/7.72.0 (bbcallen@gmail.com) os/android model/Nexus mobi_app/android build/7720200 channel/yingyongbao innerVer/7720210 osVer/10 network/2
x-bili-trace-id: 97831b4bddcb6011ee84ae59806774bf:ee84ae59806774bf:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzI4OTIsImlhdCI6MTczNTcwMzc5MiwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.hEDtIHZoN5Wyoja2hNuPcfy-laa1r05ObiEhJ5gPSt4
bili-http-engine: cronet
}

View File

@@ -0,0 +1,49 @@
meta {
name: special
type: http
seq: 1
}
get {
url: https://passport.bilibili.com/x/relation/tag/special?_device=android&_hwid=e0N3QnRBJEV0QiEXaxdrXG8LPgw1UDECYFU0AWJTZQ&access_key={{access_key}}&appkey={{appKey}}&build=7720200&c_locale=zh_CN&channel=yingyongbao&disable_rcmd=0&mobi_app=android&platform=android&s_locale=zh_CN&src=yingyongbao&statistics={"appId":1,"platform":3,"version":"7.72.0","abtest":""}&trace_id=20250101120700047&ts=1735704467&version=7.72.0.7720200&sign=c49a2ca7bf93e8e65e77fe285fb71b1e
body: none
auth: none
}
params:query {
_device: android
_hwid: e0N3QnRBJEV0QiEXaxdrXG8LPgw1UDECYFU0AWJTZQ
access_key: {{access_key}}
appkey: {{appKey}}
build: 7720200
c_locale: zh_CN
channel: yingyongbao
disable_rcmd: 0
mobi_app: android
platform: android
s_locale: zh_CN
src: yingyongbao
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
trace_id: 20250101120700047
ts: 1735704467
version: 7.72.0.7720200
sign: c49a2ca7bf93e8e65e77fe285fb71b1e
}
headers {
Host: api.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: 3160e892
env: prod
app-key: android64
user-agent: Mozilla/5.0 BiliDroid/7.72.0 (bbcallen@gmail.com) os/android model/Nexus mobi_app/android build/7720200 channel/yingyongbao innerVer/7720210 osVer/10 network/2
x-bili-trace-id: f8209f943aca4379b5b407142a6774bf:b5b407142a6774bf:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzI4OTIsImlhdCI6MTczNTcwMzc5MiwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.hEDtIHZoN5Wyoja2hNuPcfy-laa1r05ObiEhJ5gPSt4
bili-http-engine: cronet
}

View File

@@ -0,0 +1,43 @@
meta {
name: myinfo
type: http
seq: 1
}
get {
url: https://passport.bilibili.com/x/v2/account/myinfo?access_key={{access_key}}&appkey=783bbb7264451d82&build=7720200&buvid={{buvid}}&c_locale=zh_CN&channel=yingyongbao&disable_rcmd=0&local_id={{buvid}}&mobi_app=android&platform=android&s_locale=zh_CN&statistics={"appId":1,"platform":3,"version":"7.72.0","abtest":""}&ts=1735704457&sign=b33e7a0aa1aef3d1d4284c759fa12857
body: none
auth: none
}
params:query {
access_key: {{access_key}}
appkey: 783bbb7264451d82
build: 7720200
buvid: {{buvid}}
c_locale: zh_CN
channel: yingyongbao
disable_rcmd: 0
local_id: {{buvid}}
mobi_app: android
platform: android
s_locale: zh_CN
statistics: {"appId":1,"platform":3,"version":"7.72.0","abtest":""}
ts: 1735704457
sign: b33e7a0aa1aef3d1d4284c759fa12857
}
headers {
Host: app.bilibili.com
buvid: {{buvid}}
env: prod
app-key: android64
user-agent: Mozilla/5.0 BiliDroid/7.72.0 (bbcallen@gmail.com) os/android model/Nexus mobi_app/android build/7720200 channel/yingyongbao innerVer/7720210 osVer/10 network/2
x-bili-trace-id: 46e70b4538aaf4001079cf97f86774bf:1079cf97f86774bf:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzI4OTIsImlhdCI6MTczNTcwMzc5MiwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.hEDtIHZoN5Wyoja2hNuPcfy-laa1r05ObiEhJ5gPSt4
bili-http-engine: cronet
}

View File

@@ -0,0 +1,29 @@
meta {
name: index
type: http
seq: 1
}
get {
url: https://passport.bilibili.com/x/v2/feed/index
body: none
auth: none
}
headers {
Host: app.bilibili.com
buvid: {{buvid}}
fp_local: {{device_id}}
fp_remote: {{device_id}}
session_id: 3160e892
env: prod
app-key: android64
user-agent: Mozilla/5.0 BiliDroid/7.72.0 (bbcallen@gmail.com) os/android model/Nexus mobi_app/android build/7720200 channel/yingyongbao innerVer/7720210 osVer/10 network/2
x-bili-trace-id: ce74f22f44dec31cc331a61b2a6774bf:c331a61b2a6774bf:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzI4OTIsImlhdCI6MTczNTcwMzc5MiwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.hEDtIHZoN5Wyoja2hNuPcfy-laa1r05ObiEhJ5gPSt4
bili-http-engine: cronet
}

View File

@@ -0,0 +1,29 @@
meta {
name: v2
type: http
seq: 1
}
get {
url: https://api.bilibili.com/x/vip/web/vip_center/v2
body: none
auth: none
}
headers {
Host: api.bilibili.com
Cookie: {{cookieStr}}
native_api_from: h5
buvid: {{buvid}}
accept: application/json, text/plain, */*
referer: https://big.bilibili.com/mobile/index?exp_symbol=release_version&oflAb=1
content-type: application/json
user-agent: {{user-agent}}
x-bili-trace-id: 0b9853d9388b01892edb6939c16774d4:2edb6939c16774d4:0:0
x-bili-aurora-eid: UlAAQFkMBVkH
x-bili-mid: {{mid}}
x-bili-aurora-zone:
x-bili-gaia-vtoken:
x-bili-ticket: eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzU3MzgxMTEsImlhdCI6MTczNTcwOTAxMSwiYnV2aWQiOiJYVzcyNEQxNzI0Njg3MTlDQzI1NjA1REIyNDI0NzhEMkUxMjE5In0.J28IlxZ6SjllQEQkq_OvFUiRYAEL2VhQG_WWBcmNppE
bili-http-engine: cronet
}

7
common.props Normal file
View File

@@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<Authors>Ray</Authors>
<Version>3.8.2</Version>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
</PropertyGroup>
</Project>

171
docker/README.md Normal file
View File

@@ -0,0 +1,171 @@
# Docker 使用说明
<!-- TOC depthFrom:2 -->
- [1. 前期工作](#1-前期工作)
- [2. 方式一:一键脚本(推荐)](#2-方式一一键脚本推荐)
- [3. 方式二:手动 Docker Compose](#3-方式二手动-docker-compose)
- [3.1. 启动](#31-启动)
- [3.2. 其他命令参考](#32-其他命令参考)
- [4. 方式三手动Docker指令](#4-方式三手动docker指令)
- [4.1. Docker启动](#41-docker启动)
- [4.2. 其他指令参考](#42-其他指令参考)
- [4.3. 使用Watchtower更新容器](#43-使用watchtower更新容器)
- [5. 登录](#5-登录)
- [6. 添加 Bili 账号](#6-添加-bili-账号)
- [7. 自己构建镜像(非必须)](#7-自己构建镜像非必须)
- [8. 其他](#8-其他)
<!-- /TOC -->
## 1. 前期工作
```
apt-get update
apt-get install curl
```
## 2. 方式一:一键脚本(推荐)
```
bash <(curl -sSL https://raw.githubusercontent.com/RayWangQvQ/BiliBiliToolPro/main/docker/install.sh)
```
## 3. 方式二:手动 Docker Compose
### 3.1. 启动
```
# 创建目录
mkdir bili_tool_web && cd bili_tool_web
# 下载
wget https://raw.githubusercontent.com/RayWangQvQ/BiliBiliToolPro/main/docker/sample/docker-compose.yml
mkdir -p config
cd ./config
wget https://raw.githubusercontent.com/RayWangQvQ/BiliBiliToolPro/main/docker/sample/config/cookies.json
cd ..
# 启动
docker compose up -d
# 查看启动日志
docker logs -f bili_tool_web
```
最终文件结构如下:
```
bili_tool_web
├── Logs
├── config
├──── cookies.json
└── docker-compose.yml
```
### 3.2. 其他命令参考
```
# 启动 docker-compose
docker compose up -d
# 停止 docker-compose
docker compose stop
# 查看实时日志
docker logs -f bili_tool_web
# 进入容器
docker exec -it bili_tool_web /bin/bash
# 手动更新容器
docker compose pull && docker compose up -d
```
## 4. 方式三手动Docker指令
### 4.1. Docker启动
```
# 创建目录
mkdir bili_tool_web && cd bili_tool_web
# 生成并运行容器
docker pull ghcr.io/raywangqvq/bili_tool_web
docker run -d --name="bili_tool_web" \
-p 22330:8080 \
-e TZ=Asia/Shanghai \
-v ./Logs:/app/Logs \
-v ./config:/app/config \
ghcr.io/raywangqvq/bili_tool_web
# 查看实时日志
docker logs -f bili_tool_web
```
其中,`cookie`需要替换为自己真实的cookie字符串
### 4.2. 其他指令参考
```
# 启动容器
docker start bili_tool_web
# 停止容器
docker stop bili_tool_web
# 重启容器
docker restart bili_tool_web
# 删除容器
docker rm bili_tool_web
# 进入容器
docker exec -it bili_tool_web /bin/bash
```
### 4.3. 使用Watchtower更新容器
```
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once --cleanup \
bili_tool_web
```
## 5. 登录
- 默认用户:`admin`
- 默认密码:`BiliTool@2233`
首次登陆后,请到`Admin`页面修改密码。
## 6. 添加 Bili 账号
扫码进行账号添加。
![trigger](../docs/imgs/web-trigger-login.png)
![login](../docs/imgs/docker-login.png)
## 7. 自己构建镜像(非必须)
目前我提供和维护的镜像:
- DockerHub: `[zai7lou/bili_tool_web](https://hub.docker.com/repository/docker/zai7lou/bili_tool_web)`
- GitHub: `[bili_tool_web](https://github.com/RayWangQvQ/BiliBiliToolPro/pkgs/container/bili_tool_web)`
如果有需要(大部分都不需要),可以使用源码自己构建镜像,如下:
在有项目的Dockerfile的目录运行
`docker build -t TARGET_NAME .`
`TARGET_NAME`为镜像名称和版本,可以自己起个名字
## 8. 其他
代码编译和发布环境: mcr.microsoft.com/dotnet/sdk:8.0
代码运行环境: mcr.microsoft.com/dotnet/aspnet:8.0
如果下载`github`资源有问题,可以尝试添加加速器。

View File

@@ -0,0 +1,8 @@
echo "start to build"
# https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/
# https://segmentfault.com/a/1190000021166703
# linux/arm/v6,linux/riscv64,linux/s390x,linux/ppc64le,linux/386,,linux/arm/v7 偶发异常,待进一步测试
echo "Start to build docker image with multi-arch"
# $image="zai7lou/bilibili_tool_pro"
# $version="0.0.5"
docker buildx build --tag "zai7lou/bilibili_tool_pro:0.0.5" --tag "zai7lou/bilibili_tool_pro:latest" --output "type=image,push=true" --platform linux/amd64,linux/arm64 ../..

View File

@@ -0,0 +1,8 @@
@echo off
REM start to build
echo Start to build docker image
@echo on
docker build --tag zai7lou/bilibili_tool_pro:latest ../..
@echo off
pause

View File

@@ -0,0 +1,10 @@
@echo off
REM start to build
REM https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/
REM https://segmentfault.com/a/1190000021166703
echo Start to build docker image with amd64-arch
@echo on
docker buildx build --tag zai7lou/bilibili_tool_pro:latest --output "type=image,push=false" --platform linux/amd64 ../..
@echo off
pause

View File

@@ -0,0 +1,10 @@
@echo off
REM start to build
REM https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/
REM https://segmentfault.com/a/1190000021166703
echo Start to build docker image with arm64-arch
@echo on
docker buildx build --platform linux/arm64 -o type=docker -t zai7lou/bilibili_tool ../..
@echo off
pause

17
docker/entrypoint.sh Normal file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -e
set -o pipefail
echo "Starting BiliTool container..."
mkdir -p /app/config
echo "Running maintenance scripts..."
# 3.3.0 need migrate db file location to /app/config
if [ -f "/app/BiliBiliTool.db" ]; then
echo "[3.3.0] Migrate db file location to /app/config"
mv /app/BiliBiliTool.db /app/config/BiliBiliTool.db
fi
echo "Starting application..."
exec dotnet Ray.BiliBiliTool.Web.dll "$@"

337
docker/install.sh Normal file
View File

@@ -0,0 +1,337 @@
#!/usr/bin/env bash
###
# @Author: Ray zai7lou@outlook.com
# @Date: 2023-02-11 23:13:19
# @LastEditors: Ray zai7lou@outlook.com
# @LastEditTime: 2023-02-12 20:51:19
# @FilePath: \BiliBiliToolPro\docker\install.sh
# @Description:
###
set -e
set -u
set -o pipefail
echo ' ____ _ _____ _ '
echo ' | __ ) _| |_|_ _|__ ___ | | '
echo ' | _ \(_) (_) | |/ _ \ / _ \| | '
echo ' | |_) | | | | | | (_) | (_) | | '
echo ' |____/|_|_|_| |_|\___/ \___/|_| '
current_dir=$(pwd)
base_dir="${current_dir}/bili_tool_web"
github_proxy=""
github_branch="main"
remote_compose_url="${github_proxy}https://raw.githubusercontent.com/RayWangQvQ/BiliBiliToolPro/refs/heads/${github_branch}/docker/sample/docker-compose.yml"
remote_ckJson_url="${github_proxy}https://raw.githubusercontent.com/RayWangQvQ/BiliBiliToolPro/refs/heads/${github_branch}/docker/sample/config/cookies.json"
docker_img_name="ghcr.io/raywangqvq/bili_tool_web"
container_name="bili_tool_web"
### infra
verbose=false
invocation='echo "" && say_verbose "Calling: ${yellow:-}${FUNCNAME[0]} ${green:-}$*${normal:-}"'
if [ -t 1 ] && command -v tput >/dev/null; then
ncolors=$(tput colors || echo 0)
if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then
bold="$(tput bold || echo)"
normal="$(tput sgr0 || echo)"
black="$(tput setaf 0 || echo)"
red="$(tput setaf 1 || echo)"
green="$(tput setaf 2 || echo)"
yellow="$(tput setaf 3 || echo)"
blue="$(tput setaf 4 || echo)"
magenta="$(tput setaf 5 || echo)"
cyan="$(tput setaf 6 || echo)"
white="$(tput setaf 7 || echo)"
fi
fi
say_verbose() {
if [ "$verbose" = true ]; then
# using stream 3 (defined in the beginning) to not interfere with stdout of functions
# which may be used as return value
printf "%b\n" "${cyan:-}$(date "+%Y-%m-%d %H:%M:%S")[VER]:${normal:-} $1" >&3
fi
}
say_info() {
printf "%b\n" "${green:-}$(date "+%Y-%m-%d %H:%M:%S")[INF]:$1${normal:-}" >&2
}
say_warning() {
printf "%b\n" "${yellow:-}$(date "+%Y-%m-%d %H:%M:%S")[WAR]:$1${normal:-}" >&3
}
say_err() {
printf "%b\n" "${red:-}$(date "+%Y-%m-%d %H:%M:%S")[ERR]:$1${normal:-}" >&2
}
machine_has() {
eval $invocation
command -v "$1" >/dev/null 2>&1
return $?
}
# args:
# remote_path - $1
get_http_header_curl() {
eval $invocation
local remote_path="$1"
curl_options="-I -sSL --retry 5 --retry-delay 2 --connect-timeout 15 "
curl $curl_options "$remote_path" 2>&1 || return 1
return 0
}
# args:
# remote_path - $1
get_http_header_wget() {
eval $invocation
local remote_path="$1"
local wget_options="-q -S --spider --tries 5 "
# Store options that aren't supported on all wget implementations separately.
local wget_options_extra="--waitretry 2 --connect-timeout 15 "
local wget_result=''
wget $wget_options $wget_options_extra "$remote_path" 2>&1
wget_result=$?
if [[ $wget_result == 2 ]]; then
# Parsing of the command has failed. Exclude potentially unrecognized options and retry.
wget $wget_options "$remote_path" 2>&1
return $?
fi
return $wget_result
}
# Updates global variables $http_code and $download_error_msg
downloadcurl() {
eval $invocation
unset http_code
unset download_error_msg
local remote_path="$1"
local out_path="${2:-}"
local remote_path_with_credential="${remote_path}"
local curl_options="--retry 20 --retry-delay 2 --connect-timeout 15 -sSL -f --create-dirs "
local failed=false
if [ -z "$out_path" ]; then
curl $curl_options "$remote_path_with_credential" 2>&1 || failed=true
else
curl $curl_options -o "$out_path" "$remote_path_with_credential" 2>&1 || failed=true
fi
if [ "$failed" = true ]; then
local response=$(get_http_header_curl $remote_path)
http_code=$(echo "$response" | awk '/^HTTP/{print $2}' | tail -1)
download_error_msg="Unable to download $remote_path."
if [[ $http_code != 2* ]]; then
download_error_msg+=" Returned HTTP status code: $http_code."
fi
say_verbose "$download_error_msg"
return 1
fi
return 0
}
# Updates global variables $http_code and $download_error_msg
downloadwget() {
eval $invocation
unset http_code
unset download_error_msg
local remote_path="$1"
local out_path="${2:-}"
local remote_path_with_credential="${remote_path}"
local wget_options="--tries 20 "
# Store options that aren't supported on all wget implementations separately.
local wget_options_extra="--waitretry 2 --connect-timeout 15 "
local wget_result=''
if [ -z "$out_path" ]; then
wget -q $wget_options $wget_options_extra -O - "$remote_path_with_credential" 2>&1
wget_result=$?
else
wget $wget_options $wget_options_extra -O "$out_path" "$remote_path_with_credential" 2>&1
wget_result=$?
fi
if [[ $wget_result == 2 ]]; then
# Parsing of the command has failed. Exclude potentially unrecognized options and retry.
if [ -z "$out_path" ]; then
wget -q $wget_options -O - "$remote_path_with_credential" 2>&1
wget_result=$?
else
wget $wget_options -O "$out_path" "$remote_path_with_credential" 2>&1
wget_result=$?
fi
fi
if [[ $wget_result != 0 ]]; then
local disable_feed_credential=false
local response=$(get_http_header_wget $remote_path $disable_feed_credential)
http_code=$(echo "$response" | awk '/^ HTTP/{print $2}' | tail -1)
download_error_msg="Unable to download $remote_path."
if [[ $http_code != 2* ]]; then
download_error_msg+=" Returned HTTP status code: $http_code."
fi
say_verbose "$download_error_msg"
return 1
fi
return 0
}
# args:
# remote_path - $1
# [out_path] - $2 - stdout if not provided
download() {
eval $invocation
local remote_path="$1"
local out_path="${2:-}"
if [[ "$remote_path" != "http"* ]]; then
cp "$remote_path" "$out_path"
return $?
fi
local failed=false
local attempts=0
while [ $attempts -lt 3 ]; do
attempts=$((attempts + 1))
failed=false
if machine_has "curl"; then
downloadcurl "$remote_path" "$out_path" || failed=true
elif machine_has "wget"; then
downloadwget "$remote_path" "$out_path" || failed=true
else
say_err "Missing dependency: neither curl nor wget was found."
exit 1
fi
if [ "$failed" = false ] || [ $attempts -ge 3 ] || { [ ! -z $http_code ] && [ $http_code = "404" ]; }; then
break
fi
say_info "Download attempt #$attempts has failed: $http_code $download_error_msg"
say_info "Attempt #$((attempts + 1)) will start in $((attempts * 10)) seconds."
sleep $((attempts * 10))
done
if [ "$failed" = true ]; then
say_verbose "Download failed: $remote_path"
return 1
fi
return 0
}
createBaseDir() {
eval $invocation
mkdir -p $base_dir
cd $base_dir
}
installDocker() {
eval $invocation
if machine_has "docker"; then
say_info "已安装docker"
docker --version
return 0
else
say_warning "未安装docker尝试安装"
download "https://get.docker.com" ./get-docker.sh
chmod +x ./get-docker.sh
get-docker.sh
if machine_has "docker"; then
say_info "已安装docker"
docker --version
return 0
else
say_err "docker 安装失败,请手动安装成功后再执行该脚本"
exit 1
fi
fi
}
downloadResources() {
eval $invocation
say_info "开始下载资源"
# docker compose
[ -f "docker-compose.yml" ] || download $remote_compose_url ./docker-compose.yml
# ckJson
mkdir -p config
cd ./config
[ -f "cookies.json" ] || download $remote_ckJson_url ./cookies.json
chmod +x ./cookies.json
cd ..
ls -l
}
runContainer() {
eval $invocation
say_info "开始拉取镜像"
docker pull $docker_img_name
say_info "开始运行容器"
{
docker compose version && docker compose up -d
} || {
docker-compose version && docker-compose up -d
} || {
docker run -d --name="${container_name}" \
-p 22330:8080 \
-e TZ=Asia/Shanghai \
-v $base_dir/Logs:/app/Logs \
-v $base_dir/config:/app/config \
$docker_img_name
} || {
say_err "创建容器失败,请检查"
exit 1
}
}
checkResult() {
eval $invocation
say_info "检测容器运行情况"
docker ps --filter "name=${container_name}"
containerId=$(docker ps -q --filter "name=^${container_name}$")
if [ -n "$containerId" ]; then
docker logs ${container_name}
echo ""
echo "==============================================="
echo "Congratulations! 恭喜!"
echo "创建并运行${container_name}容器成功。"
echo "访问地址http:{ip}:22330"
echo "云服务器防火墙请自行开放22330端口"
echo "首次运行后,请执行扫码登录任务添加账号"
echo "Enjoy it~"
echo "==============================================="
else
echo ""
echo "请查看运行日志,确认容器是否正常运行,点击 Ctrl+c 退出日志追踪"
echo ""
docker logs -f ${container_name}
fi
}
main() {
installDocker
createBaseDir
downloadResources
runContainer
checkResult
}
main

View File

@@ -0,0 +1,4 @@
{
"BiliBiliCookies":[
]
}

View File

@@ -0,0 +1,14 @@
services:
bili_tool_web:
image: ghcr.io/raywangqvq/bili_tool_web
container_name: bili_tool_web
restart: unless-stopped
tty: true
volumes:
- ./Logs:/app/Logs
- ./config:/app/config
ports:
- "22330:8080"
environment:
TZ: "Asia/Shanghai"
DailyTaskConfig__Cron: "0 0 15 * * ?"

54
docs/claw-cloud.md Normal file
View File

@@ -0,0 +1,54 @@
# Claw免费容器部署
## 教程
点击 [https://console.run.claw.cloud/signin](https://console.run.claw.cloud/signin?link=FNTTMHS056E5) 注册账号,选择使用 GitHub 账号注册并登录。
成功后,每个月会赠送 $5 额度,跑 BiliTool 绰绰有余。
左上角可以选择一个区域,然后点击 **App Store**
![claw-app-store.png](/docs/imgs/claw-app-store.png)
搜索`BiliTool`并点击如下搜索结果。
![claw-search.png](/docs/imgs/claw-search.png)
点击`Deploy App`按钮一键部署。
![claw-deploy.png](/docs/imgs/claw-deploy.png)
等待半分钟左右,进入容器 Detail 页面,点击如下链接即可访问站点:
![claw-addr.png](/docs/imgs/claw-addr.png)
## 消息推送
建议使用环境变量配置:
![claw-notification.png](/docs/imgs/claw-notification.png)
配置值见:[confifuration](/docs/configuration.md)
## 费用
官方模板默认配置为 `0.25C 512M`,每天 $0.06,一个月 `30 * 0.06 = $1.8`,每月赠送是 $5还很富裕。
## 其他
### 账号
- 默认用户名admin
- 默认密码BiliTool@2233
首次登陆后,请立即修改账号和密码!
### 速度
不同区域速度可能有差异,可自己切换尝试。
如果速度慢可能会导致页面短时无响应,可稍作等待,或手动刷新。
### 更新
右上角`Update`进行版本更新,如果更新后启动异常,请尝试`Pause`然后再`Restart`

814
docs/configuration.md Normal file
View File

@@ -0,0 +1,814 @@
# 配置说明
**[目录]**
<!-- TOC depthFrom:2 insertAnchor:true -->
- [1. 配置方式](#1-配置方式)
- [1.1. 方式一:修改配置文件](#11-方式一修改配置文件)
- [1.2. 方式二:命令启动时通过命令行参数配置](#12-方式二命令启动时通过命令行参数配置)
- [1.3. 方式三:添加环境变量(推荐)](#13-方式三添加环境变量推荐)
- [1.4. 方式四:托管在青龙面板上,使用面板的环境变量页或配置文件页进行配置](#14-方式四托管在青龙面板上使用面板的环境变量页或配置文件页进行配置)
- [2. 优先级](#2-优先级)
- [3. 详细配置说明](#3-详细配置说明)
- [3.1. Cookie字符串](#31-cookie字符串)
- [3.2. 安全相关的配置](#32-安全相关的配置)
- [3.2.1. 是否跳过执行任务](#321-是否跳过执行任务)
- [3.2.2. 随机睡眠的最大时长](#322-随机睡眠的最大时长)
- [3.2.3. 两次调用B站Api之间的间隔秒数](#323-两次调用b站api之间的间隔秒数)
- [3.2.4. 间隔秒数所针对的HttpMethod](#324-间隔秒数所针对的httpmethod)
- [3.2.5. 请求B站接口时头部传递的User-Agent](#325-请求b站接口时头部传递的user-agent)
- [3.2.6. App请求B站接口时头部传递的User-Agent](#326-app请求b站接口时头部传递的user-agent)
- [3.2.7. WebProxy代理](#327-webproxy代理)
- [3.3. 每日任务相关](#33-每日任务相关)
- [3.3.1. 是否开启观看视频任务](#331-是否开启观看视频任务)
- [3.3.2. 是否开启分享视频任务](#332-是否开启分享视频任务)
- [3.3.3. 每日投币数量](#333-每日投币数量)
- [3.3.4. 投币时是否同时点赞](#334-投币时是否同时点赞)
- [3.3.5. 优先选择支持的up主Id集合](#335-优先选择支持的up主id集合)
- [3.3.6. 每月几号自动领取会员权益](#336-每月几号自动领取会员权益)
- [3.3.7. 每月几号进行直播中心银瓜子兑换硬币](#337-每月几号进行直播中心银瓜子兑换硬币)
- [3.3.8. Lv6后开启硬币白嫖模式](#338-lv6后开启硬币白嫖模式)
- [3.3.9. 是否开启专栏投币](#339-是否开启专栏投币)
- [3.4. 天选时刻抽奖相关](#34-天选时刻抽奖相关)
- [3.4.1. 根据关键字排除奖品](#341-根据关键字排除奖品)
- [3.4.2. 根据关键字指定奖品](#342-根据关键字指定奖品)
- [3.4.3. 天选抽奖后是否自动分组关注的主播](#343-天选抽奖后是否自动分组关注的主播)
- [3.4.4. 天选筹抽奖主播Uid黑名单](#344-天选筹抽奖主播uid黑名单)
- [3.5. 批量取关相关](#35-批量取关相关)
- [3.5.1. 想要批量取关的分组名称](#351-想要批量取关的分组名称)
- [3.5.2. 批量取关的人数](#352-批量取关的人数)
- [3.5.3. 取关白名单](#353-取关白名单)
- [3.6. 大积分相关](#36-大积分相关)
- [3.6.1. 自定义观看番剧](#361-自定义观看番剧)
- [3.7. 免费B币券充电](#37-免费b币券充电)
- [3.7.1. 充电对象](#371-充电对象)
- [3.8. 推送相关](#38-推送相关)
- [3.8.1. 是否开启每个账号单独推送消息](#381-是否开启每个账号单独推送消息)
- [3.8.2. Telegram机器人](#382-telegram机器人)
- [3.8.2.1. botToken](#3821-bottoken)
- [3.8.2.2. chatId](#3822-chatid)
- [3.8.2.3. proxy](#3823-proxy)
- [3.8.3. 企业微信机器人](#383-企业微信机器人)
- [3.8.3.1. webHookUrl](#3831-webhookurl)
- [3.8.4. 钉钉机器人](#384-钉钉机器人)
- [3.8.4.1. webHookUrl](#3841-webhookurl)
- [3.8.5. Server酱](#385-server酱)
- [3.8.5.1. TurboScKeyServer酱SCKEY](#3851-turbosckeyserver酱sckey)
- [3.8.6. 酷推](#386-酷推)
- [3.8.6.1. sKey](#3861-skey)
- [3.8.7. 推送到自定义Api](#387-推送到自定义api)
- [3.8.7.1. api](#3871-api)
- [3.8.7.2. placeholder](#3872-placeholder)
- [3.8.7.3. bodyJsonTemplate](#3873-bodyjsontemplate)
- [3.8.8. PushPlus[推荐]](#388-pushplus推荐)
- [3.8.8.1. PushPlus的Token](#3881-pushplus的token)
- [3.8.8.2. PushPlus的Topic](#3882-pushplus的topic)
- [3.8.8.3. PushPlus的Channel](#3883-pushplus的channel)
- [3.8.8.4. PushPlus的Webhook](#3884-pushplus的webhook)
- [3.8.9. Microsoft Teams](#389-microsoft-teams)
- [3.8.9.1. Microsoft Teams的Webhook](#3891-microsoft-teams的webhook)
- [3.8.10. 企业微信应用推送](#3810-企业微信应用推送)
- [3.8.10.1. 企业微信应用推送的corpId](#38101-企业微信应用推送的corpid)
- [3.8.10.2. 企业微信应用推送的agentId](#38102-企业微信应用推送的agentid)
- [3.8.10.3. 企业微信应用推送的secret](#38103-企业微信应用推送的secret)
- [3.9. 日志相关](#39-日志相关)
- [3.9.1. 日志输出等级](#391-日志输出等级)
- [3.9.2. 日志输出样式](#392-日志输出样式)
- [3.9.3. 定时任务相关](#393-定时任务相关)
- [3.9.4. 定时任务](#394-定时任务)
<!-- /TOC -->
<a id="markdown-1-配置方式" name="1-配置方式"></a>
## 1. 配置方式
<a id="markdown-11-方式一修改配置文件" name="11-方式一修改配置文件"></a>
### 1.1. 方式一:修改配置文件
推荐使用Release包在本地运行的朋友使用直接打开文件将对应的配置值填入保存即可生效。
默认有3个配置文件`appsettings.json``appsettings.Development.json``appsettings.Production.json`,分别对应默认、开发与生产环境。
对于不是开发人员的大部分人来说,只需要关注`appsettings.Production.json`即可。
<a id="markdown-12-方式二命令启动时通过命令行参数配置" name="12-方式二命令启动时通过命令行参数配置"></a>
### 1.2. 方式二:命令启动时通过命令行参数配置
在使用命令行启动时,可使用`-key=value`的形式附加配置,所有可用的命令行参数均在 [命令行参数映射表](../src/Ray.BiliBiliTool.Config/Constants.cs#L76-L105) 中。
* 使用跨平台的依赖包
各个系统只要安装了net5环境均可使用dotnet命令启动命令样例
```
dotnet Ray.BiliBiliTool.Console.dll -cookieStr=abc -numberOfCoins=5
```
* Windows系统
使用自包含包win-x86-x64.zip命令样例
```
Ray.BiliBiliTool.Console.exe -cookieStr=abc -numberOfCoins=5
```
* Linux系统
使用自包含包linux.zip命令样例
```
Ray.BiliBiliTool.Console -cookieStr=abc -numberOfCoins=5
```
如映射文件所展示,支持使用命令行配置的配置项并不多,也不建议大量地使用该种方式进行配置。使用包运行的朋友,除了改配置文件和命令行参数配置外,还可以使用环境变量进行配置,这也是推荐的做法,如下。
<a id="markdown-13-方式三添加环境变量推荐" name="13-方式三添加环境变量推荐"></a>
### 1.3. 方式三:添加环境变量(推荐)
所有的配置项均可以通过添加环境变量来进行配置。如:
Linux下运行Web
```bash
# 添加环境变量作为配置:
export RunTasks="Daily"
export BiliBiliCookies__1="abc"
export BiliBiliCookies__2="efg"
export DailyTaskConfig__NumberOfCoins="3"
# 开始运行程序:
dotnet BiliBiliTool.Web.dll
```
Linux下运行Console
```bash
# 添加环境变量作为配置:
export Ray_RunTasks="Daily"
export Ray_BiliBiliCookies__1="abc"
export Ray_BiliBiliCookies__2="efg"
export Ray_DailyTaskConfig__NumberOfCoins="3"
# 开始运行程序:
dotnet Ray.BiliBiliTool.Console.dll
```
注意Console需要添加`Ray_`前缀win系统使用`set`关键字代替`export`
<a id="markdown-14-方式四托管在青龙面板上使用面板的环境变量页或配置文件页进行配置" name="14-方式四托管在青龙面板上使用面板的环境变量页或配置文件页进行配置"></a>
### 1.4. 方式四:托管在青龙面板上,使用面板的环境变量页或配置文件页进行配置
青龙面板配置,其本质还是通过环境变量进行配置,有如下两种方式。
- 环境变量页[推荐]
例如:
名称:`Ray_BiliBiliCookies__1`
值:`abcde`
<img src="/docs/imgs/qinglong-env.png" alt="qinglong-env" width="800" />
- 配置文件页
例如配置Cookie和推送
```
export Ray_BiliBiliCookies__1="_uuid=abc..."
export Ray_Serilog__WriteTo__9__Args__token="abcde"
```
<img src="/docs/imgs/qinglong-config.png" alt="qinglong-config" width="800" />
配置文件页添加、修改配置,需要重启青龙容器使之生效,环境变量页则可以立即生效,所以推荐使用环境变量页配置。
<a id="markdown-2-优先级" name="2-优先级"></a>
## 2. 优先级
以上 4 种配置源其优先级由低到高依次是json文件 < 环境变量 < 命令行
高优先级的配置会覆盖低优先级的配置
<a id="markdown-3-详细配置说明" name="3-详细配置说明"></a>
## 3. 详细配置说明
Console项目青龙的环境变量需要添加`Ray_`前缀,其他不用。
比如原始配置Key为`BiliBiliCookies__1`Console则为`Ray_BiliBiliCookies__1`
<a id="markdown-31-cookie字符串" name="31-cookie字符串"></a>
### 3.1. Cookie字符串
必填,数组,可以多个。
| TITLE | CONTENT | 示例 |
| ----- | ------------------- | -------------------------------------------- |
| 配置Key | `BiliBiliCookies__1` | |
| 值域 | 字符串,英文分号分隔,来自浏览器抓取 | `export BiliBiliCookies__1=abc=123;def=456;` |
| 默认值 | 空 | |
| TITLE | CONTENT | 示例 |
| ----- | ------------------- | -------------------------------------------- |
| 配置Key | `BiliBiliCookies__2` | |
| 值域 | 字符串,英文分号分隔,来自浏览器抓取 | `export BiliBiliCookies__1=abc=123;def=456;` |
| 默认值 | 空 | |
<a id="markdown-32-安全相关的配置" name="32-安全相关的配置"></a>
### 3.2. 安全相关的配置
<a id="markdown-321-是否跳过执行任务" name="321-是否跳过执行任务"></a>
#### 3.2.1. 是否跳过执行任务
用于特殊情况下,通过配置灵活的开启和关闭整个应用。
配置为关闭后程序会跳过所有任务不会调用B站任何接口。
| TITLE | CONTENT | 示例 |
| ----- | ------------------------------- | ------------------------------------ |
| 配置Key | `Security__IsSkipDailyTask` | |
| 值域 | [true,false] | `export Security__IsSkipDailyTask=true` |
| 默认值 | false | |
<a id="markdown-322-随机睡眠的最大时长" name="322-随机睡眠的最大时长"></a>
#### 3.2.2. 随机睡眠的最大时长
用于设置程序启动后,随机睡眠时间的最大上限值,单位为分钟。
这样可以避免程序每天准点地在同一时间运行太像机器。
配置为0则不进行睡眠。
| TITLE | CONTENT |
| ----- | --------------------------------- |
| 配置Key | `Security__RandomSleepMaxMin` |
| 值域 | 数字 |
| 默认值 | 20 |
<a id="markdown-323-两次调用b站api之间的间隔秒数" name="323-两次调用b站api之间的间隔秒数"></a>
#### 3.2.3. 两次调用B站Api之间的间隔秒数
用于设置两次Api请求之间的最短时间间隔避免程序在1到2秒内连续调用B站的Api过快。
| TITLE | CONTENT |
| ----- | ------------------------------------------------ |
| 配置Key | `Security__IntervalSecondsBetweenRequestApi` |
| 值域 | [0,+] |
| 默认值 | 20 |
<a id="markdown-324-间隔秒数所针对的httpmethod" name="324-间隔秒数所针对的httpmethod"></a>
#### 3.2.4. 间隔秒数所针对的HttpMethod
间隔秒数所针对的HttpMethod类型服务于上一个配置。服务器一般对GET请求不是很敏感建议只针对POST请求做间隔就可以了。
| TITLE | CONTENT |
| ----- | ----------------------------------- |
| 配置Key | `Security__IntervalMethodTypes` |
| 值域 | [GET,POST],多个以英文逗号分隔 |
| 默认值 | POST |
<a id="markdown-325-请求b站接口时头部传递的user-agent" name="325-请求b站接口时头部传递的user-agent"></a>
#### 3.2.5. 请求B站接口时头部传递的User-Agent
| TITLE | CONTENT |
| ----- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| 配置Key | `Security__UserAgent` |
| 值域 | 字符串可以F12从自己的浏览器获取 |
| 默认值 | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36 Edg/87.0.664.41 |
获取浏览器中自己的UA的方法见下图
<img src="/docs/imgs/get-user-agent.png" alt="get-user-agent" width="800" />
<a id="markdown-326-app请求b站接口时头部传递的user-agent" name="326-app请求b站接口时头部传递的user-agent"></a>
#### 3.2.6. App请求B站接口时头部传递的User-Agent
| TITLE | CONTENT |
| ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 配置Key | `Security__UserAgentApp` |
| 值域 | 字符串可以F12从自己的浏览器获取 |
| 默认值 | 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 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 |
获取浏览器中自己的UA的方法见下图
<img src="/docs/imgs/get-user-agent.png" alt="get-user-agent" width="800" />
<a id="markdown-327-webproxy代理" name="327-webproxy代理"></a>
#### 3.2.7. WebProxy代理
支持需要账户密码的代理。
| TITLE | CONTENT |
| -------------- | ------------------------------ |
| 配置Key | `Security__WebProxy` |
| 值域 | 字符串形如user:password@host:port |
| 默认值 | 无 |
<a id="markdown-33-每日任务相关" name="33-每日任务相关"></a>
### 3.3. 每日任务相关
<a id="markdown-331-是否开启观看视频任务" name="331-是否开启观看视频任务"></a>
#### 3.3.1. 是否开启观看视频任务
当该配置被设置为`false`时会导致大积分任务中的签到领额外10点经验的任务不能自动完成。
| TITLE | CONTENT |
| ----- | ------------------------------- |
| 配置Key | `DailyTaskConfig__IsWatchVideo` |
| 值域 | [true,false] |
| 默认值 | true |
<a id="markdown-332-是否开启分享视频任务" name="332-是否开启分享视频任务"></a>
#### 3.3.2. 是否开启分享视频任务
| TITLE | CONTENT |
| ----- | ------------------------------- |
| 配置Key | `DailyTaskConfig__IsShareVideo` |
| 值域 | [true,false] |
| 默认值 | true |
<a id="markdown-333-每日投币数量" name="333-每日投币数量"></a>
#### 3.3.3. 每日投币数量
每天投币的总目标数量因为投币获取经验只与次数有关所以程序每次投币只会投1个也就是说该配置也表示每日投币次数。
| TITLE | CONTENT |
| ----- | -------------------------------- |
| 配置Key | `DailyTaskConfig__NumberOfCoins` |
| 值域 | [0,5]为安全考虑程序内部还会做验证最大不能超过5 |
| 默认值 | 5 |
<a id="markdown-334-投币时是否同时点赞" name="334-投币时是否同时点赞"></a>
#### 3.3.4. 投币时是否同时点赞
| TITLE | CONTENT |
| ----- | ----------------------------- |
| 配置Key | `DailyTaskConfig__SelectLike` |
| 值域 | [true,false] |
| 默认值 | false |
<a id="markdown-335-优先选择支持的up主id集合" name="335-优先选择支持的up主id集合"></a>
#### 3.3.5. 优先选择支持的up主Id集合
通过填入自己选择的up主ID以后观看、分享和投币都会优先从配置的up主下面挑选视频如果没有找到,则会去你的**特别关注**列表中随机再获取,再然后会去**普通关注**列表中随机获取,最后会去排行榜中随机获取。
**注意该配置的默认值是作者的upId如需换掉的话直接更改即可。**
| TITLE | CONTENT |
| ----- | --------------------------------------------------------------- |
| 配置Key | `DailyTaskConfig__SupportUpIds` |
| 值域 | up主ID多个用英文逗号分隔默认是作者本人的UpId如需删除可以配置为空格字符串或"-1"也可以配置为其他人的UpId |
| 默认值 | 作者的upId |
获取UP主的Id方法打开bilibili进入欲要选择的UP主主页在url中和简介中都可获得该UP主的Id如下图所示
<img src="/docs/imgs/get-up-id.png" alt="get-up-id" width="800" />
<a id="markdown-336-每月几号自动领取会员权益" name="336-每月几号自动领取会员权益"></a>
#### 3.3.6. 每月几号自动领取会员权益
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `DailyTaskConfig__DayOfReceiveVipPrivilege` |
| 值域 | [-1,31]-1表示不指定默认每月1号0表示不领取 |
| 默认值 | 1 |
<a id="markdown-337-每月几号进行直播中心银瓜子兑换硬币" name="337-每月几号进行直播中心银瓜子兑换硬币"></a>
#### 3.3.7. 每月几号进行直播中心银瓜子兑换硬币
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `DailyTaskConfig__DayOfExchangeSilver2Coin` |
| 值域 | [-1,31]-1表示不指定默认每月最后一天-2表示每天0表示不进行兑换 |
| 默认值 | -1 |
<a id="markdown-338-lv6后开启硬币白嫖模式" name="338-lv6后开启硬币白嫖模式"></a>
#### 3.3.8. Lv6后开启硬币白嫖模式
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `DailyTaskConfig__SaveCoinsWhenLv6` |
| 值域 | [true,false]true表示开启Lv6的账号不会投币 |
| 默认值 | false |
<a id="markdown-339-是否开启专栏投币" name="339-是否开启专栏投币"></a>
#### 3.3.9. 是否开启专栏投币
| TITLE | CONTENT | |
| ----- | ----------------------------------------- | --- |
| 配置Key | `DailyTaskConfig__IsDonateCoinForArticle` | |
| 值域 | [true,false] | |
| 默认值 | false | |
<a id="markdown-34-天选时刻抽奖相关" name="34-天选时刻抽奖相关"></a>
### 3.4. 天选时刻抽奖相关
<a id="markdown-341-根据关键字排除奖品" name="341-根据关键字排除奖品"></a>
#### 3.4.1. 根据关键字排除奖品
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `LiveLotteryTaskConfig__ExcludeAwardNames` |
| 值域 | 一串字符串,多个关键字使用`\|`符号隔开 |
| 默认值 | `舰\|船\|航海\|代金券\|自拍\|照\|写真\|图` |
<a id="markdown-342-根据关键字指定奖品" name="342-根据关键字指定奖品"></a>
#### 3.4.2. 根据关键字指定奖品
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `LiveLotteryTaskConfig__IncludeAwardNames` |
| 值域 | 一串字符串,多个关键字使用`\|`符号隔开 |
| 默认值 | 空 |
<a id="markdown-343-天选抽奖后是否自动分组关注的主播" name="343-天选抽奖后是否自动分组关注的主播"></a>
#### 3.4.3. 天选抽奖后是否自动分组关注的主播
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `LiveLotteryTaskConfig__AutoGroupFollowings` |
| 值域 | [true,false] |
| 默认值 | true |
<a id="markdown-344-天选筹抽奖主播uid黑名单" name="344-天选筹抽奖主播uid黑名单"></a>
#### 3.4.4. 天选筹抽奖主播Uid黑名单
不想参与抽奖的主播Upid集合多个用英文逗号分隔配置后不会参加黑名单中的主播的抽奖活动。默认值是目前已知的中奖后拒绝发奖的Up后期还会继续补充也反映反馈。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `LiveLotteryTaskConfig__DenyUids` |
| 值域 | 字符串,如"65566781,1277481241" |
| 默认值 | "65566781,1277481241,1643654862,603676925" |
<a id="markdown-35-批量取关相关" name="35-批量取关相关"></a>
### 3.5. 批量取关相关
<a id="markdown-351-想要批量取关的分组名称" name="351-想要批量取关的分组名称"></a>
#### 3.5.1. 想要批量取关的分组名称
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `UnfollowBatchedTaskConfig__GroupName` |
| 值域 | 字符串 |
| 默认值 | 天选时刻 |
<a id="markdown-352-批量取关的人数" name="352-批量取关的人数"></a>
#### 3.5.2. 批量取关的人数
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `UnfollowBatchedTaskConfig__Count` |
| 值域 | 数字,[-1,+]-1表示全部 |
| 默认值 | 5 |
<a id="markdown-353-取关白名单" name="353-取关白名单"></a>
#### 3.5.3. 取关白名单
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `UnfollowBatchedTaskConfig__RetainUids` |
| 值域 | 字符串,多个使用英文逗号分隔 |
| 默认值 | 108569350 |
<a id="markdown-36-大积分相关" name="36-大积分相关"></a>
### 3.6. 大积分相关
<a id="markdown-361-自定义观看番剧" name="361-自定义观看番剧"></a>
#### 3.6.1. 自定义观看番剧
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `VipBigPointConfig__ViewBangumis` |
| 值域 | 番剧的ssidseason_id |
| 默认值 | `33378`(名侦探柯南) |
<a id="markdown-37-免费b币券充电" name="37-免费b币券充电"></a>
### 3.7. 免费B币券充电
<a id="markdown-371-充电对象" name="371-充电对象"></a>
#### 3.7.1. 充电对象
充电对象的upId-1表示不指定~~默认为自己充电~~其他Id则会尝试为配置的UpId充电。
注意之前可以不配置默认为自己充电但后来阿B改了规则不再允许自己冲自己。。。
建议配置为自己小号(小号需要认证为作者并开启充电),或者也可以配置为 -1以支持作者~
| TITLE | CONTENT |
| ----- | --------------------------------- |
| 配置Key | `ChargeTaskConfig__AutoChargeUpId` |
| 值域 | up的Id字符串 |
| 默认值 | 无 |
<a id="markdown-38-推送相关" name="38-推送相关"></a>
### 3.8. 推送相关
v1.0.x仅支持推送到Server酱v1.1.x之后重新定义了推送地概念将推送仅看作不同地日志输出端与Console、File没有本质区别。
配置多个多个端均会收到日志消息。推荐Telegram、企业微信、Server酱。
<a id="markdown-381-是否开启每个账号单独推送消息" name="381-是否开启每个账号单独推送消息"></a>
#### 3.8.1. 是否开启每个账号单独推送消息
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Notification__IsSingleAccountSingleNotify` |
| 意义 | 开启后,每个账号会单独推送消息。否则多账号合并只推送一条消息 |
| 值域 | [true,false] |
| 默认值 | true |
<a id="markdown-382-telegram机器人" name="382-telegram机器人"></a>
#### 3.8.2. Telegram机器人
<img src="/docs/imgs/push-tg.png" alt="push-tg" width="400" />
<a id="markdown-3821-bottoken" name="3821-bottoken"></a>
##### 3.8.2.1. botToken
点击 https://core.telegram.org/api#bot-api 查看如何创建机器人并获取到机器人的botToken。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__3__Args__botToken` |
| 意义 | 用于将日志输出到Telegram机器人 |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-3822-chatid" name="3822-chatid"></a>
##### 3.8.2.2. chatId
点击 https://api.telegram.org/bot{TOKEN}/getUpdates 获取到与机器人的chatId需要用上面获取到的Token替换进链接里的{TOKEN}后访问)
P.S.访问链接需要能访问"外网"有vpn的挂vpn。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__3__Args__chatId` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
| 命令行示范 | 无 |
<a id="markdown-3823-proxy" name="3823-proxy"></a>
##### 3.8.2.3. proxy
使用代理
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__3__Args__proxy` |
| 值域 | 一串字符串格式为user:password@host:port |
| 默认值 | 空 |
| 命令行示范 | 无 |
<a id="markdown-383-企业微信机器人" name="383-企业微信机器人"></a>
#### 3.8.3. 企业微信机器人
在群内添加机器人获取到机器人的WebHook地址添加到配置中。
<img src="/docs/imgs/push-workweixin.png" alt="push-workweixin" width="400" />
<a id="markdown-3831-webhookurl" name="3831-webhookurl"></a>
##### 3.8.3.1. webHookUrl
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__4__Args__webHookUrl` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
| 命令行示范 | 无 |
<a id="markdown-384-钉钉机器人" name="384-钉钉机器人"></a>
#### 3.8.4. 钉钉机器人
在群内添加机器人获取到机器人的WebHook地址添加到配置中。
机器人的安全策略,当前不支持加签,请使用关键字策略,推荐关键字:`Ray``BiliBili`
<img src="/docs/imgs/push-ding.png" alt="push-ding" width="400" />
<a id="markdown-3841-webhookurl" name="3841-webhookurl"></a>
##### 3.8.4.1. webHookUrl
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__5__Args__webHookUrl` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-385-server酱" name="385-server酱"></a>
#### 3.8.5. Server酱
官网: http://sc.ftqq.com/9.version
<img src="/docs/imgs/wechat-push.png" alt="wechat-push" width="400" />
<a id="markdown-3851-turbosckeyserver酱sckey" name="3851-turbosckeyserver酱sckey"></a>
##### 3.8.5.1. TurboScKeyServer酱SCKEY
获取方式请参考官网。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__6__Args__turboScKey` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-386-酷推" name="386-酷推"></a>
#### 3.8.6. 酷推
https://cp.xuthus.cc/
<a id="markdown-3861-skey" name="3861-skey"></a>
##### 3.8.6.1. sKey
该平台可能还在完善当中对接时我发现其接口定义不规范且机器人容易被封所以不推荐使用且不接受提酷推推送相关bug。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__7__Args__sKey` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-387-推送到自定义api" name="387-推送到自定义api"></a>
#### 3.8.7. 推送到自定义Api
这是我简单封装了一个通用的推送接口可以推送到任意的api地址如果有自己的机器人或自己的用于接受日志的api可以根据需要自定义配置。
<a id="markdown-3871-api" name="3871-api"></a>
##### 3.8.7.1. api
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__8__Args__api` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-3872-placeholder" name="3872-placeholder"></a>
##### 3.8.7.2. placeholder
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__8__Args__placeholder` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-3873-bodyjsontemplate" name="3873-bodyjsontemplate"></a>
##### 3.8.7.3. bodyJsonTemplate
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__8__Args__bodyJsonTemplate` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-388-pushplus推荐" name="388-pushplus推荐"></a>
#### 3.8.8. PushPlus[推荐]
官网: http://www.pushplus.plus/doc/
<a id="markdown-3881-pushplus的token" name="3881-pushplus的token"></a>
##### 3.8.8.1. PushPlus的Token
获取方式请参考官网。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__9__Args__token` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-3882-pushplus的topic" name="3882-pushplus的topic"></a>
##### 3.8.8.2. PushPlus的Topic
获取方式请参考官网。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__9__Args__topic` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
<a id="markdown-3883-pushplus的channel" name="3883-pushplus的channel"></a>
##### 3.8.8.3. PushPlus的Channel
获取方式请参考官网。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__9__Args__channel` |
| 值域 | 一串字符串,[wechat,webhook,cp,sms,mail] |
| 默认值 | 空 |
<a id="markdown-3884-pushplus的webhook" name="3884-pushplus的webhook"></a>
##### 3.8.8.4. PushPlus的Webhook
获取方式请参考官网。
webhook编码(不是地址)在官网平台设定仅在channel使用webhook渠道和CP渠道时需要填写
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__9__Args__webhook` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
| 命令行示范 | |
<a id="markdown-389-microsoft-teams" name="389-microsoft-teams"></a>
#### 3.8.9. Microsoft Teams
官网: https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook
<a id="markdown-3891-microsoft-teams的webhook" name="3891-microsoft-teams的webhook"></a>
##### 3.8.9.1. Microsoft Teams的Webhook
webhook的完整地址在Teams的Channel中获取详细获取方式请参考官网。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__10__Args__webhook` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
| 命令行示范 | |
<a id="markdown-3810-企业微信应用推送" name="3810-企业微信应用推送"></a>
#### 3.8.10. 企业微信应用推送
官网: https://developer.work.weixin.qq.com/tutorial/application-message
`corpId``agentId``secret`均不为空时,自动开启推送,否则关闭。
`toUser``toParty``toTag`3个配置非必填但不可同时为空默认`toUser``@all`,向所有用户推送。
<a id="markdown-38101-企业微信应用推送的corpid" name="38101-企业微信应用推送的corpid"></a>
##### 3.8.10.1. 企业微信应用推送的corpId
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__11__Args__corpId` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
| 命令行示范 | |
<a id="markdown-38102-企业微信应用推送的agentid" name="38102-企业微信应用推送的agentid"></a>
##### 3.8.10.2. 企业微信应用推送的agentId
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__11__Args__agentId` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
| 命令行示范 | |
<a id="markdown-38103-企业微信应用推送的secret" name="38103-企业微信应用推送的secret"></a>
##### 3.8.10.3. 企业微信应用推送的secret
| TITLE | CONTENT |
| ----- | -------------------------------- |
| 配置Key | `Serilog__WriteTo__11__Args__secret` |
| 值域 | 一串字符串 |
| 默认值 | 空 |
| 命令行示范 | |
<a id="markdown-39-日志相关" name="39-日志相关"></a>
### 3.9. 日志相关
<a id="markdown-391-日志输出等级" name="391-日志输出等级"></a>
#### 3.9.1. 日志输出等级
为了美观, BiliBiliTool 默认只输出最低等级为 Information 的日志,保证只展示最精简的信息。
通过更改等级,可以指定日志输出的详细程度。
BiliBiliTool 使用 Serilog 作为日志组件,所以其值域与 Serilog 的日志等级选项相同,这里只建议在需要调试时改为`Debug`应用会输出详细的调试日志信息包括每次调用B站Api的请求参数与返回数据。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__0__Args__restrictedToMinimumLevel` |
| 值域 | [Information,Debug] |
| 默认值 | 1 |
<a id="markdown-392-日志输出样式" name="392-日志输出样式"></a>
#### 3.9.2. 日志输出样式
这里的日志样式指的是 Console 的等级,即 GitHub Actions 里和微信推送里看到的日志。
通过更改模板样式,可以指定日志输出的样式,比如不输出时间和等级,做到最精简的样式。
BiliBiliTool 使用 Serilog 作为日志组件,所以可以参考 Serilog 的日志样式模板。
| TITLE | CONTENT |
| ---------- | -------------- |
| 配置Key | `Serilog__WriteTo__0__Args__outputTemplate` |
| 值域 | 字符串 |
| 默认值 | `[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}` |
<a id="markdown-393-定时任务相关" name="393-定时任务相关"></a>
#### 3.9.3. 定时任务相关
适用于 [方式四docker容器化运行推荐](../docker/README.md),用于配置定时任务。
<a id="markdown-394-定时任务" name="394-定时任务"></a>
#### 3.9.4. 定时任务
以下环境变量的值应为有效的 [cron 表达式](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm)。
当被设置时,对应定时任务将开启。
| 环境变量 | 定时任务 |
| --------------------------------- | ------ |
| `DailyTaskConfig__Cron` | 每日任务 |
| `LiveLotteryTaskConfig__Cron` | 天选时刻抽奖 |
| `UnfollowBatchedTaskConfig__Cron` | 批量取关 |
| `VipBigPointConfig__Cron` | 大会员大积分 |

87
docs/donate-list.md Normal file
View File

@@ -0,0 +1,87 @@
# 赞赏
| 赞赏人 | 时间 | 金额 | 方式 | 留言 | 回复
| ---------- | -------------- | -------------- | -------------- | -------------- | -------------- |
| Jonty | 2020-11-04 | ¥5 | 微信 | 不知可否加个联系方式讨论一下b站小公举 | 你没有留微信号啊大兄弟 |
| 春歌 | 2020-11-06 | ¥5 | 微信 | 赞赏一下~ | |
| 雅南 | 2020-11-08 | ¥1 | 微信 | 赞赏一下~ | |
| RainMeter | 2020-11-09 | ¥1 | 微信 | 大佬牛逼 | |
| 1998 | 2020-11-10 | ¥1 | 微信 | 谢谢大佬,但是投币总是失败 | 有问题可以加群讨论 |
| Andy | 2020-11-10 | ¥1 | 微信 | 赞赏一下~ | |
| 不若艳阳 | 2020-11-11 | ¥10 | 微信 | 赞赏一下~ | |
| 努力努力再努力 | 2020-11-11 | ¥1 | 微信 | 赞赏一下~ | |
| Wandering Ghost | 2020-11-12 | ¥1 | 微信 | 好活,当赏 | |
| sadhu | 2020-11-12 | ¥1 | 支付宝 | 加油 | |
| 浮蘭·鳥ドス | 2020-11-12 | ¥1 | 微信 | 加油!在一个微信公众号看到这个 | |
| Ⅶ | 2020-11-12 | ¥1 | 微信 | 太棒啦!支持您! | |
| 舞飞扬 | 2020-11-12 | ¥1 | 支付宝 | 多谢bilibilitool | |
| 王雨桐 | 2020-11-13 | ¥1 | 微信 | 感谢ps借用作者项目完成我开源选修作业——分析一款开源软件 | |
| 郁宁 | 2020-11-13 | ¥5 | 微信 | Godd Job | |
| 半岛 | 2020-11-13 | ¥1 | 支付宝 | 赞赏一下~ | |
| Wenson | 2020-11-19 | ¥10 | 微信 | 搞的不错👍 | |
| xingxing | 2020-11-20 | ¥1 | 支付宝 | 这东西太好用了,点个 | |
| | 2020-11-21 | ¥10 | 微信 | 单纯问下,有做成云函数的可行性吗 | 目前没了解过云函数相关有懂的朋友欢迎PR~ |
| Gaogao | 2020-11-21 | ¥1 | 支付宝 | 老哥加油加油^0^ | |
| 老狗 | 2020-11-23 | ¥10 | 微信 | 好活当赏吗 | |
| | 2020-11-23 | ¥10 | 微信 | | |
| 还输给回忆不成 | 2020-11-23 | ¥1 | 微信 | | |
| Winfor | 2020-11-23 | ¥5 | 微信 | 感谢分享 | |
| 那个冰 | 2020-11-23 | ¥1 | 微信 | 如果一开始努力的方向就是错误的,那么只会越来越忙。感谢 | |
| Luv(sic) part 2 | 2020-11-24 | ¥1 | 微信 | 牛逼嗷上班划水新技能get | |
| 刘小明 | 2020-11-24 | ¥3 | 微信 | 大佬喝冰阔落 | |
| 青翘 | 2020-11-25 | ¥1 | 支付宝 | 赞赏一下~ | |
| CT | 2020-11-25 | ¥1 | 微信 | 感谢 | |
| Panda | 2020-11-25 | ¥1 | 微信 | 很好用的工具 | |
| Che | 2020-11-25 | ¥1 | 微信 | 微信推送的配置方法能不能说的再详细一点,没用过有点懵 | |
| 张浩 | 2020-11-25 | ¥1 | 微信 | 集资给你买霸王 | 真棒 |
| 骷髅刀皇 | 2020-11-26 | ¥1 | 支付宝 | 外行人第一个再GitHub跑成功的源码 | |
| | 2020-11-26 | ¥1 | 微信 | 项目有意思 | |
| ohh | 2020-11-27 | ¥1 | 微信 | 集资买霸王 duang😏 | 😏 |
| 夏风 | 2020-11-28 | ¥1 | 支付宝 | 赞赏一下~ | |
| 征服神的眼睛 | 2020-11-27 | ¥1 | 微信 | 头发+1 | |
| 长空X | 2020-11-30 | ¥1 | 支付宝 | 加油我是hjkl950217 | 贡献的代码很棒,欢迎加入 |
| 旧城空梦 | 2020-11-30 | ¥5 | 微信 | 拉我进下微信群,谢谢,我微信*** | 已拉 |
| Mr.华 | 2020-12-01 | ¥1 | 微信 | 白嫖党 今天给你投币来了 | |
| 暮雨 | 2020-12-01 | ¥1 | 微信 | 不多说好用412还没有解决 | 大于等于1.0.14版本解决啦 |
| 闪电 | 2020-12-01 | ¥1 | 微信 | 欧拉拉 | |
| 山水之间 | 2020-12-01 | ¥1 | 微信 | 加油💪 | 💪 |
| 八八九九 | 2020-12-02 | ¥1 | 微信 | cool | |
| 。 | 2020-12-02 | ¥1 | 微信 | 支持 | |
| Carnina | 2020-12-06 | ¥5 | 微信 | 谢谢大大的bili工具 | |
| 大疼 | 2020-12-07 | ¥1 | 支付宝 | 教程很细致,谢谢 | |
| | 2020-12-07 | ¥1 | 微信 | 谢谢大佬B站的项目 | |
| Nirvana | 2020-12-08 | ¥1 | 微信 | 求进群我的微信*** | 已拉 |
| | 2020-12-17 | ¥1 | 微信 | 微信昵称时空白的 | 是的 |
| aiyΑ | 2020-12-23 | ¥1 | 微信 | | |
| 就这样被作业征服 | 2021-01-02 | ¥1 | 微信 | 太棒了,十分感谢 | |
| けっこ | 2021-01-03 | ¥1 | 微信 | bilibilitools加油! | 加油~ |
| Ruo | 2021-01-05 | ¥1 | 微信 | 加油加油 | 加油~ |
| | 2021-01-06 | ¥1 | 微信 | | |
| 199863nothing | 2021-01-06 | ¥1 | 支付宝 | 等俺五级给你买霸王洗发水 | 棒 |
| 小伊 | 2021-01-06 | ¥1 | 支付宝 | 赞赏一下~ | |
| 多喝热水吧你 | 2021-01-07 | ¥10 | 微信 | 感谢作者,支持一下,太辛苦了 | 感谢 |
| YNight-FZQ | 2021-01-08 | ¥5 | 微信 | 2021要加油哦感谢作者分享 | 一起加油~ |
| 外比巴卜 | 2021-01-09 | ¥3 | 微信 | 加油^o^~,做的很棒 | 支持开源的你们更棒~ |
| 199863nothing | 2021-01-09 | ¥1 | 微信 | 求拉进群(ง •_•)ง | 你没有留微信号啊大兄弟 |
| 黑影 | 2021-01-10 | ¥5 | 微信 | Mreblack7感谢7楼大大可以加微信群嘛qwq | 你没有留微信号啊大兄弟 |
| 199863nothing | 2021-01-11 | ¥1 | 微信 | 微信号:\*\*\*,大佬捞一捞我 | 已拉~ |
| . | 2021-01-12 | ¥5 | 微信 | 进群进群,冲冲冲 | 你没有留微信号啊大兄弟 |
个人维护开源不易
如果你觉得我写的东西对你确实有帮助
或者,你就是单纯的想集资给我买瓶霸王增发液
那么下面的赞赏码可以扫一扫啦
(赞赏时记得留下【昵称】和【留言】,上面这么多留言要想要进群或者加好友的,一定一定要记得留微信号哈,微信赞赏页面是看不到微信号的~
* 微信扫码自动赞赏1元
![微信赞赏码](https://www.cnblogs.com/images/cnblogs_com/RayWang/1490646/o_%e5%be%ae%e4%bf%a1%e8%b5%9e%e8%b5%8f%e7%a0%81.jpg)
* 支付宝扫码自动赞赏1元
![支付宝赞赏吗](https://img2018.cnblogs.com/blog/1327955/201907/1327955-20190722174147547-1575068076.jpg)

BIN
docs/imgs/2233.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 924 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
docs/imgs/claw-addr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

BIN
docs/imgs/claw-deploy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
docs/imgs/claw-search.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 KiB

BIN
docs/imgs/docker-login.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
docs/imgs/donate.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
docs/imgs/dotnet-login.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

BIN
docs/imgs/get-up-id.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
docs/imgs/git-secrets.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Some files were not shown because too many files have changed in this diff Show More