APP抓包工具

目录

一、移动端数据简介、端爬取数据的背景

1、获取移动端数据的作用

2、UIAutomator的介绍

3、UIAutomator的缺陷

4、UIAutomato2的优势

5、UIAutomator2的执行流程

二、adb的简介和u2的基本操作

1、adb的安装与使用

2、adb有什么作用?

3、adb如何使用?

4、UIAutomator2快速入门

5、UIAutomator2控制移动设备

6、UIAutomato2启动手机app

7、UIAutomator2自动化工具基本操作

三、weditor的基本操作

1、什么是Activity?

2、Activity的控件

3、weditor的使用

4、weditor的界面包括

5、UiSelector和控件定位

5.1 定位方式

5.2 Andrid基本布局

5.3 控件的属性

5.4 文本定位的方式

5.5 ClassName定位的方式

5.6 资源id进行定位

5.7 混合定位的方式

5.8 坐标点定位法

5.9 xpath定位的方式

四、fiddler抓包工具的使用

1、什么是fiddler?

2、fiddler的安装 

3、Fiddler抓包有点

4、Fiddler抓包缺点

5、SwitchyOmega插件的安装

6、会话列表

7、fiddler 配置移动端数据包

7.1夜神模拟器配置

7.2 fiddler 配置

fiddler配置及使用教程 - silencio。 - 博客园

五、Appium

1、元素定位

1.1 通过ID定位:

1.2 获取元素文本、位置、大小、屏幕大小、属性

1.3 滑动


一、移动端数据简介、端爬取数据的背景

        随机互联网的发展,数据不仅仅只是存在于PC端。移动端的数据在这几年的占比以及势头发展趋势呈现几何倍数的增长。对于做数据分析、用户画像、市场调研来说仅仅参考PC端的数据是远远不够的。那么于此同时移动的数据就显得尤为的重要

1、获取移动端数据的作用

  • 数据分析
  • 用户画像
  • 商业竞争
  • 统计系统

2、UIAutomator的介绍

  • UIAutomator是google提供的用来做安卓自动化测试的一个java库

3、UIAutomator的缺陷

  • 测试脚本只能用Java语言开发
  • 测试脚本要打包成jar包或者apk包上传到设备上才能实现

4、UIAutomato2的优势

  • UI自动化编写采用Python,学习成本低
  • UI控件识别有专门的工具 weditor
  • 环境搭建简单
  • UI自动化脚本运行稳定

项目地址https://github.com/openatx/uiautomator2

5、UIAutomator2的执行流程

  • 在PC端来编写脚本(相当于发送HTTP请求到移动设备的server端)
  • 移动设备通过wifi或usb接收到了PC上发来的HTTP请求,执行定制的操作
  • 在移动设备上安装atx-agent(守护进程),随后atx-agent启动ui2服务(默认7912端口)进行监听

二、adb的简介和u2的基本操作

1、adb的安装与使用

Adb又称Android调试桥,用于通过电脑端与模拟器或者是设备之间的交互的一个工具

Adb client 命令行程序‘adb’用于从shell或脚本中运行adb命令

Adb server adb server 是运行在PC的的一个后台程序

Adbd 程序adbd作为一个后台进程在Android设备或模拟器系统中运行

2、adb有什么作用?

  • 安装卸载apk文件
  • 移动设备和PC之间拷贝文件
  • 查看设备上安装的应用信息
  • 文件管理
  • 按键操作

3、adb如何使用?

把adb的bin目录添加到环境变量当中

APP抓包工具_第1张图片

adb devices 查看链接的移动设备
adb kill-server 关闭链接的移动设备
adb install apk文件路径  安装app应用
adb shell pm list packages 查看应用包名
adb uninstall 应用包名 卸载应用

4、UIAutomator2快速入门

python -m uiautomator2 init  初始化移动设备

Uiautomator-server:  就是谷歌原声的 uiautomator

Atx-agent: uiautomator的守护进程

minicap和minitouch 中2个包是atx-agent增加远程控制功能的依赖

5、UIAutomator2控制移动设备

u2.connect_wifi('172.17.100.15')  通过wifi
u2.connect_usb('127.0.0.1:62025') 通过usb(手机序列号)
u2.connect_adb_wifi('172.17.100.15:5555') 通过adb wifi

6、UIAutomato2启动手机app

使用aapt工具进入这个路径输入
aapt dump badging apk的文件名

找到包名
d.app_start('包名')

停止
d.app_stop('包名')

7、UIAutomator2自动化工具基本操作

d.service('uiautomator').running() uiautomator运行状态

d.service('uiautomator').start() 启动uiautomator

d.service('uiautomator').stop() 停止uiautomator

d.app_install(data='apk地址') 安装app

d.app_current() 获取当前前台app的信息

d.app_stop('包名') 停止当前app

d.app_clear('包名') 清除缓存

d.app_uninstall('包名') 卸载app

d.app_list() 获取所有app的信息

d.app_stop_all() 停止所有app

d.app_uninstall_all() 卸载所有app

三、weditor的基本操作

1、什么是Activity?

       Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用户交互的系统模块

2、Activity的控件

  • TextView 显示文字
  • EditText 输入框
  • ImageView 显示图片
  • Button 按钮
  • CheckBox 复选框
  • RadioButton 单选按钮

3、weditor的使用

pip install weditor -i https://pypi.douban.com/simple
在命令行输入 weditor

4、weditor的界面包括

  • 移动设备选择区
  • 控件属性区域
  • 代码展示区
  • 层级关系和结果展示区域

5、UiSelector和控件定位

5.1 定位方式

  • UiSelector
  • Xpath

5.2 Andrid基本布局

线性布局  linearLayout
相对布局  RelativelLayout
帧布局    FrameLayout
表格布局  TableLayout
绝对布局  AbsoluteLayout

5.3 控件的属性

index

int

索引

0

instance

int 

实例

5

class

Sting

类名

android.widget.TextView

package

Sting

包名

com.tl.kaoyan

check

boolean

控件勾选状态

false/true

enable/clickable

boolean

控件可点击

false/true

focused/focusable

boolean

焦点

false/true

Scrollable

boolean

滚动条

false/true

Long-clickable

boolean

长按

false/true

selected

boolean

选择状态

false/true

5.4 文本定位的方式

Text 全文本匹配

textContains 文本包含

textMatches 正则表达式

textStartsWith 起始文本

5.5 ClassName定位的方式

className classNmae的值

classNameMatches 正则表达式匹配 classNmae的值

5.6 资源id进行定位

resourcdId 资源id

5.7 混合定位的方式

文本定位 资源id ClassName等可以配合使用来进行定位

5.8 坐标点定位法

  坐标点定位法分为2种方式 一种是通过原始的坐标点来呈现。一种是通过%号的方式来呈现

5.9 xpath定位的方式

d.xpath('xpath语句')

四、fiddler抓包工具的使用

1、什么是fiddler?

       Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯

官网 Fiddler | Web Debugging Proxy and Troubleshooting Solutions

APP抓包工具_第2张图片

fiddler功能很强大

  • 支持IE、Chrome、FireFox等等浏览器
  • 可以在phone、pad等移动设备进行连接

2、fiddler的安装 

APP抓包工具_第3张图片

APP抓包工具_第4张图片

APP抓包工具_第5张图片

3、Fiddler抓包有点

  • 可以查看所有浏览器,客户端应用或服务之间的web数据流
  • 手动或自动修改任意的请求和相应
  • 可以解密https数据流以便查看和修改。

4、Fiddler抓包缺点

  • fiddler只是支持http、https、ftp、websocket数据流等相关的协议
  • 无法检测或修改其他数据。如:SMTP、POP3等
  • fidder无法处理请求和响应超过2GB的数据。

5、SwitchyOmega插件的安装

chrome浏览器SwitchyOmega安装与使用 - OTAKU_nicole - 博客园一、安装 打开 https://github.com/FelisCatus/SwitchyOmega/releases 下载 下载之后后缀crx改成zip,解压到文件夹 chrome浏览器打开扩展程序https://www.cnblogs.com/nicole-zhang/p/11955881.html

6、会话列表

APP抓包工具_第6张图片

APP抓包工具_第7张图片

APP抓包工具_第8张图片

7、fiddler 配置移动端数据包

7.1夜神模拟器配置

APP抓包工具_第9张图片

APP抓包工具_第10张图片

APP抓包工具_第11张图片

7.2 fiddler 配置

APP抓包工具_第12张图片

(现在打开我们模拟器的浏览器)

APP抓包工具_第13张图片

提示有证书问题,我们来安装证书,点击继续

APP抓包工具_第14张图片

在这里输入我们的ip地址

(点击这个选项)

APP抓包工具_第15张图片

(如果设置密码的就已经可以了,如果没有设置密码会弹出选项让我们来设置密码)

APP抓包工具_第16张图片

APP抓包工具_第17张图片

弹出这个吐司证明安装成功了

fiddler的安装,可以参考如下文档:

fiddler配置及使用教程 - silencio。 - 博客园

注意:

1、夜神模拟器安装证书后无效问题解决?

APP抓包工具_第18张图片

        即使按照其它教程的安装证书,也只是把证书安装到了用户下面,然而安卓高版本(7.0)之后呢,app可以只信任指定证书和系统内置的证书,后续用户安装的证书是不生效的。 所以切换成低版本的系统。

2、使用Fiddler抓包抓取不了数据包的问题

原因:使用Fiddler抓包抓取不了数据包的问题

APP抓包工具_第19张图片

五、Appium

        使用Appium和Python来进行自动化测试,需要安装两个,一个是appium的客户端,一个是appium-python库,这两个需要安装的东西再加上手机就可以进行自动化测试了。他们之间的关系:python代码->Appium-Python库-》Appium-》手机

Appium环境搭建的超详细教程: Appium环境搭建超详细教程 - 知乎前言:本系列教程会从软件的基本安装开始,最终目的是通过完成几个案例后, 大家实现 自由抓取App中想要的资源。本系列以后会更的: Appium基本使用及控制真机及安卓模拟器Mitmproxy抓包工具的基本使用Fiddler抓包软件…https://zhuanlan.zhihu.com/p/49193525

需要用到的工具:

  • node.js
  • java sdk
  • Android SDK
  • appium
  • 夜神模拟器
  • python
  • pip install appium-python-client

问题: 

1、Adb连不上夜神模拟器

Adb连不上夜神模拟器的原因&&adb devices显示设备信息为空_凌萧的萧的博客-CSDN博客_dows窗口连接不上模拟器I、Adb连不上夜神模拟器的原因:(夜神模拟器的端口为62001)SDK 的 adb 版本与夜神模拟器的 adb 版本不一致(最重要)* 看看两个 adb 的版本分别是多少。* SDK adb 版本查询命令:adb version* 夜神模拟器的 adb 版本查询命令nox_adb version(如果要执行此命令,则需要在系统环境变量中配置夜神模拟器的bin目录)* 如果两个adb的版本不一致,解决方案如下:·先关闭所有 adb 的进程(在任务管理器中);·将 SDK 的...https://blog.csdn.net/weixin_45282042/article/details/109017645

2、No Android devices were detected by adb

原因:adb 没有连接上夜神模拟器

解决:cmd——adb connect 127.0.0.1:62001

3、no devices/emulators found

error: no devices/emulators found解决办法_shixiu_yuan的博客-CSDN博客这是由于没有找到设备或模拟器,导致的解决方法:检查是否连上了设备或者打开了模拟器检查设备或模拟器是否打开了开发者模式打开开发者模式由于不同品牌不同型号而有所不同,这里我讲解一下华为手机的打开方式(如果此方法找不到,可从网上搜索对应手机的开发者模式打开方法):(1)进入到设置–系统–关于手机(2)多次点击版本号(3)退回到系统页面,找到开发人员选项(4)打开开发人员选项和USB调...https://blog.csdn.net/shixiu_yuan/article/details/103517388

4、Could not find a connected Android device

原因就是adb版本与nox_adb版本不一致

将adroid sdk  platform-tools下的adb.exe 拷贝到Nox/bin目录(夜神模拟器安装目录),改名nox_adb.exe。再运行脚本可以正常执行了。

1、元素定位

两种方式:1是使用android-sdk中的C:\work\soft\android-sdk\tools\uiautomatorviewer.bat

可能遇到的问题:uiautomatorviewer打不开,原因:java的jdk版本过高。下载jdk1.8版本

案例:

from appium import webdriver

caps = dict()
# 系统
caps['platformName'] = 'Android'
# 系统版本
caps['platformVersion'] = '5.1.1'
# 设备名称
caps['deviceName'] = 'Android'
# 包名
caps['appPackage'] = 'com.tal.kaoyan'
# 界面名称
caps['appActivity'] = 'com.kaoyan.kylogin.ui.login.LoginKActivity'
# 使用自带的输入法,输入中文填True
caps['unicodeKeyboard'] = True
# 执行完程序恢复原来输入法
caps['resetKeyboard'] = True
caps['noReset'] = True

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',caps)
print('第一步:输入手机号')
tel = driver.find_element('id','com.tal.kaoyan:id/kylogin_phone_input_phonenum').send_keys('18735309044')
print('第二步:点击发送验证码')
send_code = driver.find_element('id','com.tal.kaoyan:id/kylogin_phone_input_codeget').click()
print('第三步:输入验证码')
code = input('请输入验证码')
driver.find_element('id','com.tal.kaoyan:id/kylogin_phone_input_code').send_keys(code)
print('第四步:同意协议')
driver.find_element('id','com.tal.kaoyan:id/loginTreatyCheckboxPhone').click()
print('第五步:登录')
driver.find_element('id','com.tal.kaoyan:id/loginCodeLoginBtn').click()

说明:这里的包名和当前打开界面的名称通过adb命令来获取的:命令如下:

adb shell dumpsys window windows | findstr mFocusedApp

另一种方法就是:appium自带功能

APP抓包工具_第20张图片

 APP抓包工具_第21张图片

 APP抓包工具_第22张图片

APP抓包工具_第23张图片

这样就定位到了元素的位置。 

1.1 通过ID定位:

from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey
from appium.webdriver.common.appiumby import By
caps = dict()
# 系统
caps['platformName'] = 'Android'
# 系统版本
caps['platformVersion'] = '5.1.1'
# 设备名称
caps['deviceName'] = 'Android'
# 包名
caps['appPackage'] = 'com.android.Calendar'
# 界面名称
caps['appActivity'] = '.ui.activity.MainActivity'
# 使用自带的输入法,输入中文填True
caps['unicodeKeyboard'] = True
# 执行完程序恢复原来输入法
caps['resetKeyboard'] = True
caps['noReset'] = True

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',caps)

# 点击,输入,清空
try:
    skip = driver.find_element(By.ID, 'com.android.Calendar:id/btn_skip')
    if skip:
        skip.click()
except:
    pass
# 点击一下搜索框
driver.find_element(By.ID,'com.android.Calendar:id/tv_search').click()
# 搜索淘宝
driver.find_element(By.ID,'com.android.Calendar:id/et_search_word').send_keys('淘宝')
# 点击搜索按钮
#driver.find_element(By.ID,'com.android.Calendar:id/ibtn_search').click()
# 或者回车 AndroidKey 键盘按键
driver.press_keycode(AndroidKey.ENTER)

1.2 获取元素文本、位置、大小、屏幕大小、属性

from appium import webdriver
from appium.webdriver.common.appiumby import By
caps = dict()
# 系统
caps['platformName'] = 'Android'
# 系统版本
caps['platformVersion'] = '5.1.1'
# 设备名称
caps['deviceName'] = 'Android'
# 包名
caps['appPackage'] = 'com.android.settings'
# 界面名称
caps['appActivity'] = '.Settings'

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',caps)
# 获取元素文本
# 获取无线名称
print(driver.find_element(By.XPATH,'//*[@text="WLAN"]').text)
# 获取元素的位置和大小
# {'x': 1208, 'y': 38}
print(driver.find_element(By.id,'com.android.settings:id/search').location)
# {'height': 69, 'width': 72}
print(driver.find_element(By.id,'com.android.settings:id/search').size)
print(driver.get_window_size())
# 获取元素的属性值
print(driver.find_element(By.id,'com.android.settings:id/search').get_attribute('content-desc'))

1.3 滑动

from appium import webdriver
import time
from appium.webdriver.common.appiumby import By
caps = dict()
caps['platformName'] = 'Android'
caps['platformVersion'] = '5.1.1'
caps['deviceName'] = 'Android'
caps['appPackage'] = 'com.ss.android.ugc.aweme'
caps['appActivity'] = '.splash.SplashActivity'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)

"""获取屏幕的宽高"""
def get_size(driver):
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    return x,y

# 向上滑动
def swipeup(driver,t = 100,n=10):
    x, y = get_size(driver)
    x1 = x * 0.5
    y1 = y * 0.2
    y2 = y * 0.7
    time.sleep(5)
    is_agree = driver.find_element('id', 'com.ss.android.ugc.aweme:id/c6-')
    if is_agree:
        is_agree.click()
    for i in range(n):
        try:
            driver.swipe(x1, y1, x1, y2, t)
        except Exception as error:
            print('error:',error)
# 向下滑动
def swipedown(driver,t = 500,n = 1):
    x,y = get_size(driver)
    x1 = x * 0.5
    y1 = y * 0.8
    y2 = y * 0.2
    for i in range(n):
        driver.swipe(x1,y1,x1,y2,t)

# swipeup(driver)
# 一个元素滑动到另一个元素  没有惯性的
# w_button = driver.find_element(By.XPATH,'//*[@text="WLAN"]')
# y_button = driver.find_element(By.XPATH,'//*[@text="应用"]')
# driver.drag_and_drop(y_button, w_button)
# 一个元素滑动到另一个元素 有惯性的
# driver.scroll(y_button, w_button)

你可能感兴趣的:(python爬虫,数据分析,信息可视化,数据挖掘,爬虫)