影刀RPA新手教程_多账号Cookie池调度高并发采集的账号资源管理
影刀RPA新手教程:多账号Cookie池调度——高并发采集的账号资源管理
影刀RPA单账号做采集,遇到限流只能干等。但如果你有10个账号,通过Cookie池调度可以把采集效率提升10倍——每个账号用满配额,自动切换,互不影响。
这篇讲Cookie池的设计和调度逻辑。
什么是Cookie池
简单说:维护一批已登录账号的Cookie,采集时动态切换,让每个账号都轮流上阵。
拼多多店群自动化报活动上架!
账号池: - account_01: Cookie有效,今日已用120次 - account_02: Cookie有效,今日已用80次 - account_03: Cookie过期,待刷新 - account_04: Cookie有效,今日已用200次(接近限额) - account_05: Cookie有效,今日已用10次  调度逻辑: → 优先选使用次数最少的账号(account_05) → account_04已接近限额,跳过 → account_03过期,触发后台刷新Cookie池的数据结构
用SQLite存Cookie池状态,一目了然:
importsqlite3importjsonfromdatetimeimportdatetime# 创建Cookie池数据库conn=sqlite3.connect(r'C:\配置\cookie_pool.db')cursor=conn.cursor()cursor.execute(''' CREATE TABLE IF NOT EXISTS cookies ( account_id TEXT PRIMARY KEY, platform TEXT NOT NULL, username TEXT,  cookies JSON, status TEXT DEFAULT 'active', -- active/expired/cooldown daily_count INTEGER DEFAULT 0, -- 今日使用次数 daily_limit INTEGER DEFAULT 300, -- 每日限制次数 last_used TIMESTAMP, last_refresh TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''')conn.commit()调度器核心逻辑
classCookiePool:def__init__(self,db_path):self.db=sqlite3.connect(db_path)self.db.row_factory=sqlite3.Row# 让查询结果可以按列名访问defget_available_account(self,platform):"""获取一个可用账号(使用次数最少的)"""cursor=self.db.cursor()account=cursor.execute(''' SELECT * FROM cookies WHERE platform = ? AND status = 'active' AND daily_count < daily_limit ORDER BY daily_count ASC LIMIT 1 ''',(platform,)).fetchone()ifnotaccount:raiseException(f"没有可用的{platform}账号")returnaccountdefuse_account(self,account_id):"""记录账号使用一次"""self.db.execute(''' UPDATE cookies SET daily_count = daily_count + 1, last_used = ? WHERE account_id = ? ''',(datetime.now().isoformat(),account_id))self.db.commit()defmark_expired(self,account_id):"""标记Cookie已过期"""self.db.execute(''' UPDATE cookies SET status = 'expired' WHERE account_id = ? ''',(account_id,))self.db.commit()defreset_daily_count(self):"""每天凌晨重置使用计数"""self.db.execute("UPDATE cookies SET daily_count = 0")self.db.commit()definject_cookies(self,browser,account_id):"""把指定账号的Cookie注入到浏览器"""cursor=self.db.cursor()row=cursor.execute('SELECT cookies FROM cookies WHERE account_id = ?',(account_id,)).fetchone()ifnotrow:raiseValueError(f"账号{account_id}不存在")cookies=json.loads(row['cookies'])# 清除当前浏览器Cookiebrowser.delete_all_cookies()# 注入Cookieforcookieincookies:browser.add_cookie(cookie)browser.refresh()在影刀RPA流程中使用
pool=CookiePool(r'C:\配置\cookie_pool.db')defcollect_with_pool(url,platform='pdd'):"""使用Cookie池进行采集,自动切换账号"""retry_count=0whileretry_count<3:# 1. 获取可用账号account=pool.get_available_account(platform)account_id=account['account_id']# 2. 注入Cookiepool.inject_cookies(browser,account_id)# 3. 访问目标URLopen_url(url)# 4. 检测是否被重定向到登录页current_url=browser.current_urlif'login'incurrent_urlor'signin'incurrent_url:# Cookie过期了pool.mark_expired(account_id)send_alert(f"账号{account_id}Cookie已过期,已标记")retry_count+=1continue# 5. 记录使用pool.use_account(account_id)# 6. 采集数据returncollect_page_data()raiseException("所有账号均不可用")Cookie刷新机制
TEMU店群矩阵自动化运营核价报活动
过期的Cookie需要重新登录获取。建议在凌晨空闲时间批量刷新:
defrefresh_expired_cookies():"""批量刷新过期Cookie"""cursor=pool.db.cursor()expired=cursor.execute("SELECT account_id, username FROM cookies WHERE status = 'expired'").fetchall()foraccountinexpired:try:# 自动登录获取新Cookie(用存储的账号密码)# ...登录流程...new_cookies=browser.get_cookies()pool.db.execute(''' UPDATE cookies SET cookies = ?, status = 'active', last_refresh = ? WHERE account_id = ? ''',(json.dumps(new_cookies),datetime.now().isoformat(),account['account_id']))pool.db.commit()log(f"账号{account['account_id']}Cookie刷新成功")exceptExceptionase:log(f"账号{account['account_id']}刷新失败:{e}")注意事项
| 事项 | 说明 |
|---|---|
| 账号来源合法 | 必须是自己运营的账号,不能购买或非法获取 |
| 单账号频率控制 | 即使有多账号,单账号频率也不能太高 |
| IP与账号匹配 | 多账号最好配合多IP,不然同一IP切换账号容易触发检测 |
| 数据安全 | Cookie相当于登录态,数据库文件要加密存储 |
#影刀RPA #RPA自动化 #Cookie池 #账号管理 #高并发采集
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
