资讯动态

Python自动化脚本实战:路由器签到与GitHub Actions部署指南

发布时间:2026/10/2 18:41:52 来源:尧图企业网站定制
1. 项目概述与核心价值最近在折腾一些自动化脚本发现一个挺有意思的项目叫millylee/anyrouter-check-in。乍一看名字可能很多朋友会有点懵这“anyrouter”和“check-in”组合在一起是啥意思其实这是一个专门为特定类型的路由器设备设计的自动签到脚本。简单来说它模拟了用户登录路由器后台并执行签到操作的行为帮你自动完成那些需要每天手动点击的“打卡”任务从而获取路由器厂商提供的一些积分、流量包或者加速时长等奖励。我自己也用过不少品牌的路由器深知很多厂商为了增加用户粘性会在自家路由器固件里内置一个“用户中心”或者“福利中心”里面通常会有每日签到、任务中心等功能。手动操作一两天还行时间一长就容易忘记毕竟谁没事天天记得去路由器后台点一下呢这个脚本的价值就在于它把这种重复、机械的操作自动化了让你“一次部署长期受益”。对于喜欢“薅羊毛”、最大化利用设备权益或者单纯就是不想被这种琐事打扰的技术爱好者来说这绝对是个实用的小工具。这个项目在GitHub上开源意味着你可以查看它的所有代码了解其工作原理甚至根据自己的需求进行修改。它背后涉及的技术点其实挺典型的包括网络请求模拟、Cookie/Session管理、定时任务调度等是学习Web自动化和脚本编写的一个很好的实战案例。接下来我就带大家深入拆解一下这个项目从设计思路到实操部署再到可能遇到的坑我会结合自己的经验把整个过程讲透。2. 项目整体设计与思路拆解2.1 核心目标与工作原理anyrouter-check-in脚本的核心目标非常明确自动、稳定、无感地完成指定路由器后台的每日签到任务。为了实现这个目标它的工作原理可以概括为“模拟浏览器行为”。我们手动在网页上签到通常的步骤是打开浏览器 - 输入路由器管理地址 - 登录 - 找到签到按钮 - 点击。脚本要做的事情就是用代码精确地复现这一系列HTTP请求。它不会真的打开一个浏览器窗口而是通过发送网络请求包来与路由器的Web服务器进行交互。这主要涉及到以下几个关键环节登录认证脚本首先需要模拟登录过程。这通常意味着向登录接口比如/cgi-bin/luci/api/auth/login发送一个POST请求携带你的用户名和密码通常是加密后的。服务器验证成功后会返回一个认证凭证最常见的形式是Cookie例如sysauth或者一个Token。脚本必须妥善保存这个凭证因为后续的所有操作包括签到都需要携带它以证明“你是已经登录的用户”。获取签到状态在尝试签到之前一个稳健的脚本应该先检查一下今天是否已经签过到了。这需要访问一个查询接口比如/cgi-bin/luci/api/user/get_signin_status解析返回的JSON数据判断signed字段是否为true。如果已经签到脚本就应该优雅地退出避免重复操作。执行签到如果尚未签到脚本则向签到接口比如/cgi-bin/luci/api/user/signin发送一个POST请求。这个请求同样需要携带登录时获取的认证凭证。结果解析与通知签到请求成功后服务器会返回一个结果通常包含获得的积分、流量等信息。脚本需要解析这个结果并以某种形式通知用户比如打印到日志、发送到微信通过Server酱等工具或者邮件。2.2 技术栈与方案选型这个项目通常采用 Python 语言编写这是此类自动化脚本的绝佳选择。Python拥有极其丰富和成熟的网络请求库、解析库和定时任务库社区生态完善代码可读性高。网络请求库requests。这是Python生态中处理HTTP请求的“事实标准”。它比Python自带的urllib库更简洁、更人性化能够非常方便地处理Cookie、Session、Headers等。脚本利用requests.Session()对象可以自动管理Cookie模拟浏览器保持登录状态的行为这是实现自动登录和后续操作的关键。解析库json(内置) 和lxml/BeautifulSoup。路由器后台返回的数据大多是JSON格式Python内置的json库足以应对。少数情况下如果需要从HTML页面中提取信息比如早期的固件版本可能会用到BeautifulSoup或lxml这样的HTML解析库。定时任务方案这是决定脚本如何“自动”运行的核心。主要有两种主流方案本地定时任务在运行脚本的机器上比如你常年开机的NAS、旧电脑、树莓派配置cron(Linux/macOS) 或任务计划程序(Windows)。这是最直接、依赖最少的方式。你需要编写一个简单的启动脚本如Shell脚本或批处理文件然后让系统定时调用它。云函数/Serverless将脚本部署到云服务平台如腾讯云函数、阿里云函数计算、GitHub Actions等。这种方式无需自己维护服务器由云平台按需执行并管理运行环境。特别是GitHub Actions因为它与GitHub仓库天然集成非常适合托管这类开源脚本可以设置每天定点自动运行完全免费在额度内成为了很多人的首选。配置管理为了安全性和灵活性脚本不应该把路由器密码等敏感信息硬编码在代码里。通常采用环境变量或配置文件如config.json的方式来管理。部署时用户只需修改配置文件或设置环境变量即可。为什么选择这样的技术栈从功能性上看requestsSession完美契合了模拟登录保持状态的需求。从易用性上看Python语法简洁requests的API设计直观大大降低了开发门槛。从部署角度看结合cron或 GitHub Actions实现了从“一次编写”到“长期自动运行”的闭环。整个方案轻量、高效、成本低是个人自动化项目的最佳实践范式。2.3 适配性与风险考量这里必须重点讨论一下项目的“anyrouter”部分。理想情况下一个脚本能适配所有路由器但这在现实中几乎不可能。不同品牌、甚至同品牌不同型号的路由器其后台管理页面的接口地址、参数格式、加密方式都可能完全不同。因此millylee/anyrouter-check-in项目在实际中很可能是针对某一款或某一系列特定路由器例如某米、某为的部分型号开发的。它的“any”可能体现在代码结构上——设计了一套通用的登录、签到、检查的框架而针对不同路由器的具体差异则通过配置文件或插件模块来实现。用户在部署前必须确认该脚本是否支持自己正在使用的路由器型号。通常项目README文件会明确列出支持的路由器列表。安全与合规性提醒仅用于自家设备自动化脚本只应用于你自己拥有管理权限的路由器。未经授权访问他人网络设备是违法行为。密码安全尽管脚本使用配置文件但密码仍以明文形式存储。务必确保配置文件如config.json的访问权限在Linux上可通过chmod 600 config.json设置并且不要将包含真实密码的配置文件上传到公开的Git仓库。了解服务条款使用自动化脚本签到可能违反路由器厂商的用户协议。虽然这类“薅羊毛”行为通常被视为灰色地带且厂商大多睁一只眼闭一只眼毕竟提升了用户活跃度但理论上存在被封禁奖励资格的风险。这一点需要知晓。稳定性路由器固件可能会升级一旦后台接口发生变化脚本就可能失效。因此脚本需要一定的维护成本。3. 核心细节解析与实操要点3.1 网络请求模拟的深度剖析脚本的核心是模拟HTTP请求这里面的细节决定了脚本的稳定性和隐蔽性。会话保持与Cookie管理requests.Session()对象是精髓所在。它会在同一个会话中自动保存和发送Cookie就像浏览器一样。登录接口返回的Set-Cookie头信息通常是sysauthxxxxxx会被Session自动保存。之后用同一个Session实例去请求签到接口时Cookie头会自动被附加到请求中。这是实现状态保持最优雅的方式。import requests session requests.Session() # 创建一个会话对象 # 模拟登录 login_data {username: admin, password: your_encrypted_password} login_response session.post(http://192.168.1.1/cgi-bin/luci/api/auth/login, datalogin_data) # 此时如果登录成功服务器返回的Cookie会自动保存在session中 # 使用同一个session进行签到无需手动处理Cookie sign_response session.post(http://192.168.1.1/cgi-bin/luci/api/user/signin)请求头伪装为了更像一个真实的浏览器避免被服务器的简单反爬机制拦截我们需要精心设置请求头。User-Agent是最关键的一项它告诉服务器我们是什么客户端。脚本通常会设置一个常见的浏览器User-Agent。headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Referer: http://192.168.1.1/cgi-bin/luci/, # 告诉服务器请求来自哪个页面有时是必需的 X-Requested-With: XMLHttpRequest # 表明这是一个Ajax请求常见于现代Web应用 } # 可以将headers设置给session这样所有请求都会带上 session.headers.update(headers)参数与数据格式登录和签到接口通常需要提交数据。数据格式可能是application/x-www-form-urlencoded类似网页表单也可能是application/json。你需要通过抓包工具如浏览器开发者工具的Network面板准确查看原始请求是如何发送的并在脚本中完全复现。application/x-www-form-urlencoded: 使用data参数传递一个字典。session.post(url, data{key1: value1, key2: value2})application/json: 使用json参数传递一个字典requests会自动将其序列化为JSON字符串并设置正确的Content-Type。session.post(url, json{key1: value1, key2: value2})错误处理与重试网络请求不可能100%成功。一个健壮的脚本必须包含错误处理逻辑。连接超时/读取超时使用try...except捕获requests.exceptions.Timeout或requests.exceptions.ConnectionError。HTTP状态码错误检查response.status_code。登录失败可能是401或403接口不存在是404服务器错误是5xx。重试机制对于网络波动导致的短暂失败可以实现一个简单的重试逻辑。例如如果请求失败等待几秒后重试最多重试3次。import time from requests.exceptions import RequestException def make_request_with_retry(session, url, methodget, retries3, delay5, **kwargs): for i in range(retries): try: response session.request(method, url, timeout10, **kwargs) response.raise_for_status() # 如果状态码不是200会抛出HTTPError异常 return response except RequestException as e: print(f请求失败 (尝试 {i1}/{retries}): {e}) if i retries - 1: time.sleep(delay) else: raise # 重试次数用完抛出异常 return None3.2 配置与安全最佳实践如何安全、方便地管理配置是这类脚本从“玩具”到“工具”的关键一步。使用配置文件创建一个独立的config.json文件来存放所有配置{ router: { host: 192.168.1.1, username: admin, password: your_password_here, model: AX6000 // 路由器型号用于适配不同逻辑 }, notification: { enable: false, type: wechat, // 或 email, bark sckey: your_serverchan_sckey // Server酱的SCKEY } }在脚本中读取配置import json import os def load_config(): config_path os.path.join(os.path.dirname(__file__), config.json) with open(config_path, r, encodingutf-8) as f: return json.load(f) config load_config() host config[router][host] username config[router][username] password config[router][password] # 注意密码仍是明文环境变量更安全对于密码等极度敏感的信息最佳实践是使用环境变量。这样密码不会出现在任何代码或配置文件中。# 在终端中设置环境变量临时 export ROUTER_PASSWORDyour_super_strong_password # 或者在 ~/.bashrc / ~/.zshrc 中设置永久import os password os.environ.get(ROUTER_PASSWORD) if not password: raise ValueError(请设置环境变量 ROUTER_PASSWORD)在GitHub Actions中你可以在仓库的Settings - Secrets and variables - Actions中添加环境变量然后在 workflow 文件中通过${{ secrets.ROUTER_PASSWORD }}引用安全性极高。.gitignore文件务必在项目根目录创建.gitignore文件并加入config.json和任何包含敏感信息的文件防止误提交。# .gitignore config.json *.log __pycache__/3.3 日志记录与状态追踪“脚本到底跑没跑成功了吗” 清晰的日志是回答这个问题的唯一途径。不要只用print使用Python内置的logging模块。import logging import sys def setup_logger(): logger logging.getLogger(router_checkin) logger.setLevel(logging.INFO) # 控制台处理器 console_handler logging.StreamHandler(sys.stdout) console_format logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) console_handler.setFormatter(console_format) logger.addHandler(console_handler) # 文件处理器可选 file_handler logging.FileHandler(checkin.log, encodingutf-8) file_format logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) file_handler.setFormatter(file_format) logger.addHandler(file_handler) return logger logger setup_logger() logger.info(脚本开始运行) logger.error(登录失败状态码%s, response.status_code) logger.info(签到成功获得积分%d, points)这样你既能在运行时看到输出也能在checkin.log文件中查看历史记录便于排查问题。4. 完整实操部署流程假设我们选择GitHub Actions作为运行平台这是目前最流行、最方便的免费方案。下面我将一步步演示如何将一个本地的anyrouter-check-in脚本部署到GitHub Actions上实现每日自动运行。4.1 环境准备与脚本本地测试第一步获取脚本代码首先你需要将millylee/anyrouter-check-in项目的代码克隆或下载到本地。假设项目结构如下anyrouter-check-in/ ├── checkin.py # 主脚本文件 ├── requirements.txt # Python依赖列表 ├── config.example.json # 配置文件示例 └── README.md第二步安装依赖在项目目录下通常会有requirements.txt文件列出了需要的Python包如requests。使用pip安装它们。cd /path/to/anyrouter-check-in pip install -r requirements.txt如果项目没有提供requirements.txt你可以根据脚本中的import语句手动安装通常pip install requests就足够了。第三步配置脚本复制config.example.json为config.json并根据你的路由器信息进行修改。切记此时先使用明文密码进行本地测试确认脚本能正常工作。测试成功后我们再考虑用环境变量替换密码。{ router_ip: 192.168.1.1, username: admin, password: 你的路由器密码, model: 你的路由器型号 }第四步本地运行测试在终端运行脚本python checkin.py观察输出。如果看到“登录成功”、“今日已签到”或“签到成功获得XX积分”等字样说明脚本在你的环境下运行正常。如果失败请根据错误信息如连接超时、登录失败、接口404等进行排查。本地测试是至关重要的一步能排除90%的基础环境问题。4.2 配置GitHub Actions自动化工作流本地测试通过后我们开始配置云端自动化。第一步创建GitHub仓库并上传代码在GitHub上创建一个新的私有仓库推荐私有因为包含配置信息。将你的脚本代码注意不要上传config.json推送到这个仓库。第二步设置仓库机密进入仓库的Settings - Secrets and variables - Actions。 点击New repository secret添加以下机密信息ROUTER_IP: 你的路由器IP地址如192.168.1.1ROUTER_USERNAME: 登录用户名如adminROUTER_PASSWORD: 你的路由器密码这是最敏感的信息ROUTER_MODEL: 路由器型号这些信息将以安全的方式注入到GitHub Actions的运行环境中。第三步编写GitHub Actions工作流文件在项目根目录创建.github/workflows文件夹然后在该文件夹内创建一个YAML文件例如daily-checkin.yml。name: Daily Router Check-in on: schedule: # 每天 UTC 时间 16:30 运行对应北京时间 00:30 (UTC8)。选择一个人少的时间点。 - cron: 30 16 * * * workflow_dispatch: # 允许手动触发 inputs: log_level: description: 日志级别 required: true default: info jobs: checkin: runs-on: ubuntu-latest # 使用最新的Ubuntu系统作为运行环境 steps: - name: Checkout code uses: actions/checkoutv4 # 检出仓库代码 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.10 # 指定Python版本与脚本兼容即可 - name: Install dependencies run: | python -m pip install --upgrade pip if [ -f requirements.txt ]; then pip install -r requirements.txt; fi # 如果项目没有requirements.txt显式安装requests pip install requests - name: Run check-in script env: # 将仓库机密设置为环境变量 ROUTER_IP: ${{ secrets.ROUTER_IP }} ROUTER_USERNAME: ${{ secrets.ROUTER_USERNAME }} ROUTER_PASSWORD: ${{ secrets.ROUTER_PASSWORD }} ROUTER_MODEL: ${{ secrets.ROUTER_MODEL }} run: | # 这里需要修改你的主脚本使其从环境变量读取配置而不是config.json # 例如在checkin.py中 # import os # ip os.environ[ROUTER_IP] # ... python checkin.py第四步修改脚本以读取环境变量这是关键一步。你需要修改checkin.py让它从环境变量中读取配置而不是写死的config.json。# checkin.py 修改示例 import os import requests import logging # 从环境变量读取配置 router_ip os.environ.get(ROUTER_IP, 192.168.1.1) # 提供默认值以防万一 username os.environ.get(ROUTER_USERNAME, admin) password os.environ.get(ROUTER_PASSWORD) router_model os.environ.get(ROUTER_MODEL, default) if not password: logging.error(环境变量 ROUTER_PASSWORD 未设置) exit(1) # ... 后续的脚本逻辑使用上面读取的变量 ...第五步提交并触发工作流将修改后的脚本和.github/workflows/daily-checkin.yml文件推送到GitHub仓库。 推送完成后进入仓库的Actions标签页你应该能看到一个名为“Daily Router Check-in”的工作流。你可以点击Run workflow手动触发一次来验证整个流程是否正常。稍等片刻查看运行日志确认签到是否成功。4.3 通知功能集成增强体验脚本默默运行固然好但如果能通知你结果就更完美了。这里以集成Server酱方糖服务发送微信通知为例。第一步获取Server酱 SCKEY访问 Server酱官网用GitHub登录即可获得一个SCKEY。第二步在GitHub仓库机密中添加SERVERCHAN_SCKEY。第三步在脚本中添加通知函数在checkin.py的末尾根据签到结果调用通知函数。import os import requests def send_wechat_notification(title, message): sckey os.environ.get(SERVERCHAN_SCKEY) if not sckey: logging.warning(未设置 SERVERCHAN_SCKEY跳过微信通知) return False url fhttps://sctapi.ftqq.com/{sckey}.send data { title: title, desp: message } try: resp requests.post(url, datadata, timeout10) if resp.json().get(code) 0: logging.info(微信通知发送成功) return True else: logging.error(f微信通知发送失败: {resp.text}) return False except Exception as e: logging.error(f发送微信通知时发生异常: {e}) return False # 在脚本主逻辑的结尾处调用 if checkin_success: send_wechat_notification(路由器签到成功, f获得积分{points}) else: send_wechat_notification(路由器签到失败, f错误信息{error_msg})第四步更新GitHub Actions工作流在.github/workflows/daily-checkin.yml的env部分添加SERVERCHAN_SCKEY环境变量。- name: Run check-in script env: ROUTER_IP: ${{ secrets.ROUTER_IP }} ROUTER_USERNAME: ${{ secrets.ROUTER_USERNAME }} ROUTER_PASSWORD: ${{ secrets.ROUTER_PASSWORD }} ROUTER_MODEL: ${{ secrets.ROUTER_MODEL }} SERVERCHAN_SCKEY: ${{ secrets.SERVERCHAN_SCKEY }} # 新增 run: | python checkin.py这样每次GitHub Actions运行完脚本无论成功失败你都会在微信上收到一条通知真正做到“运筹帷幄之中决胜千里之外”。5. 常见问题与排查技巧实录即使按照步骤操作在实际部署和运行中你依然可能会遇到各种问题。下面是我在多次部署类似脚本中积累的一些常见问题与解决方案。5.1 登录失败401/403状态码这是最常见的问题。问题表现脚本报错提示登录失败HTTP状态码为401未授权或403禁止访问。排查思路核对账号密码首先百分之百确认你在脚本或环境变量中配置的用户名和密码是正确的。可以先用浏览器手动登录路由器后台验证。检查路由器IP和端口确认脚本中配置的router_ip是否正确。有些路由器可能使用192.168.31.1或10.0.0.1等不同网段。端口也可能不是80比如http://192.168.1.1:8080。抓包分析这是最有效的方法。在浏览器中打开开发者工具F12切换到Network标签页勾选Preserve log。然后手动进行一次登录操作。在Network列表中找到登录请求通常是login或auth相关的POST请求。查看请求URL确认脚本使用的登录接口地址是否与抓包看到的一致。查看请求头特别注意Content-Type和User-Agent。脚本是否设置了相同的User-AgentContent-Type是application/json还是application/x-www-form-urlencoded查看请求体查看Form Data或Payload。密码是明文吗还是经过了某种加密如Base64, MD5, RSA这是关键很多路由器会对密码进行前端加密。如果抓包看到密码是一长串乱码如password: “aBcDeFgHiJkL...”说明密码被加密了。脚本必须使用相同的加密算法对密码进行加密后再发送。加密算法破解如果密码被加密你需要找到浏览器中执行加密的JavaScript代码。在开发者工具的Sources或Network中搜索password,encrypt,md5,rsa等关键词。找到加密函数后可以尝试用Python的相应库如hashlib用于MD5/SHA,Crypto用于RSA进行复现。这是此类脚本开发中最具技术挑战性的部分。5.2 签到接口返回错误或404问题表现登录成功但签到时报错或者返回“接口不存在”404。排查思路接口地址变化路由器固件升级可能导致API接口路径改变。同样需要通过抓包找到最新的签到请求地址。请求方法或参数错误确认签到请求是GET还是POST是否需要额外的参数抓包查看签到请求的详情。认证信息失效虽然登录成功了但可能因为Session过期或Token失效导致签到失败。检查脚本是否在签到请求中正确携带了Cookie或Token。使用requests.Session()通常能自动管理Cookie。如果服务器使用Token可能需要从登录响应中提取并在后续请求的headers中手动添加如Authorization: Bearer token。频率限制服务器可能对签到频率有限制。确保你的脚本不会在短时间内重复运行。GitHub Actions的定时任务设置应至少间隔24小时。5.3 GitHub Actions运行失败问题表现在GitHub Actions的日志中看到红色错误。排查思路依赖安装失败检查requirements.txt文件格式是否正确或者尝试在Install dependencies步骤中直接pip install requests。脚本执行错误查看Run check-in script步骤的详细日志。错误信息会和本地运行一样打印出来。根据错误信息进行调试。环境变量未设置确认你在仓库Settings - Secrets中正确添加了所有必要的机密变量并且在工作流YAML文件的env部分正确引用了它们注意大小写。网络问题GitHub Actions的服务器在国外而你的路由器在国内。如果路由器没有做公网IP映射或DDNSGitHub Actions的服务器是无法直接访问你家的内网IP如192.168.1.1的。这是一个致命问题解决方案脚本必须运行在能访问到你路由器管理页面的网络环境中。因此GitHub Actions方案仅适用于你的路由器管理页面可以通过公网访问的情况这通常意味着你设置了端口转发或DMZ存在极大安全风险极不推荐。更优方案将脚本部署在你家内网的一台常开设备上如树莓派、旧电脑、NAS并使用cron或systemd timer定时执行。这才是最安全、最稳定的方案。GitHub Actions更适合运行那些不需要访问内网资源的脚本。5.4 脚本运行不稳定时而成功时而失败问题表现脚本不是每次都失败而是偶尔失败错误可能是超时或连接重置。排查思路增加超时和重试如前面“错误处理与重试”部分所述在网络请求函数中添加合理的超时参数如timeout(5, 10)表示连接超时5秒读取超时10秒和重试逻辑。检查路由器状态路由器本身是否稳定在脚本运行的时间点路由器是否在重启、更新固件或者网络负载很高日志分析确保脚本记录了详细的日志包括请求的URL、状态码、响应内容片段。当失败发生时通过日志定位具体在哪一步出错。5.5 通用调试技巧打印关键信息在开发调试阶段可以在关键步骤后打印响应状态码、响应头和响应体注意可能包含敏感信息调试后移除。print(fStatus Code: {response.status_code}) print(fResponse Headers: {response.headers}) print(fResponse Text (first 500 chars): {response.text[:500]})使用本地代理在本地测试时可以使用mitmproxy或Fiddler等抓包工具将脚本的流量代理过去直观地查看脚本发出的每一个请求和收到的响应与浏览器行为进行比对。分步测试不要一次性运行完整脚本。先单独测试登录函数确保能拿到正确的Cookie/Token。再单独测试签到函数手动传入认证信息。分步调试能快速定位问题模块。部署这样一个自动化签到脚本从技术原理到实战落地整个过程就像完成一次小型的系统工程。它考验的不仅仅是对Python和HTTP协议的理解更是排查问题、设计健壮性方案的综合能力。当看到脚本每天准时为你“赚取”积分那种“自动化”带来的满足感正是驱动我们不断折腾的动力。希望这份超详细的拆解和指南能帮你顺利搞定自己的路由器签到自动化。如果在实际操作中遇到新的问题不妨回到抓包和分析代码这两件“法宝”上它们能解决绝大多数网络自动化相关的问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑