百度翻译接口获取过程 - Go语言中文社区

百度翻译接口获取过程


记百度翻译接口获取过程

思路:进入到百度翻译(https://fanyi.baidu.com/),首先要找到返回数据的接口:

  1. 打开f12,输入你要翻译的内容后能看到很多请求如图所示;
    在这里插入图片描述
  2. 进入到XHR查看请求的信息(现在一般都是json返回数据);
    在这里插入图片描述
  3. 这里推荐一个网站(https://www.json.cn/)专门解析json字符串,将response中返回的数据丢到这个网站上去解析,解析结果如下;
    在这里插入图片描述
  4. 这里其实就能够看到这是我们要找的接口

思路:既然接口找到了,开始模拟浏览器发送请求。发送请求的数据是什么,请求头会不会有要求?这些都需要去考虑,去找规律:
在这个截图里面找接口、请求方式等
请求接口:https://fanyi.baidu.com/v2transapi
请求方式:POST
请求参数:
from: zh
to: en
query: 喜欢
transtype: translang
simple_means_flag: 3
sign: 64916.269989
token: e3f945758e2f3ef4e897e4bcd6f653db

思路:发现不带header会出问题,最终会发现其实header里面只有Cookie发挥了作用,所以同样在headers里面把request header:
主要拿这里面的cookie
思路:经过对比翻译不同的东西发现请求参数的sign根据不同的翻译内容改变,所以接下来的目标就是找sign的规律。这段规律是通过找博客直接dowm下来用的参考(https://blog.csdn.net/z434890/article/details/85008821),具体怎么去搞定sign,我也得好好研究一下。po出最终的代码:

-- coding: utf-8 --

!/usr/bin/env python

import json
import requests
import execjs

class BaiDuTranslate():
def init(self):
self.base_url = ‘
https://fanyi.baidu.com/v2transapi
self.word = input(“请输入要翻译的单词:”)

def send_request(self, params, header):
    """
    发送请求
    :param params: data参数
    :param header: 请求头
    :return:
    """
    response = requests.post(url=self.base_url, headers=header, data=params).content.decode()
    results = json.loads(response)
    result = results["trans_result"]["data"][0]["result"][0][1] #解析返回的json获取返回值
    return result

def parse_sign(self):
    """
    # https://blog.csdn.net/z434890/article/details/85008821 查找资料得到sign值
    :return: sign值
    """
    jsCode = """
        function a(r) {
            if (Array.isArray(r)) {
                for (var o = 0, t = Array(r.length); o < r.length; o++)
                    t[o] = r[o];
                return t
            }
            return Array.from(r)
        }
        function n(r, o) {
            for (var t = 0; t < o.length - 2; t += 3) {
                var a = o.charAt(t + 2);
                a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
                a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
                r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
            }
            return r
        }
        var i = null;
        function e(r) {
            var t = r.length;
            t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))

            var u = void 0, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);

            u = null !== i ? i : (i = '320305.131321201' || "") || "";
            for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
                var A = r.charCodeAt(v);
                128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
                S[c++] = A >> 18 | 240,
                S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
                S[c++] = A >> 6 & 63 | 128),
                S[c++] = 63 & A | 128)
            }
            for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
                p += S[b],
                p = n(p, F);
            return p = n(p, D),
            p ^= s,
            0 > p && (p = (2147483647 & p) + 2147483648),
            p %= 1e6,
            p.toString() + "." + (p ^ m)
        }
    """
    sign = execjs.compile(jsCode).call("e", self.word)
    return sign

def main(self):
    sign = self.parse_sign() # 获取解析后的sign
    params = {"from": "zh",
              "to": "en",
              "query": self.word,
              "transtype": "translang",
              "simple_means_flag": "3",
              "sign": sign,  # 问题1:不同的搜索关键字值不一样,找出sign的处理方式
              "token": "7c7080081fc1d32690394ea107924e0a"} # post请求参数
    headers = {
        # "Accept": "*/*",
        # "Accept-Encoding": "gzip,deflate,br",
        # "Accept-Language": "zh-CN,zh;q=0.9",
        # "Connection": "keep-alive",
        # "Content-Length": "136",
        # "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Cookie": "BAIDUID=6ACF9C6D814D61BB34FF9B6E42C4FDE0:FG=1; BIDUPSID=6ACF9C6D814D61BB34FF9B6E42C4FDE0; PSTM=1557366108; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=26522_1428_21078_28519_28772_28721_28964_28835_28585_28604_22157; delPer=0; PSINO=2; ZD_ENTRY=baidu; locale=zh; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1557452953; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1557453216; to_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D; from_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D",
        # "Host": "fanyi.baidu.com",
        # "Origin": "https://fanyi.baidu.com",
        # "Referer": "https://fanyi.baidu.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
        # "X-Requested-With": "XMLHttpRequest"
    } # 请求头
    result = self.send_request(params, headers)
    print(result)

if name == ‘main’:
while True:
translate = BaiDuTranslate()
translate.main()

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42689212/article/details/90081515
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-30 08:22:11
  • 阅读 ( 6732 )
  • 分类:职场

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢