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

本次实战目标站点: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)))

运行结果如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值