功能概述
- 并发三连:点赞、投币、收藏三个接口并发请求,响应更快
- 多账号支持:读取 Cookie 列表,轮流对目标视频执行三连
- 停止控制:通过
threading.Event优雅停止,避免中断导致数据不一致 - 网络验证:集成卡密验证,防止未授权运行
B站三连接口
# 三个接口
LIKE_URL = "https://api.bilibili.com/x/web-interface/archive/like"
COIN_URL = "https://api.bilibili.com/x/web-interface/coin/add"
FAVOR_URL = "https://api.bilibili.com/x/v3/fav/resource/deal"
并发三连核心
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests, threading
stop_event = threading.Event()
def triple_action(bvid: str, aid: int, cookies: dict) -> dict:
# 对单个视频执行三连,返回各操作结果
session = requests.Session()
session.cookies.update(cookies)
session.headers.update({
"Referer": f"https://www.bilibili.com/video/{bvid}",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
})
csrf = cookies.get("bili_jct", "")
results = {}
def like():
if stop_event.is_set():
return "stopped"
r = session.post(LIKE_URL, data={"bvid": bvid, "like": 1, "csrf": csrf})
return r.json().get("message", "unknown")
def coin():
if stop_event.is_set():
return "stopped"
r = session.post(COIN_URL, data={"bvid": bvid, "multiply": 1,
"select_like": 1, "csrf": csrf})
return r.json().get("message", "unknown")
def favor():
if stop_event.is_set():
return "stopped"
# 需要先获取默认收藏夹 ID
ml_id = get_default_fav_id(session, cookies)
if not ml_id:
return "no_fav_folder"
r = session.post(FAVOR_URL, data={
"rid": aid, "type": 2,
"add_media_ids": ml_id, "del_media_ids": "",
"csrf": csrf
})
return r.json().get("message", "unknown")
with ThreadPoolExecutor(max_workers=3) as pool:
futures = {
pool.submit(like): "like",
pool.submit(coin): "coin",
pool.submit(favor): "favor",
}
for f in as_completed(futures):
action = futures[f]
try:
results[action] = f.result()
except Exception as e:
results[action] = f"error: {e}"
return results
def get_default_fav_id(session, cookies: dict) -> str | None:
# 获取默认收藏夹 ID
mid = get_mid(session)
r = session.get(f"https://api.bilibili.com/x/v3/fav/folder/created/list-all?up_mid={mid}&jsonp=jsonp")
data = r.json()
folders = data.get("data", {}).get("list", [])
if folders:
return str(folders[0]["id"])
return None
def get_mid(session) -> str:
r = session.get("https://api.bilibili.com/x/member/web/account")
return str(r.json().get("data", {}).get("mid", ""))
多账号批量执行
import json, time
def batch_triple(bvid: str, aid: int, cookie_list: list,
stop_event: threading.Event, delay: float = 1.0):
# 逐账号对同一视频三连
for i, cookies in enumerate(cookie_list):
if stop_event.is_set():
print("[*] 已停止")
break
print(f"[{i+1}/{len(cookie_list)}] 正在处理账号...")
result = triple_action(bvid, aid, cookies)
print(f" 点赞: {result['like']}")
print(f" 投币: {result['coin']}")
print(f" 收藏: {result['favor']}")
time.sleep(delay)
def load_cookies(path: str) -> list:
# 从文件加载 Cookie 列表,每行一个 JSON 对象
cookies = []
with open(path, encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
cookies.append(json.loads(line))
return cookies
网络验证集成
from license_client import LicenseClient
import hashlib, platform
def get_machine_id() -> str:
# 生成机器指纹(MAC + CPU 信息哈希)
import uuid
mac = hex(uuid.getnode())
cpu = platform.processor()
raw = f"{mac}:{cpu}"
return hashlib.sha256(raw.encode()).hexdigest()[:32]
def check_license(license_key: str) -> bool:
client = LicenseClient(
server="https://license.example.com",
software_id="bilibili-triple",
secret="shared_secret_here"
)
machine_id = get_machine_id()
result = client.verify(license_key, machine_id)
return result.get("valid", False)
PyInstaller 打包
pip install pyinstaller
pyinstaller --onefile --console ^
--name "B站三连工具" ^
--add-data "cookies.txt;." ^
app.py
生成的 exe 在 dist/ 目录,双击运行无需 Python 环境。
注意事项
- 请勿滥用:批量三连违反 B 站使用条款,仅供学习 API 调用,请适度使用
- Cookie 安全:Cookie 文件包含敏感信息,请妥善保管,不要上传到公开仓库
- 账号封禁风险:高频异常操作可能导致账号被封