浪潮SA5212M4的IPMI设置
最近在马云家看到浪潮SA5212M4的服务器性价比很好,缺点就是风扇的噪音受不了,按卖家提示在IPMI设置风扇转速来降噪
进BIOS,选择Server Mgmt –>BMC network configuration,进入BMC网络配置界面
里面的BMC Sharelink是指把网口2也复用为管理口,后面的dedicated才是我们的专用管理口设备,选Get BMC Dedicated 选择Manual 配置独享BMC端口的IP
configuration选择static; 配置为静态模式,填一个管理IP地址
如果原用户admin 密码admin有效,可略过下面的BMC用户设置,不行则按下新增
BMC用户设置:进进BIOS,选择Server Mgmt –>BMC User Settings在里面新增一个用户,里面的通道选1,权限选administrator,新增完后还要在charge里把用户enable.
然后就可以把自己电脑IP设置为以上管理IP同网段的地址,网线连接IPMI管理口来来访问,记得要用https,进去后把风扇速度设置为手动控制20%就可以了,
设置后,拔了电源线会失效,但如果在系统内关机不断电不会失效。
python-selenium定位方法
元素选择策略
在 WebDriver 中有 8 种不同的内置元素定位策略:
class name 定位class属性与搜索值匹配的元素(不允许使用复合类名)
css selector 定位 CSS 选择器匹配的元素
id 定位 id 属性与搜索值匹配的元素
name 定位 name 属性与搜索值匹配的元素
link text 定位link text可视文本与搜索值完全匹配的锚元素
partial link text 定位link text可视文本部分与搜索值部分匹配的锚点元素。如果匹配多个元素,则只选择第一个元素。
tag name 定位标签名称与搜索值匹配的元素
xpath 定位与 XPath 表达式匹配的元素
class name定位
1.查找元素:页面打开f12,点击左上角的箭头,再去点击对应需要定位的元素定位,找到该元素下的class属性,在ctrl+f查找,该属性是否唯一,唯一就可以定位,不唯一就换其他方法定位:(一时找不到class唯一的,就用下图代替说明问题)
定位代码:
# 导入需要的包
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome() # 实例化webdriver
driver.get("http://www.baidu.com/") # 打开网页
driver.find_element(By.CLASS, "login-item")
nam、id、link tex、tag name定位和class name类似
driver.find_element(By.NAME, "name定位元素")
driver.find_element(By.ID, "id定位元素")
driver.find_element(By.LINK_TEXT, "LINK_TEXT定位元素")
driver.find_element(By.PARTIAL_LINK_TEXT, "PARTIAL_LINK_TEXT定位元素")
driver.find_element(By.TAG_NAME, "TAG_NAME定位元素")
主要介绍xpath定位,这个可以应对测试中80%以上的定位
1.使用xpath方法结合id、name、class定位也可以
driver.find_element(By.XPATH, "//*[@class='login-default']").click()
driver.find_element(By.XPATH, "//*[@name='login-default']").click()
driver.find_element(By.XPATH, "//*[@id='login-default']").click()
2.xpath:其他属性定位:在实际工作过程中,往往会遇到一个元素id、name、class属性都没有,这时候也可以通过其它属性定位到
driver.find_element(By.XPATH, "//*[@type='password']")
3.xpath:标签定位,在实际工作中,还会遇到一种情况就是相同属性具有同一个名字,这时就需要通过标签筛选,定位更准一点
如果不想制定标签名称,可以用*号表示任意标签
如果想制定具体某个标签,就可以直接写标签名称
driver.find_element(By.XPATH, "//input[@type='password']").send_keys("gld123")
driver.find_element(By.XPATH, "//a[@class='login']").click()
4.xpath:相对路径/绝对路径定位,
如果一个元素,它的属性不是很明显,无法直接定位到,这时候我们可以先找它上一层元素(父元素)
找到父元素后,再找下个层级就能定位到了
要定位的是input这个标签,它的老爸的id=s_kw_wrap.
要是它老爸的属性也不是很明显,就找它爷爷id=form
于是就可以通过层级关系定位到
driver.find_element(By.XPATH, "//div[@class='login-default']/div/span/input").send_keys("17027517202")
5.xpath:索引,
如果一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟。
虽然双胞胎兄弟很难识别,但是出生是有先后的,于是可以通过它在家里的排行老几定位到。
用xpath定位老大、老二和老三(这里索引是从1开始算起的,跟Python的索引不一样)
driver.find_element(By.XPATH, "//div[@class='login-default']/div[2]/span/input").send_keys("17027517202")
6.xpath:逻辑运算
- xpath还有一个比较强的功能,是可以多个属性逻辑运算的,可以支持与(and)、或(or)、非(not)
- 一般用的比较多的是and运算,同时满足两个属性
driver.find_element(By.XPATH, "//input[@type='password' and @class='login-default']").send_keys("gld123")
使用selenium
一、环境搭建
(1)安装selenium库:
如果安装不上就上国内源
pip install selenium -i http://pypi.douban.com/simple –trusted-host pypi.douban.com
(2)下载Chrome驱动:
chromedriver的下载地址http://chromedriver.storage.googleapis.com/index.html
需要注意的是这里有很多种版本,这里需要下载和你浏览器版本最接近的一个。注意是最接 近,打开浏览器,在地址栏输入chrome://version/便可以查看到谷歌当前的版本号
解压会得到一个chromedriver.exe(名字不同就必成这个)文件。如果没有最新版本可到以下地址查看
https://googlechromelabs.github.io/chrome-for-testing/
因为chrome会自动更新,所以要在服务或者计划任务管理(控制面板-系统和安全-windows工具-计划任务)里把自动更新禁用
(3)将Chromedriver加入到path:
1.桌面右击谷歌浏览器–>打开文件所在位置,将刚解压的.exe文件复制一份到此路径下
- 将刚刚解压的.exe文件复制一份,放入python根目录中
至于如何查看自己的python根目录,可在cmd下进python,再输入 where python可得目录
- 将.exe文件再复制并放到当前工程文件同文件夹下
可以测试下看是否可以,python编译器,编写如下代码,运行如果出现窗口,提示正受测试软件控制,说明可以了,(反应慢,第一次可能要1分多钟)
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
sleep(2)
driver.quit()
到此处可能已可以了,如果不行进行4和5步,
(4)将浏览器环境变量添加到path:
打开开始菜单->我的电脑(或计算机)->系统属性->高级系统设置->环境变量,编辑用户变量里的path, 在最后面添加;C:\Program Files (x86)\Google\Chrome\Application\ 或者在最前面添加C:\Program Files (x86)\Google\Chrome\Application\ 修改完之后点击确定按钮保存配置。
如果出错,则:
将chromedriver.exe文件放入python的scripts目录,并将该scripts目录添加到系统path变量中;
3、找到Google Chrome安装目录,一般在C:\Users\Administrator\AppData\Local\Google\Chrome\Application\Google Chrome.exe,将Google Chrome.exe复制一个出来,并重命名为chrome.exe,并将目录C:\Users\Administrator\AppData\Local\Google\Chrome\Application\添加到系统path变量中
注意你的路径不一定和他相同,这个就是右击谷歌浏览器图标的路径,复制下来就好了
VMWare虚拟机设置各虚拟机与主机间局域内网
装好爱快虚拟机后,可以把此虚拟机的其中一张虚拟网卡和电脑及其它虚拟机设置共组一个局域内网。
方法为在虚拟机设置中把这张网卡设置为“仅主机”,然后启动爱快,把这张网卡绑定一个lan口,把IP设置为192.168.80.1,然后进主机系统的网卡设置,把虚拟的Vnet1这个网卡的IP地址设置为192.168.80.2,此时在电脑主机中访问192.168.80.1应该能访问到爱快路由界面了。
看显卡性能比较用显卡天梯图,CPU也有CPU天梯图
找直播m3u8地址
之前找一个被cloudflare加速过的直播,要找他的m3u8地址,那么可以根据fiddler来看到直播的m3u8地址,然后看这个地址里的一串字母,然后用find,在find里把match case,secrch binaries,decode compressed content,select matches,unmark old results等都点上,再查找,最后在之前页面返回响应的syntaxview选项卡里找到m3u8链接,之前因为没有在上面选decode,所以这里面是乱码。
Trunk、Hybrid、Access、Tag、Untag、Pvid
1、Trunk口,Trunk口上可以同时传送多个VLAN的包,一般用于交换机之间的链接。
2、Hybrid口,Hybrid口上可以同时传送多个VLAN的包,一般用于交换机之间的链接或交换机于服务器的链 接。
3、Access口,Access口只能属于1个VLAN,一般用于连接计算机的端口。
4、Tag和Untag,tag是指vlan的标签,即vlan的id,用于指名数据包属于那个vlan,untag指数据包不属于任何vlan,没有vlan标记。
5、PVID即 Port Vlan id,代表端口的缺省VLAN。交换机从对端设备收到的帧有可能是不带VLAN标签的数据帧,但所有以太网帧在交换机中都是以带VLAN标签的形式来被处理和转发的,因此交换机必须给端口收到的不带VLAN标签的数据帧添加上VLAN标签。为了实现此目的,必须为交换机配置端口的缺省VLAN。当该端口收到不带VLAN标签的数据帧时,交换机将给它加上该缺省VLAN的VLAN标签。通俗的讲,指的是native Vlan,即不打Vlan标记的Vlan,一般默认为Vlan 1
Port-base VLAN ID,是表示网络通信中基于端口的VLAN ID,一个端口可以属于多个VLAN,但是只能有一个PVID,收到一个不带tag头的数据包时,会打上PVID所表示的VLAN号,视同该VLAN的数据包处理。一个物理端口只能拥有一个PVID,当一个物理端口拥有了一个PVID的时候,必定会拥有和PVID相等的VID,而且在这个VID上,这个物理端口必定是Untagged Port。PVID的作用只是在交换机从外部接受到可以接受Untagged 数据帧的时候给数据帧添加TAG标记用的,在交换机内部转发数据的时候PVID不起任何作用。
二、端口的Tag和Untag
若某一端口在vlan设定中被指定为非标记端口untagged port, 所有从此端口转发出的数据包上都没有标记 (untagged)。若有标记的数据包进入交换机,则其经过非标记端口时,标记将被去除。因为目前众多设备并不支持标记数据包,其也无法识别标记数据包,因此,需要将与其连接的端口设定为非标记。
若某一端口在vlan设定中被指定为标记端口tagged port, 所有从此端口转发出的数据包上都将有标记 (tagged)。若有非标记的数据包进入交换机,则其经过标记端口时,标记将被加上。此时,其将使用在ingress 端口上的pvid设定作为增加的标记中的vlan id号。
三、端口的封装类型:ISL、802.1Q
ISL Trunk上所有的包都是tag的(Cisco专用);
802.1q 设计的时候为了兼容与不支持VLAN的交换机混合部署,特地设计成可以不tag:但是只有一个VLAN允许不tag,这样N个VLAN,(N-1)个都tag了,不tag的包一定是来自那个特殊VLAN的,所以不会乱套。(当然也可以所有VLAN都tag)
四、各端口收发数据的区别
端口类型 | 收发 | 描述 |
Access | 收报文 | 判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则直接丢弃(缺省) |
发报文 | 将报文的VLAN信息剥离,直接发送出去 | |
Trunk | 收报文 | 收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有判断该trunk端口是否允许该 VLAN的数据进入:如果可以则转发,否则丢弃 |
发报文 | 比较端口的PVID和将要发送报文的VLAN信息,如果两者相等则剥离VLAN信息,再发送,如果不相等则直接发送 | |
Hybrid | 收报文 | 收到一个报文判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则判断该hybrid端口是否允许该VLAN的数据进入:如果可以则转发,否则丢弃 |
发报文 | 判断该VLAN在本端口的属性(disp interface 即可看到该端口对哪些VLAN是untag, 哪些VLAN是tag)如果是untag则剥离VLAN信息,再发送,如果是tag则直接发送 |
以下案例可以帮助大家深入理解华为交换机的hybrid端口模式
[Switch-Ethernet0/1]int e0/1
[Switch-Ethernet0/1]port link-type hybrid
[Switch-Ethernet0/1]port hybrid pvid vlan 10
[Switch-Ethernet0/1]port hybrid vlan 10 20 untagged
[Switch-Ethernet0/1] int e0/2
[Switch-Ethernet0/2]port link-type hybrid
[Switch-Ethernet0/2]port hybrid pvid vlan 20
[Switch-Ethernet0/2]port hybrid vlan 10 20 untagged
此时inter e0/1和inter e0/2下的所接的PC是可以互通的,但互通时数据所走的往返vlan是不同的。
以下以inter e0/1下的所接的pc1访问inter e0/2下的所接的pc2为例进行说明
pc1所发出的数据,由inter0/1所在的pvid vlan10封装vlan10的标记后送入交换机,交换机发现inter e0/2允许vlan 10的数据通过,于是数据被转发到inter e0/2上,由于inter e0/2上vlan 10是untagged的,于是交换机此时去除数据包上vlan10的标记,以普通包的形式发给pc2,此时pc1->p2走的是vlan10
再来分析pc2给pc1回包的过程,pc2所发出的数据,由inter0/2所在的pvid vlan20封装vlan20的标记后送入交换机,交换机发现inter e0/1允许vlan 20的数据通过,于是数据被转发到inter e0/1上,由于inter e0/1上vlan 20是untagged的,于是交换机此时去除数据包上vlan20的标记,以普通包的形式发给pc1,此时pc2->pc1走的是vlan20
青龙
先宝塔,里面装docker,再用以下命令在docker中装青龙
docker run -dit \
--name QL \
--hostname QL \
--restart always \
-p 5700:5700 \
-v $PWD/QL/config:/ql/config \
-v $PWD/QL/log:/ql/log \
-v $PWD/QL/db:/ql/db \
-v $PWD/QL/scripts:/ql/scripts \
-v $PWD/QL/jbot:/ql/jbot \
whyour/qinglong:latest
再在宝塔和云服务器后台放开入站规则5700端口,然后登录
获取京东cookies,
chrome浏览器访问 https://m.jd.com
然后点击 我的
并用手机京东app扫描弹出来的二维码。
然后F12打开浏览器调试工具,点击 Application
找到 Cookies
点击 https://home.m.jd.com
,
在右边我们找到 pt_key
和 pt_pin
两个变量的值,将他们记录下来。
配置环境变量
在我们拿到 pt_key
和 pt_pin
两个变量后我们就可以开始配置青龙面板的环境变量了。
在面板的右上角我们可以看到环境变量这个选项,我们点击增加。
在弹出的窗口中输入变量,名称为 JD_COOKIE
值就是刚刚获取的 pt_key
和 pt_pin
两个变量,注意别搞反了(中间和后面的分号不可少),如
pt_key=AAJhuUiCADQS_fjhNxcGreONxMHJdtIQ1Tg0dCJK4n3FHHqW4sEv3Y-4dmXH1C8;pt_pin=jd_6ca591d6a;
拉取脚本库
在配置好环境变量后我们就可以开始拉取脚本了,由于脚本库会更新我们拉取脚本的命令也可以放在定时任务中。
添加库:
进入面板-右上角“定时任务”-分别填入相关信息。提供个人设置,给大家参考。其中任务名、任务定时可自定义。
名称:
拉取京东脚本
拉库命令填写下方代码:
ql repo https://gh.fakev.cn/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"
或者:
ql repo https://hub.fastgit.xyz/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"
PS:两者任选其一即可
国外鸡可直连Github的话填写下方代码
ql repo https://github.com/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"
定时规则(每天8点30):
30 8 * * *
填写完毕后我们点击播放按钮运行一次脚本,稍等一下,让它转一会儿。然后刷新页面,就能看到库的脚本了
看到上面的内容可以说就大功告成了,京东脚本就会按照脚本设置的时间自动执行任务获取京豆和红包。
四、安装青龙面板依赖
一键依赖
docker exec -it qinglong bash
## 安装青龙依赖,如果按上面的安装青龙容器脚本,此处要把qinglong改成QL.
curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/FlechazoPh/QLDependency/main/Shell/QLOneKeyDependency.sh | sh
四、消息推送(可选)
在每次执行完我们需要一个推送来告诉我们今天获取了多少京豆,以及cookies有没有过期。我们在面板的配置文件项的第44行找到server酱并填入SendKey并保存即可。
目前Server酱使用门槛变高,改用钉钉机器人是一个比较好的选择,具体步骤可参考这篇文章:青龙面板 消息推送功能设置之钉钉机器人消息推送! – 孤岛 (feiji.work)
五、总结
这是一个非常好的服务器回血项目,即使在配置和搭建上比较复杂,但是收益还是相当可观的,配置得当你甚至在收回本金后还能赚不少钱。
其它补充内容可参考:搭建青龙面板运行京东、B站脚本 – 登山亦有道 (chenyan98.cn),目前发表原文的站点无法访问,看seo关键词估计是被请去喝茶了,。
其它参考链接
青龙面板自动领京东京豆,做农场浇水、萌宠、工厂、种豆等任务-缙哥哥 (dujin.org)
青龙面板拉取常用脚本(JD签到)目前在维护的脚本更新(2021-10-04)
https://blog.csdn.net/m0_61705773?type=blog
其它用法
Fiddler脚本
写好脚本则更能够帮你抓取数据到文件、数据库,部分实现自动化,甚至远超一些同类专业产品。
常规功能
可以用来指定抓取所有的WEB通讯,也可以只抓取指定进程的通讯。
File-Capture Traffic ; Any Process 或拖动选定进程窗口
2.可以用来查看一个URL打开后,浏览器与后端的交互
3.可以查看任意一个HTTP交互,看请求和响应的原始报文,帮助你了解HTTP协议
4.可以设置丰富的过滤条件,确保聚焦
5.可以以各种形态查看数据,并提供了工具来做转换【这个比较丰富,但隐藏较深】
6.可以编写脚本,实现各个阶段的处理
可以基于类似Windows下的WScript,甚至使用一些ActiveX组件实现并发机制、通讯与数据存储。
OnBeforeRequest 在请求发生前调用,请求经过Fiddler发送给服务器之前会先调用这个函数,因此,如果想要修改请求,可以写在这个函数里
OnPeekAtResponseHeaders 在头到达后调用
OnBeforeResponse 在内容到达后,还没有处理前调用,从服务器读完响应后,且在将响应发送给客户端之前执行的。通过修改这个函数,可以修改服务器的响应头或者响应体
把网页上的JSON文件下载到本地
把以下内容放入OnBeforeResponse里面,
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
}
if (oSession.uriContains("https://www.tiktok.com/api/recommend/item_list/")){
var strBodytk=oSession.GetResponseBodyAsString();
//var spstk = oSession.PathAndQuery.slice(-58,);
//FiddlerObject.alert(spstk)
var timestamptk=new Date().getTime();
var filenametk = "D:\\tiktokzl" + "\/" + timestamptk + ".json";
//var filename = "D:\抖音评论资料" + "/" + sps + timestamp + ".json";
var curDatetk = new Date();
var swtk : System.IO.StreamWriter;
if (System.IO.File.Exists(filenametk)){
swtk = System.IO.File.AppendText(filenametk);
swtk.Write(strBodytk);
}
else{
swtk = System.IO.File.CreateText(filenametk);
swtk.Write(strBodytk);
}
swtk.Close();
swtk.Dispose();
}
抓到 请求的数据 保存本地txt 文件里面
- 将下代码 粘到OnBeforeRequest 的函数里头
if
(oSession.fullUrl.Contains("填写需要抓取的域名")) { var
fso; var
file; fso = new
ActiveXObject("Scripting.FileSystemObject"); //文件保存路径可自定义 file = fso.OpenTextFile("填写保存TXT文件地址",8 ,true, true); file.writeLine("Request url: "
+ oSession.url); file.writeLine("Request header:"
+ "\n"
+ oSession.oRequest.headers); file.writeLine("Request body: "
+ oSession.GetRequestBodyAsString()); file.writeLine("\n"); file.close();}
自动化抓取图片并提出重复的
static function FileExsitInDirectory(fso:Object, filename:String , dirpath:String )
{
var curPath = dirpath + “/” + filename ;
var objset , objFolders , FolderName, ret;
if (fso.FileExists(curPath))
{
return curPath;
}
else
{
var objset = fso.getFolder(dirpath);
var objFolders = objset.SubFolders;
var fenum = new Enumerator(objset.SubFolders);
for (var i = 0 ; !fenum.atEnd(); fenum.moveNext(),i++)
{
var FolderName = dirpath + "/" + fenum.item().Name + "/";
var ret = FileExsitInDirectory(fso, filename, FolderName);
if( ret != "NULL" )
{
return ret
}
}
return "NULL";
}
}
static function OnBeforeResponse(oSession: Session)
{
if (m_Hide304s && oSession.responseCode == 304)
{
oSession[“ui-hide”] = “true”;
}
//如果来自指定网站,且是jpg,则写文件 image/jpeg
if(
(oSession.RequestHeaders.AllValues("Host").Contains(".mm115.net") ||
oSession.RequestHeaders.AllValues("Host").Contains(".jzsjwk.com"))
&&
oSession.ResponseHeaders.AllValues("Content-Type").Contains("image/jpeg") )
{
var whindex = oSession.url.IndexOf ('?');
if (whindex <= 0)
whindex = oSession.url.Length;
var file_url = oSession.url.Substring (0,whindex);
whindex = oSession.url.IndexOf ('.jpg');
if ((whindex > 0) && (oSession.GetResponseBodyAsString().Length > 40000))
{
whindex = whindex+4;
file_url = file_url.Substring (0,whindex).Replace ('/','_').Replace('%','B').Replace('?','7').Replace('&','-').Replace('img22.jzsjwk.com','img1.mm115.net');
var file_path = "d:/PRVIT/jpg/"+file_url;
try
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
var retval = FileExsitInDirectory(fso,file_url,"d:/PRVIT/jpg/");
FiddlerObject.log (retval);
if ("NULL" == retval)
{
var stream = new ActiveXObject('Adodb.Stream');
stream.Mode = 3;
stream.Open();
stream.Type = 1;
//stream.Charset = 'unicode';
//stream.WriteText(s);
stream.Position = 0;
stream.Type = 1;
//stream.Position = 2;
//var bs = stream.Read();
//stream.Position = 0;
stream.Write(oSession.responseBodyBytes);
//stream.SetEOS();
stream.SaveToFile(file_path,1);
stream.Close();
oSession["ui-backcolor"] = "yellow";
}
else
{
oSession["ui-strikeout"] = "true";
oSession["ui-backcolor"] = "green";
}
}
catch(err)
{
FiddlerObject.log (err.message);
oSession["ui-backcolor"] = "red";
}
}
else
{
oSession["ui-color"] = "red";
}
}
}
抓取内容,并存放到数据库
var sql = “”;
try
{
var con =new ActiveXObject(“ADODB.Connection”);
//con.Provider="Microsoft.ACE.OLEDB.18.0";
var rs=new ActiveXObject("ADODB.Recordset");
/**
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Y:/TEST/fiddler_web_service_analysis.accdb;Persist Security Info=False;
**/
//var access_db_path = "d:/fiddler_web_service_analysis.accdb" ;
//con.ConnectionString="Data Source="+access_db_path;
//ODBC DSN name ,config by windows odbc
con.open("DSN=db_hsb_vs_ahs;") ;
//FiddlerObject.alert(1);
sql = "insert into t_call_record (call_timestamp,request_send_timestamp,response_recv_timestamp,sitename,url,request,response,spend_second,content_type,content_length) values(" +
strVar1(oSession.Timers.FiddlerBeginRequest) + "," +
strVar1(oSession.Timers.ClientDoneRequest) + "," +
strVar1(oSession.Timers.ServerDoneResponse) + "," +
strVar1(oSession.RequestHeaders.AllValues("Host")) + "," +
strVar1(oSession.url.Substring (0,whindex)) + "," +
strVar1(oSession.RequestHeaders.ToString ()+oSession.GetRequestBodyAsString()) + "," +
strVar1(oSession.ResponseHeaders.ToString ()+oSession.GetResponseBodyAsString()) + "," +
etimes*1000 + "," +
strVar1(oSession.ResponseHeaders.AllValues("Content-Type")) +"," +
oSession.ResponseHeaders.AllValues("Content-Length")+0
+");";
//FiddlerObject.alert(sql);
rs.open(sql,con);
oSession["ui-color"] = "red";
//rs.close();
// rs=NULL;
con.close();
// con = NULL;
}
catch(exp)
{
var txt="Error description: " + exp.message + "\n\n" + sql;
FiddlerObject.log(txt);
oSession["ui-strikeout"] = "true";
}
- 在此处【重定向urlplace】host和url的判断
if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
oSession.hostname = "api.mobile.xxx.com"
}
- 在此处【设置请求的header】,测试网络爬虫时候会用,
// TSET FOR Spider: 根据网站来限定请求
if (oSession.HostnameIs("test.com")) {
// 模拟修改请求的用户端ip,这种情况对独立的网络有效,对于公司级的网络,还是有一些问题,需要借助vpn
oSession.oRequest["X-Forwarded-For"]="16.12.23.16";
// 修改请求的header
oSession.oRequest["User-Agent"] = "spider Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0";
}
2019.04.26 手机模拟添加cookie(区别于种cookie 在onBeforeResponse里)
- 删除所有的cookie
oSession.oRequest.headers.Remove("Cookie");
- 新建cookie
oSession.oRequest.headers.Add("Cookie", "username=testname;testpassword=P@ssword1");
注意: Fiddler script不能直接删除或者编辑单独的一个cookie, 你需要用replace方法或者正则表达式的方法去操作cookie的string
if (oSession.HostnameIs("******") && oSession.oRequest.headers.Exists("Cookie") ) {
var sCookie = oSession.oRequest["Cookie"];
//用replace方法或者正则表达式的方法去操作cookie的string
//sCookie = sCookie.Replace("cookieName=", "ignoreme=");
sCookie = sCookie + ";tt_spver=1";
oSession.oRequest["Cookie"] = sCookie;
}
在此处修改response的bady内容【使用正则匹配方式】
if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
// 获取response中的body字符串
var strBody=oSession.GetResponseBodyAsString();
// 用正则表达式或者replace方法去修改string
var regx = '"stream_mode":\d*?'
strBody=strBody.replace(regx,'"stream_mode":0');
// 弹个对话框检查下修改后的body
FiddlerObject.alert(strBody);
// 将修改后的body,重新写回Request中
oSession.utilSetResponseBody(strBody);
}
在此处修改json中的数据【修改接口字段的值】
if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
// 获取Response Body中JSON字符串
var responseStringOriginal = oSession.GetResponseBodyAsString();
// 转换为可编辑的JSONObject变量
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
// 修改JSONObject变量,修改字段数据
responseJSON.JSONObject["new_core"] = "True";
responseJSON.JSONObject["stream_mode"] = 5;
// 重新设置Response Body
var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
oSession.utilSetResponseBody(responseStringDestinal);
}
在此处修改json中的数据【增加接口字段=值】
if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
// 获取Response Body中JSON字符串
var responseStringOriginal = oSession.GetResponseBodyAsString();
// 转换为可编辑的JSONObject变量
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
// 修改JSONObject变量,修改字段数据
responseJSON.JSONObject["type_arr"] = ["bullet"];
// 重新设置Response Body
var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
oSession.utilSetResponseBody(responseStringDestinal);
}
使指定URL支持CORS跨域请求有时候,你调用一个 json 接口,发现跨域了,你需要去找接口的开发人支持跨域,显然傻傻等待后端开发完毕再联调是低效率的, 这个时候就就要在后台改完之前就自己实现跨域的模拟,此时 fiddler 显然是再好不过的利器。支要持 CORS 跨域, 就是要为请求的返回头增加 Access-Control-Allow-Origin 属性,因此需要修改 OnBeforeResponse函数,在该函数的末尾添加你的 CORS 逻辑
static function OnBeforeResponse(oSession: Session) {
...
if(oSession.uriContains("要处理的url")){
oSession.oResponse["Access-Control-Allow-Origin"] = "允许的域名";
oSession.oResponse["Access-Control-Allow-Credentials"] = true;
}
}
oSession常用的相关属性和方法
// 修改session中的显示样式
oSession["ui-color"] = "orange";
// 移除http头部中的MQB-X5-Referer字段
oSession.oRequest.headers.Remove("MQB-X5-Referer");
// 修改http头部中的Cache-Control字段
oSession.oRequest["Cache-Control"] = "no-cache";
// 修改host
oSession.host = "example.domain";
// 修改Origin字段
oSession.oRequest["Origin"] = "http://domain";
// 删除所有的cookie
oSession.oRequest.headers.Remove("Cookie");
// 新建cookie
oSession.oRequest.headers.Add("Cookie", "username=cookiename;");
// 修改Referer字段
oSession.oRequest["Referer"] = "https://yoururl";
// 获取Request中的body字符串
var strBody=oSession.GetRequestBodyAsString();
// 用正则表达式或者replace方法去修改string
strBody=strBody.replace("aaaa","bbbbbb");
// 将修改后的body,重新写回Request中
oSession.utilSetRequestBody(strBody);
// 判断连接中是否包含字符串str
oSession.uriContains(str)
// 给连接请求添加一个字段TEST
oSession.oRequest["TEST"]="TEST NEW Request";
可参考
https://github.com/gitjayzhen/FiddlerUseScript