小项目-有道翻译接口参数

参考:
python爬虫-有道翻译(js分析)
Python调用有道词典翻译

小项目-有道翻译接口参数_第1张图片
有道翻译

目标:使用python的post功能向该网页中提交翻译内容,并返回结果。

  1. 获取有道翻译post发送信息的网站:F12--network--all--找到Request Method:POST的一项,其中的Headers中general就是发往服务器的网址。
  2. post表格形式:在该项最后有Form Data就是表格形式:
    表格形式如下:
 'i': trans_str,
 'from': 'AUTO',
 'to': 'AUTO',
 'smartresult': 'dict',
 'client': 'fanyideskweb',
 'salt': salt,
 'sign': sign,
 'doctype': 'json',
 'version': '2.1',
 'keyfrom': 'fanyi.web',
 'action': 'FY_BY_REALTIME',
 'typoResult': 'True'

真实发去的形式:i=hello%0A&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=1512717804298&sign=9423bd6df96d0bbc5403db99d44691ea&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_ENTER&typoResult=false

  1. 头信息:headers:
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.9
Content-Length:201
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:OUTFOX_SEARCH_USER_ID_NCOO=493676007.9814818; _ntes_nnid=a7f22502fe6d2b3cb13f2c26de0ae65f,1512699043959; JSESSIONID=abcZkCYYfkyNHfvsh_0aw; SESSION_FROM_COOKIE=fanyiweb; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; [email protected]; ___rl__test__cookies=1512717804296
Host:fanyi.youdao.com
Origin:http://fanyi.youdao.com
Proxy-Connection:keep-alive
Referer:http://fanyi.youdao.com/?keyfrom=dict2.index
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
X-Requested-With:XMLHttpRequest
  1. 解析post表格含义,并创建真实的表格数据,以发送到服务器被识别。
    参考文章:Python爬虫,破解有道翻译接口参数
    我直接使用他的函数生成的表格信息,向大神致敬。
    大致过程:找到salt和sign生成对应的js文件,找到Source文件夹中Ctrl+F搜索salt或者sign找到的对应文件fanyi.min.js,然后保存到本地。使用在线js格式化工具格式化代码,网址:http://tool.oschina.net/codeformat/js/。找到与network中post递交的Form大致一样的部分。
t.translate = function(e, t) {
        T = u("#language").val();
        var n = b.val(),
        r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)),
        o = u.md5(E + n + r + O),
        a = n.length;
        if (D(), x.text(a), a > 5e3) {
            var l = n;
            n = l.substr(0, 5e3),
            o = u.md5(E + n + r + O);
            var c = l.substr(5e3);
            c = (c = c.trim()).substr(0, 3),
            u("#inputTargetError").text("有道翻译字数限制为5000字,“" + c + "”及其后面没有被翻译!").show(),
            x.addClass("fonts__overed")
        } else x.removeClass("fonts__overed"),
        u("#inputTargetError").hide();
        f.isWeb(n) ? i() : s({
            i: n,                     //待翻译内容
            from: _,                  //可默认为Auto
            to: C,                    //可默认为Auto
            smartresult: "dict",
            client: E,                //fanyideskweb
            salt: r,                  //需要模拟的参数1
            sign: o,                 //需要模拟的参数2
            doctype: "json",
            version: "2.1",
            keyfrom: "fanyi.web",
            action: e || "FY_BY_DEFAULT",
            typoResult: !1
        },
        t)
    },
    t.showResult = a

其中salt:r = "" + ((new Date).getTime() + parseInt(10 * Math.random(),10)),含义:

  • ((new Date).getTime() :返回new Date距 1970 年 1 月 1 日之间的毫秒数
    替代为python代码为:time.time()*1000。time.time()当前时间的时间戳(1970纪元后经过的浮点秒数),故乘以1000
  • parseInt(10 * Math.random(),10)):以十进制(也可以是2、8)解析10 * Math.random()(0到10之间的随机数,不包括0和10),得到一个十进制的随机整数。
    python代替: str(int(time.time() * 1000) + random.randint(1, 9))
  1. 完整代码如下:
import hashlib
import time
import random
import requests


def create_Data(trans_str):
    salt = int(time.time() * 1000) + int(random.random() * 10)
    client = 'fanyideskweb'
    a = "rY0D^0'nM0}g5Mm1z%1G4"
    m = hashlib.md5()
    digStr = client + trans_str + str(salt) + a
    m.update(digStr.encode('utf-8'))
    sign = m.hexdigest()
    data = {
        'i': trans_str,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': salt,
        'sign': sign,
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTIME',
        'typoResult': 'True'
    }
    return data


url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=null"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0",
}


trans_str = '你好'
payload = create_Data(trans_str)
r = requests.post(url, data=payload, headers=headers)
print(r.json())

要根据情况修改headers的信息和表格data的信息。 执行会出现{'errorCode': 50}的情况,解决办法:将url中 http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=null_o去掉即可,这样可访问。原因不知,好像得到翻译结果差了些。

你可能感兴趣的:(小项目-有道翻译接口参数)