Skip to content

Commit 71b2bd8

Browse files
committed
update: 提交代码
1 parent 4ba085a commit 71b2bd8

File tree

4 files changed

+196
-2
lines changed

4 files changed

+196
-2
lines changed

BiliRequest.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import requests
2+
import json
3+
from fake_useragent import UserAgent
4+
from requests import utils
5+
import qrcode
6+
7+
8+
class BiliRequest:
9+
qrcode_generate_url = 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate'
10+
qrcode_poll_url = 'https://passport.bilibili.com/x/passport-login/web/qrcode/poll'
11+
qrcode_url = ''
12+
qrcode_key = ''
13+
refresh_token = ''
14+
cookies = {}
15+
16+
request_headers = {
17+
'User-Agent': UserAgent().chrome,
18+
}
19+
20+
# black_list_query_url = 'https://api.bilibili.com/x/relation/modify'
21+
black_list_add_url = "https://api.bilibili.com/x/relation/batch/modify"
22+
23+
# 申请二维码
24+
def getQrcodeData(self):
25+
# 获取二维码数据
26+
res = requests.get(self.qrcode_generate_url, headers=self.request_headers)
27+
# 判断返回状态码
28+
if res.status_code != 200:
29+
raise Exception('获取二维码失败,状态码:' + str(res.status_code))
30+
# 解析返回包体
31+
data = res.json()
32+
# 判断返回值
33+
if data['code'] != 0:
34+
raise Exception('获取二维码失败,错误信息:' + data['message'])
35+
# 解析数据
36+
self.qrcode_url = data['data']['url']
37+
self.qrcode_key = data['data']['qrcode_key']
38+
img = qrcode.make(self.qrcode_url)
39+
img.save('loginqr.png')
40+
41+
# 获取二维码扫码状态
42+
def getQrcodeScanData(self):
43+
res = requests.get(self.qrcode_poll_url, headers=self.request_headers, params={'qrcode_key': self.qrcode_key})
44+
# 判断返回状态码
45+
if res.status_code != 200:
46+
raise Exception('获取二维码扫描状态失败,状态码:' + str(res.status_code))
47+
# 解析返回数据
48+
data = res.json()
49+
if data['code'] != 0:
50+
raise Exception('获取二维码扫描状态失败,错误信息:' + data['message'])
51+
# 判断扫码状态
52+
if data['data']['code'] == 86101: # 未扫描
53+
return 86101
54+
elif data['data']['code'] == 86090: # 已扫描未确认
55+
return 86090
56+
elif data['data']['code'] == 86038: # 已过期
57+
return 86038
58+
elif data['data']['code'] == 0: # 已确认
59+
# 获取res里的cookie
60+
cookie_jar = res.cookies
61+
self.cookies = requests.utils.dict_from_cookiejar(cookie_jar)
62+
self.refresh_token = data['data']['refresh_token']
63+
return 0
64+
else:
65+
raise Exception('获取二维码扫描状态失败,错误信息:' + data['message'])
66+
67+
# 批量拉黑
68+
def batchBlock(self, uids):
69+
# 构造请求头
70+
headers = self.request_headers
71+
headers['Content-Type'] = 'application/x-www-form-urlencoded'
72+
# 添加cookie
73+
headers['Cookie'] = ''.join([f'{k}={v};' for k, v in self.cookies.items()])
74+
# 构造请求参数
75+
params = {
76+
'fids': ','.join(uids),
77+
'act': 5,
78+
're_src': 11,
79+
'csrf': self.cookies.get('bili_jct'),
80+
}
81+
82+
res = requests.post(self.black_list_add_url, headers=headers, data=params)
83+
# 打印请求
84+
print(res.request.body)
85+
data = res.json()
86+
if data['code'] != 0:
87+
print('批量拉黑失败,错误信息:' + data['message'])
88+
return
89+
print("拉黑失败uid列表:" + str(data['data']['failed_fids']))

README.md

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,25 @@
1-
# BilibiliAutoBlacklist
2-
自动批量拉黑用户
1+
# B站批量拉黑处理程序
2+
3+
## 使用方法
4+
1. 在文件夹内放置**B站直播间机器人_实时更新.xlsx**
5+
2. 打开批量拉黑.exe
6+
3. 文件目录下会生成**loginqr.png**,打开后扫描二维码
7+
4. 登录成功后会自动根据表格进行拉黑操作
8+
9+
## excel表格数据源
10+
11+
[B站直播间机器人_实时更新](https://docs.qq.com/sheet/DUkdEbXlzYnFqTmlt?tab=BB08J2)
12+
13+
## 如何编译本代码
14+
15+
安装[pixi](https://pixi.sh/latest/)软件包管理器
16+
17+
~~~powershell
18+
pixi install
19+
20+
# 直接运行
21+
pixi run run
22+
23+
# 打包为exe
24+
pixi run build
25+
~~~

pixi.toml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[project]
2+
authors = ["AuraElicase <AuraElicase@outlook.com>"]
3+
channels = ["conda-forge"]
4+
description = "bilibili auto add black"
5+
name = "QuickBlackList"
6+
platforms = ["win-64"]
7+
version = "0.1.0"
8+
9+
[tasks]
10+
run = "python quickBlack.py $PIXI_PROJECT_ROOT"
11+
build = { cmd = ["python", "-m", "nuitka", "--show-progress", "--lto=no", "--include-package-data=fake_useragent", "--onefile", "--standalone", "--output-filename=QuickBlackList", "quickBlack.py"] }
12+
13+
14+
[dependencies]
15+
python = "*"
16+
17+
18+
[pypi-dependencies]
19+
xlrd = "==1.2.0"
20+
requests = ">=2.32.3,<3"
21+
qrcode = ">=8.0,<9"
22+
fake_useragent = "*"
23+
pillow = "*"
24+
nuitka = "*"
25+
setuptools = "*"

quickBlack.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import re
2+
from itertools import islice
3+
from time import sleep
4+
5+
import xlrd
6+
import requests
7+
import json
8+
from fake_useragent import UserAgent
9+
from requests import utils
10+
from BiliRequest import BiliRequest
11+
12+
13+
def chunker(iterable, size):
14+
"""将列表分成多个指定大小的块"""
15+
iterator = iter(iterable)
16+
for first in iterator:
17+
yield [first] + list(islice(iterator, size - 1))
18+
19+
20+
if __name__ == '__main__':
21+
data = xlrd.open_workbook('./B站直播间机器人_实时更新.xlsx')
22+
table = data.sheet_by_name('机器人名单')
23+
blackAddr = table.col_values(2)
24+
breq = BiliRequest()
25+
breq.getQrcodeData()
26+
code = -1
27+
while code != 0 or code == 86038:
28+
ncode = breq.getQrcodeScanData()
29+
if ncode != code:
30+
if ncode == 86101:
31+
print('等待扫描二维码')
32+
if ncode == 86090:
33+
print('已扫描,请确认')
34+
if ncode == 86038:
35+
print('二维码已失效')
36+
exit(0)
37+
if ncode == 0:
38+
print('已登录')
39+
code = ncode
40+
break
41+
code = ncode
42+
sleep(1)
43+
if code == 0:
44+
print(breq.cookies)
45+
print("需要拉黑:", table.nrows)
46+
blackUids = []
47+
for url in blackAddr[1:]:
48+
match = re.search(r"bilibili\.com/(\d+)/", url)
49+
if match:
50+
blackUids.append(match.group(1))
51+
for i, group in enumerate(chunker(blackUids, 20), start=1):
52+
# 这里可以执行你的操作,例如:
53+
print(f"处理第{i}组: {', '.join(group)}")
54+
# 执行你的操作,例如 API 请求等
55+
breq.batchBlock(group)
56+
sleep(1)
57+
print("拉黑完成")

0 commit comments

Comments
 (0)