Python爬虫:js加密实例-有道翻译

简介: Python爬虫:js加密实例-有道翻译

实现步骤

1、随便输入关键字,打开调试,发现是ajax传输,post请求

不难发现,请求连接Request URL:

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule


里边有我们需要的json数据


{
    "translateResult": [
        [{
            "tgt": "baidu",
            "src": "百度"
        }]
    ],
    "errorCode": 0,
    "type": "zh-CHS2en",
    "smartResult": {
        "entries": ["", "Baidu\r\n"],
        "type": 1
    }
}

image.png


2、找到FormData请求发送的参数


i: 百度
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 1535649141531
sign: 9204f873edc8ee3df27e5f097b973de5
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_CLICKBUTTION
typoResult: false

多请求几次,观察规律发现变量有3个:


i: 很明显是需要翻译的词语

salt:类似时间戳

sign:类似md5

3、查看Request Headers请求头


Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: keep-alive
Content-Length: 218
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: OUTFOX_SEARCH_USER_ID_NCOO=1715177970.4171937; OUTFOX_SEARCH_USER_ID=1390060209@59.111.179.144; ___rl__test__cookies=1535649371369
Host: fanyi.youdao.com
Origin: http://fanyi.youdao.com
Referer: http://fanyi.youdao.com/
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
X-Requested-With: XMLHttpRequest

多请求几次,发现变化的值有2个:


Content-Length:文本长度,后面测试中删除也能通过

Cookie中的___rl__test__cookies: 类似时间戳

尝试删除cookie,发现返回50,说明需要带cookie,再次发送请求,发现必要的cookie是:


OUTFOX_SEARCH_USER_ID_NCOO=1715177970.4171937; 
OUTFOX_SEARCH_USER_ID=1390060209@59.111.179.144; 
___rl__test__cookies=1535649371369

4、打开调试找到文件:fanyi.min.js,搜索salt找到如下代码,发现和post提交的参数大致一样了


var t = e.i,
i = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)),
o = n.md5("fanyideskweb" + t + i + "ebSeFb%=XZ%T[KZ)c(sy!");
r && r.abort(),
r = n.ajax({
    type: "POST",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    url: "/bbk/translate_m.do",
    data: {
        i: e.i,
        client: "fanyideskweb",
        salt: i,
        sign: o,
        tgt: e.tgt,
        from: e.from,
        to: e.to,
        doctype: "json",
        version: "3.0",
        cache: !0
    },
    dataType: "json",
    success: function(t) {
        t && 0 == t.errorCode ? e.success && e.success(t) : e.error && e.error(t)
    },
    error: function(e) {}
})

按照第2步中找到的变量参数,部分代码截取如下:

var t = e.i,
i = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)),
o = n.md5("fanyideskweb" + t + i + "ebSeFb%=XZ%T[KZ)c(sy!");
i: e.i,

现在就很明白了需要两个参数:


salt: i, 可以被算出来

sign: o :需要找到 t 和 i

t == e.i == i (就是我们需要翻译的词语)

我们在控制台执行测试


>> (new Date).getTime()  // 当前时间戳
1535650639011
>> Math.random()  // 0 - 1随机数
0.6568699792902069
// 当前时间戳 + 0 - 10的随机数
>> ((new Date).getTime() + parseInt(10 * Math.random(), 10)) 
1535650592194
>> "1535650592194".length
13

这样基本就明白了,不过python中的时间戳是10位+小数点

需要做一个转换


time_span = int(time.time()*1000)  # 10位时间戳变13位
salt =  str(time_span + random.randint(0, 10))  # 加一个0-10的随机数转为字符串

把参数代入计算出md5即可


最后调试发现:


salt 的随机数可以不加

Content-Length 可以没有

不过为了保持原有规则,我没有去除


最终代码

import requests
import time
import random
import hashlib
import json
def youdao_fanyi(key):
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    # 将js转换为python代码计算参数(重点)
    time_span = int(time.time()*1000)
    salt =  str(time_span + random.randint(0, 10))
    s = "fanyideskweb" + key + salt + "ebSeFb%=XZ%T[KZ)c(sy!"
    sign = hashlib.md5(s.encode()).hexdigest()
    # post提交的参数
    data = {
        "i": key,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": salt,
        "sign": sign,
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_CLICKBUTTION",
        "typoResult": "false"
    }
    # 请求必要的头部和cookie
    headers = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
        "Connection": "keep-alive",
        "Content-Length": str(len(key)),
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Host": "fanyi.youdao.com",
        "Origin": "http://fanyi.youdao.com",
        "Referer": "http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest",
    }
    cookies ={
        "OUTFOX_SEARCH_USER_ID_NCOO": "937253968.9247279",
        "OUTFOX_SEARCH_USER_ID": "-850496506@10.168.8.76",
        "___rl__test__cookies": str(time_span)
    }
    # 提交请求
    response = requests.post(url, data=data, headers=headers, cookies=cookies)
    if response.status_code == 200:
        result = response.json()
    else:
        result = {}
    if result.get("errorCode") == 0:
        return result.get("translateResult")[0][0].get("tgt")
    else:
        return key
if __name__ == '__main__':
    key="紫色"
    print(youdao_fanyi(key))
    # purple
相关文章
|
9月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
1868 58
|
数据采集 Web App开发 JavaScript
Python爬虫如何获取JavaScript动态渲染后的网页内容?
Python爬虫如何获取JavaScript动态渲染后的网页内容?
|
算法 Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
492 18
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
1390 9
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
697 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
1465 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
384 0
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
1796 5
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
1875 2

推荐镜像

更多