今天使用Python+adb 来实现淘宝自动领喵币。
简单说一下adb是什么,adb中文名安卓调试桥。简单来说,可以用它来模拟手机的操作,调试手机等等。
https://developer.android.google.cn/studio/command-line/adb
首先要配置好开发环境,
- 安装Python
- 安装adb(安装并添加到Path)
- 手机打开开发者模式(以小米为例,步骤为:设置–我的设备–全部参数–点击MIUI版本7次(点击时有提示,最后会提示已经进入开发者模式)–更多设置–开发者选项–打开USB调试和USB调试(安全设置)
- 使用数据线连接电脑和手机
开发环境配置好了就可以用python调用adb写程序了。程序主要过程就是:1)截图;2)找点;3)点击。没有特别的地方,但是要注意的是,这里我的屏幕是1080*1920的,如果你的屏幕分辨率不一样的话,可能要修改坐标(因为去分享也是红色的,所以程序找点的起点是去分享下面(不然就会一直点去分享))。
#稍微修改了一下2020/5/30 08:38 #需要配置好adb。 #运行前打开淘宝,进入领喵币活动页面。 import os import time from PIL import Image MAX_TIMES = 15 # 自定义最大浏览次数 #用来执行命令,这里加了延迟 def execute_cmd(args): DELAY_SECOND = 3#延迟时间, 因为网络和手机响应速度不同,反应慢的可以改大一些。 time.sleep(DELAY_SECOND) #等待上一步操作响应完成 os.system(args) #截图保存到手机上, 上传到电脑上 def screencap(): execute_cmd('adb shell screencap -p /sdcard/screen.png') execute_cmd('adb pull /sdcard/screen.png') #获取颜色z(rgb)对应的坐标(x,y) def get_pos(z,x_start=953,y_start=0): image = Image.open('screen.png') width = image.size[0] height = image.size[1] for x in range(x_start, x_start+100 if x_start+100<width else width): for y in range(y_start,height): data = image.getpixel((x,y))[:3] if data == z: return (x,y) # 进入领喵币中心 def enter_miaobi_center(): # 截图 screencap() z = (249, 239, 108) pos = get_pos(z) execute_cmd('adb shell input tap {} {}'.format(pos[0], pos[1])) # 浏览店铺 def browse_stores(): BROWSER_WAIT = 15 #浏览等待15秒 screencap() # z是在'去浏览'图标上取色得到的rgb,用来定位'去浏览'坐标 z = (237, 46, 67) for i in range(0, MAX_TIMES): pos = get_pos(z, 790, 1190) print(pos)#调试用 # 点击去浏览 execute_cmd('adb shell input tap {} {}'.format(pos[0], pos[1])) # 下滑浏览,防止第一次没滑动成功,滑动两次 execute_cmd('adb shell input swipe 900 1500 900 500 200') execute_cmd('adb shell input swipe 900 1500 900 500 200') print('进入店铺,浏览页面中,请等待15s...') time.sleep(BROWSER_WAIT) # 返回 execute_cmd('adb shell input keyevent 4') print('END') if __name__ == '__main__': try: enter_miaobi_center() except: print("进入喵币中心失败,可能已经进入领喵币中心,尝试进入浏览页面...") try: browse_stores() except: print('浏览失败')
另外,实现找点的方法除了像素点检测,还可以调用opencv的函数matchTemplate来实现。这种方法更加准确(因为它可以匹配一块区域,而不是一个点)。另外这种方法的通用性更好。
有关matchTemplate的文章: https://www.jianshu.com/p/c20adfa72733
import cv2 as cv import numpy as np #在target中匹配tpl, #传入两个图像 #返回中心坐标点 def mathch_center(tpl,target): th,tw = tpl.shape[:2] #获取模板图像的高宽 result = cv.matchTemplate(target, tpl, cv.TM_CCOEFF_NORMED) # result是我们各种算法下匹配后的图像 threshold = 0.9 #阈值,1表示完全匹配 loc = np.where(result>=threshold) #返回所有匹配图像的中心点 for pt in zip(*loc[::-1]): # *号表示可选参数 br = (pt[0] + tw, pt[1] + th) # 右下点 center = (int)((pt[0] + br[0]) / 2), (int)((pt[1] + br[1]) / 2) yield center
补充一个adb无线连接的方式,只要第一次用数据线连接,之后只要在同一局域网内就可以无线连接了。(参考http://www.aoaoyi.com/archives/738.html#chapter2.3)
2.3、无线连接(需要借助 USB 线)
除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
1.将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
2.将设备与电脑通过 USB 线连接。应确保连接成功(可运行 adb devices 看是否能列出该设备)。
3.让设备在 5555 端口监听 TCP/IP 连接:
adb tcpip 5555
4.断开 USB 连接。
5.找到设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到,也可以使用下文里 adb 命令来查看设备信息 – IP 地址 。
6.通过 IP 地址连接设备。
adb connect
这里的 就是上一步中找到的设备 IP 地址。
7.确认连接状态。