针对带反作弊的Android游戏,如何用Python替代ADB发送输入事件?
解决方案:Root设备下绕过COC反ADB的Python模拟点击方案
针对《部落冲突》反ADB检测导致常规点击方法失效的问题,结合你已Root的设备状态,提供以下三种不依赖ADB核心输入通道的可行方案:
方案1:复用Scrcpy控制协议模拟输入
Scrcpy的鼠标输入能正常工作,说明其走的输入通道未被游戏拦截。你可以直接通过Python连接Scrcpy的控制端口,发送触摸事件,和Scrcpy鼠标输入走完全相同的路径。
步骤:
- 启动Scrcpy时开启控制端口:
scrcpy --control-port=27183
- Python通过Socket发送符合Scrcpy协议的触摸事件(需参考Scrcpy官方源码构造正确的二进制/Protobuf消息):
import socket import struct def scrcpy_touch(x, y): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 27183)) # 构造触摸DOWN事件(简化版,需根据Scrcpy协议版本调整) down_msg = struct.pack('<BBHHH', 1, 0, 0, x, y) # 协议头+坐标 s.send(down_msg) # 构造触摸UP事件 up_msg = struct.pack('<BBHHH', 1, 1, 0, x, y) s.send(up_msg) s.close() # 调用示例 scrcpy_touch(137, 1000)
注:完整协议需参考Scrcpy的
ControlMessage定义,建议生成对应Python Protobuf代码构造标准消息。
方案2:Root权限直接操作输入设备节点
Root设备可直接写入/dev/input/eventX节点,绕过所有上层输入拦截,直接和硬件输入层交互,游戏反作弊几乎无法检测。
步骤:
- 在设备端执行
getevent -l,找到触摸对应的输入节点(如/dev/input/event2) - 选择以下两种实现方式:
方式A:设备端运行Python脚本(需Termux等Android Python环境)
import struct EVENT_PATH = '/dev/input/event2' # 替换为你的触摸节点 def send_input_event(type_, code, value): # 构造input_event结构体:timeval(sec, usec) + type + code + value event = struct.pack('llHHI', 0, 0, type_, code, value) with open(EVENT_PATH, 'wb') as f: f.write(event) # 模拟触摸按下 send_input_event(3, 57, 1) # ABS_MT_TRACKING_ID send_input_event(3, 53, 137) # ABS_MT_POSITION_X send_input_event(3, 54, 1000) # ABS_MT_POSITION_Y send_input_event(1, 330, 1) # BTN_TOUCH send_input_event(0, 0, 0) # SYN_REPORT # 模拟触摸抬起 send_input_event(3, 57, -1) send_input_event(1, 330, 0) send_input_event(0, 0, 0)
方式B:PC端通过SSH调用设备命令(需开启设备SSH服务)
import subprocess DEVICE_SSH = 'root@192.168.1.100' # 替换为你的设备SSH地址 EVENT_NODE = '/dev/input/event2' # 构造sendevent命令序列 touch_cmds = [ f'sendevent {EVENT_NODE} 3 57 1', f'sendevent {EVENT_NODE} 3 53 137', f'sendevent {EVENT_NODE} 3 54 1000', f'sendevent {EVENT_NODE} 1 330 1', f'sendevent {EVENT_NODE} 0 0 0', 'sleep 0.1', f'sendevent {EVENT_NODE} 3 57 -1', f'sendevent {EVENT_NODE} 1 330 0', f'sendevent {EVENT_NODE} 0 0 0', ] # 执行SSH命令 subprocess.run(['ssh', DEVICE_SSH, ' && '.join(touch_cmds)], check=True)
方案3:Root权限调用Android系统injectInputEvent API
通过Root权限直接调用Android系统输入注入API,和系统原生输入事件路径一致,稳定性高。
设备端Python实现(需pyjnius库)
from jnius import autoclass, cast InputManager = autoclass('android.hardware.input.InputManager') MotionEvent = autoclass('android.view.MotionEvent') # 获取系统InputManager实例 input_manager = cast('android.hardware.input.InputManager', InputManager.getInstance()) def inject_touch(x, y): # 构造按下事件 down_event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, x, y, 0) input_manager.injectInputEvent(down_event, 0) # 构造抬起事件 up_event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, x, y, 0) input_manager.injectInputEvent(up_event, 0) # 调用示例 inject_touch(137, 1000)
注意事项
- 所有Root方案需确保设备已获取完整Root权限,执行命令时若权限不足,需添加
su -c前缀 - 操作
/dev/input/eventX节点时,若提示权限错误,可执行chmod 666 /dev/input/eventX临时修改权限 - Scrcpy协议需对应版本,建议参考官方源码同步协议细节
内容的提问来源于stack exchange,提问作者ManoloPutoAmo
相关产品推荐
相关产品推荐

