利用Github Actions与Shell脚本实现网易云游戏自动签到

📅 2026/8/24 12:12:23
利用Github Actions与Shell脚本实现网易云游戏自动签到
1. 项目缘起从“手动肝”到“自动领”的执念作为一个重度游戏爱好者我几乎每天都会在网易云游戏平台上消磨一些碎片时间。这个平台最大的好处就是免下载、即点即玩对于我这种硬盘空间常年告急、又懒得折腾各种客户端的人来说简直是福音。平台为了提升用户粘性也搞了一套签到领时长的机制——每天手动点一下签到就能累积一些免费的游戏时长。听起来很美对吧但问题就出在这个“每天手动”上。人总有忘事的时候忙起来或者出差几天签到链就断了看着那些本可以白嫖的时长因为断签而拿不到心里总有点不得劲。这种“损失厌恶”心理加上一点技术人的“懒癌”晚期催生了一个想法能不能让这个签到过程自动化让机器在后台默默帮我完成这个每日任务而我只需要坐享其成看着时长一点点涨上去这就是“白嫖”艺术的终极形态用最小的成本写点代码换取稳定的收益免费时长。更重要的是这个过程本身充满了极客的乐趣——将重复、枯燥的劳动交给程序解放自己的双手和大脑。所以今天要聊的就是如何利用一些现成的、免费的工具搭建一个属于你自己的“网易云游戏平台自动签到器”。这不仅仅是一个脚本更是一种“懒人”的自动化思维实践。2. 核心原理拆解签到自动化是如何实现的在动手之前我们必须搞清楚我们要自动化的对象——网易云游戏平台的签到——究竟是怎么一回事。只有理解了它的运作机制我们写的脚本才能精准命中目标而不是一通乱拳。简单来说一次签到行为在技术层面可以分解为以下几个核心步骤身份认证你需要向服务器证明“你是谁”。这通常通过登录后服务器下发的一个凭证如Cookie、Token来实现。没有这个凭证服务器会认为你是陌生人拒绝你的任何请求。发起请求你需要向一个特定的网络地址URL发送一个“我要签到”的指令。这个指令通常是一个HTTP请求比如一个GET或POST请求。传递参数这个请求可能需要携带一些额外的信息比如当前时间、用户ID、或者一个用于防止机器人刷签到的“令牌”常常被称为csrf_token或x-csrf-token。解析响应服务器处理完你的请求后会返回一个结果。这个结果通常是一个JSON格式的数据包里面会告诉你签到是否成功、获得了多少时长、或者失败的原因是什么。我们的自动化脚本本质上就是模拟一个真实的浏览器或客户端按顺序、正确地完成以上四个步骤。其中最关键的、也是最容易出问题的环节就是第一步如何稳定地获取并维持有效的身份认证凭证。网易云游戏平台像大多数现代Web应用一样其登录和会话管理机制可能比较复杂。它可能采用组合验证账号密码短信验证码登录后的Cookie可能有过期时间甚至可能绑定了设备或IP。直接硬编码账号密码在脚本里去模拟登录不仅风险高泄露隐私而且一旦登录流程有变动比如增加了滑块验证脚本就会立刻失效。因此一个更稳健、更通用的思路是人工登录一次获取长效的认证凭证然后交给脚本去使用。这个凭证最常见的形式就是浏览器Cookie。我们只需要在浏览器中成功登录一次网易云游戏平台然后利用开发者工具将当前会话的Cookie完整地复制出来保存到我们的脚本配置中。只要这个Cookie不过期通常能维持数天到数周我们的脚本就能一直用它来代表“你”去执行签到操作。注意这里涉及一个重要的安全与合规边界。我们的脚本仅用于自动化完成平台公开提供的、用户本就有权手动操作的签到功能目的是方便用户而非攻击系统、刷取异常利益或干扰平台正常服务。任何试图绕过安全机制、破解协议、或进行超出正常用户频率请求的行为都是不被允许且存在法律风险的。我们的讨论严格限定在“模拟一次合法的用户手动操作”这个范畴内。3. 工具选型为什么是Github Actions Shell脚本明确了原理下一步就是选择实现工具。网络上相关的热词给了我们很多线索Github Action、shell脚本、python脚本、自动化脚本。这里我选择Github Actions Shell脚本这个组合并详细解释一下为什么这是目前最优雅、最“白嫖”的解决方案。3.1 核心需求分析我们的项目有几个核心需求定时触发需要每天在固定时间比如北京时间早上8点自动运行。持久化运行需要一个7x24小时在线的“服务器”来托管和运行我们的脚本不能依赖我自己的电脑开机。免费既然是“白嫖”主题运行成本当然也要是零。易于维护和隐藏敏感信息脚本里会包含Cookie等敏感信息不能直接公开在代码里。同时代码和配置要方便更新。3.2 方案对比与选型理由方案A购买云服务器 Cron定时任务优点控制力强可以运行任何复杂的程序。缺点需要花钱租服务器违背“白嫖”初心。需要自己维护服务器安全、更新系统有运维成本。结论不够“白嫖”PASS。方案B使用电脑/路由器上的定时任务优点完全免费利用现有设备。缺点依赖设备常年开机且网络稳定。个人电脑不可能不关机路由器性能有限且配置复杂。无法保证可靠性。结论可靠性太差PASS。方案C使用第三方免费云函数/定时任务平台优点通常免费额度足够无需维护服务器。缺点不同平台配置方式各异可能有地域限制免费额度可能变化平台本身可能不稳定或停止服务。结论可选但依赖第三方有不确定性。方案DGithub Actions优点完全免费对于公开仓库Github Actions提供每月一定额度的免费计算时间用于签到这种几秒钟就能跑完的任务绰绰有余。稳定可靠由Github维护基础设施全球分布在线率极高。原生支持定时任务通过schedule触发器可以像Cron一样设置定时任务语法简单。完美集成代码与秘密管理脚本代码存放在Github仓库中而像Cookie这样的敏感信息可以通过Github仓库的Settings - Secrets and variables - Actions功能以加密环境变量的形式存储脚本运行时可以读取但在日志和代码中不可见安全又方便。跨平台Actions的运行环境是Linux容器可以运行Shell、Python、Node.js等多种脚本非常灵活。缺点需要一点Github和YAML的基础知识。结论完全符合“免费、稳定、易维护”的核心需求是最佳选择。至于脚本语言Shell和Python都是优秀的选择。Python的requests库处理HTTP请求非常强大。但我这里选择Shell脚本主要是为了极致的轻量和透明。Shell脚本几乎不需要额外的依赖运行环境通常已内置curl代码更直观地展示了我们是如何通过最基础的命令行工具完成HTTP请求的便于理解原理。而且结合热词中大量关于Shell脚本的搜索如shell脚本for循环shell脚本入门用Shell教学也更贴合许多初学者的探索路径。4. 实战步骤一获取你的“身份令牌”Cookie这是整个流程中最关键的一步也是唯一需要手动操作的一步。我们将使用Chrome浏览器其他浏览器类似来获取登录后的Cookie。4.1 登录并打开开发者工具打开Chrome浏览器访问网易云游戏平台官网并登录你的账号。登录成功后停留在平台首页或任意一个页面。按下键盘上的F12键或右键点击页面选择“检查”打开开发者工具。切换到“Network”网络标签页。为了捕捉到清晰的请求最好先点击一下开发者工具左上角的红色圆形录制按钮如果它已经是灰色说明正在录制然后按F5刷新一下当前页面。4.2 寻找并复制Cookie刷新后“Network”标签页下方会列出很多网络请求。找到第一个通常是文档类型的请求比如www.xxx.com它的Name列可能就叫域名本身。点击这个请求在右侧会弹出详情面板。在详情面板中找到“Headers”标头选项卡。在“Headers”中向下滚动找到“Request Headers”请求头区域。在这个区域里找到一行叫做Cookie:的字段。后面跟着的一长串由分号分隔的键值对就是你的身份令牌。(注此处为描述性文字实际无图)将Cookie:后面整个字符串从第一个字符到结尾完整地复制下来。它看起来会像这样_ntes_nnidabc123...; _ntes_nuiddef456...; NETEASE_WDA_UIDghi789...; ...其他各种键值对重要提示请务必完整复制不要遗漏开头或结尾的任何字符包括可能存在的空格。这个Cookie字符串是高度敏感的个人信息等同于你的账号密码绝对不能泄露给任何人也不能上传到公开的代码仓库。4.3 关于Cookie的有效期与更新你复制到的Cookie是有生命周期的。平台可能会设置它几天或几周后过期。当脚本某天突然签到失败返回“未登录”或“会话过期”的错误时最大的可能性就是Cookie失效了。解决方法重复上述4.1和4.2的步骤重新登录平台获取新的Cookie字符串并更新到我们后续将要设置的秘密变量中。5. 实战步骤二编写核心签到Shell脚本现在我们有了“钥匙”Cookie接下来要打造一把能自动使用这把钥匙开门的“机械手”脚本。我们将创建一个名为checkin.sh的Shell脚本。5.1 脚本基础结构Shell脚本的第一行通常是指定解释器。我们使用最通用的#!/bin/bash。#!/bin/bash # 网易云游戏平台自动签到脚本 # 作者你的名字 # 描述通过模拟HTTP请求实现每日自动签到领取时长5.2 定义关键变量我们将签到所需的URL和Cookie定义为变量方便管理和修改。特别注意这里的COOKIE变量我们稍后会通过环境变量传入而不是直接写死在脚本里这是保证安全的关键。# 签到接口URL (这个URL需要通过抓包获取此处为示例需替换为真实URL) SIGN_URLhttps://api.youxi.163.com/api/v1/user/signin # 从Github Actions Secrets中读取Cookie USER_COOKIE$COOKIE_FROM_SECRET # 这个COOKIE_FROM_SECRET将在Github Actions中配置为环境变量如何找到真实的SIGN_URL这需要一点“抓包”技巧。在开发者工具的“Network”标签页保持录制状态然后你去手动点击一次平台上的签到按钮。在请求列表中你会看到一个新的请求被发出它的地址就是真正的签到接口URL。你需要仔细辨认找到那个Method是POST也可能是GET且Status为200的与签到相关的请求将其Request URL复制下来。这个过程可能需要一些耐心和尝试。5.3 构建并发送HTTP请求我们使用Linux下强大的网络工具curl来发送请求。curl可以精确地设置请求头、方法、数据体等。# 使用curl发送POST请求进行签到 # -X POST: 指定请求方法为POST # -H ‘Cookie: ...‘: 设置请求头中的Cookie这是我们身份验证的关键 # -H ‘User-Agent: ...‘: 设置用户代理模拟一个真实浏览器避免被简单的反爬机制拦截 # -H ‘Content-Type: application/json‘: 告诉服务器我们发送的数据格式是JSON根据实际接口要求调整 # --data-raw ‘{}‘: POST请求携带的数据体如果接口需要参数就写在这里面。示例为空对象。 response$(curl -s -X POST $SIGN_URL \ -H Cookie: $USER_COOKIE \ -H User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 \ -H Content-Type: application/json \ --data-raw {} \ --max-time 10) # --max-time 10 设置超时时间为10秒防止网络卡死 # 打印出服务器返回的原始响应用于调试 echo 服务器响应$response代码解读与注意事项-s参数让curl静默运行不显示进度条等额外信息。-H用于添加请求头。User-Agent非常重要一个常见的浏览器UA能减少被识别为脚本的风险。--data-raw用于发送原始数据。如果签到接口需要特定的JSON参数比如{action: signin}你需要在这里填写。这同样需要通过抓包分析“请求负载”Request Payload来确定。--max-time设置超时是个好习惯。命令用反引号...或$()包裹将其输出结果赋值给response变量。5.4 解析响应与结果通知服务器返回的response通常是一个JSON字符串。我们需要解析它来判断签到是否成功。Linux下有一个强大的命令行JSON处理工具叫jq但Github Actions的默认环境可能没有安装。为了保持最大的兼容性和简洁我们可以先用grep进行简单的关键字匹配。当然更严谨的做法是安装jq。# 方法1使用grep简单判断如果返回结果中包含“成功”或“已签到”等字样 if echo $response | grep -q -E \success\\s*:\s*true|\code\\s*:\s*200|成功|已签到; then echo $(date ‘%Y-%m-%d %H:%M:%S‘) 签到成功 echo 响应内容$response # 这里可以添加成功后的通知逻辑比如调用通知服务的API else echo $(date ‘%Y-%m-%d %H:%M:%S‘) 签到可能失败。 echo 错误响应$response # 这里可以添加失败后的告警逻辑 fi # 方法2安装并使用jq进行精确解析推荐更可靠 # 首先检查是否安装了jq如果没有则安装适用于Debian/Ubuntu系环境 if ! command -v jq /dev/null; then echo jq未安装尝试安装... apt-get update apt-get install -y jq 2/dev/null || echo 安装jq失败将使用简单判断。 fi if command -v jq /dev/null; then # 假设返回的JSON格式为 {code: 200, message: success, data: {...}} code$(echo $response | jq -r ‘.code‘ 2/dev/null || echo null) if [ $code 200 ] || [ $code 0 ]; then # 根据实际接口返回的成功码判断 echo $(date ‘%Y-%m-%d %H:%M:%S‘) 使用jq解析签到成功 (code$code)。 else echo $(date ‘%Y-%m-%d %H:%M:%S‘) 使用jq解析签到失败 (code$code)。 fi else echo 无法使用jq已回退到简单判断。 fi5.5 完整的脚本示例将以上部分组合起来并增加一些错误处理和日志一个相对完整的checkin.sh脚本如下#!/bin/bash # 网易云游戏平台自动签到脚本 # 使用前请在Github Actions Secrets中配置 COOKIE_SECRET # 设置语言环境避免日期等命令输出中文乱码可选 export LANGen_US.UTF-8 # 配置区域 # 签到接口URL请通过浏览器开发者工具抓包获取真实地址 SIGN_URLhttps://api.youxi.163.com/api/v1/user/signin # Cookie从Github Actions Secrets传入变量名定义为COOKIE_SECRET USER_COOKIE${COOKIE_SECRET} # 检查必要参数 if [ -z $USER_COOKIE ]; then echo 错误COOKIE_SECRET 环境变量未设置。请在Github仓库的Secrets中配置。 exit 1 fi if [ -z $SIGN_URL ]; then echo 错误SIGN_URL 未设置。请配置正确的签到接口地址。 exit 1 fi # 执行签到 echo 开始执行网易云游戏平台自动签到... echo 当前时间$(date ‘%Y-%m-%d %H:%M:%S‘) echo 请求地址$SIGN_URL # 发送HTTP请求 response$(curl -s -X POST $SIGN_URL \ -H Cookie: $USER_COOKIE \ -H User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 \ -H Content-Type: application/json \ -H Accept: application/json \ --data-raw ‘{}‘ \ --connect-timeout 5 \ --max-time 10 \ --retry 2 \ --retry-delay 1) curl_exit_code$? if [ $curl_exit_code -ne 0 ]; then echo 网络请求失败curl退出码$curl_exit_code echo 可能原因网络超时、地址错误或服务器不可用。 exit $curl_exit_code fi echo 原始响应$response # 解析响应结果 # 尝试使用jq解析 if command -v jq /dev/null; then echo 使用 jq 解析响应... code$(echo $response | jq -r ‘.code‘ 2/dev/null) message$(echo $response | jq -r ‘.message // .msg‘ 2/dev/null) if [ $code 200 ] || [ $code 0 ] || [ $code success ]; then echo ✅ 签到成功 echo 状态码$code echo 消息$message else echo ❌ 签到失败 echo 状态码$code echo 消息$message # 可以在此处添加失败通知 exit 1 fi else # 如果没有jq使用grep进行简单判断 echo jq 未找到使用 grep 进行简单判断... if echo $response | grep -q -E \code\\s*:\s*(200|0)|\success\\s*:\s*true; then echo ✅ 签到成功根据关键字判断。 else echo ❌ 签到可能失败根据关键字判断。 echo 建议安装 jq 工具以获得更准确的解析。 exit 1 fi fi echo 签到流程执行完毕。这个脚本已经具备了基本的健壮性检查输入参数、处理网络超时、尝试用jq精确解析、提供清晰的日志。接下来我们要让它在一个免费的、永动的“服务器”上定时运行。6. 实战步骤三配置Github Actions自动化工作流Github Actions的配置文件采用YAML格式存放在仓库的.github/workflows/目录下。我们将创建一个名为netease-game-auto-checkin.yml的文件。6.1 工作流结构解析name: Netease Cloud Game Auto Checkin # 工作流的名称 on: schedule: # 使用UTC时间格式分 时 日 月 星期 # 例如每天UTC时间0点北京时间早上8点运行 - cron: ‘0 0 * * *‘ workflow_dispatch: # 允许手动触发此工作流 jobs: checkin: runs-on: ubuntu-latest # 指定运行环境使用最新的Ubuntu系统 steps: # 步骤1检出仓库代码 - name: Checkout repository uses: actions/checkoutv4 # 步骤2赋予Shell脚本执行权限 - name: Grant execute permission run: chmod x ./checkin.sh # 步骤3执行签到脚本并传入Secret - name: Run checkin script run: ./checkin.sh env: COOKIE_SECRET: ${{ secrets.NETEASE_COOKIE }} # 关键将Secret注入为环境变量关键点解读on.schedule.cron: 这是定时触发器的核心。‘0 0 * * *‘代表每天UTC时间的0点0分运行。北京时间是UTC8所以这对应北京时间的早上8点。你可以根据需求调整Cron语法可以很容易搜到在线生成器。on.workflow_dispatch: 添加这个配置后你可以在Github仓库的Actions页面手动点击按钮来运行这个工作流非常便于测试。runs-on: 指定运行器环境。ubuntu-latest是最通用和稳定的选择。steps: 定义了具体的执行步骤。env: 在run命令下我们可以设置环境变量。${{ secrets.NETEASE_COOKIE }}就是引用我们接下来要设置的秘密变量。脚本里的$COOKIE_SECRET变量将获得这个值。6.2 在Github仓库中配置秘密变量Secrets这是保护你Cookie安全的关键一步。进入你的Github仓库页面。点击上方的“Settings”选项卡。在左侧边栏找到“Secrets and variables”-“Actions”。点击绿色的“New repository secret”按钮。在“Name”输入框中填写NETEASE_COOKIE这个名字必须和上面YAML文件中的secrets.NETEASE_COOKIE一致。在“Value”输入框中粘贴你之前在浏览器中复制的完整Cookie字符串。点击“Add secret”。至此你的Cookie就被安全地加密存储在了Github的服务器上在日志和代码中都不会明文显示。任何人查看你的仓库代码都看不到这个Cookie值。6.3 测试工作流将checkin.sh脚本和.github/workflows/netease-game-auto-checkin.yml文件提交并推送到你的Github仓库。进入仓库的“Actions”选项卡。你应该能看到一个名为“Netease Cloud Game Auto Checkin”的工作流。由于我们添加了workflow_dispatch你可以看到“Run workflow”按钮。点击“Run workflow”选择默认分支如main然后点击绿色的运行按钮。工作流开始执行。点击进入这次运行记录你可以实时查看日志。如果一切配置正确你应该能看到脚本执行的每一步日志最终输出“签到成功”。恭喜如果测试成功你的自动化签到系统就已经搭建完成。Github Actions会在你设定的UTC时间每天自动运行这个工作流为你签到。7. 进阶优化与排坑指南基础功能跑通后我们可以让它变得更强大、更稳定、更贴心。这里分享几个进阶方向和常见问题的排查思路。7.1 添加结果通知至关重要脚本在云端默默运行成功或失败我们如何知晓必须添加通知功能。这里推荐使用“Server酱”或“PushPlus”这类免费的微信消息推送服务。以Server酱为例访问其官网用GitHub登录获取一个SCKEY。在Github仓库的Secrets里添加一个名为SERVERCHAN_SCKEY的秘密变量值为你获取的SCKEY。修改checkin.sh脚本在成功和失败的分支里添加调用Server酱API的代码# 在脚本开头定义通知函数 notify() { local title$1 local content$2 local sckey${SERVERCHAN_SCKEY} if [ -n $sckey ]; then curl -s -X POST https://sctapi.ftqq.com/${sckey}.send \ -d title${title}desp${content} echo 通知已发送。 else echo 未配置Server酱SCKEY跳过通知。 fi } # 在签到成功的地方调用 notify 网易云游戏签到成功 恭喜今日时长已领取。响应$message # 在签到失败的地方调用 notify 网易云游戏签到失败 请及时检查错误信息$message记得在Github Actions的env部分也加入SERVERCHAN_SCKEY: ${{ secrets.SERVERCHAN_SCKEY }}。这样每次运行后你都能在微信上收到结果通知。7.2 处理复杂的签到接口有些平台的签到接口可能需要更复杂的参数比如一个动态生成的csrf_token。这个token往往藏在页面的HTML里或者某个初始化接口的返回数据中。解决方案你的脚本可能需要分两步。第一步先访问一个页面或接口用同样的Cookie获取页面源码或JSON响应然后用grep或jq配合正则表达式把csrf_token提取出来。第二步再将这个token作为参数放入签到请求的>