通过网页查看服务器算法,利用17ce自动化监测网站
原标题:利用17ce自动化监测网站
作者:suliuer
1
概述
运维工作中,遇到网络抖动报警或者有用户反馈故障的时候,我们会使用类似17ce这些测速工具诊断一下全国各地访问站点的实际情况。但是,上医治于未病之前,作为一个有态度的运维,我们应该在第一时间就掌握到“病情”,真正在第一时间内解决处理掉问题。这样,当别人再反馈过来的时候,我们就可以胸有成竹地说:“不慌,问题不大”。
那么,如何做到在第一时间就获取到“病情”呢?现在很多的运维系统都有比较完善的监测模块,有很多的途径可以实现监测目的。今天我们提供一个小思路,利用17ce这类监测工具,不间断地监测站点然后获取到监测数据,再通过数据分析将有异常的数据取出来,然后通过邮件、短信等方式通知出来。
关键问题是,我们如何不间断地获取到监测数据呢?这篇文章我们就来谈谈如何利用17ce不间断地获取监测数据,从而提前将异常信息发送出来。
2
前端验证自动获取监测数据
2.1验证算法
如何获取到17ce上的数据呢?通过对17ce post的数据仔细观察后发现,其获取监测数据的整体思路是,在前端先将verfiy和url post到服务器,然后返回一个tid,利用tid再获取所各个监测站点的具体监测数据。
那么 verfiy 这个数据是怎么来的呢?经过另一番仔细的研究之后发现,其发送的verfiy数据是可能是客户端js文件加密生成的,具体是(https://www.17ce.com/smedia/js/common.js?ver=20171213):
postdata+=”&verify=”+hex_sha1(“C^dLMi%r&JH7bkmdFCgGl8”+ decodeURIComponent(url) + rt + “TnvST&D9LJ”);
测试一下:先利用这个算法生成一段verfiy,再在17ce上输入具体url获取数据时post的verfiy做一个对比,发现两者确实是一样的。
2.2获取数据
既然知道了verfiy的生成算法,剩下的就好办了。只要根据算法,将要监测的url生成verfiy然后post给服务器,再根据返回的tid取到所有监测点数据就可以了。以下是简要的示例函数。
#
defget_response(url,post,headers):
_response = requests.post(url,data=post,headers=headers)
response = _response.content
data = ast.literal_eval(response)
returndata
#获取tid
defget_tid(url):
url_17ce_ping = 'http://www.17ce.com/site/ping'
verify = hashlib.sha1("C^dLMi%r&JH7bkmdFCgGl8"+ url +"1"+"TnvST&D9LJ").hexdigest()
url_str = urllib.quote(url)
post = '&url=%s&curl=&rt=1&nocache=0&host=&referer=&cookie=&agent=&speed=&postfield=&verify=%s&pingcount=&pingsize=&area[]=0&area[]=1&area[]=2&area[]=3&&isp[]=0&isp[]=1&isp[]=2&isp[]=6&isp[]=7&isp[]=8&isp[]=4&'% (
url_str,verify)
data = get_response(url_17ce_ping,post,headers)
returndata['tid']
#根据tid获取到站点的具体监测数据
defget_17ce_data(tid):
_post = {
'tid': tid,
'num':'1',
'ajax_over':'0'
}
post = urllib.urlencode(_post)
url_17ce_ajax = 'http://www.17ce.com/site/ajaxfresh'
datas = {}
day = time.strftime("%Y%m%d_%H%M%S",time.localtime())
ping_log = 'ping_%s.log'% day
foriinrange(60):
time.sleep(1)
datas.update(get_response(url_17ce_ajax,post,headers))
data = datas['freshdata']
withopen(ping_log,'a+')asping:
json.dump(datas,ping)
returndata
运行代码之后,各个站点的监测数据手到擒来。然后我们可以启用定时任务,根据监测数据,再编写代码或者直接接入现有的运维系统对线上业务进行不间断监测分析,只要有异常,就马上将异常告警信息发送出来。
好像一切都很美好。
3
使用17ce API获取监测数据
说起来挺让人忧伤的。不知道大家七夕过得怎样,反正我是知道,七夕之后监测数据就获取不到了。
怀着忐忑不安的心情去观察一下,发现17ce改代码了。主要改变在两个方面:
数据传输由原来的http改成wss;
验证方式由原来的前端生成verfiy改成服务器验证code。
3.1http和wss区别
在这里顺便学习一下http和wss两个协议的区别。
在HTTP1.0中,HTTP的生命周期通过Request来界定,也就是一个Request一个Response,那么这次HTTP请求就结束了。现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断地向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽资源。
在这种情况下,HTML5定义了WebSocket协议,能更好地节省服务器资源和带宽,并且能够更实时地进行通讯。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。简单点说,WebSocket 就是减小客户端与服务器端建立连接的次数,减小系统资源开销,只需要一次HTTP 握手,整个通讯过程是建立在一次连接状态中,也就避免了HTTP的非状态性,服务端会一直与客户端保持连接,直到你关闭请求,同时由原本的客户端主动询问,转换为服务器有信息的时候推送。
总而言之,HTTP像只有七秒记忆的鱼,每次搞完事之后就不记得之前的事情(无状态),重新搞事情就需要再从头到尾把台词念一遍(浪费资源);而WebSocket有点类似回调函数,就有事了我来找你(有数据就返回),不用每次傻乎乎跑过来问你(节省表情)。
17ce原来是数据返回是使用HTTP的,每次使用17ce的时候服务器都要返回几十个监测站点数据,总让人感受到服务器满满的压力;改成wss传输之后,理论上网站的体验效果应该会好一些。
3.2服务器验证code
把数据传输改成wss协议其实问题也不大,关键是数据返回的验证方式改成服务器验证code,这就让人挺难过的。
那么这个code是怎么来的呢?原来17ce API 监控接口开放了(https://www.17ce.com/site/api),根据API文档接口显示:
$user: 17ce 用户名$pwd: 17ce 密码$t:时间戳md5(base64_encode(substr(md5($pwd), 4, 19).trim($user).$t));对密码md5加密后第 4位起截取 19位字符,拼接用户名和时间戳进行base64和md5加密。如 $user:test@ 17ce.com $pwd: 123456$t: 1532598458用户密码 MD5 加密:e10adc3949ba59abbe56e057f20f883e截取字符串:dc3949ba59abbe56e05拼接后进行 base64 和 md5 加密: 6c5a1867714c4a9629b0e858977d4467
17ce API 使用账号密码生成code,然后将user、code、ut三个数据post到服务器就可以取到数据,服务端账号使用积分制,0.1分/次/测速点,默认注册账号时有10万积分。
3.3使用17ce API获取数据
本着研究实践的精神,认认真真用python写了17ce API的接口然后取回了监测数据,心里很开心。
# -*- coding: utf-8 -*-
importtime
importhashlib
importbase64
importrequests
importjson
importurllib
importast
defgen_code(user,passwd,t):
#对密码md5加密后第4位起截取19位字符
_passwd_md5 = hashlib.md5(passwd)
passwd_md5 = _passwd_md5.hexdigest()
passwd_str = passwd_md5[4:23]
#拼接用户名和时间戳进行base64和md5加密
gen_str = passwd_str + user +str(t)
code_base64 = base64.b64encode(str(gen_str))
_code = hashlib.md5(code_base64)
code = _code.hexdigest()
returncode
defget_response(url,data):
response = requests.post(url,data=data)
response = _response.content
data = ast.literal_eval(response)
returndata
defget_tid(code,user,t,url):
url = urllib.quote(url)
printurl
url_17ce_ping = 'https://api.17ce.com/ping'
form_data = {
"user":str(user),
"code":str(code),
"t":str(t),
"url": url,
"isp":'1',
"city": [1535]
}
result = get_response(url_17ce_ping,form_data)
tid = result['tid']
returntid
defget_data(tid,code,user,t):
url_17ce_ajax = 'https://api.17ce.com/ajaxfresh'
form_data = {
"user":str(user),
"code":str(code),
"t":str(t),
"url": url,
"tid": tid,
"num":'1',
"ajax_over":'0'
}
result = []
foriinrange(40):
time.sleep(1)
_result = get_response(url_17ce_ajax,form_data)
result.append(_result)
returnresult
if__name__ =='__main__':
user = 'my@mail.com'
passwd ='my_passwd'
t =int(time.time())
code = gen_code(user,passwd,t)
# 要监测的业务站点url ='www.baidu.com'
tid = get_tid(code,user,t,url)
printget_data(tid,code,user,t)
4
使用selenium获取监测数据
4.1selenium简介
继续本着研究实践的精神,感觉这个问题可以换个思路再优化抵达一下。17ce页面上的数据是通过Java来动态生成,直接通过url抓取页面数据是获取不到的,怎么办呢。有没有一种不需要通过验证的方式获取到监测数据呢?
还好我们有自动化测试框架selenium,我们可以通过selenium编写代码让浏览器:
自动加载网页;
模拟表单提交(比如模拟登录),获取需要的数据;
页面截屏;
判断网页某些动作是否发生等。
selenium需要和第三方的浏览器一起搭配使用,支持以下浏览器,需要把对应的浏览器驱动下载到Python的对应路径下:
Chrome:https://sites.google.com/a/chromium.org/chromedriver/home
FireFox:https://github.com/mozilla/geckodriver/releases
PhantomJS:http://phantomjs.org/
IE:http://selenium-release.storage.googleapis.com/index.html
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Opera:https://github.com/operasoftware/operachromiumdriver/releases
当然,Linux下也支持的,只要下载对应的浏览器驱动版本即可。
4.2selenium获取数据
这样,我们就可以使用selenium获取到监测数据了,整体思路:
调用模拟浏览器,打开www.17ce.com;
输入想要监测的url,如www.baidu.com,然后提交submit;
等待返回数据;
利用 BeautifulSoup 解析出监测数据。
简要示例代码如下:
# -*- coding: utf-8 -*-
fromseleniumimportwebdriver
importtime
frombs4importBeautifulSoup
importre
browser = webdriver.Chrome() #调用本地的Chrome浏览器
browser.get('http://www.17ce.com')#请求页面,打开一个浏览器窗口
kw = browser.find_element_by_id("url")#获取到输入框的元素
su = browser.find_element_by_id("btn_wr")#获取到提交按钮
kw.send_keys("www.baidu.com")#输入要监测的站点网址
su.click()#点击提交按钮
time.sleep(10)#等待数据加载
html_text = browser.page_source#获得页面数据
browser.quit()#关闭浏览器
print(html_text)
#利用BeautifulSoup解析数据
soup = BeautifulSoup(html_text,'html.parser')
tr_data = soup.find_all('tr',attrs={'id': re.compile("trd+")})
foriintr_data:
printi#继续使用BeautifulSoup解析数据
...
这样子,我们又开开心心地获取到监测数据了。
5
结语
很多站点初期发展中,为了拦截额外的请求流量,会在前端设置一层加密算法,只要验证不经过服务端,数据还是比较容易获取到的,但是这种方式到后期会逐渐替换掉,验证会转移到服务端。
使用selenium+BeautifulSoup的方式获取数据,此方法仅用于学习测试拓展交流,切勿用于实际线上业务。另外selenium毕竟是基于模拟浏览器获取数据,再加上站点可能随时改版,稳定性难以保证。线上业务的监测需要依赖于稳定的监测数据,推荐使用官方API接口去获取监测数据。
获取到原始监测数据之后,我们对监测数据进行分析处理,比如:
多维度监测:通过区域、运营商、时段分析,迅速、实时监测线上业务可靠性、可用性;
辅助排障:通过原始监测数据报错分析,网站在什么时间访问出错,出什么错,在哪些区域、哪些ISP出错,等详细的出错信息,并提供原始出错信息记录,辅助运维排查定位问题;
存档历史数据:整合原始监测数据,存档入库或生成全网网络质量报表,作为后期网络质量对比评测等。
根据分析的结果,然后灵活展开广阔的运维应用,真正做到运筹帷幄,自动化运维。
END
如果你喜欢我们的文章,请转发到朋友圈
公众号
ywjtshare
运维军团
专注运维技术与传承,分享丰富原创干货返回搜狐,查看更多
责任编辑:
通过网页查看服务器算法,利用17ce自动化监测网站相关推荐
- 通过网页查看服务器算法,服务器使用国密(SM2/SM3/SM4)证书,通过浏览器访问
1. Apache + Gmssl Apache 本身不支持国密,需要修改代码支持GMTLS 下载解压: wget http://archive.apache.org/dist/httpd/httpd ...
- 通过网页查看服务器算法,java分析html算法(java网页蜘蛛算法示例)
遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费我们宝贵的时间. 第二个办法用开源组织htmlparser的包 ...
- 利用冰盾DDOS***监控器查看服务器是否被***
选择,而如何查看服务器是否正在被***,怎样判断服务器是否遭遇DDOS***,冰盾为客户提供一款免费工具可以实时查看当前服务器是否遭遇*** - 冰盾DDOS***监控器. 就***常识而言,如果出现 ...
- 网站f12怎么查询服务器,网页f12查看服务器
网页f12查看服务器 内容精选 换一换 主机管理的云服务器列表中仅显示以下主机的防护状态:在所选区域购买的华为云主机已接入所选区域的非华为云主机在所选区域购买的华为云主机已接入所选区域的非华为云主机若 ...
- 服务器上登录网页ip地址,查看服务器上登录的ip地址
查看服务器上登录的ip地址 内容精选 换一换 确认虚拟机主网卡已经正确分配到IP地址.登录虚拟机内部.执行ifconfig命令或ip address查看网卡的IP信息.Windows虚拟机可以在命令行 ...
- dmidecode服务器型号,利用dmidecode 查看系统的硬件信息,不错
最新工作上要统计服务器的一些硬件信息,但是,我又不想跑到机房里去核对,于是想能不能通过命令去查询我想要的信息呢.肯定是可以的,dmidecode可查看的信息很多. 1.查看服务器的品牌与型号 dmid ...
- 然后查看服务器运行情况,netstat命令查看服务器运行情况
在运行netstat -n|grep 80 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'时发现有大量的time_wait,出现这种 ...
- python开发自动化创建一个任务下发到手机_如何利用Fabric自动化你的任务
首先让我们首先看一个例子.我们知道在*NIX下面,uname命令是查看系统的发行版. 可以写这样一个Fabric脚本: from fabric.api import run def host_type ...
- 查看计算机远程端口,如何查看服务器远程端口号.doc
如何查看服务器远程端口号 如何查看服务器远程端口号 篇一:服务器端口怎么打开_系统端口安全配置 服务器端口怎么打开 方法/步骤 1. 1 首先在右下角电脑连接右键打开网络连接设置. 2. 2 选择一个 ...
最新文章
- python3 str bytes bytearray 互相转换
- 动态规划之——拦截导弹(nyoj79)
- ITIL基础概述与实战案例分析(下)
- XML文件解析--Python
- 由m种数字组成的n位数有多少个
- Oracle数据库基本操作
- Spring.NET教程(三)——对象的创建(基础篇)
- 128.深入 cookie ,session
- 音视频基础:H264、H265、MPEG-4、VP8、VP9编码基础知识
- Score UVA - 1585
- 电脑录屏怎么录?3个方法,教你如何录制视频
- Data Matrix码
- C专家编程 第1章 C:穿越时空的迷雾 1.4 KR C
- SysML-Sec: A Model-Driven Environment for Developing Secure Embedded Systems
- Excel打印时完整显示合并的单元格区域
- 这五款牛逼的 IDEA 插件,堪称代码质量检查利器!
- STM32——NFC门禁模块(RC522)
- Nat网络地址转换实验
- nyoj82 迷宫寻宝(一) (bfs)
- 电子商务系统的建设方式及技术选择