#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ BUFF 饰品属性同步脚本(固定代理账号密码版本) 说明: 1. 复用 sync_goods_attr.py 的数据库/同步主流程逻辑 2. 将“从代理池 API 获取代理”改为“固定代理账号密码” 3. 默认使用本文件内置代理参数,也支持环境变量覆盖 """ import os import sys from sync_goods_attr import ( BATCH_SIZE, CONCURRENT_WORKERS, DB_HOST, DB_NAME, DB_PORT, BuffGoodsAPI, DatabaseConnectionPool, GoodsAttrDatabase, GoodsAttrSyncTask, logger, ) # 固定代理配置(可通过环境变量覆盖) FIXED_PROXY_USERNAME = os.getenv( "FIXED_PROXY_USERNAME", "user-sub.1114324035-type-dc-session-dzkC45", ) FIXED_PROXY_PASSWORD = os.getenv("FIXED_PROXY_PASSWORD", "1114324035") FIXED_PROXY_HOST = os.getenv("FIXED_PROXY_HOST", "proxy.haiwaiip.net") FIXED_PROXY_PORT = os.getenv("FIXED_PROXY_PORT", "1469") class FixedProxyBuffGoodsAPI(BuffGoodsAPI): """固定代理版本:不再请求代理池 API,始终使用同一代理凭据""" def _fetch_new_proxy_from_pool(self): if not all([FIXED_PROXY_USERNAME, FIXED_PROXY_PASSWORD, FIXED_PROXY_HOST, FIXED_PROXY_PORT]): logger.error("固定代理配置不完整,请检查用户名/密码/主机/端口") return None return f"{FIXED_PROXY_USERNAME}:{FIXED_PROXY_PASSWORD}@{FIXED_PROXY_HOST}:{FIXED_PROXY_PORT}" def _rotate_proxy(self, reason: str) -> bool: """兼容父类重试逻辑:将“切换代理”退化为“确保固定代理已设置”""" new_proxy = self._fetch_new_proxy_from_pool() if not new_proxy: logger.error("设置固定代理失败(原因:%s)", reason) return False with self._proxy_lock: old_proxy = self._current_proxy self._current_proxy = new_proxy if old_proxy != new_proxy: logger.info("固定代理已启用(%s): %s", reason, f"{FIXED_PROXY_HOST}:{FIXED_PROXY_PORT}") return True class FixedProxyGoodsAttrSyncTask(GoodsAttrSyncTask): """固定代理同步任务""" def __init__(self): self.db = GoodsAttrDatabase() self.api = FixedProxyBuffGoodsAPI() self._sync_offset = 0 def main(): task = None try: logger.info("启动饰品属性同步脚本(固定代理账号密码版本)...") logger.info( "数据库写入目标: %s:%s/%s 表 buff_goods_attr(请确认您查询的是同一库)", DB_HOST, DB_PORT, DB_NAME, ) logger.info( "配置信息: 每次处理 %s 个饰品, 串行单请求(无固定间隔), 并发数 %s, 固定代理 %s:%s", BATCH_SIZE, CONCURRENT_WORKERS, FIXED_PROXY_HOST, FIXED_PROXY_PORT, ) task = FixedProxyGoodsAttrSyncTask() task.run_continuous() except KeyboardInterrupt: logger.info("\n收到中断信号,正在退出...") if task: task.cleanup() sys.exit(0) except Exception as e: logger.exception("程序运行异常: %s", e) if task: task.cleanup() sys.exit(1) if __name__ == "__main__": try: import dbutils # noqa: F401 except ImportError: print("请先安装依赖: pip install DBUtils==3.0.2") sys.exit(1) main()