爬虫入门经典(二十) | 破解JS加密之有道翻译

不温卜火 等级 641 0 0

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/爬虫入门经典(二十) | 破解JS加密之有道翻译

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!

目录


爬虫入门经典(二十) | 破解JS加密之有道翻译


推荐

爬虫入门经典(二十) | 破解JS加密之有道翻译
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
爬虫入门经典(二十) | 破解JS加密之有道翻译

一、小小课堂

爬虫入门经典(二十) | 破解JS加密之有道翻译
本文是应粉丝要求写的,本来可能要等到我有空闲时间再写,但是由于博主最近看了关于JS破解的相关知识。就想着先找个实战demo进行测试,这就是此篇博文产出的大题过程。

之前博主做了通过百度翻译的接口制作一个简易的翻译软件。当时由于没有想太多,只是对其汉译英与英译汉进行了简单的测试就发了出来。后来经过粉丝的测试,告知了我此程序在翻译句子的时候会报错。如下图:
爬虫入门经典(二十) | 破解JS加密之有道翻译

博主在破解了有道翻译之后,再次测试,发现翻译句子可以完美运行,如下图:
爬虫入门经典(二十) | 破解JS加密之有道翻译
嗯!这也算是间接的增加了翻译的功能了哈哈!

二、加密与解密

我们在爬取数据时,有的数据是通过加密解密得到的。这时,有人会问道什么是加密?那么又是如何解密的呢?

加密与解密,通俗的来讲就是:

  • 加密:把明文变成密文
  • 解密:把密文变成明文

市面上常见的加密方式有三种:

  • 1、js加密
  • 2、css加密
  • 3、base64加密

爬虫入门经典(二十) | 破解JS加密之有道翻译
本篇博文讲解的是js加密的破解

本次选用的案例为有道翻译:http://fanyi.youdao.com/
爬虫入门经典(二十) | 破解JS加密之有道翻译
下面咱们要做的就是模拟有道翻译进行单词的翻译。

三、分析

爬虫入门经典(二十) | 破解JS加密之有道翻译

3.1 分析尝试(初次)

  • 1.翻译一句话
    爬虫入门经典(二十) | 破解JS加密之有道翻译
    1. 查看URL

这个时候我们就可以拿到我们请求的URL
爬虫入门经典(二十) | 破解JS加密之有道翻译
URL为:

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule 
    1. 查找参数
      爬虫入门经典(二十) | 破解JS加密之有道翻译
      先把此部分复制出来
"""
i: 你好
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16032741765278
sign: b25367e1be33d7529a099d200c8f7dd3
lts: 1603274176527
bv: 4abf2733c66fbf953861095a23a839a8
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_CLICKBUTTION
""" 

我们将其转换成字典(dict),代码如下

from pprint import pprint

data = """i: 你好
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16032741765278
sign: b25367e1be33d7529a099d200c8f7dd3
lts: 1603274176527
bv: 4abf2733c66fbf953861095a23a839a8
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_CLICKBUTTION"""

pprint({i.split(": ")[0]:i.split(": ")[1] for i in data.splitlines()}) 

爬虫入门经典(二十) | 破解JS加密之有道翻译
把此部分复制出来如下:

{'action': 'FY_BY_CLICKBUTTION',
 'bv': '4abf2733c66fbf953861095a23a839a8',
 'client': 'fanyideskweb',
 'doctype': 'json',
 'from': 'AUTO',
 'i': '你好',
 'keyfrom': 'fanyi.web',
 'lts': '1603274176527',
 'salt': '16032741765278',
 'sign': 'b25367e1be33d7529a099d200c8f7dd3',
 'smartresult': 'dict',
 'to': 'AUTO',
 'version': '2.1'} 
    1. 添加请求头

我们先来看下,有道翻页此网页的请求头
爬虫入门经典(二十) | 破解JS加密之有道翻译
我们可以看到有多种请求,其实一般我们爬取网页内容,并不需要全部添加,除非需要。一般我们添加User-Agent即可。
在此,博主由于已经提前测试过了。因此就给出所需要的请求头部分

headers = {
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-1808168645@10.108.160.208; JSESSIONID=aaaRyVJv8oEwg7dPaWrux; OUTFOX_SEARCH_USER_ID_NCOO=704285648.1294403; ___rl__test__cookies=1602406917270'
} 
    1. 测试代码

🆗,到这我们就可以进行初步测试了。代码如下:

import requests

url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=1393050056.867326; OUTFOX_SEARCH_USER_ID="1960068844@10.108.160.18"; _ga=GA1.2.1058335445.1601859339; P_INFO=18240707138|1602644960|1|youdaonote|00&99|null&null&null#hen&410100#10#0|&0|null|18240707138; _gid=GA1.2.1420409534.1603269583; JSESSIONID=aaaimJ33Iywd1fQBRukvx; ___rl__test__cookies=1603274176525'
}
data = {'action': 'FY_BY_CLICKBUTTION',
        'bv': '9caf244986fe6d1de38207408302e500',
        'client': 'fanyideskweb',
        'doctype': 'json',
        'from': 'AUTO',
        'i': '你好',
        'keyfrom': 'fanyi.web',
        'lts': '1603274176527',
        'salt': '16032741765278',
        'sign': 'b25367e1be33d7529a099d200c8f7dd3',
        'smartresult': 'dict',
        'to': 'AUTO',
        'version': '2.1'
}
response = requests.post(url=url,headers=headers,data=data)
print(response.content.decode("utf-8")) 

爬虫入门经典(二十) | 破解JS加密之有道翻译
我们这时发现,当修改翻译内容的时候,得不到想要的结果。其实做为一个合格的爬虫开发者,应该有敏感性。

二、JS破解

爬虫入门经典(二十) | 破解JS加密之有道翻译
我们此时可以重新看一下所获取的参数:
爬虫入门经典(二十) | 破解JS加密之有道翻译

2.1 验证时间戳

此时我们可以进行验证。

百度搜索时间戳在线转换工具即可。链接:https://tool.lu/timestamp/

    1. lts
      爬虫入门经典(二十) | 破解JS加密之有道翻译
    1. salt

我们先来对比下lts和salt

 'lts': '1603274176527',
        'salt': '16032741765278', 

通过对比我们发现,只是多了最后一个数字,那么salt到底是什么呢?我们现在并不知道,不过我们可以通过查找确定其位置,然后判定其到底是什么。

2.2 JS的破解方式

1. 普通JS的破解方式

爬虫入门经典(二十) | 破解JS加密之有道翻译
这种方法不经常使用, 因为一旦出现多个相同的JS就很麻烦,

2. 通用JS破解方式

    1. 先通过Srearch查找translate_o 爬虫入门经典(二十) | 破解JS加密之有道翻译
    1. 格式化JS 然后继续搜索translate_o 爬虫入门经典(二十) | 破解JS加密之有道翻译
    1. 查找salt:
      爬虫入门经典(二十) | 破解JS加密之有道翻译
    1. 断点调试js,查看变量值,再次确认。

由于之前已经验证过,所以在此直接给出怎样查找
爬虫入门经典(二十) | 破解JS加密之有道翻译
断点位置,博主已经提前给出
爬虫入门经典(二十) | 破解JS加密之有道翻译
在此,我们先把此部分copy出来

 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 + "]BjuETDhU)zqSxf-=B#7m")
        }
    }; 

经过分析,确认参数:

ts是当前时间戳

bv是使用md5加密navigator.appVersion,只要浏览器不变,其实可以是固定的
爬虫入门经典(二十) | 破解JS加密之有道翻译

salt是时间戳拼接0-9的随机整数字符串

sgin是md5加密的

这里的e通过断点调试确认e就是翻译的内容

3. python模拟MD5加密

    1. 模拟its和salt
import time
import random

its = str(round(time.time(),3)).replace(".","")
salt = its+str(random.randint(0,9))

print(its,salt) 

爬虫入门经典(二十) | 破解JS加密之有道翻译

    1. MD5加密模拟

MD5算法一般用来加密,不可逆。
此部分内容随机输入,最终都是32位的加密字符串

import hashlib

content = "我不温卜火"
md5 = hashlib.md5()
md5.update(content.encode("utf-8"))
ret = md5.hexdigest()
print(ret,len(ret)) 

爬虫入门经典(二十) | 破解JS加密之有道翻译

    1. 程序中的对比
sign: n.md5("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m")

# 此部分修改为
sign = do_md5("fanyideskweb" + params + salt + "]BjuETDhU)zqSxf-=B#7m") 

三、完整代码

爬虫入门经典(二十) | 破解JS加密之有道翻译

# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-10 17:07
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 有道翻译.py
  @Version:1.0

'''
import requests
import time
import random
import hashlib
from pprint import pprint

def main():
    """主程序"""
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    headers = {
        'X-Requested-With': 'XMLHttpRequest',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'Cookie': 'OUTFOX_SEARCH_USER_ID=-1808168645@10.108.160.208; JSESSIONID=aaaRyVJv8oEwg7dPaWrux; OUTFOX_SEARCH_USER_ID_NCOO=704285648.1294403; ___rl__test__cookies=1602406917270'
    }
    while True:
        params = input("请输入单词:")
        data = get_data(params)
        response = requests.post(url=url,headers=headers,params=params,data=data)
        print(response.json()["translateResult"][0][0]["tgt"])

def do_md5(content):
    """md5方法"""
    md5 = hashlib.md5()
    md5.update(content.encode("utf-8"))
    return md5.hexdigest()

def get_data(params):
    """获取参数"""
    lts = str(round(time.time(), 3)).replace(".", "")
    salt = lts + str(random.randint(0, 9))
    sign = do_md5("fanyideskweb" + params + salt + "]BjuETDhU)zqSxf-=B#7m")
    data = {
        'action': 'FY_BY_CLICKBUTTION',
        'bv': '9caf244986fe6d1de38207408302e500',
        'client': 'fanyideskweb',
        'doctype': 'json',
        'from': 'AUTO',
        'i': params,
        'keyfrom': 'fanyi.web',
        'lts': lts,
        'salt': salt,
        'sign': sign,
        'smartresult': 'dict',
        'to': 'AUTO',
        'version': '2.1'
    }
    return data

if __name__ == '__main__':
        main() 

四、运行测试

爬虫入门经典(二十) | 破解JS加密之有道翻译
爬虫入门经典(二十) | 破解JS加密之有道翻译
美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


爬虫入门经典(二十) | 破解JS加密之有道翻译

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

爬虫入门经典(二十) | 破解JS加密之有道翻译
爬虫入门经典(二十) | 破解JS加密之有道翻译

本文转自 https://buwenbuhuo.blog.csdn.net/article/details/109190900,如有侵权,请联系删除。

收藏
评论区

相关推荐

项目实战之---AES 加密
ajax/index.js import axiosApi from '../js/fetch'; import { baseUrl, headerParams } from '../js/baseUrl'; // import引用AES源码js import CryptoJS from 'cryptojs/cryptojs'; console.lo
只听说过CSS in JS,怎么还有JS in CSS?
CSS in JS是一种解决css问题想法的集合,而不是一个指定的库。从CSS in JS的字面意思可以看出,它是将css样式写在JavaScript文件中,而不需要独立出.css、.less之类的文件。将css放在js中使我们更方便的使用js的变量、模块化、treeshaking。还解决了css中的一些问题,譬如:更方便解决基于状态的样式,更容易追溯依赖关
前端 - 常见的异常捕获方法
前端异常捕获在ES3之前js代码执行的过程中,一旦出现错误,整个js代码都会停止执行,这样就显的代码非常的不健壮。从ES3开始,js也提供了类似的异常处理机制,从而让js代码变的更健壮,程序执行的过程中出现了异常,也可以让程序具有了一部分的异常恢复能力。js异常的特点是,出现不会导致JS引擎崩溃,最多只会终止当前执行的任务。回归正题,我们该如何在程序异常发生
CSS禁用鼠标拖拽选中内容
chrome  -webkit-user-select:none firxfox  -moz-user-select:none IE需要使用JS的onSelected事件了。 JS代码             dom.style.MozUserSelect = 'none';//fixrox禁止选择的JS脚本             dom.st
JS导出页面为PDF文件,该如何操作?来看一眼就明白啦!
废话不多说,直接上代码。 1.资源文件或依赖 <script type="text/javascript" src="https://my.oschina.net//u/4265132/blog/4054317/js/canvg2.js"></script><script type="text/javascript" src="https://m
Echarts全国地图二级钻取
<html> <head> <script src="js/jquery-1.9.1.min.js"></script> <script src="js/echarts-all-3.js"></script> <script src="js/china.js"></script> </h
JS前端图形化插件之利器Gojs组件(php中文网)
JS前端图形化插件之利器Gojs组件(php中文网) ========================== 一、总结 ---- ### 一句话总结:php中文网我可以好好走一波 二、JS前端图形化插件之利器Gojs组件 -------------------- 参考: JS前端图形化插件之利器Gojs组件-js教程-PHP中文网 http://
JavaScaript学习笔记第(一)
js由三部分组成,分别是ECMAScript、DOM、BOM 其中ECMAScript规定了js的语法 js是一门解释型语言、脚本语言、动态类型语言、基于对象语言 书写js代码和CSS一样,有三个书写的地方,第一个是使用<script>标签,再<sccript>标签中书写js代码,标签一般都在body标签中的末尾,第二个地方是书写再结构里,html标签
JavaScript 两个叹号含义
先起个例子吧~  这个用的是谋智的js引擎monkey spider  darion.yaphet@localhost.localdomain:/home/darion.yaphet> js               js> var i; js> print(i) undefined js>  js> va
JavaScript八张思维导图
**![](https://oscimg.oschina.net/oscnet/17104907-a0f0-4b40-ac9d-9c40d9b13157.jpg)** **目录** * JS基本概念 * JS操作符 * JS基本语句 * JS数组用法 * Date用法 * JS
Python js逆向 爬取X天下数据,好好看,好好学
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 之前讲过execjs这个库可以在python中运行js代码,这将极大的帮助我们解决逆向问题,找到加密位置不会重写怎么办、js代码太复杂怎么办,用execjs秒杀它。 本次的受害者 ====== aHR0cHM6Ly9wYXNz
Python 和 JS 有什么相似?
Python 是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有 Python 的身影。作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数、解构赋值、Decorator等),同时本文会对 Python 的一些用法与 JS 进行类比。不管是提升自己的知识广度,还是更好地迎接 AI 时代,Python 都是一门值
RF日志文件(log.html)解读一
引入的js库: Jquery,Jquery templates plugin,Jquery tablesorter,JsxCompressor(JSXGraph) 版本都很老,而且有些还是废弃的项目(Jquery templates plugin),但是脚本都直接写进了html页面中,所以版本问题无影响 页面呈现的内容:统计列表,python运行时错误
React.createClass 、React.createElement、Component
react里面有几个需要区别开的函数 React.createClass 、React.createElement、Component 首选看一下在浏览器的下面写法: <div id="app"> </div> <script src="../js/react.js"></script> <scr
Springmvc异步上传文件
<script src="js/jquery.js" type="text/javascript"></script><script src="js/jquery.ext.js" type="text/javascript"></script><script src="js/jquery.form.js" type="text/javascript"