TikTok 多账号养号自动化脚本。在云电脑上通过比特浏览器(指纹隔离)+ 住宅 IP 模拟真人行为, 对账号执行 FYP 浏览 / 点赞 / 关注等动作,支持定时调度与动作统计。
项目背景与整体方案见
tiktok_matrix_proposal_v1.md。 规模目标:2 → 10 → 1000+ 账号。
云电脑 (Windows)
├── 梯子 (Clash, TUN 模式) — 内网穿透到 IPRoyal 住宅 IP
├── BitBrowser 比特浏览器 — 指纹隔离,每号一个 profile + 一个住宅 IP
│ └── 本地 API :54345 — open/close/pids
└── account-matrix (本仓库)
├── patchright — 反检测版 Playwright,connect_over_cdp 接管浏览器
├── main.py — 单次批量执行所有启用账号
└── scheduler.py — FastAPI + APScheduler 定时调度
一个账号动作执行完即关闭浏览器,再执行下一个;文件锁保证同一时间只操作一个账号。
config/accounts.yaml 账号与行为配置(唯一配置源)
config/comments.txt FYP 默认评论池(每行一条,可自由增删)
config/comments_brand.txt 品牌向评论池(目标号互动用)
src/
main.py 入口:批量/单账号执行,PID 文件锁,SQLite 动作日志
scheduler.py 定时调度服务(FastAPI lifespan + AsyncIOScheduler)
bitbrowser.py BitBrowser 本地 API 客户端
actions.py 养号动作:fyp_browse / try_like / try_follow / try_comment
target_engage.py 目标号互动:抓新视频 + 点赞/评论自家品牌官方号
human_mouse.py 贝塞尔曲线模拟真人鼠标移动
notify.py 批次结束推送(ServerChan / Bark / Webhook)
stats.py 动作统计:按账号汇总浏览/点赞/关注/评论次数
test_like.py 点赞动作诊断脚本
test_comment.py 评论动作诊断脚本(dump 选择器 + 试发评论)
data/ 运行时生成(已 gitignore)
actions.db SQLite 动作日志
sessions.log 可读的会话日志
run.lock PID 锁文件
仅在云电脑上运行,本机不登录 TikTok / 不开 BitBrowser。
- 云电脑装好 Clash(TUN 模式)、BitBrowser,并在 BitBrowser 里为账号配好住宅 IP 代理后再生成指纹。
- Python 3.13,安装依赖:
pip install -r requirements.txt
- BitBrowser 应用保持开启(脚本依赖其本地 API
127.0.0.1:54345)。
编辑 config/accounts.yaml:
defaults:
daily_actions:
fyp_browse_minutes: [2, 5] # 单次 FYP 浏览时长范围(分钟)
like_probability: 0.35 # 每个视频点赞概率
follows_per_session: [0, 1] # 每 session 关注数上限
comment:
enabled: true
comments_per_session: [1, 2] # 每 session 评论数上限(最多 1~2 条)
min_video_comments: 1000 # 仅评论“评论数 > 此值”的视频
probability: 0.25 # 命中候选视频后,单视频尝试评论的概率
active_hours: [[9, 12], [19, 23]]
timezone: America/New_York
scheduler:
fires_per_day: 3 # 每天在 active_hours 内随机触发次数
accounts:
- id: tiktok_1
enabled: true
bitbrowser_profile_id: "比特浏览器的 profile ID"
notes: "测试号 #1"新增账号 = 在 accounts: 下加一项;临时停用某号设 enabled: false。
cd src
# 单次执行所有启用账号(账号间随机间隔 30-120s)
python main.py
# 只跑某一个账号
python main.py --account tiktok_1
# 创建绑定固定代理的比特浏览器窗口(默认 socks5)
python create_browser.py --name tiktok_2 \
--proxy "192.0.2.10:12324:用户名:密码"
# HTTP 代理;省略 --proxy 会隐藏输入,避免密码进入 shell 历史
python create_browser.py --name tiktok_2 --type http
# 批量读取代理文件;自动读取现有 tiktok_N 窗口的最大编号并从 N+1 创建
# 默认允许多个窗口复用已使用的代理;如需跳过则增加 --skip-used
# 文件每行格式:host:port:用户名:密码(空行和 # 注释会忽略)
python create_browser.py --file ../config/private/proxies/ip_0630
# 打开 BitBrowser、进入 Google 登录、填写邮箱并点击 Next(停留在密码页)
python gmail_setup.py --browser-name tiktok_25 --email account@gmail.com
# 填写并提交密码;推荐隐藏输入,避免密码进入命令历史
# 自动接受 Workspace 首次登录的 I understand 条款页
# 登录完成后自动点击 Google Account 的 Google password
# 遇到两步验证或其他安全挑战时会停留在对应页面
python gmail_setup.py --browser-name tiktok_25 --email account@gmail.com --ask-password
# I understand 默认等待 60 秒;超时后直接继续 Google password 流程
python gmail_setup.py --browser-name tiktok_25 --email account@gmail.com \
--ask-password --terms-timeout 60
# 未指定新密码时使用脚本内置的统一新密码并提交修改
python gmail_setup.py --browser-name tiktok_25 --email account@gmail.com \
--ask-password
# 批量读取邮箱文件;从指定窗口名开始逐个登录/改密,操作完自动关闭再打开下一个
# 文件每行格式:账号----密码----可忽略备注(空行和 # 注释会忽略)
# 例:第 1 行跑 tiktok_25,第 2 行跑 tiktok_26
python gmail_setup.py --file ../config/private/mails/mail_0702 \
--browser-name tiktok_25
# 查看统计
python stats.py # 全部(FYP 浏览/点赞/关注/评论)
python stats.py --today # 今天
python stats.py --days 7 # 近 7 天
python stats.py --target # 目标号互动汇总(按号 + 按目标)
python stats.py --target --today # 今天的目标号互动(可配合 --today/--days)
# 点赞动作诊断(浏览器已打开时也可用)
python test_like.py
# 评论动作诊断:找高评论视频、dump 选择器 HTML、试发评论
python test_comment.py # 找 >1000 评论的视频并试发
python test_comment.py --min 100 --no-post # 调低门槛、只定位不发评论评论池在
config/comments.txt,每行一条。养号阶段仅评论“评论数 >min_video_comments” 的高流量视频,每 session 最多 1~2 条,降低被判垃圾评论的风险。
让 participants 里的号每次 session 先刷 FYP,再去检查目标官方号有没有新视频,
按概率点赞/评论。配置在 accounts.yaml 的 target_accounts 段:
target_accounts:
enabled: true
handles: [brand_account_1, brand_account_2, brand_account_3] # 目标官方号
participants: [tiktok_example_6, ..., tiktok_example_15] # 执行号(10 个)
first_run_latest_n: 1 # 无记录时只处理最新 1 条
max_videos_per_run: 3 # 单次单目标最多处理几条新视频
like_probability: 0.9
comment_probability: 0.5 # 不强制全员评论,打散抱团
comments_file: comments_brand.txt
follow: true # 关注目标号(每号对每个目标只关一次)
follow_probability: 0.5 # 遇到未关注的目标按此概率关注(分散到不同天)关注目标号:参与号还会关注这几个品牌官方号——每号对每个目标只关一次
(target_follows 表记录,关过/已关就不再关),且按概率分散到不同天完成,不是
10 个号同一天一起关。关注状态经校验(按钮文案变 Following / 关注键消失才算成功),
失败不记录、下次可重试。
判新机制:抓目标号主页每条视频 URL 里的 video_id(雪花号,越大越新),
与 SQLite target_engagements 表里的水位线(该号对该目标已处理过的最大 id)比对,
id > 水位线 才算新。置顶旧视频因 id 较小不会被误判为新。某号对某目标无记录时
只处理最新 1 条作为起点,之后每天自然跟进新发布的,同一天多次触发不会重复处理。
⚠️ 10 个号集中给同一品牌点赞/评论本质是「互动抱团」,是平台重点打击对象。 已内置缓解:点赞/评论各自独立按概率(非全员)、班次错峰、每次先刷 FYP 混淆。 建议先用 23 个号灰度 23 天,确认点赞/评论留存(没被限流回滚)再扩到 10 个。
cd src
python scheduler.py启动后每天 00:05 为每个账号在它自己的 active_hours 内随机生成 fires_per_day
个触发时间,每次只跑那一个账号。服务监听 127.0.0.1:9601:
GET /health— 查看已排期的触发时间、锁状态- 触发前自动探测 BitBrowser API,不可达则跳过本次
- 进程内串行:同一时刻只驱动一个 profile(
session_lock) - 调度与手动
python main.py通过data/run.lock互斥,不会同时跑
共享 IP 错峰(班次模型):20 号 / 10 IP 时,每个 IP 挂 2 个号——一个排上午班
[[9,12]]、一个排晚上班 [[19,23]]。两班次时间不重叠,所以同一 IP 的两个号绝不会
同时在线(隔离靠 active_hours 错班,配合进程内 session_lock 串行执行)。
ip_group:同一个 IP 的两个号填相同字母(A~J),仅用于启动校验——若同 IP 的 两个号被排进重叠的active_hours,scheduler 启动时会告警。active_hours:决定账号属于哪个班次。
默认
accounts.yaml已是 20 号 / 2 班次模板,仅tiktok_1启用;填好各号的bitbrowser_profile_id并把enabled改true即可逐个上线。
config/accounts.yaml 的 notify 段默认关闭。开启后每批结束推送 OK/ERR 摘要,
支持 ServerChan / Bark / 通用 Webhook。
- profile 同一时间只能在一台机器打开,切勿本机与云电脑同时登录同一 BitBrowser 账号。