也许有人觉得抓手机的数据包都费劲,还搞什么自动化,而且肯定不简单。但我要告诉你的是,这一切都被一个叫Airtest的自动化测试软件给搞定了,你只需要把它一直运行着,你的手机上的所有操作,就都交给它了,直接就是点点点。
这里我们需要连接手机,由于小编有模拟器,为了不影响小编玩手机,所以我决定用Airtest模拟器来连接手机,打开模拟器,选择关于平板电脑,如图:
连击多次版本号,直到出现开发者选项功能,然后打开开发者选项下的USB调试,如图:
这样我们就开启了USB调试,下面我们Airtest来远程连接我们的模拟器,如图:
这里有一个知识需要向大家说明的就是,我们连接的远程端口号不是随便弄的,而是根据模拟器的不同而使用的不同的端口号,模拟器和端口号一一对应关系如下:
这样选择好我们的主机地址和端口号后就可以进行连接了,然后我们点击connect就可以直接连接了,如图:
由于我们是使用模拟器连接,所以图上第一项最好选上,不然模拟器即使连接上了也是没有画面的。如果还是没有画面,那可能是因为屏幕捕捉程序“yosemite.apk”没有下载到模拟器中,在Airtest中找出来,直接拖动到模拟器中,再次连接模拟器,打开一看,如图:
成功连接上了。下面就上面三个选项跟大家简单描述下:
use javacap:#解决IDE中手机画面黑屏的问题
use ADB orientation :#解决IDE中屏幕旋转的问题
use ADB touch:#解决IDE中屏幕无法点击的问题
这里我们不光可以和模拟器建立连接,还可以和我们已打开或者未打开的应用进行连接操作,我们可以点击选定窗口,选择指定的应用程序,这样程序就会被加载到Airtest中去了,这里我打开了360浏览器,如图:
可以看到被加载进去了,我们可以在里面浏览了,但是此时我们的桌面上的浏览器却不翼而飞,这就是因为Airtest正在使用我们的浏览器,当我们点击断开当前设备就可以关闭掉这个设备,此时便可以重新看到浏览器又回到了我们的桌面了,如图:
虽然模拟器很方便,但是毕竟很麻烦,而且万一你的电脑配置不行的话,那么模拟器可能开不了几个应用就爆了,所以这里我们也要使用手机来连接Airtest,手机相比其它的连接方式略显复杂,下面请看我表演。
首先我们需要将数据线插入电脑的USB接口,然后还是打开开发者选项和USB调试;只不过手机可不像模拟器,除了以上选项要设置之外,我们还需要设置默认USB配置,并把它设为MIDI,默认USB配置就在USB调试的下方,如图:
然后选择MIDI,如图:
这样手机端的开发者选项设置算是全部完结了,但是这样还是远远不够的,你还需要一大堆操作,是的,没错,一大堆,这款IDE最大的毛病就在这,正是验证了一句话,安装两小时,编程两分钟,哈哈哈哈。
因为小编手机是Vivo的,所以小编在网上下了一个Vivo的驱动程序包,如果你的手机跟小编不是一个版本,那么请看下面:
三星: http://www.samsung.com/cn/support/downloads
华为: http://consumer.huawei.com/minisite/HiSuite_cn/
小米: http://bigota.d.miui.com/tools/xiaomi_usb_driver.rar
Vivo: http://zs.vivo.com.cn/download.php
魅族:http://care.meizu.com/
一加:http://service.oneplus.cn/
华硕: http://www.asus.com.cn/support/
联想: http://www.lenovocare.com.cn/default.aspx
LG: http://www.lg.com/us/support/software-firmware-drivers
索尼: https://developer.sony.com/develop/drivers/
摩托罗拉: https://mobilesupport.lenovo.com/us/en/solution/MS88481
HTC: http://www.htc.com/us/software/htc-sync-manager/
谷歌: https://developer.android.com/studio/run/win-usb.html
黑莓: https://swdownloads.blackberry.com/Downloads/entry.do?code=4EE0932F46276313B51570F46266A608
戴尔: http://www.dell.com/support/home/us/en/04/Products?app=drivers&lwp=rt
宏基: https://www.acer.com/ac/en/US/content/drivers
如果上面还是没有,那么你可能需要一款兼容所有设备的驱动软件,驱动人生或者驱动精灵,随意挑选一个即可。
如果我们在Airtest中要输入文字的话,使用手机自带的输入法是没办法输入的,必须使用我们前面提到的“yosemite”输入法,这里在我们安装好手机的驱动后会自动下载到你的手机的,你只需要安装即可。如图:
然后我们再设置系统默认输入法为这个输入法即可,如图:
虽然设置好了后我们可以输入文字了,但是有时候的话可能鼠标点击的不是很准确,那么这个时候,我们还需要设置模拟位置,同样在开发者选项中,如图:
这样设置好后,回到我们的Airtest主界面,我们就可以看到已经出现了设备的名称和状态了,如图:
还是如模拟器一样,点击Connect 勾选Use Javacap,这时设备就已经成功连接上了,如图:
这里我们无需准备数据线也可以连接上我们的安卓机,只要你三个步骤完成好了,就简单了。我们首先需要知道安卓真机的IP地址,可在这里查看,如图:
然后我们使用这个IP地址在Airtest中建立连接,如图:
注意这里的端口号是5555,如果你写其它的端口的话也可以运行,但是它是无法监听TCP/IP信息的,如果你想指定多个这样的端口,命令提示符输入如下命令即可:
adb tcpip 666#开启666端口
这里有个前提,就是手机必须和我们IDE所处在同一个Wifi网络环境下才行,否则是访问不到的。
这里我们双击脚本编辑窗,设置一个编辑器的脚本文件,如下:
设置完毕后返回即可看到如下画面:
然后我们就可以在这里面连接安卓机了,具体代码如下:
connect_device('Android://127.0.0.1:5037/手机IP地址:5555')#前面是本机号和端口后面就是你手机的IP地址了
请大家注意,这里同样需要安卓机子和IDE处在同一个WiFi网络环境下哦。
今天我们讲的是这款自动化工具的安装和界面功能的剖析,这个工具整体上来说,用法比较简单,就是安装坑太多,新手小白可能要花一些时间才能整明白,在此特与大家分享,愿大家学习之路更加平坦顺畅。下次我们再来讲讲IDE的妙用。
在日常开发中,经常需要根据设备的类型来做不同的适配或逻辑处理。特别是在移动端开发中,判断用户使用的设备类型是手机还是平板电脑是非常常见的需求。本文将介绍使用 JavaScript 判断设备类型的方法,并提供相应的代码示例。
User-Agent 是浏览器在发送 HTTP 请求时,会在请求头中附带的一个字符串,其中包含了有关浏览器和操作系统的信息。我们可以通过解析 User-Agent 字符串来判断设备类型。
// 获取 User-Agent 字符串
const userAgent=window.navigator.userAgent;
// 判断是否是手机
const isMobile=/Mobile/i.test(userAgent);
// 判断是否是平板电脑
const isTablet=/Tablet/i.test(userAgent);
上述代码首先通过 window.navigator.userAgent 获取到当前浏览器的 User-Agent 字符串。然后通过正则表达式匹配判断是否是手机或平板电脑。
另一种判断设备类型的方法是根据屏幕宽度进行判断。通常,手机的屏幕宽度比较窄,而平板电脑的屏幕宽度较宽。
// 获取屏幕宽度
const screenWidth=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
// 判断是否是手机
const isMobile=screenWidth < 768;
// 判断是否是平板电脑
const isTablet=screenWidth >=768 && screenWidth < 1024;
上述代码中,我们通过 window.innerWidth、document.documentElement.clientWidth 和document.body.clientWidth 来获取到屏幕宽度,然后根据宽度范围判断设备类型。
下面是一个完整的示例代码,演示了如何根据设备类型来显示不同的提示信息:
// 获取 User-Agent 字符串
const userAgent=window.navigator.userAgent;
// 获取屏幕宽度
const screenWidth=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
// 判断是否是手机
const isMobile=/Mobile/i.test(userAgent) || screenWidth < 768;
// 判断是否是平板电脑
const isTablet=/Tablet/i.test(userAgent) || (screenWidth >=768 && screenWidth < 1024);
if (isMobile) {
console.log("您正在使用手机访问");
} else if (isTablet) {
console.log("您正在使用平板电脑访问");
} else {
console.log("您正在使用桌面电脑访问");
以上代码中,在判断设备类型后,通过控制台打印不同的提示信息。
本文介绍了两种常见的判断设备类型的方法,并提供了相应的代码示例。通过这些方法,我们可以根据设备类型来进行不同的适配或逻辑处理,提升用户的体验。在实际开发中,可以根据具体需求选择合适的方法来判断设备类型。
如若转载,请注明出处:开源字节 https://sourcebyte.vip/article/348.html
近在搞 App 爬虫,不过万事入门难,我得自己研究研究 Mitmproxy 虽然不知道到底是不是那么强啦,就是得要会用,所以我就亲自入坑,并把自己的一下观点比较记录下来,毕竟好记性不然烂笔头嘛。
mitmproxy 是一个支持 HTTP 和 HTTPS 的抓包程序,有类似 Fiddler、Charles 的功能,只不过它是一个控制台的形式操作。
mitmproxy 还有两个关联组件。一个是 mitmdump ,它是 mitmproxy 的命令行接口,利用它我们可以对接Python 脚本,用Python实现监听后的处理。另一个是 mitmweb,它是一个 Web 程序,通过它我们可以清楚观察 mitmproxy 捕获的请求。
接下来我将给同学们讲解 Mitmproxy 抓包工具的安装及介绍,之前我分享了 Fiddler 抓包工具的安装以及简单操作,通过 Fiddler 抓包工具我们可以抓取 Web 端和 App 端的数据。今天给大家介绍另一款强大的抓包工具同样可以抓取 Web 端和 App 端的数据,并且可以和 Python 语言融合在一起,通过爬虫来抓取数据—— Mitmproxy 。
Mitmproxy 其实就是用来做中间人攻击的,那什么是中间人工具呢?
图一
其实,上面这张图(图一)和我们上节课讲的 Fiddler 那张图很像,我们的 Mitmproxy 就和 Fiddler 一样,在上图的 Man in the Middle 位置一样,在中间做一些截取和查看,用于中间人代理其实和正常的一样,会将我们客户端发起的请求截取,然后转发给我们的服务器(不过是多了一个中间人,这个中间人可以修该或者不修改你发起请求的数据),服务器收到请求之后会收到响应,同样我们的 Mitmproxy 会截获这个响应,最后再转发给我们的 Client 。所以总结下来就是以下三点:
Mitmproxy 不同于 Fiddler 之类的抓包工具,不仅可以截获数据并且可以帮助开发者查看分析等操作,更可以自定义脚本来进行二次开发,举个例子来讲:利用 Fiddler 可以过滤出浏览器对某个特定 URL 的请求,并且查看和分析数据,但是,实现不了高度的定制化需求。例如:截获对该浏览器的请求,将返回数据为空并将真实的返回数据存到某一个数据库中或者出现异常的时候发出邮件通知。
上面所说的功能 Fiddler 实现不了,但对于 Mitmproxy 来说,可以使用载入自定义的 Python 脚本来实现,Mitmproxy 并不会对无辜的人发起攻击,由于我们的 Mitmproxy 工作在 HTTP 中,而当前通过 HTTPS 的普及,使客户端拥有检测规避中间人的能力,所以要让我们 Mitmproxy 正常工作的话必须让我们客户端或者 App 信任 Mitmproxy 的 SSL 证书或者忽略证书异常。
其实和 Fiddler 差不多,Fiddler 也是安装了一个自己的证书使的客户端信任,所以 Mitmproxy 一样也是要让浏览器或者 App 信任该证书,让 Mitmproxy 在中间充当一个中间人的角色——达到截获请求或者响应。
这个不是在做黑产,而是在做我们的开发测试。
在正式安装之前,我们先来看看 Mitmproxy 需要一个怎样的安装环境。
首先,我们需要打开我们的命令行工具 CMD ,直接在命令行命令输入以下命令:
回车就可以安装了,如果以上安装不了出现问题,建议先给自己的 pip 换源一下:Windows pip 换源,但是如果出现报错,咱们继续往下看 。
如果出现以下类似的报错信息(图二)我们有两种解决方法,第一种安装 Microsoft Visual c++ Build Tools,来一劳永逸的解决,方法如下:
图二
上图(图二)出现的报错信息,最重要的是:error:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual c++ Build Tools":landinghub.visualstudio.com/visual-cpp-build-tools
记住!认真看报错信息,按你具体提示是链接去浏览器访问。当然有可能链接会访问失败出现 404 之类的。
那如果不行,同学们可以直接下载完成之后,我来进行安装,安装也非常的方便,直接运行安装程序即可。这里我简单的把安装截图演示出来(图三):
图三
出现下图(图四)就已经正在安装了:
图四
安装时间看具体电脑,会比较久一些。通过一段时间等待,就安装成功了,需要你重启计算机,重启之后再次运行以下命令即可:
此方法如果不能解决还需要用方法解决,请同学们灵活选择。
点击下面链接下载文件,放到桌面(当然,你也看放到其他位置,放到桌面主要为了小白方便,比如我这里演示的时候,.whl 文件放在我的电脑桌面上,我的文件路径:C:\Users\clela\Desktop,接下来我们在命令行输入以下内容:
如果没有报错,则安装成功。如果其他问题可以自行百度或者底栏留言即可。
那我们该如何验证呢?我们可以查看一下 mitmproxy 的版本,我们在命令行输入:
但是结果报错了 ,我们来看看报错内容:
我们来简单翻译一下:错误:mitmproxy控制台接口不支持在Windows。您可以运行mitmdump或mitmweb代替。,那这个时候又同学会说:那我们不是白安装了吗?装了半天,还解决 Bug 结果:mitmproxy 不能用,怎么办?
但是,我们可以看见上面报错提示:您可以运行mitmdump或mitmweb代替 所以也就是说 mitmproxy 有两个组件,一个是 mitmdump 另一个是 mitmweb 也就是这三个我们用哪个都可以。
一般我们抓包用的是:mitmproxy ,在与 Python 交互的时候用哪一个呢?——我们用的是 mitmdump 而在 Windows 里面我们用 mitmweb ,在 Linux 里面使用 mitmproxy 。在 Linux 与 Windows 里面都是用 mitmdump 与 Python 交互。
那接下来我们来看一下 mitmdump 的版本号,命令如下:
输出结果如下:
由上面的结果可知,我们的 Mitmproxy 版本:5.1.1 基于我的 Python 版本:3.7.6 等信息,表明我们 Mitmproxy 安装成功的,而我们的安装平台是:Windows-10-10.0.18362-SP0 (也就是 Windows 10)。
上面我们在 Windows 平台上安装了 Mitmproxy 接下来我们来看看如何在 Linux 上安装。
在 Linux 里面也是基于 Python 安装的,我们也使用如下命令:
这里使用 pip3 的原因是,Linux 自带 Python2 所以这里是为了区分也是为了使用 Python3 所以使用。
这里我们也是可以查看 mitmproxy 版本号,这回就不会出现 Windows 里面报错的信息了,命令如下:
上面给大家讲解了 Mitmproxy 在 Windows 、Linux 平台的安装,如果你对安装有任何问题欢迎留言!
接下来,我们来看看 Mitmproxy 有哪几项功能,如下:
和 Charles 一样,Mitmproxy 运行于自己的 PC 上,mitmproxy 会在 PC 的 8080 端口运行,然后开启一个代理服务,这个服务实际上是一个 HTTP/HTTPS 的代理。
手机和 PC 在同一个局域网内,设置代理为 mitmproxy 的代理地址,这样手机在访问互联网的时候流量数据包就会流经 mitmproxy,mitmproxy 再去转发这些数据包到真实的服务器,服务器返回数据包时再由 mitmproxy 转发回手机,这样 mitmproxy 就相当于起了中间人的作用,抓取到所有 Reques t和 Response,另外这个过程还可以对接 mitmdump,抓取到的 Request 和 Response 的具体内容都可以直接用 Python 来处理,比如得到Response 之后我们可以直接进行解析,然后存入数据库,这样就完成了数据的解析和存储过程。
首先,我们需要运行 mitmproxy,命令如下所示:
启动 mitmproxy 的命令如下:
之后会在8080端口上运行一个代理服务,如下图所示。
右下角会出现当前正在监听的端口。
或者启动 mitmdump,它也会监听 8080 端口,命令如下所示:
运行结果如下图所示。
将手机和 PC 连接在同一局域网下,设置代理为当前代理。首先看看PC的当前局域网IP。
Windows 上的命令如下所示:
Linux 和 Mac 上的命令如下所示:
输出结果如下图所示。
Linux/Mac:
Windows:
一般类似 10.*.*.*或 172.16.*.* 或 192.168.1.* 这样的 IP 就是当前 PC 的局域网 IP,例如此图中 (Linux)PC 的 IP 为192.168.220.130,手机代理设置类似如下图所示。
这样我们就配置好了mitmproxy的的代理。
确保 mitmproxy 正常运行,并且手机和 PC 处于同一个局域网内,设置了 mitmproxy 的代理,具体的配置方法可以参考官方文档。
运行 mitmproxy,命令如下所示:
设置成功之后,我们只需要在手机浏览器上访问任意的网页或浏览任意的 App 即可。
不过还要安装证书才可以使用,操作方法启动 mitmproxy 之后,在手机上也设置代理之后,打开浏览器输入:mitm.it 下载手机平台的证书并安装。
例如在手机上打开页面便会呈现出手机上的所有请求,如下图所示。
这就相当于之前我们在浏览器开发者工具监听到的浏览器请求,在这里我们借助于mitmproxy完成。Charles完全也可以做到。
这里是刚才手机打开百度页面时的所有请求列表,左下角显示的 1/36 代表一共发生了 36 个请求,当前箭头所指的是第一个请求。
每个请求开头都有一个 GET 或 POST,这是各个请求的请求方式。紧接的是请求的 URL。第二行开头的数字就是请求对应的响应状态码,后面是响应内容的类型,如 text/html 代表网页文档、image/gif 代表图片。再往后是响应体的大小和响应的时间。
当前呈现了所有请求和响应的概览,我们可以通过这个页面观察到所有的请求。
如果想查看某个请求的详情,我们可以敲击回车,进入请求的详情页面,如下图所示。
可以看到 Headers 的详细信息,如 Host、Cookies、User-Agent 等。
最上方是一个Request、Response、Detail的列表,当前处在Request这个选项上。这时我们再点击TAB键,即可查看这个请求对应的响应详情,如下图所示。
最上面是响应头的信息,下拉之后我们可以看到响应体的信息。针对当前请求,响应体就是网页的源代码。
这时再敲击TAB键,切换到最后一个选项卡 Detail,即可看到当前请求的详细信息,如服务器的IP和端口、HTTP协议版本、客户端的IP和端口等,如下图所示。
mitmproxy 还提供了命令行式的编辑功能,我们可以在此页面中重新编辑请求。
敲击 e 键即可进入编辑功能,这时它会询问你要编辑哪部分内容,如 Cookies、Query、URL 等,每个选项的第一个字母(或数字)会高亮显示。
敲击要编辑内容名称的首字母(或数字)即可进入该内容的编辑页面,如敲击 5 即可编辑请求的方式,敲击 6 即可修改 GET 请求参数 Query 。
这时我们敲击 6,进入到编辑 Query 的页面。我们可以看到已经有一些参数了,我们可以敲击 a 来增加一行,然后就可以输入参数对应的 Key 和 Value,如下图所示。
这里我们输入 Key 为 wd,Value 为aiyc.top。
然后再敲击 esc 键和 q 键,返回之前的页面,再敲击 e 和 4 键修改 Path 。和上面一样,敲击 a 增加 Path 的内容,这时我们将 Path 修改为 aiyuechuang,如下图所示。
再敲击 esc 和 q 键返回,我们就再修改一下请求,也是敲击 e 和 5 修改 method,这个时候会出现如下结果,操作如下动图:
敲击 a 保存修改,敲击 r 重新发起修改后的请求,即可看到上方请求方式前面多了一个回旋箭头,这说明重新执行了修改后的请求。这时我们再观察响应体内容,即可看到请求失败,因为我的博客是不存在这个请求链接的,如下图所示。
以上内容便是 mitmproxy 的简单用法。利用 mitmproxy ,我们可以观察到手机上的所有请求,还可以对请求进行修改并重新发起。
接下来,我们对编辑操作进行简单的小结:
e进入 Part,a增加一行
主界面操作快捷键:
?帮助文档,q返回/退出程序,b保存 response body,f输入过滤条件,k上,j下,h左,l右,space翻页,enter进入接口详情,z清屏,e编辑,r重新请求
过滤请求,和上面的操作类似,只不过接下来的操作,是按键 f 开始,输入 f 之后你会看见如下位置会有相对应的显示:
接下来,我们就可以过滤请求了,这个地方我们来筛选请求结果不是 200 的(也就是得到请求不是 200 的结果),我们需要添加的命令为:!(~c 200) 也就是如下命令:
详细的呢,我们来下面来讲:
Many commands in the mitmproxy tool make use of filter expressions. Filter expressions consist of the following operators:
mitmproxy 工具中的许多命令都使用了过滤表达式。过滤器表达式由以下操作符组成:
注意: 这里把英文写出来不是为了炫技,而是希望看见这篇的小伙伴也顺便学习一下英文,英文真的很重要!
~aMatch asset in response: CSS, Javascript, Flash, images.匹配响应中的:CSS、JavaScript、Flash、Images。
~b regexBody使用正则表达式,匹配响应体 Body
~bq regexRequest body请求体~bs regexResponse body响应体
~c intHTTP response code匹配 HTTP 状态码~d regexDomain域名(可以理解成 url,但不准确)
~dst regexMatch destination address匹配目的地址
~eMatch error匹配错误
~h regexHeader匹配头部
~hq regexRequest header匹配请求头
~hs regexResponse header匹配响应头
~httpMatch HTTP flows匹配 HTTP 流
~m regexMethod匹配模式(方法)
~markedMatch marked flows匹配标记流
~qMatch request with no response匹配请求无响应
~sMatch response匹配响应
~src regexMatch source address匹配源地址
~t regexContent-type header内容类型的头
~tcpMatch TCP flows与 TCP 流
~tq regexRequest Content-Type header请求的 content - type 头
~ts regexResponse Content-Type header响应的 content - type 头
~u regexURLURL
~websocketMatch WebSocket flows匹配 WebSocket 流量
!unary not not
&and and
|or or
(...)grouping 分组
Fiddler、Charles 也有这个功能,而且它们的图形界面操作更加方便。那么 mitmproxy 的优势何在?mitmproxy 的强大之处体现在它的另一个工具 mitmdump,有了它我们可以直接对接 Python 对请求进行处理。代码可以关注本账号私信获取哦!
*请认真填写需求信息,我们会在24小时内与您取得联系。