windows的小米11真机appium微信爬虫

news2025/7/14 5:31:10

1、下载appium
仓库地址
2、下载python的包
pip install Appium-Python-Client -i https://pypi.tuna.tsinghua.edu.cn/simple
3、下载android-sdk
先下SDK Tools
国内一个镜像网站
参考这个教程
在这里插入图片描述
安装好后,运行这个SDK Manager.exe
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后install,同意协议,等待安装结束
在这里插入图片描述
4、配置环境变量
ANDROID_HOME值为刚刚安装的目录,如下图就是D:\IDEandEVR\Android SDK Tools
在这里插入图片描述
在这里插入图片描述
然后在PATH中添加
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
在这里插入图片描述
再配置下appium的ANDROID_HOME
在这里插入图片描述

4、手机插上电脑,进入开发者模式
MIUI进入开发者模式
小米手机以开发者模式连上电脑
使用adb devices进行测试,此代码也是下面json里的deviceName数据
先在上面那个appium点启动服务器

在这里插入图片描述

5、
写一段代码测试

from appium import webdriver

if __name__ == '__main__':
  desired_caps = {
    'platformName': 'Android',
    'deviceName': '99da881c',
    'platformVersion': '12',
    'appPackage': 'com.tencent.mm',
    'appActivity': 'com.tencent.mm.ui.LauncherUI',
    'automationName':'UIAutomator2',# 高版本android需要这个,好像是从11开始       
   }

  driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
  print("结束")

如果运行正常,真机上会打开微信的登录界面
6、开始找界面元素
首先,不推荐uiautomatorviewer,即下图这个,因为jdk版本等问题,有需要改源码才能解决的BUG
在这里插入图片描述
我这里决定使用Appium自带的Appium Inspector
在这里插入图片描述
把python代码里的配置数据弄到这里,可以填表单,或者右边粘贴json,但是很容易说json语法错误,我也不知道为什么
在这里插入图片描述
新增的noReset是防止重置应用,避免需要反复登录

{
  "platformName": "Android",
  "deviceName": "99da881c",
  "platformVersion": "12",
  "appPackage": "com.tencent.mm",
  "appActivity": "com.tencent.mm.ui.LauncherUI",
  "automationName": "UIAutomator2",
  "noReset": true
}

用过开发者工具的看到下图应该知道该怎么弄了
在这里插入图片描述
7、注意事项
appium是真的慢,找一个登录按钮找个20s,这里先放一个最基本的避坑思路
2020年12月30日 appium 执行速度优化

很多博客提出,对于固定位置的组件,直接用坐标点击,速度能快一半,但是如果不特殊处理,不能兼容不同屏幕大小的手机
下面红圈的两个元组,表示这个组件左上角和右下角的定位,所以我们只要触摸(x1~ x2,y1 ~ y2)的就行了
driver.tap([(200, 2800)], 500)
在这里插入图片描述

8、
中文API

9、应付学校作业写的一个监听微信消息的代码

import time
import datetime

from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy

from appium.webdriver.common.touch_action import TouchAction


def response(text):
   if text == "现在什么时候了":
       return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
   elif text == "感觉Appium怎么样":
       return "配环境有点小麻烦,运行时速度较慢,文档不太全面,感觉用的人不多,不太行"
   elif text == "你这个脚本的效果是什么":
       return "检测微信主页的可视范围内(不下滑时)的所有有未读信息的好友,判断他们的文本并进行回复"
   elif text == "你是谁":
       return "刘宇阳"
   elif text == "缺憾是什么":
       return "因为怕登录频繁出问题,就没写登录部分;不能回复所有好友的消息,因为框架只能检测屏幕可视范围的组件,可以实现下滑,但是会很麻烦;轮询,所以回复速度可能有点慢"
   elif text == "为什么能回复自己发的消息":
       return "因为左右两边的聊天框是同一类组件,区分起来有点麻烦;不区分也方便自己测试"
   else:
       return None


if __name__ == '__main__':
   # Appium的配置
   desired_caps = {
       'platformName': 'Android',
       'deviceName': '自己用命令获得',
       'platformVersion': '12',
       'appPackage': 'com.tencent.mm',
       'appActivity': 'com.tencent.mm.ui.LauncherUI',
       'automationName': 'UIAutomator2',
       'noReset': True,  # 不要重置App,不需要重新登录
   }
   # 建立会话并打开微信界面
   driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
   # 不登录了,怕出问题,需要手机已提前登录微信
   # 用ID查找到元素再点击
   # driver.find_element(By.ID,"com.tencent.mm:id/j_9").click()
   # 根据屏幕上的坐标点击(更快但是不兼容不同屏幕)
   # driver.tap([(200, 2800)], 500)
   try:
       while True:
           print("监听中...")
           time.sleep(3)
           red_dots_tmp = driver.find_elements(MobileBy.ID, "com.tencent.mm:id/kmv")
           red_dots = []
           for dot in red_dots_tmp:
               TouchAction(driver).tap(dot).perform()
               time.sleep(1)
               msg_tmp = driver.find_elements(MobileBy.ID, "com.tencent.mm:id/b4b")
               text = msg_tmp[len(msg_tmp) - 1].text
               resp = response(text)
               if resp != None:
                   # 点击输入框
                   text_input = driver.find_element(MobileBy.ID, "com.tencent.mm:id/b4a")
                   TouchAction(driver).tap(text_input).perform()
                   # 放入文本
                   text_input.set_text(resp)
                   # 发送
                   send_btn = driver.find_element(MobileBy.ID, "com.tencent.mm:id/b8k")
                   TouchAction(driver).tap(send_btn).perform()
               # 返回到主页
               back_btn = driver.find_element(MobileBy.ID, "com.tencent.mm:id/yn")
               TouchAction(driver).tap(back_btn).perform()
           # 以下代码弃用,不滑动了,只取第一面的
           # origin_el = red_dots[0]
           # idx = 8
           # if len(red_dots) < 8:
           #     idx = len(red_dots)
           # destination_el = red_dots[idx]
           # driver.drag_and_drop(destination_el, origin_el)
   except:
       print("结束")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Alphalens使用方法细节判断

首先alphalens的数据格式&#xff1a; factor: MultiIndex&#xff08;用stack()方法来转换&#xff09; prices: DataFrame #转换成MultiIndex factor alpha_mom.stack() print (factor.tail()) datetime 2017-11-20 15:00:00 601857.XSHG 1…

小学生python游戏编程arcade----烟花粒子

小学生python游戏编程arcade----烟花粒子前言烟花粒子1、Vector向量类1.1 arcade中的向量类1.2 应用2、绘制粒子所有纹理图片2.1 给定直径和颜色的圆的纹理2.2 arcade.make_circle_texture函数原码2.3 make_soft_circle_texture 函数原码2.4 公共纹理代码3 效果图4 代码源码获取…

【读点论文】Densely Connected Convolutional Networks用残差连接大力出奇迹,进一步叠加特征图,以牺牲显存为代价

Densely Connected Convolutional Networks Abstract 如果卷积网络在靠近输入的层和靠近输出的层之间包含较短的连接&#xff0c;则卷积网络可以训练得更深入、更准确和有效。在本文中&#xff0c;接受了这种观察&#xff0c;并介绍了密集卷积网络(DenseNet)&#xff0c;它以…

Linux - Linux下Java安装路径查找;配置Java环境变量

一、查看Java的安装路径 1、已经安装好了JDK&#xff0c;也配置了环境变量 1、执行 java -version java -version 出现了版本号&#xff0c;表示安装过了JDK&#xff0c;配置了环境变量 2、在配置过jdk的情况下&#xff0c;执行java -verbose指令&#xff0c;在打印出的文本…

java stream中的peek()用法

文章目录前言最终操作&#xff08;terminal operation&#xff09;peek() vs forEach()peek() 的典型用法&#xff1a;协助调试总结前言 最近看到一段代码&#xff1a; aeFormList.stream().peek(object -> saveInfomation(object, params)).collect(Collectors.toList())…

std::shared_ptr(基础、仿写、安全性)

目录 一、c参考手册 1、解释说明 2、代码示例 3、运行结果 二、对std::shared_ptr分析 1、shared_ptr基础 2、创建shared_ptr实例 3、访问所指对象 4、拷贝和赋值操作 5、检查引用计数 三、仿写std::shared_ptr代码 1、单一对象 2、数组对象 四、shared_ptr遇到问…

MyBatis 环境搭建

MyBatis 环境搭建步骤 1.创建一张表和表对应的实体类 2.创建一个 maven 项目&#xff0c;把项目添加到 git 仓库 创建maven项目 教程见&#xff1a;Maven[项目构建工具]_chen☆的博客-CSDN博客 添加到git仓库&#xff1a; 3.在文件 pom.xml 添加 mybiatis 相关依赖(导入 MyBa…

Java - 利用Nacos做一个动态开关配置功能

Java - 利用Nacos做一个动态开关配置功能前言一. Nacos配置类编写二. 测试三. 展望前言 我公司里有一个Config配置功能&#xff08;我相信这是很普遍的一个功能&#xff09;。简单来说就是&#xff1a; 将相关的键值对放到这个Config配置系统里面。代码里通过这个Config配置系…

博客项目(前台功能实现)

博客项目(前台接口实现) 文章目录博客项目(前台接口实现)1.前置知识1.1Controller1.1.1ResponseResult类1.1.2该类的方法1.2Service1.3ServiceImpl1.4Mapper1.5Vo的理解1.6可能会用到的相关插件1.7设置字面量1.8后端接口测试工具2.热门文章接口分析2.1热门文章接口位置2.2接口的…

Internet Download Manager2023最新版下载器功能介绍

说到下载器在国内就不得不提迅雷&#xff0c;迅雷真是伟大&#xff0c;几乎垄断了国内的下载市场&#xff0c;的确&#xff0c;有的时候用迅雷可以下载到很不错的资源&#xff0c;但在没有VIP的情况下&#xff0c;迅雷是不友好的&#xff0c;相信使用迅雷的各位都有被限速过的经…

三、Eureka

文章目录一、认识服务提供者和服务调用者二、Eureka 的工作流程三、服务调用出现的问题及解决方法四、搭建 eureka-server五、注册 user-service、order-service六、在 order-service 完成服务拉取&#xff08;order 模块能访问 user 模块&#xff09;七、配置远程服务调用八、…

分布式锁:不同实现方式实践测评

Hello读者朋友们&#xff0c;今天打算分享一篇测评实践类的文章&#xff0c;用优雅的代码与真实的数据来讲述在分布式场景下&#xff0c;不同方式实现的分布式锁&#xff0c;分别探究每一种方式的性能情况与最终的优劣分析。 开门见山&#xff0c;我们先看一张表格&#xff0c…

fiddler安卓模拟器与ios手机抓包

一.安卓模拟器(雷电模拟器)抓包 1.1fiddler基本配置 1.2导出Fiddler证书 Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop 在桌面上看到导出的FiddlerRoot.cer证书文件 1.3下载和安装openssl openssl下载地址 git终端输入 open…

蜂鸟E203学习(一)--RISC的前世今生

第一章 CPU之前世今生 1.1、CPU众生相 1.1.1 处理器&#xff08;cpu&#xff09;和处理器内核&#xff08;core&#xff09;的区分 处理器严格意义上是soc&#xff0c;包含了内核和其他设备或者存储器. 1.1.2 不同CPU架构的诞生时间 CPU架构诞生时间Intel 80861978年ARM19…

Opencv之Mat常用类成员(一篇就够了)

1. 重要类成员 data&#xff1a;数据存储的起始地址 (uchar*类型)&#xff1b;dims&#xff1a;矩阵维度。如 3 * 4 的矩阵为 2 维&#xff0c; 3 * 4 * 5 的为3维&#xff1b;channels()&#xff1a;通道数量&#xff0c;矩阵中表示一个元素所需要的值的个数。例&#xff1a;…

Docker-系统环境

Docker1.Docker与虚拟机的区别2.Docker主要解决的问题3.镜像和容器4.Docker的安装9.查找镜像10.常用命令11.安装数据库12.安装tomcat13.容器使用注意事项1.Docker与虚拟机的区别 Docker是开发运行和部署应用程序的开发管理平台&#xff0c;它类似于虚拟机&#xff0c;可以独立…

七、Feign

文章目录一、Feign实现远程调用1.替换RestTemplate发起远程调用&#xff0c;RestTemplate存在的问题&#xff1a;2.实现Feign远程调用&#xff1a;二、Feign的自定义日志1.Feign可修改的配置如下2.方式一&#xff1a;配置文件方式3.方式二&#xff1a;Java代码方式一、Feign实现…

Qt:信号与槽机制

说实话&#xff0c;Qt给我的感觉像一种魔改版c&#xff0c;不纯粹&#xff0c;看不到内部的源代码&#xff0c;也不知道一些宏是怎么实现的... 信号与槽内部机制 回归正题&#xff0c;其实学过设计模式的应该都能看出来&#xff0c;qt的这个机制是一个观察者模式&#xff1b; …

又解锁了一种OpenFeign的使用方式!

引言 Hello 大家好&#xff0c;这里是Anyin。 在关于OpenFeign那点事儿 - 使用篇 中和大家分享了关于OpenFeign在某些场景下的一些处理和使用方法&#xff0c;而今天Anyin再次解锁了OpenFeign的又一个使用场景&#xff0c;只能说真香。 在我们日常开发中&#xff0c;相信大家…

SSM框架-MyBatis基础

1. MyBatis简介 1.1 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis&#xff0c;2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c;iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBa…