Kylaan

Back

1. 项目目标#

在 Linux 服务器(CentOS + 宝塔面板)上,利用 Python + Selenium 实现:

  1. 每天定时自动打开腾讯文档收集表。
  2. 自动登录(只需扫码一次,后续自动维持登录状态)。
  3. 自动填写指定内容(单选、文本等)。
  4. 自动提交并处理“二次确认”弹窗。

2. 环境搭建与依赖解决#

2.1 基础环境#

  • OS: CentOS (宝塔面板)
  • Language: Python 3.x
  • Library: Selenium

2.2 遇到的问题 & 解决方案#

问题一:无法下载 ChromeDriver (网络问题)#

  • 现象:使用 webdriver-manager 自动安装时报错 ConnectionResetError,因为国内服务器无法连接 Google API。
  • 解决
    1. 查看 Chrome 版本:google-chrome --version
    2. 从国内淘宝镜像源手动下载对应版本的驱动: https://npmmirror.com/mirrors/chrome-for-testing/
    3. 手动解压并移动到 /usr/bin/chromedriver,赋予 chmod +x 权限。

问题二:Chrome 启动即崩溃 (内存不足/环境限制)#

  • 现象:脚本报错 Chrome instance exited 或无任何报错直接断开,无法生成截图。
  • 原因:Linux 无头模式下 /dev/shm(共享内存)过小,且服务器物理内存不足。
  • 解决
    1. 增加虚拟内存 (Swap):通过宝塔“Linux工具箱”添加 2GB~4GB Swap。
    2. 优化启动参数
      options.add_argument("--disable-dev-shm-usage") # 使用硬盘代替共享内存
      options.add_argument("--no-sandbox") #以此绕过沙盒限制
      options.add_argument("--headless=new") # 使用新版无头模式
      python

问题三:残留进程导致卡死#

  • 现象:多次调试后,提示 SessionNotCreatedException,因为旧的 Chrome 僵尸进程占用了资源。
  • 解决:在脚本开头加入“暴力清理”逻辑:
    os.system("pkill -9 chrome")
    os.system("pkill -9 chromedriver")
    python

3. 核心逻辑演进#

为了解决 “需要登录”“每日自动运行” 的矛盾,我们将脚本拆分为两个独立文件。

3.1 登录脚本 (login.py)#

  • 功能:人工运行一次。打开网页 -> 点击登录 -> 截图二维码 -> 等待用户扫码 -> 保存 Cookie 到本地目录。
  • 难点攻克
    • 定位登录按钮:最初使用文字匹配失败(因中英文环境差异),最终通过分析 HTML 源码,锁定了唯一 ID header-login-btn
    • 多步弹窗处理:实现了 点击右上角 -> 点击中间"立即登录" -> 点击"同意协议" -> 截图二维码 的完整链条。

3.2 填表脚本 (submit.py)#

  • 功能:定时任务运行。读取已保存的 Cookie -> 填表 -> 提交 -> 确认。
  • 难点攻克
    • 选项无法选中:最初只点击了文字,但腾讯文档的 React 框架未识别点击。
      • 修正:改为定位 role="radio" 的父容器,并优先点击内部的小圆圈元素。
      • 双重验证:点击后检查 aria-checked="true" 属性,未选中则重试。
    • 提交确认弹窗失效:脚本找不到“Confirm”按钮。
      • 原因:界面语言变成了英文(Confirm),脚本在找中文(确定)。
      • 修正:通过源码找到确认按钮的唯一 CSS 类名 button.dui-modal-footer-ok,无视语言差异,精准点击。

4. 最终代码#

文件结构#

  • /www/wwwroot/python_txwd/login.py (登录专用)
  • /www/wwwroot/python_txwd/submit.py (填表专用)
  • /www/wwwroot/python_txwd/chrome_user_data/ (存放登录凭证的文件夹)

脚本 A: 登录 (login.py)#

(仅需运行一次,用于生成 Cookie)

脚本 B: 每日自动填表 (submit.py)#

(适配每日归寝统计)


5. 定时任务设置#

在宝塔面板的【计划任务】中添加 Shell 脚本:

  • 周期:每天 23:00
  • 脚本
    /usr/bin/python3 /www/wwwroot/python_txwd/submit.py >> /www/wwwroot/python_txwd/log.txt 2>&1
    bash

维护说明:如果某天发现日志提示“未登录”,或者截图显示登录按钮,只需手动运行一次 python login.py 重新扫码即可,无需修改代码。

腾讯文档自动填表脚本开发与部署记录
https://kylaan.cn/blog/auto-submit/work
Author Kylaan
Published at 2025年12月10日
Comment seems to stuck. Try to refresh?✨