当前位置: 首页 > 科技观察

微信“拍一拍”可以用Python实现

时间:2023-03-20 00:17:02 科技观察

近日,微信“拍一拍”火遍各大微信群,并迅速占据热搜榜单。于是决定用pyhton自动实现微信“拍一拍”,没想到竟然成功了。整个过程只用了30行代码。下面介绍一下具体的实现步骤:这篇文章的亮点:使用appium模拟控制手机并截图,使用图像识别定位好友头像坐标,最后使用appium模拟双击的坐标头像,从而实现“拍照”功能。具体步骤:1.使用appium控制手机。关于appium的安装和使用我之前写过很多,这里不再赘述。直接进入操作步骤1,用python打开微信,代码如下:desired_caps={"platformName":"Android","deviceName":"VOG-AL00","appPackage":"com.tencent.mm","appActivity":".ui.LauncherUI","noReset":"true","fullReset":"false"}server='http://localhost:4723/wd/hub'driver=webdriver.Remote(server,desired_caps)难点在于desired_cap参数的配置,这里再介绍一下:platformName:表示设备操作系统deviceName:表示设备名称apppackage:表示app包名appActivity:表示app入口Activity名称.手机连接电脑,打开开发者模式,运行这个程序,你会发现手机自动打开了微信。二、模拟双击头像1、原理介绍我们都知道,微信“拍照”是通过双击好友的头像实现的,如下图所示:点击头像,首先要获取头像在屏幕上的坐标。引入一个函数:基于Python-opencv2的目标定位模块:aircv可以利用其find_template函数在原图中找到目标图像的坐标范围。用法如下:defmatchImg(imgsrc,imgobj,confidencevalue=0.7):imsrc=ac。imread(imgsrc)imgobj=ac.imread(imgobj)match_result=ac.find_template(imsrc,imgobj,confidencevalue)returnmatch_result其中imgsrc=原始图像路径,imgobj=要查找的目标图像路径。如果没有找到,match_result=None;如果找到,返回以下数据:{'result':(570.0,2771.0),'rectangle':((30,1601),(30,3941),(1110,1601),(1110,3941)),'confidence':0.999999463558197}其中:result为匹配图片在原图上的中心坐标点,也就是我们要找的点击点;rectangle是匹配图片的四边形在原图上的坐标;置信度是匹配相似度。2、那么如何在程序中自动获取好友头像的坐标呢?在appium客户端可以确定头像在屏幕上的像素是140×140。我们可以先保存好友头像,然后用ps把头像改成这个像素。然后在程序中创建一个while循环。第一步完成后,手动进入好友聊天框(其实也可以通过识别好友头像自动进入)。通过appium截取手机屏幕并命名为src.png,并保存用头像路径(obj.png)导入1中的检测函数:driver.save_screenshot('src.png')imgsrc='src.png'imgobj='obj.png'match_result=matchImg(imgsrc,imgobj)如果返回None,则表示聊天窗口没有检测到好友头像,继续循环;如果检测到头像坐标,则分析返回的坐标数据,使用for循环模拟双击坐标位置:ifmatch_resultisnotNone:result=[match_result['rectangle'][0],match_result['rectangle'][3]]foriinrange(2):driver.tap(result,100)print('拍摄成功')else:print('未找到头像')这样做是不是很简单?摘要:本文介绍了使用python模拟微信“拍一张照片”的主要思路。如果有兴趣,可以继续做下去,实现一些有趣的功能。群聊用户一张一张拍照,挺有意思的。