您的位置:首页 > 理论基础 > 计算机网络

python实战:利用chrome抓包插件HTTP间谍分析有道翻译反爬机制

2019-02-20 17:02 507 查看

本次实战目标站点:http://fanyi.youdao.com/?keyfrom=fanyi-new.logo ,主要利用HTTP间谍抓包插件分析有道翻译反爬机制,该抓包能帮我们过滤掉一些不需要的常规请求如图片,css等。
**1、**首先分析提交翻译请求后URL的规律。打开chrome的开发者工具,输入翻译内容后点击“翻译”按钮,可以看到服务器返回的数据,如下图所示:

此时我们点击插件,可以看到其只有一个请求结果,相对与chrome的请求结果更加直观快速得分析请求规律。从插件返回的结果中我们可以看到请求的URL为:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule ,请求时还携带了cookies和表单数据,下面我们将其展开:

**2、**经过多次的请求翻译,并且每次翻译后都去查看插件返回的数据,比较每次翻译时发送的表单数据的值可知参数i、salt、sign、bv、ts这些是不同的,其他的数据都是一样的,因此我们需找到这些参数的赋值规律。以salt为关键词我们进行全局搜索,如下图:

搜索结果可知salt在fanyi.min.js文件中,再从该文件中搜索可得到其定义,而且同时我们也得到了其他参数的定义,这里来做个简介:

e:代表的是需要翻译的字符串。
t:代表浏览器的版本号md5值,即User-Agent的md5值。
r:当前时间的时间戳。
salt:参数r加上0-10的随机字符串。
sign:使用的是"fanyideskweb"+e+salt+"p09@Bn{h02_BIEe]$P^nG"的md5值。

知道生成原理后,我们就可以写Python代码,以下是全部代码:

import js2py
import random,time
import hashlib

def set_user_agent():
USER_AGENTS = [
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]
user_agent = random.choice(USER_AGENTS)
return user_agent

js_str = """ r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);"""
js_text = js2py.EvalJs()
js_text.execute(js_str)

def getSalt():
# salt的公式r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10))
# 方法1:利用js2py模块,获取salt值:
#   salt_text = js2py.EvalJs()
#   salt_text.execute(js_str)
salt = js_text.i

# 方法2:将js_str翻译成python代码获取salt值:
#   salt = int(time.time()*1000) + random.randint(0, 10)
return salt

def getMd5(v):
md5 = hashlib.md5()
md5.update(v.encode("utf-8"))
sign = md5.hexdigest()
return sign

def getSign(key, salt):
sign = "fanyideskweb" + key + str(salt) + "p09@Bn{h02_BIEe]$P^nG"
sign = getMd5(sign)
return sign

class Youdao():
def __init__(self):
self.headers = {
"Accept": "application/json,text/javascript,*/*;q=0.01",
"Accept-Encoding": "gzip,deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Host": "fanyi.youdao.com",
"Origin": "http://fanyi.youdao.com",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
'User-Agent': set_user_agent(),
'Referer': 'http://fanyi.youdao.com/',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-315098820@10.169.0.83; JSESSIONID=aaaBADMLwT0Wj8je4pjKw; OUTFOX_SEARCH_USER_ID_NCOO=1012727192.8548353; YOUDAO_MOBILE_ACCESS_TYPE=0; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcVeHVPsZKjL9bo6tjKw; user-from=http://www.youdao.com/; from-page=http://www.youdao.com/; ___rl__test__cookies=1550646069714'
}
self.data = {
'i': None,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
'client': 'fanyideskweb',
'keyfrom': 'fanyi.web',
"doctype": "json",
"version": "2.1",
"action": "FY_BY_CLICKBUTTION",
"typoResult": "false",
"bv":getMd5(set_user_agent()),
"ts":js_text.r,
'salt': None,
'sign': None
}
self.url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
def translate(self, word):
self.data['i'] = word
self.data['salt'] = getSalt()
self.data['sign'] =getSign(word,getSalt())
res = requests.post(self.url, headers=self.headers, data=self.data)
return res.json()['translateResult'][0][0]['tgt']

if __name__ == '__main__':
youdao = Youdao()
while True:
word=input('请输入要翻译的内容:')
print("翻译结果为:{}".format(youdao.translate(word)))

运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: