sync_goods_attr_fixed_proxy.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. BUFF 饰品属性同步脚本(固定代理账号密码版本)
  5. 说明:
  6. 1. 复用 sync_goods_attr.py 的数据库/同步主流程逻辑
  7. 2. 将“从代理池 API 获取代理”改为“固定代理账号密码”
  8. 3. 默认使用本文件内置代理参数,也支持环境变量覆盖
  9. """
  10. import os
  11. import sys
  12. from sync_goods_attr import (
  13. BATCH_SIZE,
  14. CONCURRENT_WORKERS,
  15. DB_HOST,
  16. DB_NAME,
  17. DB_PORT,
  18. BuffGoodsAPI,
  19. DatabaseConnectionPool,
  20. GoodsAttrDatabase,
  21. GoodsAttrSyncTask,
  22. logger,
  23. )
  24. # 固定代理配置(可通过环境变量覆盖)
  25. FIXED_PROXY_USERNAME = os.getenv(
  26. "FIXED_PROXY_USERNAME",
  27. "user-sub.1114324035-type-dc-session-dzkC45",
  28. )
  29. FIXED_PROXY_PASSWORD = os.getenv("FIXED_PROXY_PASSWORD", "1114324035")
  30. FIXED_PROXY_HOST = os.getenv("FIXED_PROXY_HOST", "proxy.haiwaiip.net")
  31. FIXED_PROXY_PORT = os.getenv("FIXED_PROXY_PORT", "1469")
  32. class FixedProxyBuffGoodsAPI(BuffGoodsAPI):
  33. """固定代理版本:不再请求代理池 API,始终使用同一代理凭据"""
  34. def _fetch_new_proxy_from_pool(self):
  35. if not all([FIXED_PROXY_USERNAME, FIXED_PROXY_PASSWORD, FIXED_PROXY_HOST, FIXED_PROXY_PORT]):
  36. logger.error("固定代理配置不完整,请检查用户名/密码/主机/端口")
  37. return None
  38. return f"{FIXED_PROXY_USERNAME}:{FIXED_PROXY_PASSWORD}@{FIXED_PROXY_HOST}:{FIXED_PROXY_PORT}"
  39. def _rotate_proxy(self, reason: str) -> bool:
  40. """兼容父类重试逻辑:将“切换代理”退化为“确保固定代理已设置”"""
  41. new_proxy = self._fetch_new_proxy_from_pool()
  42. if not new_proxy:
  43. logger.error("设置固定代理失败(原因:%s)", reason)
  44. return False
  45. with self._proxy_lock:
  46. old_proxy = self._current_proxy
  47. self._current_proxy = new_proxy
  48. if old_proxy != new_proxy:
  49. logger.info("固定代理已启用(%s): %s", reason, f"{FIXED_PROXY_HOST}:{FIXED_PROXY_PORT}")
  50. return True
  51. class FixedProxyGoodsAttrSyncTask(GoodsAttrSyncTask):
  52. """固定代理同步任务"""
  53. def __init__(self):
  54. self.db = GoodsAttrDatabase()
  55. self.api = FixedProxyBuffGoodsAPI()
  56. self._sync_offset = 0
  57. def main():
  58. task = None
  59. try:
  60. logger.info("启动饰品属性同步脚本(固定代理账号密码版本)...")
  61. logger.info(
  62. "数据库写入目标: %s:%s/%s 表 buff_goods_attr(请确认您查询的是同一库)",
  63. DB_HOST,
  64. DB_PORT,
  65. DB_NAME,
  66. )
  67. logger.info(
  68. "配置信息: 每次处理 %s 个饰品, 串行单请求(无固定间隔), 并发数 %s, 固定代理 %s:%s",
  69. BATCH_SIZE,
  70. CONCURRENT_WORKERS,
  71. FIXED_PROXY_HOST,
  72. FIXED_PROXY_PORT,
  73. )
  74. task = FixedProxyGoodsAttrSyncTask()
  75. task.run_continuous()
  76. except KeyboardInterrupt:
  77. logger.info("\n收到中断信号,正在退出...")
  78. if task:
  79. task.cleanup()
  80. sys.exit(0)
  81. except Exception as e:
  82. logger.exception("程序运行异常: %s", e)
  83. if task:
  84. task.cleanup()
  85. sys.exit(1)
  86. if __name__ == "__main__":
  87. try:
  88. import dbutils # noqa: F401
  89. except ImportError:
  90. print("请先安装依赖: pip install DBUtils==3.0.2")
  91. sys.exit(1)
  92. main()