功能概述

  • 并发三连:点赞、投币、收藏三个接口并发请求,响应更快
  • 多账号支持:读取 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 环境。

注意事项

  1. 请勿滥用:批量三连违反 B 站使用条款,仅供学习 API 调用,请适度使用
  2. Cookie 安全:Cookie 文件包含敏感信息,请妥善保管,不要上传到公开仓库
  3. 账号封禁风险:高频异常操作可能导致账号被封