基于Github Action与Shell脚本的网易云游戏自动签到实践

发布时间:2026/8/24 9:54:25
基于Github Action与Shell脚本的网易云游戏自动签到实践 1. 项目概述当“白嫖”成为一种技术活“白嫖”这个词在互联网语境里早已脱离了最初的贬义演变成一种略带自嘲和智慧的“资源最大化利用”艺术。尤其是在各种互联网平台推出的签到、做任务领奖励的运营体系下手动坚持成了一种反人性的考验。今天要聊的这个项目就是针对“网易云游戏平台”的每日签到奖励通过技术手段实现自动化领取把“白嫖”这件事变得优雅且可持续。网易云游戏平台提供了云游戏服务用户可以通过网页或客户端直接游玩各类游戏无需下载。为了提升用户粘性平台设有每日签到奖励通常是一些游戏时长、优惠券或虚拟道具。对于重度用户或者只是想薅点羊毛的玩家来说每天手动打开APP或网页点一下签到时间一长就容易忘记。这个项目的核心目标就是写一个能自动完成这个签到动作的脚本并借助Github Action这类免费的云服务来定时运行实现真正的“躺赚”。这不仅仅是一个签到脚本它涉及了几个非常实用的技术点组合网络请求的分析与模拟、定时任务的云端部署、以及轻量级脚本的编写。无论你是想学习如何分析一个网页或APP的签到逻辑还是想了解如何利用Github Action打造自己的自动化工具链这个项目都是一个绝佳的入门案例。它不涉及复杂的逆向工程更多的是对现有开放接口的合理利用技术门槛适中但成就感十足。2. 核心思路与技术选型解析2.1 逆向签到流程从点击到完成实现自动签到的第一步是搞清楚手动签到背后发生了什么。这需要我们扮演一次“侦探”使用开发者工具来追踪网络请求。首先在电脑浏览器上登录网易云游戏平台官网打开开发者工具F12切换到“网络”(Network)标签页并勾选“保留日志”(Preserve log)。然后进行手动签到操作。此时网络请求列表中会刷出新的条目。我们的目标是找到那个真正触发签到、携带了必要认证信息如Cookie或Token的请求。通常签到请求是一个POST请求其请求URL可能包含sign、checkin、daily等关键词。点击这个请求查看它的“标头”(Headers)和“负载”(Payload)。在“标头”中我们需要重点关注Authorization、Cookie等字段这些是服务器识别用户身份的关键。在“负载”中可能会看到一些固定的参数比如platform、type等也可能什么都没有即请求体为空。注意有些平台的签到逻辑可能更复杂比如需要先访问某个页面获取一个动态的token或csrf_token然后在签到请求中附带。这就需要分析签到前的页面请求提取关键信息。对于网易云游戏目前其接口相对直接。找到这个请求后右键点击它选择“复制” - “以cURL(bash)复制”。这个cURL命令包含了完成一次签到所需的所有信息是我们编写脚本的“蓝图”。2.2 脚本语言选择Bash Shell的轻量之道有了cURL命令我们需要一个脚本语言来执行它并处理可能的响应。在这个场景下Bash Shell脚本是绝佳的选择。选择Shell脚本的理由很充分天生为命令行而生cURL本身就是命令行工具用Shell脚本调用它无缝衔接。轻量且无处不在在Linux/macOS系统上原生支持Windows通过Git Bash或WSL也能完美运行。这对于后续在Github Action的Linux虚拟环境中运行至关重要。处理文本得心应手签到后服务器通常会返回一个JSON格式的响应我们可以用grep、awk、jq一个强大的JSON处理工具来解析响应判断签到是否成功并提取奖励信息。简单直接我们的核心逻辑就是“发送请求-检查结果”用Shell脚本实现起来代码清晰易于理解和修改。当然你也可以用Python、Node.js等它们有更强大的网络库如requests,axios和JSON解析能力。但对于这个单一、简单的任务Shell脚本的简洁和零依赖除了curl和jq优势明显更符合“轻量自动化”的初衷。2.3 定时执行引擎为什么是Github Action脚本写好了放在自己电脑上跑还得保证电脑不关机这显然不够“自动化”。我们需要一个24小时在线、能定时触发脚本的服务器。购买云服务器是一种方案但违背了“白嫖”的初心。Github Action完美地解决了这个问题。Github Action是Github提供的持续集成/持续部署(CI/CD)服务它允许你在代码仓库中定义工作流响应各种事件如代码推送、定时任务。对于我们的项目最关键的是它的定时调度功能。选择Github Action的核心优势完全免费对于公开仓库Github Action提供每月一定额度的免费计算时间用于签到这种几秒钟就能跑完的任务绰绰有余。配置即代码工作流配置文件.yml存放在仓库里版本可控修改和回滚都非常方便。环境隔离每次任务都在一个全新的、干净的虚拟环境中运行避免了本地环境差异导致的问题。通知集成可以很方便地配置任务成功或失败后通过邮件、钉钉、Server酱等渠道通知你。相比其他方案比如使用Windows任务计划程序绑定单机或某些提供免费定时任务的网站不稳定、有广告Github Action无疑是目前免费、稳定、可靠的首选。3. 脚本编写与核心细节实现3.1 从cURL到Shell脚本构建请求核心我们假设从开发者工具中复制出的cURL命令大致如下curl https://api.xxx.cloudgame.163.com/sign/v1/daily_signin \ -H authority: api.xxx.cloudgame.163.com \ -H accept: application/json, text/plain, */* \ -H authorization: Bearer eyJhbGciOiJ...很长一串Token \ -H cookie: _ntes_nnid...; _ntes_nuid...; NETEASE_WDA_UID...; \ -H origin: https://cg.163.com \ -H referer: https://cg.163.com/ \ -H user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \ --compressed这是一个GET请求不虽然示例里没写-X POST但根据上下文它很可能就是签到请求。我们需要确认。如果它是POST可能还带有--data-raw参数。为了保险起见我们在脚本中会保留所有关键的头部信息。现在我们将其转化为一个更健壮的Shell脚本checkin.sh#!/bin/bash # 网易云游戏自动签到脚本 # 请将下方的 COOKIE 和 AUTHORIZATION 替换为你自己的信息 COOKIE你的完整Cookie字符串 AUTHORIZATIONBearer 你的Token USER_AGENTMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 # 签到API地址示例需根据实际分析修改 SIGN_URLhttps://api.xxx.cloudgame.163.com/sign/v1/daily_signin # 执行签到请求 echo $(date %Y-%m-%d %H:%M:%S) 开始执行网易云游戏签到... response$(curl -s -X POST ${SIGN_URL} \ -H authority: api.xxx.cloudgame.163.com \ -H accept: application/json, text/plain, */* \ -H authorization: ${AUTHORIZATION} \ -H cookie: ${COOKIE} \ -H origin: https://cg.163.com \ -H referer: https://cg.163.com/ \ -H user-agent: ${USER_AGENT} \ --compressed) # 打印原始响应便于调试 echo API响应: $response # 使用jq解析响应假设返回格式为 {code: 0, message: success, data: {...}} if command -v jq /dev/null; then code$(echo $response | jq -r .code) message$(echo $response | jq -r .message) if [ $code 0 ] || [ $code 200 ]; then echo $(date %Y-%m-%d %H:%M:%S) 签到成功消息$message # 可以进一步解析data字段提取获得的奖励 reward$(echo $response | jq -r .data.reward // 未知) echo 本次获得奖励$reward else echo $(date %Y-%m-%d %H:%M:%S) 签到失败。代码$code, 消息$message exit 1 # 非零退出码表示失败可用于Github Action通知 fi else # 如果没有安装jq使用grep进行简单判断 if echo $response | grep -q code:0 || echo $response | grep -q success; then echo $(date %Y-%m-%d %H:%M:%S) 签到成功(基于grep判断) else echo $(date %Y-%m-%d %H:%M:%S) 签到可能失败请检查响应。 echo $response exit 1 fi fi关键点解析变量抽取将Cookie、Token等敏感信息抽取为变量方便管理和替换。切记不要将真实的Cookie和Token上传到公开的Github仓库错误处理脚本使用if条件判断请求是否成功。通过解析返回的JSON中的code字段可以精确判断。工具依赖jq是一个强大的命令行JSON处理器。如果Github Action环境或你的本地环境没有脚本也提供了备选的grep检查方案但jq更精确。在Github Action中我们可以轻松安装它。日志输出每一步都使用echo并带上时间戳输出日志这对于后期排查问题非常有用。3.2 安全第一如何管理你的敏感信息直接在脚本里写死Cookie和Token是极其危险的尤其是计划上传到Github即使是私有仓库也有风险。Github Action提供了Secrets加密变量功能来解决这个问题。操作步骤在你的Github仓库页面点击Settings-Secrets and variables-Actions。点击New repository secret。输入名称例如NETEASE_COOKIE在Value里粘贴你完整的Cookie字符串。同样地创建NETEASE_AUTHORIZATION、NETEASE_USER_AGENT等Secret。这样这些信息就会以加密形式存储只在Github Action工作流运行时被注入到环境变量中不会在日志或代码中明文显示。我们需要修改脚本使其从环境变量读取这些信息#!/bin/bash # checkin.sh - 从环境变量读取配置 COOKIE${NETEASE_COOKIE} AUTHORIZATION${NETEASE_AUTHORIZATION} USER_AGENT${NETEASE_USER_AGENT:-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36} SIGN_URLhttps://api.xxx.cloudgame.163.com/sign/v1/daily_signin # ... 其余脚本逻辑不变 ...在Github Action的配置文件中我们会将这些Secrets映射到工作流的环境变量里。3.3 签到策略优化应对重复签到与奖励查询一个健壮的签到脚本不能只会“点一下”。我们还需要考虑重复签到如果脚本意外多次运行或者你手动签过了平台通常会返回“已签到”的错误。我们的脚本应该能识别这种状态而不是报错。奖励查询除了签到可能还想查询本月签到天数、累计奖励等。这需要分析其他相关API。优化后的响应处理逻辑# 使用jq解析响应 code$(echo $response | jq -r .code // .status) # 尝试不同可能的code字段名 message$(echo $response | jq -r .message // .msg // ) case $code in 0 | 200) echo $(date) 签到成功消息$message ;; 10001 | already_checked_in) # 假设这些代码表示已签到 echo $(date) 今日已签到无需重复操作。消息$message ;; 401 | 403) echo $(date) 认证失败Cookie或Token可能已过期 exit 1 ;; *) echo $(date) 签到遇到未知错误。代码$code, 消息$message exit 1 ;; esac通过case语句我们可以更优雅地处理多种已知的返回状态给出更清晰的日志。添加查询功能我们可以分析用户信息或签到日历的接口写一个query.sh脚本定期运行并汇总信息甚至可以将结果格式化后通过Github Action通知发给自己。4. Github Action工作流配置详解4.1 构建自动化工作流文件在项目仓库的根目录创建.github/workflows文件夹在里面新建一个YAML文件例如netease-auto-checkin.yml。name: Netease Cloud Game Auto Checkin on: schedule: # 每天国际标准时间16点北京时间0点运行cron表达式 - cron: 0 16 * * * workflow_dispatch: # 允许手动触发 push: branches: [ main ] # 推送代码到main分支时也运行用于测试 jobs: checkin: runs-on: ubuntu-latest # 使用最新的Ubuntu系统作为运行环境 steps: # 1. 检出代码 - name: Checkout repository uses: actions/checkoutv4 # 2. 安装必要的工具jq用于解析JSON - name: Install jq run: sudo apt-get update sudo apt-get install -y jq # 3. 执行签到脚本 - name: Run checkin script env: # 将仓库Secrets注入为环境变量 NETEASE_COOKIE: ${{ secrets.NETEASE_COOKIE }} NETEASE_AUTHORIZATION: ${{ secrets.NETEASE_AUTHORIZATION }} NETEASE_USER_AGENT: ${{ secrets.NETEASE_USER_AGENT }} run: | chmod x ./checkin.sh # 确保脚本有执行权限 ./checkin.sh # 4. 可选发送成功通知到Telegram/钉钉等 - name: Send notification on success if: success() run: | echo 签到成功 # 这里可以替换为真实的curl命令调用通知Webhook # 示例使用curl调用Server酱 # curl -s https://sctapi.ftqq.com/YOUR_SENDKEY.send?title网易云签到成功desp任务已执行 # 5. 可选发送失败通知 - name: Send notification on failure if: failure() run: | echo 签到失败请检查日志 # 这里可以替换为失败通知配置详解on.schedule: 这是定时任务的核心。cron: 0 16 * * *表示在UTC时间的每天16:00运行。北京时间是UTC8所以这对应北京时间的第二天凌晨0点。你可以根据平台刷新签到的时间点调整。on.workflow_dispatch: 允许你在Github仓库的Actions页面手动点击运行这个工作流非常便于测试。on.push: 代码推送到main分支时触发主要用于调试阶段确保脚本修改后能正常运行。env: 将我们在仓库Settings里设置的Secrets以环境变量的形式传递给脚本步骤。if: success() / failure(): 条件步骤可以根据上一步的执行结果决定是否运行非常适合用于通知。4.2 定时策略与平台规则规避设置定时任务时有几点需要特别注意时间随机化不要所有脚本都卡在整点运行。Github Action的定时任务可能会有几分钟的延迟但这还不够。为了避免被平台检测为规律性机器行为可以在cron表达式上增加一点随机性或者在自己的脚本里加入随机睡眠sleep $((RANDOM % 300))随机睡0-5分钟。遵守平台规则自动签到属于“灰色地带”。在编写和使用脚本时务必仅用于个人账户不要滥用。请求频率要低一天一次足矣。模拟真实用户使用合理的User-Agent和请求间隔。关注平台用户协议如果明确禁止自动化请谨慎使用。容错与重试网络可能波动。可以在脚本中加入简单的重试逻辑比如失败后等待10秒再试一次最多重试3次。4.3 状态通知与日志追踪“设置好就忘了”是自动化的理想状态但我们仍需关注它是否在正常运行。Github Action本身提供了运行历史和日志查看。每次执行后你都可以在仓库的Actions标签页查看详细的运行日志包括每一步的输出。进阶通知方案邮件通知Github Action默认会在工作流失败时向仓库所有者发送邮件。Server酱、PushPlus等这些是国内常用的推送服务。在工作流步骤中根据成功或失败用curl命令调用它们提供的Webhook URL即可将简短消息推送到微信。Telegram Bot如果你使用Telegram可以创建一个Bot通过其API发送通知自由度更高。一个集成Server酱通知的步骤示例- name: Notify via ServerChan if: always() # 无论成功失败都通知 env: SENDKEY: ${{ secrets.SERVERCHAN_SENDKEY }} run: | STATUS${{ job.status }} # 获取工作流状态 # 构建通知消息可以包含Github Run ID和链接 RUN_URL${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} if [ $STATUS success ]; then TITLE 网易云游戏签到成功 DESP任务已顺利完成。 else TITLE❌ 网易云游戏签到失败 DESP请检查Github Action日志[查看详情]($RUN_URL) fi curl -s https://sctapi.ftqq.com/${SENDKEY}.send?title${TITLE}desp${DESP}5. 本地测试与问题排查实录5.1 在本地环境中调试脚本在将脚本提交到Github之前一定要在本地进行充分测试。准备环境确保你的电脑或WSL安装了curl和jq。在Ubuntu/Debian上可以用sudo apt install curl jq安装。导出环境变量在终端里设置临时的环境变量模拟Github Action的Secrets。export NETEASE_COOKIE你的Cookie export NETEASE_AUTHORIZATION你的Token运行测试给脚本加上执行权限并运行。chmod x checkin.sh ./checkin.sh分析输出仔细观察脚本输出的“API响应”。如果返回的是HTML页面而不是JSON说明接口地址不对或者Cookie/Token已失效。如果返回了JSON但code不是0根据错误信息调整脚本逻辑。一个常见的坑Cookie过期。网页登录的Cookie通常有有效期几天到几周。这意味着你需要定期更新仓库Secrets里的Cookie值。可以设置一个日历提醒每月手动更新一次。更自动化的方式是研究平台的登录API用账号密码自动刷新Token但这涉及更复杂的模拟登录安全风险也更高一般不推荐。5.2 Github Action运行失败排查指南即使本地测试成功在Github Action上也可能失败。以下是常见问题及解决方法错误jq: command not found原因Ubuntu最新版镜像可能默认没有安装jq。解决确保在工作流中包含了Install jq这一步。错误脚本执行权限不足原因从仓库检出的脚本文件默认没有执行权限。解决在run命令中先使用chmod x ./checkin.sh赋予权限。错误NETEASE_COOKIE: unbound variable原因Secrets没有正确设置或者环境变量名在脚本和YML文件中不匹配。解决检查仓库Settings - Secrets里是否确实创建了同名Secret。检查YML文件env部分和脚本中使用的变量名是否完全一致注意大小写。可以在YML的run步骤里加一句echo Cookie length: ${#NETEASE_COOKIE}来检查变量是否被成功注入长度大于0则成功。注意这会在日志中暴露Cookie长度调试后请删除。错误签到API返回403/401原因Cookie或Authorization Token失效、格式错误。解决重新在浏览器中登录网易云游戏平台使用开发者工具复制最新的请求头。更新仓库Secrets中的值。检查复制的Cookie是否完整特别是长字符串中间不要有换行。定时任务没有运行原因Github Action的定时任务可能被禁用或者有延迟。解决进入仓库的Actions页面点击左边的工作流名称确认该工作流是启用状态。点击“Enable workflow”如果它被禁用了。Github Action的定时任务不是精确到秒的可能会有几分钟甚至更长的延迟这属于正常现象。5.3 长期维护与迭代建议自动化脚本不是一劳永逸的。平台可能会更新接口、改变参数、甚至封禁自动化行为。因此维护是必须的。关注接口变更如果某天开始签到连续失败而Cookie确认有效那很可能是接口变了。需要重新用开发者工具抓包分析新的请求URL和参数并更新脚本。代码版本管理所有脚本和YML配置文件都应放在Git仓库中。任何修改都通过提交进行便于回溯。定期检查日志养成习惯每周或每半个月看一眼Github Action的运行历史确认任务都在成功执行。考虑备用方案如果Github Action的策略收紧或者此平台签到接口变得不稳定可以考虑迁移到其他免费的CI/CD服务如 GitLab CI、Cloudflare Workers或者使用家中的树莓派等低功耗设备来运行定时任务。这个项目麻雀虽小五脏俱全。它串联起了前端抓包、Shell编程、API调用、云服务配置等多个环节。成功运行起来后你收获的不仅是每天自动到账的游戏时长更是一套可复用的、解决类似“自动化薅羊毛”问题的技术框架。下次遇到其他平台的签到任务你就能快速套用这个模式真正把技术变成生产力。