首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
宝塔
V2EX  ›  Python

有道翻译后台破解的问题。

  •  
  •   woshichuanqilz · 129 天前 · 1476 次点击
    这是一个创建于 129 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://zhuanlan.zhihu.com/p/40797421

    我是参考这个文章,对有道翻译的后台做了一个 js 的破解。 破解的原理大概是这样的, post 的 form 里面有几个值, f, d, ....之类的:

    img

    但是应该是有有道的后台做了更新,这个破解失效了, 返回错误码。 {"errorCode":50}

    现在这种情况,我应该从哪种思路往下继续进行? 我的理解是这个 post 请求已经完全还原了真实的浏览器的请求不知道还有那些可以尝试的点?

    第 1 条附言  ·  126 天前
    # -*- coding: utf-8 -*-
    # from lizhelib.scrapy_lizhe import *
    import requests
    import time
    def str_MD5(origin_string):
        import hashlib
        m = hashlib.md5()
        m.update(origin_string.encode('utf-8'))
        return m.hexdigest()
    
    keyword = "apple"
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7',
        'Connection': 'keep-alive',
        'Content-Length': '237',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1539804542.6380599; _ntes_nnid=063365ee317cb05d955f6037c9b7f99b,1562145610441; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcKgh9yV1U-IdF1piKVw; ___rl__test__cookies={}'.format(int(round(time.time() * 1000, 0))),
        'Host': 'fanyi.youdao.com',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }
    
    salt_value = str(int(round(time.time() * 1000, 0))) + '1'
    form_data = {
    'i': 'live',
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': salt_value,
    'sign': str_MD5("fanyideskweb" + keyword + salt_value + "97_3([email protected][KZQmqjTK"),
    'ts': str(int(round(time.time() * 1000, 0))),
    'bv': str_MD5(headers["User-Agent"]),
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME'
    }
    
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    response = requests.post(url, headers=headers, data=form_data)
    print(response.content)
    
    7 回复  |  直到 2019-07-15 13:49:25 +08:00
        1
    throns   129 天前 via Android
    这里不是不允许讨论破解相关的问题吗?
        2
    locoz   128 天前 via Android
    这个不叫“后台破解”…看标题还以为你在搞渗透,叫“请求加密参数破解”还差不多。
    网上的文章与实际情况有出入是很正常的事情,照抄之后发现没有效果你可以自己逆向一下看看到底长啥样,不知道入口在哪可以参考原文章(只要变动不太大)。
    然后你现在这情况,你确定已经完全还原了么?抓个包对比一下看看?
        3
    wc110302   128 天前
    这个应该叫 js 加密破解吧
        4
    caneman   126 天前
    随手看了一下,这是 POST 需要的 data,

    i: hello
    from: AUTO
    to: AUTO
    smartresult: dict
    client: fanyideskweb
    salt: 15631545265703
    sign: 12f5d8eb3bdf901b889fc20ae5b9f64c
    ts: 1563154526570
    bv: 3a019e7d0dda4bcd253903675f2209a5
    doctype: json
    version: 2.1
    keyfrom: fanyi.web
    action: FY_BY_REALTlME

    关键的加密函数如下:
    var r = function(e) {
    var t = n.md5(navigator.appVersion)
    , r = "" + (new Date).getTime()
    , i = r + parseInt(10 * Math.random(), 10);
    return {
    ts: r,
    bv: t,
    salt: i,
    sign: n.md5("fanyideskweb" + e + i + "97_3([email protected][KZQmqjTK")
    }

    其中参数 e 是需要翻译的字符串
        5
    woshichuanqilz   126 天前
    @caneman 对, 我看教程的分析也是这样的, 关键的点就是时间戳和 md5, 但是这样用 python 写下来得到的返回值是 error 50, 我自己写的和之前教程上的代码都是这样。

    ```
    # -*- coding: utf-8 -*-
    # from lizhelib.scrapy_lizhe import *
    import requests
    import time
    def str_MD5(origin_string):
    import hashlib
    m = hashlib.md5()
    m.update(origin_string.encode('utf-8'))
    return m.hexdigest()

    keyword = "apple"
    headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7',
    'Connection': 'keep-alive',
    'Content-Length': '237',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1539804542.6380599; _ntes_nnid=063365ee317cb05d955f6037c9b7f99b,1562145610441; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcKgh9yV1U-IdF1piKVw; ___rl__test__cookies={}'.format(int(round(time.time() * 1000, 0))),
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
    }

    salt_value = str(int(round(time.time() * 1000, 0))) + '1'
    form_data = {
    'i': 'live',
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': salt_value,
    'sign': str_MD5("fanyideskweb" + keyword + salt_value + "97_3([email protected][KZQmqjTK"),
    'ts': str(int(round(time.time() * 1000, 0))),
    'bv': str_MD5(headers["User-Agent"]),
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME'
    }

    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    response = requests.post(url, headers=headers, data=form_data)
    print(response.content)
    ```
        6
    woshichuanqilz   126 天前
    @caneman 代码我 append 到楼顶了, 回复里面贴代码缩进有问题
        7
    caneman   126 天前
    @woshichuanqilz
    猜测,你写的 ts/salt 的部分可能有问题(我没细看),还有就是 bv 部分,appVersion 和 User-Agent 的输出格式不一样的
    我下面的这个版本是能正常返回结果的,随便写的有点糙,凑合着看吧
    import requests
    import time
    import random
    import hashlib


    def md5(k):
    m = hashlib.md5()
    m.update(k.encode('UTF-8'))
    return m.hexdigest()


    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    appversion = '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'

    keyword = 'youdao'

    ts = int(time.time() * 1000)
    salt = ts * 10 + int(random.uniform(0, 1) * 10)
    bv = md5(appversion)
    sign = md5('fanyideskweb' + keyword + str(salt) + '97_3([email protected][KZQmqjTK')

    data = {
    'i': keyword,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': salt,
    'sign': sign,
    'ts': ts,
    'bv': bv,
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
    }

    headers = {
    'Cookie':'YOUDAO_MOBILE_ACCESS_TYPE=1; [email protected]; JSESSIONID=aaadmmGUl_OHN4PD2j0Vw; ___rl__test__cookies={}; OUTFOX_SEARCH_USER_ID_NCOO=298433689.2039179'.format(ts),
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'}

    res = requests.post(url, data=data, headers=headers)
    print(res.text)
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   948 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 22:37 · PVG 06:37 · LAX 14:37 · JFK 17:37
    ♥ Do have faith in what you're doing.