爬虫:突破有道翻译js加密(最新)

爬虫:突破有道翻译js加密

代码已上传至个人GitHub,可供下载: 突破有道翻译js加密

思路:(python版本3.6)

1、分析post上传form信息,发现存在加密行为

2、查看网页js文件,分析加密函数

3、根据加密函数原理进行解密,突破有道的翻译接口

 一、打开有道翻译网页,按F12键,并输入内容进行翻译,可以看到服务器对网页请求作出的回应,最需要关注的是上传的信息和上传的路径(URL)。

 

通过多次观察,发现上传的form信息中不断变化的信息是(i、salt、sign、ts),其他的信息都是不变的。

 

根据以往经验就可以判断salt、sign、ts就是有道翻译为机器获取其翻译内容所设置的障碍。

二、寻找js文件中相应的加密函数,并分析其加密过程。

刷新一下网页,就可以看到反馈回来的各种js文件,fanyi.min.js最为显眼,像不像【翻译*密.js】。 

打开fanyi.min.js文件,并将js代码进行格式化,并查找相应的加密函数。

将格式化后的js代码放入txt文档进行查找操作,可以得到如下的加密函数。

 由上图函数可以看到ts、bv、salt、sign参数的由来,整理如下:

  • ts:指的是获取当前的时间戳乘以1000取整
  • bv:获取当前有道翻译版本的MD5编码(版本一般长时间不变)
  • salt:ts加上[1, 10]之间的随机数
  • sign:md5(“fanyideskweb” + 要翻译的内容 + salt + "1L5ja}w$puC.v_Kz3@yYn")

注意:由于有道翻译的反爬虫机制,其中的参数每过一段时间可能会改变,或者直接加密函数发生改变,但不变的解决问题的思想。

三、根据对加密函数的分析,就可以写相对应的解密代码了

from urllib import request, parse
import time
import random
import hashlib
import json


def get_ts():
    ts = str(int(1000 * time.time()))
    return ts


def get_salt(ts):
    salt = ts + str(random.randint(0, 10))
    return salt


def get_sign(words, salt):
    content = 'fanyideskweb' + words + salt + '1L5ja}w$puC.v_Kz3@yYn'
    sign = hashlib.md5(content.encode()).hexdigest()
    return sign


def translate(words, ts, salt, sign):
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

    data = {
        "i": words,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": salt,
        "sign": sign,
        'ts': ts,
        'bv': 'bbb3ed55971873051bc2ff740579bb49',
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTIME",
        "typoResult": "false"
    }

    data = parse.urlencode(data).encode()

    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        # 'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Content-Length': len(data),
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': '__guid=204659719.2422785200799945700.1554675512727.244; OUTFOX_SEARCH_USER_ID=-1327275086@10.169.0.82; OUTFOX_SEARCH_USER_ID_NCOO=378292303.3354687; JSESSIONID=aaaLYwaICIOxi6ofRh8Nw; monitor_count=8; ___rl__test__cookies=1554693830913',
        'Host': 'fanyi.youdao.com',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }

    req = request.Request(url=url, data=data, headers=headers)
    rsp = request.urlopen(req)
    html = rsp.read().decode('utf-8')
    json_data = json.loads(html)
    print('翻译的结果为:' + json_data['translateResult'][0][0]['tgt'])


if __name__ == '__main__':
    words = input('请输入要翻译的内容:')
    ts = get_ts()
    salt = get_salt(ts)
    sign = get_sign(words, salt)
    translate(words, ts, salt, sign)

运行结果:

代码已上传至个人GitHub,可供下载: 突破有道翻译js加密

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值