大家好,继第二十六课 - 汇率查询(http请求的应用)后,这节课我们继续讲讲有关HTTP请求的内容。从标题可知,本节课会着重讲解如何抓包,从而在云扩RPA中使用HTTP请求时会更加得心应手。
准备工作:
1)准备开发流程的电脑,请打开云扩学院链接查看云扩RPA编辑器运行的硬件&软件要求(https://academy.encoo.com/wiki/Studio/quickStart/HarewareAndSoftwareRequirements.md?)。
2)打开云扩官网(https://www.encoo.com/)下载编辑器并安装。
3)安装Fiddler
首先介绍下什么是HTTP:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
有关于HTTP基础教程请参考:
https://www.runoob.com/http/http-tutorial.html
客户端发送一个到服务器的HTTP请求一般包括请求行(请求方法、URI、协议/版本)、消息报头、请求正文,如下图所示:
如何分析HTTP请求和使用HTTP请求组件?
1. 拖入“HTTP请求”组件,点击“设置请求方式”:
2. 从抓包工具Fiddler看到的请求数据如图,观察发现存在方法、URL、内容类型、头部、正文:
3. 配置“设置请求方式”页面
头部信息可能存在多个,一般选择几个比较重要的写入(比如Cookie之类,实在不行可全部放入)
正文包含在双引号内("),正文内容中包含的双引号用两个双引号替换
HTTP请求中方法和URL必填,内容类型、头部、正文根据不是必填,需要根据不同的请求协议做判断(上述案例需要完整填入)
方法:POSTURL:"https://ocrapi-ugc.taobao.com/ocrservice/ugc"内容类型:application/json头部:key = "Authorization",value="APPCODE xxxxxxxxxxxxxxxxxxxxx"正文:"{""img"": ""iVBORw0KGgo(内容太多,只放入部分)AAAANSUhEUgAAAc""}"
抓包工具介绍 - Fiddler
上面我们学习了如何分析HTTP请求和如何运用HTTP请求组件,很多系统客户不会提供接口文档,当我们需要获取某些数据时需要自己去分析,以下提供一个抓包案例:
小编最近做的一个项目,需要获取CRM系统中的特定单号的金额和数量,问题是此CRM系统仅仅支持某小众浏览器,金额和数量是以弹框形式展示,用获取文本组件不能获取所需要的内容,经研究后发现使用HTTP请求方法可以获取金额和数量(如果客户可以提供接口文档,可以忽略抓包教程),市面上抓包工具很多,Google Chrome, Fiddler, Charles, Wireshark等等,本课中我们介绍Fiddler。
第一步:安装Fiddler,具体可参考Fiddler的官方文档
https://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureFiddler
Fiddler界面的左边是捕捉到的所有HTTP请求列表,点击需要查看的请求,界面的右上部分窗口是HTTP请求的详细信息,点击Raw选项卡,可以看到HTTP请求的原始信息,除头部信息外,还可以看到Cookie和请求数据内容,界面的右下角是HTTP的响应内容
第二步:打开CRM查询页面,输入需要查询内容,点击查询按钮,这时候会发现Fiddler所有请求页面增加了一条(或几条)请求,怎么判断这条请求消息是有用的呢,一般情况分析此请求消息的响应消息,若响应消息里有我们需要的内容,就可以拿来使用
Fiddler抓包截图如下,方法、URL、内容类型、头部(除Cookie)、正文,都有明确字段
我们尝试使用Postman(接口测试工具)验证此接口通过,但是一旦Cookie过期或者重新登录,此接口验证即失败,这一步,我们需要考虑注入Cookie操作,使用Selenium模拟登录操作获取所需要的Cookie并保存在本地,下面是登录页面Python代码
driver = webdriver.Chrome()driver.get("URL")driver.find_element_by_xpath('登录用户名的XPath').clear()driver.find_element_by_xpath('登录用户名的XPath').send_keys(username)driver.find_element_by_xpath('登录密码的XPath').clear()driver.find_element_by_xpath('登录密码的XPath').send_keys(password)driver.find_element_by_xpath('提交按钮的XPath').click()# 登录后,获取Cookie方法datacomm = driver.get_cookies()for i in datacomm: print(i['value']) cookie = "JSESSIONID=" + i['value']filepath = "D:\RPA\cookie.txt"with open(filepath, "w") as file: # ”w"代表着每次运行都覆盖内容 file.write(cookie)
获取到的完整Cookie
[{'domain': 'partner.li-ning.com.cn', 'httpOnly': False, 'name': 'JSESSIONID', 'path': '/', 'secure': False, 'value': '0001gx26W6Gm1s4uMXP9fuwSkpr:1acvpjor4'}]
根据Fiddler所需要的Cookie数据,只取value中的值
JSESSIONID=0001gx26W6Gm1s4uMXP9fuwSkpr:1acvpjor4
参考:
Selenium:http://www.selenium.org.cn/
Postman:https://www.postman.com/
第三步:选中刚查询到的单号,点击客户收货确认按钮
Fiddler抓包截图如下,其中URL多了jhd和cjrq不确定字段,观察发现这2个字段可以通过第一个响应消息里截获。注意,此接口也需要注入Cookie。
Postman验证此接口通过,获取响应消息中的金额和数量。
至此,我们可以通过HTTP请求成功获取到特定单号中的数量和金额。
由于上述情况需要Cookie注入,Cookie是存在过期时间的,一旦过期,请求的内容会失败或者不准确,建议判断响应消息中是否包含特定字符,若未包含,那程序需要重新登录去获取新的Cookie。
总结来说,在未提供接口文档的前提下,HTTP请求需要人为去分析相关的请求中的关联关系,可能会遇到一些难以绕过的点,普通的内部系统一般针对查询操作问题不大,如果遇到Token或者经过加密的字段难度会比较大,需要具体情况具体分析。