最新Python爬虫有道翻译JS逆向解析详细介绍版,附源码

2023-10-27

我的第一篇文章,写的很详细,这里方便刚接触爬虫帅哥们理解,大家一起加油

前两步为js的逆向分析过程,了解过程的请跳到第三步(源码),最后打包成exe文件

有道翻译网址:在线翻译_有道

第一步:找到有道翻译发送请求的Url地址

老规矩进去界面F12打开浏览器的抓包工具,输入测试值

 查看界面源代码发现找不到翻译内容,可以判断请求是aj二次请求或者封装在js文件里。

点击调试工具中点network(网络)选择XHR可以查考到有哪些二次请求,点击Preview能查看到相应的内容。

 

发现这里面相应的就是我们翻译的内容,然后找到Header,复制好请求的地址

Url请求地址:

 url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"      #有道翻译的请求头

发现是POSt请求,拉到最下面找到需要的参数

虽然有很多,可是我们通过多次输入内容发送请求,通过对比发现以上参数发生变化的只有salt,sign,lts这三个

只要找到salt,sign,lts加密过程再用post方式发送请求就好了。


第二步:找以上参数的加密过程

有道翻译为post请求 且有salt,sign,lts三个随机变量 其他data中的为固定值,所以找到这三个变量的加密过程即可


这里是:找三个变量的生成途径

打开搜索,搜索salt,打上断点 

可以在8389行发现salt是进行md5加密过后的字段

打上断点运行后:

 发现e为输入内容,i为js时间戳加上一个0-9的随机整数,变量sign分析完毕

sign=fanyideskweb" + 输入的内容(e) + i(时间戳) + "Tbh5E8=q6U3EXe+&L[4c@ 再后用md5加密

lts:时间戳         通过前面多次输入发生请求内容时,发现its就是时间戳

salt时间戳加0-随机整数

以上三个变量都解析完毕,md5加密可以在有道翻译的js文件里面保存加密过程,再通过python的第三方execjs库去执行js文件 ,也可以直接调用hashlib 进行md5加密

搜索md5即可找到加密过程在8209行,通过发条调试js,找到所缺的函数内容后,直接写入js文件,再用execjs读取即可


第三步:用python语言改写调用接口

附代码:我这里是直接调用第三方库加密,以下代码复制粘贴可直接运行,缺失的库直接添加即可

import requests      #获取url请求
# import execjs        #node模板 用来执行js文件
import random        #随机数
import time          #用来生成python模式的时间戳
import hashlib      #md5加密模板可以直接对"fanyideskweb" + 输入的内容 + i + "Tbh5E8=q6U3EXe+&L[4c@" 加密得到salt

'''有道翻译为post请求 且有salt,sign,lts三个随机变量 其他data中的为固定值,所以找到这三个变量的加密过程即可
lts:时间戳
sign:fanyideskweb" + 输入的内容(e) + i(时间戳) + "Tbh5E8=q6U3EXe+&L[4c@  再后用md5加密
salt:时间戳加0-随机整数
以上三个都为字符类型
'''
if __name__ == '__main__':
    while True:
        print('-------------------有道翻译-------------------')
        e = input('请输入需要翻译的文字:').strip()
        if len(e) and e!="" :
            rsum = str(int(random.random()*10))         #生成(0,9)的随机整数并转换成字符型
            r = str(int(time.time() * 1000))            #生成python模式下的时间戳
            i = r+rsum                                  #构造data中的salt变量  !!!!完成了salt变量的加密:时间py时间戳乘1000即js时间加上0-9的随机整数
            # node = execjs.get()
            # ctx = node.compile(open('./youdao.js',encoding='utf-8').read())
            # funcName = "getSign('{0}','{1}')".format(e,i)   #调用有道翻译的加密语法得到sign
            # sign = ctx.eval(funcName)       #fanyideskweb" + 输入的内容就是e + i + "Tbh5E8=q6U3EXe+&L[4c@" 加密得到sign

            url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"      #有道翻译的请求头
            Header = {

             'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
                        'Referer':'https://fanyi.youdao.com/',
                        'Cookie':'OUTFOX_SEARCH_USER_ID_NCOO=1328394085.0392962; OUTFOX_SEARCH_USER_ID="1796778757@10.108.160.18"; JSESSIONID=aaaEK20l8ctLw9SDeioDx; ___rl__test__cookies=1611923654835'
            }

            start_sign = "fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@"
            sign_ = hashlib.md5(start_sign.encode()).hexdigest()
            Data = {
                'i' : e ,
                'from' : 'AUTO',
                'to' : 'AUTO',
                'smartresult' : 'dict',
                'client' : 'fanyideskweb',
                'salt' : i,                 #时间戳加(0,9)随机整数
                'sign' : sign_,              # "fanyideskweb" + 输入的内容 + i + "Tbh5E8=q6U3EXe+&L[4c@"  在youdaojs文件中进行md5加密;也可以直接用sign_(直接用hashlib模板的md5加密方法)
                'lts' : r,                  #时间戳
                'bv' : 'c795a332c678d5063a1ee5eb15253848',
                'doctype' : 'json',
                'version' : '2.1',
                'keyfrom' : 'fanyi.web',
                'action' : 'FY_BY_REALTlME'
            }
            try:#对requests异常处理
                # 发送请求,获取响应
                rsp = requests.post(url, headers=Header, data=Data)
                # print(rsp)  #检查接口
            except:
                print('接口错误,请退出程序!!')
            else:
                # 打印数据

                if len(rsp.json())>1:
                    # print(Data['i'])
                    result = rsp.json()
                    # print(result)
                    for items in rsp.json()['translateResult']:
                        for item in items:
                            print("翻译后:",item['tgt'])
                            # print("src长度为:", len(item['src']))
                else:
                    print("输入错误请重新输入!!!")
        else :
            print("输入错误请重新输入!!!")
        del e
'''     
        src为当前语句翻译前的字符串
        tgt为翻译后的内容
        BUG:  
        最多只能翻译src的长度为50个字符的内容
        Bug:           
            1.输入多个英文字符事翻译内容显示不完全,而输入多个中文字符翻译内容正确      
        问题分析:  
            2 导致的原因src字符长度限制问题被网站辨识爬虫 在请求返回时候限制了翻译字数 src
        
        解决方案:
        进aj文件查看src,tgt怎么得出
        将input的英文长度>50就 .分割  依次请求后拼接翻译内容(应该没啥用,只能小规模减小错误)
'''

运行结果:

js解析小技巧搜索可以直接搜索关键字如md5,hash,AES,DES,RSA等加密关键字

大部分网站都运用到时间戳进行加密,看到13位数字的参数值大概率就是时间戳,还有些网站在js加密过程中中进行了as值转换根本搜不到上传的参数,不用慌找加密关键字或者根据调用的函数打断点一个个找如蜂窝网

里面各注释也写的很详细了,还有存在的bug也标明,有道翻译爬取到此结束~


第四步:文件打包

转载python3项目打包成exe可执行程序 - 测试一枝花 - 博客园

打包那一步直接在pycharm的Trminal输入命令:

pyinstaller -F xxx.py(xxx.py,打包的文件名称)

打包成功后到py文件目录里,找到新增的dist文件夹打开就有exe文件了,可以发给其他小伙伴运行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最新Python爬虫有道翻译JS逆向解析详细介绍版,附源码 的相关文章

随机推荐

  • U盘做启动盘之后容量变小了,咋办呢?

    有U盘的可能会遇到U盘容量不正常的情况 比如U盘做了启动盘后 U盘量产过 U盘用其他软件格式化过后导致U盘容量变小了 那么其他容量去哪里了呢 如果分成了2个区 那么为什么只识别一个呢 怎么才能恢复容量呢 一般U盘容量变小了 但实际上还是正常
  • IDM下载工具下载教程

    转自 13条消息 怎样通过其他下载工具下载某盘文件 发呆哥o o 的博客 CSDN博客
  • Qt多线程自定义结构体变量无法通过信号槽的方式传递的解决办法

    需要在子线程的头文件中包含 include
  • 用JS在html页面实现打印功能

    有时候我们做页面的时候 会要求有打印页面的按钮 而且有的时候会要求只打印页面中的某一部分而不是全打印 首先在head里面加入下面一段js代码
  • 七大常见排序,你究竟懂几个?(上)

    幼儿园的小朋友会排队做操 小学生们会排队打饭 大妈购物也会抢着 排队 付账 作为程序猿的你 会以下的排序算法吗 本节目标 1 排序的概念及意义 2 直接插入和希尔排序的实现及分析 3 直接选择和堆排序的实现及分析 首先我们先来看一下基本的七
  • 【UE4_笔记】————人物的基本移动

    人物的基本移动 1 键盘控制移动 2 鼠标控制视角 3 人物的转向 4 跳 说明 完成了人物的创建之后 接下来就是要完成人物的移动了 下面是我的丑丑的主角 1 键盘控制移动 1 编辑 项目设置 点击引擎列表中的输入 2 在轴映射中添加如下属
  • TensorFlow的静态图机制和Tensorboard中手动添加监控数据(scalar/simple_value...)的方法

    说明 本文将介绍如何向tensorboard中添加sclar的方法 但会先尽量简要介绍一下tensorflow的静态图机制 查看添加方法可以直接去这一部分 TensorFlow的静态计算图机制 关于并非众所周知的静态计算图 唯一能说的是 这
  • linux系统如何安装编译器,如何安装gfortran编译器

    如何安装gfortran编译器 发布时间 2010 05 29 22 32 04来源 红联作者 kiger 大家好 我是linux的新手 因论文需要编译一些 f90的源代码 这两天刚把debian linux装好 网上说要装gfortran
  • FreeMarker在js中使用

    var checkedArray 初始化将测试集包含的用例存在数组里面 lt if beneficiaryVOs gt lt list beneficiaryVOs as item gt checkedArray push id item
  • 联想计算机BIOS开启Intel-vx,各品牌电脑BIOS开启Intel VT-X虚拟化技术方法(华硕,联想,HP,技嘉等)...

    我们在电脑上运行虚拟机 模拟器是需要CPU虚拟化技术支持的 如果你的电脑没有开启 那么将无法运行虚拟机或模拟器 那么下面小编整理了华硕 联想 HP 技嘉等品牌电脑BIOS下开启Intel VT X虚拟化技术方法 有需要的朋友可以学习一下哦
  • spring配置websocket并实现群发/单独发送消息

    spring框架中自带了websocket的jar包 利用它可以实现与H5中WebSocket的对接 甚至websocket还可以通过依赖注入与http请求一同工作 详细配置实现过程如下 文件目录结构如下 主要是controller和web
  • 卡诺图化简法详细介绍

    没想到最后保存成了图片格式 给大家带来不方便 抱歉抱歉 http pan baidu com s 1bOIj5k 这里是WORD版本 支持更改
  • Node.js处理URL模块详解

    处理URL 在hello koa工程中 我们处理http请求一律返回相同的HTML 这样虽然非常简单 但是用浏览器一测 随便输入任何URL都会返回相同的网页 正常情况下 我们应该对不同的URL调用不同的处理函数 这样才能返回不同的结果 例如
  • 微信小程序date转毫秒数遇到的坑

    业务需求要对new Date 进行计算 要计算就要先转成毫秒数 但我发现直接 是不行的会出现NaN 不过倒是可以 于是想到了gettime方法 测试一波 依旧是NaN 明明代码补全会自己跳出这个方法 居然不能用 最后总算发现用 Data p
  • mybatis多数据源配置

    MapperScannerConfigurer以下是正常只有一个数据源 只有一个sqlSessionFactory 这样写没问题 但是有多个数据源 有2个sqlSessionFactory 的时候这样写就不可以了 需要你使用 sqlSess
  • Vagrant

    什么是Vagrant Vagrant 是用于管理虚拟机生命周期的命令行实用程序 在一个一次性和一致的环境中隔离依赖项及其配置 为什么要使用Vagrant 通过定义我们知道Vagrant主要是用于管理虚拟机的 当我们需要创建很多虚拟机的时候
  • Win2012 AD中将域用户加入到所有客户端本地管理员组中

    为了让域中的某个用户具有所有客户端的管理员权限 方法如下 在AD服务器中打开 组策略管理器 点击 开始 管理工具 组策略管理 右击 Default Domain Policy 选择 编辑 定位到 本地用户和组 右键 新建 本地组 将分配的客
  • <%@ include file=""%> 我们都知道在jsp中include有两种形式 分别是

  • JQuery突出显示效果

    示例 突出显示效果
  • 最新Python爬虫有道翻译JS逆向解析详细介绍版,附源码

    我的第一篇文章 写的很详细 这里方便刚接触爬虫帅哥们理解 大家一起加油 前两步为js的逆向分析过程 了解过程的请跳到第三步 源码 最后打包成exe文件 有道翻译网址 在线翻译 有道 第一步 找到有道翻译发送请求的Url地址 老规矩进去界面F