尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于PaddleOCR与安卓自动化的游戏兑换码实时监控与兑换系统实践

基于PaddleOCR与安卓自动化的游戏兑换码实时监控与兑换系统实践 1. 项目缘起一个“抢码”需求背后的技术挑战最近在游戏圈子里特别是《原神》的玩家社区里经常能看到“抢码”这个词。无论是新版本的前瞻直播兑换码还是米游社官方不定时放出的周边、活动资格码都成了大家争相获取的“香饽饽”。我自己也经历过好几次守着直播等兑换码一出来手忙脚乱地复制、切换应用、粘贴结果还是慢人一步看着“兑换码已失效”的提示干瞪眼。这种纯粹拼手速和人品的“肉搏战”对于技术出身的我来说总觉得有点“不优雅”。于是一个想法冒了出来能不能用技术手段实现一个自动化的“抢码”工具注意这里的“抢码”特指在规则允许的范围内通过程序自动完成信息获取和提交的过程比如自动监控直播页面、识别兑换码文本、自动在米游社App内完成兑换。这本质上是一个自动化流程和信息实时处理的技术挑战而不是去攻击服务器或者绕过限制。搞清楚这个边界非常重要我们的所有操作都必须建立在公开、合法的接口和用户手动授权的基础上。这个项目的核心价值在于它是对抗“信息差”和“操作延迟”的一个有趣实践。在数字时代信息的分发和获取速度往往决定了资源的归属。通过这个项目我们不仅能解决一个具体的“手慢无”痛点更能深入理解网络请求、App自动化、图像识别OCR乃至简单的反反爬策略等一系列实用技术。它就像是一个微型的“军备竞赛”在合规的框架内用代码提升效率。2. 技术选型与核心思路拆解要实现一个稳定、高效的抢码工具我们需要拆解整个流程并为每个环节选择合适的技术方案。整个流程可以抽象为信息源监控 - 信息提取 - 执行操作。2.1 信息源监控从哪里获取“码”这是第一步也是决定性的环节。码的来源主要有两种直播流/视频流例如《原神》官方在B站、抖音等平台的前瞻直播。码会以文字形式出现在屏幕下方。网页/App内公告米游社的帖子、官方动态等。对于第一种我们需要实时屏幕捕获与OCR识别。这里有几个关键点捕获区域不能全屏捕获那样效率太低。需要精确定位到直播画面中通常显示兑换码的区域一般是屏幕下方的一个矩形区域。捕获频率频率太高消耗资源太低则可能错过。在码出现的关键时间段如直播尾声可能需要提高到每秒1-2帧其他时间可以降低频率。OCR引擎选择我们需要高精度、高速度的OCR。PaddleOCR是一个优秀的选择它开源、免费对中文和数字混合的识别准确率高且提供了Python接口易于集成。Tesseract是另一个备选但在中文场景下PaddleOCR通常表现更佳。对于第二种监控网页或App内的变化更倾向于使用网络请求监听或定期DOM解析。我们可以通过浏览器开发者工具的Network面板找到获取帖子列表或内容详情的API接口然后定期请求这个接口解析返回的JSON数据检查是否有包含“兑换码”、“CDK”、“礼包”等关键词的新内容出现。注意直接频繁请求官方接口有被封IP的风险。务必在请求头中模拟真实浏览器User-Agent并添加合理的延时如随机5-10秒请求一次避免给服务器造成压力。2.2 信息提取与清洗如何判断“它就是码”OCR识别出来或从接口获取到的是一段文本我们需要从中准确提取出兑换码。兑换码通常有固定格式例如原神的兑换码一般是XXXXXXXXXXX11位大写字母和数字组合。我们可以用正则表达式来匹配。例如一个简单的正则规则可以是[A-Z0-9]{11,15}用于匹配11到15位的大写字母和数字组合。但这样可能误匹配其他序列号。更精确的做法是结合上下文比如匹配“兑换码”后面的特定长度字符串或者结合多个特征进行判断。提取后的验证也至关重要。一个简单的验证步骤是提取到疑似码后立即尝试在米游社的兑换历史页面通过接口查询该码是否已被使用或是否有效当然这需要已登录的会话。这可以避免将无效或已过期的码加入执行队列。2.3 执行操作如何自动兑换这是最复杂的一步因为需要在移动端App米游社内完成操作。有几种思路安卓设备自动化ADB UI Automator这是最稳定、最接近真人操作的方式。你需要一台安卓手机或模拟器开启USB调试通过Python的uiautomator2库来操控App。步骤包括启动米游社App、点击“我的”、点击“兑换码”、输入识别到的码、点击兑换。这种方式完全模拟用户图形界面操作但依赖于具体的UI布局如果米游社App界面改版脚本可能需要调整。抓包分析直接调用兑换接口这是更“底层”也更高效的方法。通过抓包工具如Charles、Fiddler拦截米游社App兑换码时的网络请求分析出兑换接口的URL、请求方法、参数和必要的Headers尤其是认证Token。然后我们的程序在获取到码之后直接构造相同的HTTP请求进行兑换。优点速度快不依赖UI资源消耗低。难点与风险接口可能有加密参数或动态Token逆向分析难度大。频繁调用同一接口极易触发风控导致Token失效或账号受限。必须极度谨慎严格遵守请求频率限制并做好错误处理和重试机制。技术选型总结编程语言Python。生态丰富有PaddleOCR、uiautomator2、requests等强大的库支持。OCRPaddleOCR推荐或 Tesseract。安卓自动化uiautomator2。网络请求requests。定时/监控schedule库或简单的while循环time.sleep。部署环境一台长期运行的电脑Windows/Linux均可如果需要安卓自动化则需连接安卓设备或模拟器。3. 实战构建以“直播监控安卓自动化”为例下面我将以“监控B站直播识别兑换码并通过安卓自动化兑换”这一完整链路为例手把手拆解实现步骤。这是技术实现最直观的一条路径。3.1 环境准备与依赖安装首先确保你的开发环境已经就绪。# 创建项目目录和虚拟环境可选但推荐 mkdir genshin_code_claimer cd genshin_code_claimer python -m venv venv # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate # 安装核心Python库 pip install paddleocr opencv-python uiautomator2 schedule requests pillow对于PaddleOCR它默认会下载轻量级的推理模型。如果遇到网络问题可能需要手动下载模型文件放置到指定目录。安卓自动化部分需要在电脑上配置好ADBAndroid Debug Bridge环境并在手机上开启“开发者选项”和“USB调试”。使用uiautomator2时通常还需要在手机上安装一个辅助AppATX库会自动引导你完成。# 初始化uiautomator2连接手机 python -m uiautomator2 init执行后按照提示在手机上操作即可。3.2 核心模块一直播屏幕捕获与OCR识别我们假设直播在电脑浏览器中全屏播放。我们需要捕获屏幕上特定区域的图像。import cv2 import numpy as np from PIL import ImageGrab # 用于Windows屏幕捕获 import pyautogui # 跨平台捕获备选但可能需要处理权限 import time def capture_screen(regionNone): 捕获屏幕指定区域 :param region: 一个元组 (left, top, width, height) 例如 (100, 200, 800, 100) 捕获屏幕下方的一个长条 :return: OpenCV格式的图像 (numpy array) # 使用PIL的ImageGrabWindows/macOS screen ImageGrab.grab(bboxregion) if region else ImageGrab.grab() # 转换为OpenCV格式 (BGR) screen_cv cv2.cvtColor(np.array(screen), cv2.COLOR_RGB2BGR) return screen_cv # 定义捕获区域你需要根据自己屏幕分辨率和直播窗口位置调整 # 格式(左上角x, 左上角y, 右下角x, 右下角y) # 例如假设你的浏览器窗口在屏幕中央兑换码出现在画面下方1/10处 screen_width, screen_height pyautogui.size() # 获取屏幕尺寸 capture_region (screen_width//4, screen_height*7//8, screen_width*3//4, screen_height*9//10)接下来是OCR识别模块。我们使用PaddleOCR。from paddleocr import PaddleOCR # 初始化PaddleOCR使用中英文模型关闭详细日志 ocr PaddleOCR(use_angle_clsTrue, langch, show_logFalse) def extract_text_from_image(image_cv): 从图像中提取文本 :param image_cv: OpenCV图像 :return: 识别出的文本列表 result ocr.ocr(image_cv, clsTrue) texts [] if result is not None: for line in result: if line and line[1]: # line[1]是(文本置信度) text line[1][0] texts.append(text) return texts3.3 核心模块二兑换码文本过滤与验证从OCR识别出的一大堆文本中我们需要精准地找到兑换码。import re def filter_and_validate_codes(text_list): 过滤文本列表找出可能的兑换码并进行基础验证 :param text_list: OCR识别出的文本列表 :return: 过滤后的、疑似兑换码的字符串列表 potential_codes [] # 《原神》兑换码常见模式11-15位大写字母和数字 # 注意这个正则可能匹配到其他序列号需要结合上下文优化 pattern re.compile(r[A-Z0-9]{11,15}) for text in text_list: # 先去除空格等干扰字符 clean_text text.replace( , ).replace(-, ) matches pattern.findall(clean_text) for match in matches: # 基础验证长度和字符集 if 11 len(match) 15 and match.isalnum(): # 可以添加更多逻辑比如排除纯数字可能是房间号或过于常见的错误匹配 # 例如如果匹配到的字符串在已知的“黑名单”如“ENTER”“PLAY”等中则忽略 if match not in [ENTER, PLAY, START, PAUSE]: # 示例黑名单 potential_codes.append(match) # 去重 unique_codes list(set(potential_codes)) return unique_codes3.4 核心模块三安卓自动化兑换操作这是模拟用户操作的部分。首先你需要熟悉米游社App的界面布局。使用uiautomator2提供的weditor工具可以可视化地查看App的UI控件获取它们的定位信息如resource-id, text, bounds。import uiautomator2 as u2 class MihoyoAppOperator: def __init__(self, device_serialNone): 初始化连接设备 :param device_serial: 设备序列号通过 adb devices 查看如果只有一台设备可为None self.d u2.connect(device_serial) # 连接设备 self.package_name com.mihoyo.hyperion # 米游社App包名 def start_app(self): 启动米游社App self.d.app_start(self.package_name) time.sleep(5) # 等待App启动 def goto_exchange_page(self): 导航到兑换码页面 # 步骤1点击底部栏“我的” self.d(resourceIdcom.mihoyo.hyperion:id/tab_icon, description我的).click() time.sleep(2) # 步骤2点击“兑换码”入口这里需要根据实际UI定位可能是通过text或resource-id # 方法A通过文本定位 self.d(text兑换码).click() # 方法B如果文本定位不稳定可以通过resource-id需用weditor查看 # self.d(resourceIdcom.mihoyo.hyperion:id/entry_exchange_code).click() time.sleep(3) def input_and_exchange(self, code): 在兑换页面输入码并点击兑换 :param code: 兑换码字符串 # 定位输入框并输入 input_box self.d(resourceIdcom.mihoyo.hyperion:id/code_input) # 假设的resource-id if input_box.exists: input_box.set_text(code) time.sleep(1) # 定位兑换按钮并点击 exchange_btn self.d(resourceIdcom.mihoyo.hyperion:id/confirm_btn) # 假设的resource-id if exchange_btn.exists: exchange_btn.click() time.sleep(3) # 等待兑换结果 # 这里可以尝试捕捉结果弹窗判断成功或失败 # 例如检查是否有“兑换成功”或“兑换码错误”的文本出现 if self.d(textContains成功).exists: print(f[成功] 兑换码 {code} 可能兑换成功) return True elif self.d(textContains错误).exists or self.d(textContains无效).exists: print(f[失败] 兑换码 {code} 无效或已使用。) return False print(f[错误] 未找到输入框或按钮界面可能已变化。) return False def run_exchange_flow(self, code_list): 执行完整的兑换流程 self.start_app() self.goto_exchange_page() results [] for code in code_list: success self.input_and_exchange(code) results.append((code, success)) # 每个码操作后稍作停顿 time.sleep(2) return results重要提示上述代码中的resourceId和text定位符是示例米游社App的UI元素ID和文本可能随版本更新而变化。你必须使用weditor工具运行python -m weditor连接手机后实时查看并获取正确的定位信息。这是安卓自动化脚本最需要维护的部分。3.5 主循环与调度最后我们将所有模块串联起来形成一个监控-识别-兑换的循环。import schedule import time from datetime import datetime def job(): print(f[{datetime.now()}] 开始执行监控任务...) # 1. 捕获屏幕 screen_img capture_screen(regioncapture_region) # 2. OCR识别 texts extract_text_from_image(screen_img) # 3. 过滤出兑换码 codes filter_and_validate_codes(texts) if codes: print(f识别到潜在兑换码: {codes}) # 4. 执行兑换这里假设设备已连接 operator MihoyoAppOperator() results operator.run_exchange_flow(codes) for code, success in results: status 成功 if success else 失败 print(f兑换码 {code}: {status}) else: print(未识别到符合条件的兑换码。) if __name__ __main__: print(原神直播兑换码监控程序已启动。) # 在直播关键时间段如最后10分钟提高监控频率 # 使用schedule库定时执行例如每10秒一次 schedule.every(10).seconds.do(job) # 注意频率过高可能消耗资源 # 或者使用简单的循环更灵活控制 while True: # 可以在这里添加时间判断只在特定时间段执行 current_hour datetime.now().hour # 假设直播在晚上20点 if 19 current_hour 21: # 直播前后一小时 job() time.sleep(10) # 监控间隔4. 避坑指南与进阶优化在实际开发和运行中你会遇到各种各样的问题。下面是我在实践过程中总结的一些关键坑点和优化思路。4.1 识别准确率提升不仅仅是调参OCR识别不准是最大的问题之一。除了选用PaddleOCR并确保图像清晰外还有以下技巧图像预处理在将图像送给OCR之前可以先进行预处理。例如转换为灰度图、二值化、降噪、调整对比度等。OpenCV的cv2.cvtColor,cv2.threshold,cv2.GaussianBlur等函数可以派上用场。目标是让文字和背景对比更鲜明。区域动态调整直播画面可能会缩放、移动。写死一个捕获区域可能失效。可以考虑一个“动态锚点”策略先识别直播画面中一个固定的、容易识别的元素比如直播平台的Logo、主播头像然后以这个元素的位置为基准计算兑换码区域的相对坐标。多帧验证一个码通常在屏幕上会停留一段时间。不要只相信单次识别结果。可以连续捕获3-5帧对识别到的候选码进行投票出现次数最多的那个才被认为是有效码。这能有效过滤掉偶然的识别错误。4.2 安卓自动化的稳定性维护UI自动化脚本非常脆弱App一次小更新就可能让它瘫痪。使用多种定位策略组合不要只依赖resourceId因为它经常变。结合text、className、XPath甚至图像匹配d.image.click()进行定位提高容错性。优先使用相对稳定的元素如“兑换码”这种功能入口的文本。增加等待与重试机制网络卡顿或App响应慢会导致元素找不到。在关键操作前后使用time.sleep是基础更好的方法是使用d.wait()或d.implicitly_wait()设置隐式等待让框架自动轮询直到元素出现。异常处理与状态恢复脚本必须能处理各种异常如元素找不到、App崩溃、网络断开。使用try...except包裹关键操作并在异常发生时尝试恢复比如重新启动App、回到主页等。4.3 风控与合规性最重要的红线这是本项目最需要谨慎对待的部分。任何自动化操作在官方看来都可能被视为“非正常行为”。模拟人类行为在自动化操作中加入随机延时。不要以固定的、极快的速度点击。在点击前可以随机移动鼠标对于ADB可以模拟随机滑动模仿人类的犹豫和操作轨迹。控制请求频率无论是监控接口还是兑换接口频率一定要低。对于监控每分钟1-2次足矣。对于兑换一个码尝试一次即可失败后不要立即重试。账号风险强烈不建议在主账号上使用自动化脚本。使用小号或专门的测试账号进行实验。明确知晓这可能违反米哈游的用户协议存在账号被封禁的风险。本项目的技术分享仅供学习和研究自动化技术之用请勿用于破坏游戏公平性或干扰服务正常运行。备用方案人工辅助最安全的方式是“半自动”。即程序只负责监控和识别当发现兑换码后通过声音提示、桌面通知、甚至发送邮件/微信消息给真人由真人手动去兑换。这完全规避了自动化操作的风险。4.4 部署与日志让程序可靠运行如果你希望这个程序能长期、稳定地在后台运行就需要考虑部署。日志系统使用Python的logging模块记录程序运行状态、识别到的码、兑换结果、发生的错误等。这便于后期排查问题。守护进程在Linux服务器上可以使用systemd或supervisor将Python脚本作为守护进程运行保证其崩溃后能自动重启。容器化可以考虑使用Docker容器化整个环境包括ADB连接模拟器实现环境隔离和便捷迁移。这个项目从想法到实现贯穿了多个层面的技术思考。它不仅仅是一个“抢码工具”更是一个综合性的练手项目涉及了图像处理、模式识别、移动端自动化、网络协议、调度任务等多个领域。在实现过程中最大的收获不是成功抢到几个码而是面对一个具体需求时如何拆解问题、选择技术栈、处理边界情况和应对变化的系统工程能力。技术永远是为解决问题服务的但在运用技术时时刻保持对规则和边界的敬畏是每个开发者应有的素养。
返回列表