吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1163|回复: 8
收起左侧

[求助] 百度翻译-js逆向 问题求助

  [复制链接]
SuperSpiderMan 发表于 2021-10-21 09:51
原文 https://www.52pojie.cn/thread-1474990-1-1.html
我也是通过此方法破解sign,对于字符串长度在30以内的,获取的sign是正确的,但是当长文本(字符串长度大于30)此时获取的sign就是错误的,
有没有遇到此问题的朋友,欢迎指教 谢谢!

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

QingYi. 发表于 2021-10-21 10:40
学会提好一个问题也是一门技术活
Prozacs 发表于 2021-10-21 10:46
本帖最后由 Prozacs 于 2021-10-21 10:48 编辑


用有道吧。google也行,百度翻译的不敢恭维。
 楼主| SuperSpiderMan 发表于 2021-10-21 11:04
QingYi. 发表于 2021-10-21 10:40
学会提好一个问题也是一门技术活

好的大哥,我一定好好描述问题
 楼主| SuperSpiderMan 发表于 2021-10-21 11:13
Prozacs 发表于 2021-10-21 10:46
用有道吧。google也行,百度翻译的不敢恭维。

谷歌翻译需要selenium模拟浏览器才能使用,有道挺好的,请问您有谷歌翻译/有道翻译的代码么
Prozacs 发表于 2021-10-21 11:14
SuperSpiderMan 发表于 2021-10-21 11:13
谷歌翻译需要selenium模拟浏览器才能使用,有道挺好的,请问您有谷歌翻译/有道翻译的代码么

from urllib import parse
import urllib
from win32com.client import Dispatch
import pythoncom
import hashlib
import urllib.parse
import random
import json
g_headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'}
def getWinHttpReq(typeid, timeOut = 25):
    pythoncom.CoInitialize()
    WinHttpReq = Dispatch('WinHttp.WinHttpRequest.5.1')
    WinHttpReq.SetTimeouts(8*10000, 8*10000, timeOut*10000, timeOut*10000)
    if typeid == 2:
        HTTPREQUEST_PROXYSETTING_PROXY = 2
        WinHttpReq.SetProxy(HTTPREQUEST_PROXYSETTING_PROXY,"xxxxxx", "")
    return WinHttpReq
winhttp = getWinHttpReq(1)
def SendWinHttpReq_2(WinHttpReq,sendUrl,reUrl=False,body=None,reType=1,headDic=None):
    global  g_headers, g_headerss, GPcookie
    WinHttpReq.SetOption(6, reUrl)  # 设置是否跳转,False为重定向不自动跳转  True为自动跳转
    if body==None:  # 设置/判断 请求类型 是GET 还是 post
        WinHttpReq.Open('GET', sendUrl, False)
    else:
        WinHttpReq.Open('POST', sendUrl, False)
    WinHttpReq.SetRequestHeader('User-Agent',g_headers['User-Agent']) #设置 浏览器 请求头
    if headDic!=None:
        for i in headDic:
            try:
              WinHttpReq.SetRequestHeader(i,headDic) # 设置头部信息
            except:
                continue
    if body == None:
        WinHttpReq.Send()
    else:
        if type(body) != type('11'):# 判断post数据类型是否为字符串类型
            body = urllib.parse.urlencode(body) # 进行url编码
        WinHttpReq.Send(body) # 发送
    WinHttpReq.WaitForResponse() # 等待响应
    if reType==1:
        try:
          objstr = WinHttpReq.ResponseBody.obj # get 服务器响应返回内容
        except:
            return ''
        return objstr
    if reType==2:
        try:
           return WinHttpReq.GetResponseHeader('Location')
        except:
            try:
                objstr = WinHttpReq.ResponseBody.obj
            except:
                return ''
            if objstr.startswith(b'\xef\xbb\xbf'):
                objstr = objstr[3:]
            return objstr.decode('utf-8','ignore')
    return WinHttpReq.GetAllResponseHeaders()
def SendWinHttpReq(WinHttpReq, sendUrl, reUrl=False, body=None, reType=1, headDic=None, code='utf-8'):
    global g_headers
    WinHttpReq.SetOption(6, reUrl)
    if body == None:
        WinHttpReq.Open('GET', sendUrl, False)
    else:
        WinHttpReq.Open('POST', sendUrl, False)
    WinHttpReq.SetRequestHeader('User-Agent', g_headers['User-Agent'])
    if headDic != None:
        for i in headDic:
            try:
              WinHttpReq.SetRequestHeader(i,headDic)
            except:
                continue
    if body == None:
        WinHttpReq.Send()
    else:
        if type(body) != type('11'):
            body = parse.urlencode(body)
        WinHttpReq.Send(body)
    WinHttpReq.WaitForResponse()
    if reType == 1:
        try:
          objstr = WinHttpReq.ResponseBody.obj
        except:
            return ''
        if objstr.startswith(b'\xef\xbb\xbf'):
            objstr = objstr[3:]
        if code != None:
           return objstr.decode(code,'ignore')
        return objstr
    if reType == 2:
        try:
           return WinHttpReq.GetResponseHeader('Location')
        except:
            try:
                objstr = WinHttpReq.ResponseBody.obj
            except:
                return ''
            if objstr.startswith(b'\xef\xbb\xbf'):
                objstr = objstr[3:]
            if code != None:
                return objstr.decode(code, 'ignore')
            return objstr
    return WinHttpReq.GetAllResponseHeaders()

def strGetlen(strn, strx, strend):
    sint = strn.find(strx)
    strn = strn[sint + len(strx):]
    if strend == "":
        return strn
    eint = strn.find(strend)
    return strn[:eint]
def getMD5(content):
    encoding = 'utf-8'  # 编码用utf-8
    m2 = hashlib.md5()
    m2.update(content.encode(encoding))
    return m2.hexdigest()

def translate(text):
    headData={'X-Requested-With': 'XMLHttpRequest',
              'Accept': 'application/json, text/javascript, */*; q=0.01',
              'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
              'Referer': 'https://fanyi.youdao.com/',
              'Cookie':'OUTFOX_SEARCH_USER_ID=1246911609@10.169.0.81; OUTFOX_SEARCH_USER_ID_NCOO=1980893172.0992112; UM_distinctid=17c7e122e12be-0fd8d04e99cb3a-b7a1438-1fa400-17c7e122e1310ed; P_INFO=18817122609|1634202753|1|youdao_zhiyun2018|00&99|null&null&null#hun&430100#10#0|&0||18817122609; JSESSIONID=aaa0_e_9U6Id95XIy8cYx; ___rl__test__cookies=1634284455005'
              }
    salt = str(random.random()*1000)
    lts = str(random.random()*1000)
    bv =getMD5(g_headers['User-Agent'])
    sign =getMD5("fanyideskweb" + text + salt + "Y2FYu%TNSbMCxc3t2u^XT")
    postUrl = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    postData='i='+urllib.parse.quote(text)+'&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt='+salt+'&sign='+sign+'&lts='+lts+'&bv='+bv+'&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME'
    authUrl  = SendWinHttpReq(winhttp, postUrl, True, postData, 1, headData)
    authUrl = json.loads(authUrl)
    if authUrl['errorCode'] == 0:
        try:
            src = authUrl['translateResult'][0][0]['tgt']
            return src
        except Exception as e:
            print(e)
    else:
        return '翻译失败:'+str(authUrl['errorCode'])
if __name__ == '__main__':
    text ='我也是通过此方法破解sign,对于字符串长度在30以内的,获取的sign是正确的,但是当长文本(字符串长度大于30)此时获取的sign就是错误的'
    msg = translate(text)
    print(msg)

有道
 楼主| SuperSpiderMan 发表于 2021-10-21 11:17
Prozacs 发表于 2021-10-21 11:14
from urllib import parse
import urllib
from win32com.client import Dispatch

感谢感谢
Prozacs 发表于 2021-10-21 11:18
SuperSpiderMan 发表于 2021-10-21 11:13
谷歌翻译需要selenium模拟浏览器才能使用,有道挺好的,请问您有谷歌翻译/有道翻译的代码么

import requests
import execjs
from urllib.parse import quote
debug = False
import json
class Py4Js:

    def __init__(self):
        self.ctx = execjs.compile("""
            function TL(a) {
                var k = "";
                var b = 406644;
                var b1 = 3293161072;      
                var jd = ".";
                var $b = "+-a^+6";
                var Zb = "+-3^+b+-f";   
                for (var e = [], f = 0, g = 0; g < a.length; g++) {
                    var m = a.charCodeAt(g);
                    128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
                    e[f++] = m >> 18 | 240,
                    e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
                    e[f++] = m >> 6 & 63 | 128),
                    e[f++] = m & 63 | 128)
                }
                a = b;
                for (f = 0; f < e.length; f++) a += e[f],
                a = RL(a, $b);
                a = RL(a, Zb);
                a ^= b1 || 0;
                0 > a && (a = (a & 2147483647) + 2147483648);
                a %= 1E6;
                return a.toString() + jd + (a ^ b)
            };      
            function RL(a, b) {
                var t = "a";
                var Yb = "+";
                for (var c = 0; c < b.length - 2; c += 3) {
                    var d = b.charAt(c + 2),
                    d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
                    d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
                    a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
                }
                return a
            }
        """)

    def get_tk(self, text):
        return self.ctx.call("TL", text)


def build_url(text, tk, tl='zh-CN'):
    """
    需要用转URLEncoder
    :param text:
    :param tk:
    :param tl:
    :return:
    """
    return 'https://translate.google.cn/translate_a/single?client=webapp&sl=auto&tl=' + tl + '&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&source=btn&ssel=0&tsel=0&kc=0&tk=' \
           + str(tk) + '&q=' + quote(text, encoding='utf-8')


def translate(js, text, tl='zh-CN'):
    header = {
        'authority': 'translate.google.cn',
        'method': 'GET',
        'path': '',
        'scheme': 'https',
        'accept': '*/*',
        'accept-encoding': 'gzip, deflate, br',
        'accept-language': 'zh-CN,zh;q=0.9,ja;q=0.8',
         'cookie':'_ga=GA1.3.110668007.1547438795; _gid=GA1.3.1522575542.1548327032; 1P_JAR=2019-1-24-10; NID=156=ELGmtJHel1YG9Q3RxRI4HTgAc3l1n7Y6PAxGwvecTJDJ2ScgW2p-CXdvh88XFb9dTbYEBkoayWb-2vjJbB-Rhf6auRj-M-2QRUKdZG04lt7ybh8GgffGtepoA4oPN9OO9TeAoWDY0HJHDWCUwCpYzlaQK-gKCh5aVC4HVMeoppI',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
        'x-client-data': 'CKi1yQEIhrbJAQijtskBCMG2yQEIqZ3KAQioo8oBCL+nygEI7KfKAQjiqMoBGPmlygE='
    }
    url = build_url(text, js.get_tk(text), tl)
    res = []
    try:
        r = requests.get(url, headers=header)
        result = json.loads(r.text)
        r.encoding = "UTF-8"
        if debug:
            print(result)

        res = result[0]
        if res is None:
            if result[7] is not None:
                try:
                    correct_text = result[7][0].replace('<b><i>', ' ').replace('</i></b>', '')
                    if debug:
                        print(correct_text)
                    correct_url = build_url(correct_text, js.get_tk(correct_text), tl)
                    correct_response = requests.get(correct_url)
                    correct_result = json.loads(correct_response.text)
                    res = correct_result[0]
                except Exception as e:
                    if debug:
                        print(e)
                    res = []

    except Exception as e:
        res = []
        if debug:
            print(url)
            print("翻译" + text + "失败")
            print("错误信息:")
            print(e)
    finally:
        return res

def get_translate(word, tl):
    js = Py4Js()
    translate_result = translate(js, word, tl)

    if debug:
        print("word== %s, tl== %s" % (word, tl))
        print(translate_result)
    return translate_result


if __name__ == '__main__':
    debug = False
    content= ' I also use this method to crack the sign. For the string length less than 30, the obtained sign is correct, but when the long text (string length greater than 30), the obtained sign is wrong'
    results = get_translate(content, 'zh-CN')
    print(results)
谷歌

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
SuperSpiderMan + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| SuperSpiderMan 发表于 2021-10-21 15:24
首先感谢楼上朋友分享谷歌翻译与有道翻译代码
百度翻译遇到的问题也已经解决了,不是因为传入的字符太长引起的,
是因为python执行js的模块execjs生成的sign与浏览器生成的sign不一样
解决方法: 使用nodejs 执行JS文件,生成的sign就是正常的

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
剑来…… + 1 + 1 涨知识了。送你第一个热心值~

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表