Python爬虫JS解密详解,学会直接破解80%的网站!_requests.post获取网址加密如何解密-程序员宅基地

技术标签: python  post  json  http  url  

1、网页查看

 

 


2、有道翻译简单实现源码

import requests


#请求头
#headers不能只有一个User-Agent,因为有道翻译是有一定的反扒机制的,所以我们直接全部带上
headers = {
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Content-Length": "244",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Cookie": "[email protected]; JSESSIONID=aaaUggpd8kfhja1AIJYpx; OUTFOX_SEARCH_USER_ID_NCOO=108436537.92676207; ___rl__test__cookies=1597502296408",
    "Host": "fanyi.youdao.com",
    "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/84.0.4147.125 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest",
}

#提交参数
params = {
    "i": "I love you",
    "from": "UTO",
    "to": "AUTO",
    "smartresult": "dict",
    "client": "fanyideskweb",
    "salt": "15975022964104",
    "sign": "7b7db70e0d1a786a43a6905c0daec508",
    "lts": "1597502296410",
    "bv": "9ef72dd6d1b2c04a72be6b706029503a",
    "doctype": "json",
    "version": "2.1",
    "keyfrom": "fanyi.web",
    "action": "FY_BY_REALTlME",
}

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

#发起POST请求
response = requests.post(url=url,headers=headers,data=params).json()

print(response)

到这里表面上已经完成了有道翻译的代码,但其实还有问题,比如下方如果更换了需要翻译的内容就会报错

 

原因

我们在有道翻译重新翻译,会发起新的POST请求,而每次请求所带的参数值会有所不同,如果想要真正实现有道翻译功能,就要找到这四个参数值生成方式,然后用python实现同样的功能才行


3、JS解密(详解)

Ctrl+Shift+f 进行搜索,输入sign

因为加密肯定是发起请求的时候加密所以我们搜索translate_o

调试

在有道翻译重新输入翻译内容,即可到断点处停下

但是发现数据已经是加密好了的

但由于我们是调试模式,可以返回到上一步,点击如下按钮

可以发现salt、sign、lts、bv都是通过 r 获取出来的,而 r 又是通过一个函数得到的


进入该函数

可以发现这里就是加密的地方


复制这段js代码,我们需要使用使用python代码来实现

 

可以看到是一模一样的,到这里算是有一点点小成功了

注意这里翻译的内容不同其bv也是不同的哦

接下来看lts,用python实现


可见python生成的时间戳和JS的有所不同,但细心的小伙伴肯定知道怎么把python的时间戳变成跟JS一样

这样就ok了

乘以1000转化为int舍弃小数位再转化为字符串,因为JS里是字符串


接下来看i,然后用python实现

最后

温馨提示:
可能会正在有道翻译更新时进行改变,但这不是什么问题,如果仔细看了JS解密的话,还是能够找到新的


4、python实现JS解密后的完整代码

import requests
from hashlib import md5
import time
import random


#请求地址
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/84.0.4147.125 Safari/537.36"

headers = {
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Content-Length": "244",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Cookie": "[email protected]; JSESSIONID=aaaUggpd8kfhja1AIJYpx; OUTFOX_SEARCH_USER_ID_NCOO=108436537.92676207; ___rl__test__cookies=1597502296408",
    "Host": "fanyi.youdao.com",
    "Origin": "http://fanyi.youdao.com",
    "Referer": "http://fanyi.youdao.com/",
    "user-agent": appVersion,
    "X-Requested-With": "XMLHttpRequest",
}


def r(e):
    # bv
    t = md5(appVersion.encode()).hexdigest()

    # lts
    r = str(int(time.time() * 1000))

    # i
    i = r + str(random.randint(0,9))

    return {
        "ts": r,
        "bv": t,
        "salt": i,
        "sign": md5(("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m").encode()).hexdigest()
    }


def fanyi(word):

    data = r(word)
    params = {
        "i": word,
        "from": "UTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": data["salt"],
        "sign": data["sign"],
        "lts": data["ts"],
        "bv": data["bv"],
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTlME",
    }

    response = requests.post(url=url,headers=headers,data=params)
    #返回json数据
    return response.json()



if __name__ == "__main__":
    while True:
        word = input("请输入要翻译的语句:")
        result = fanyi(word)
        
        #对返回的json数据进行提取,提取出我们需要的数据
        r_data = result["translateResult"][0]
        print(r_data[0]["src"])
        print(r_data[0]["tgt"])

这代码我就不做过多解释了,相信大家都能看懂。


4.1、实现效果


5、JS解密后完整代码升级版

如果只是对一些词语、语句翻译那还不如直接在网址上进行翻译,本次升级版可以对文章句子进行分段翻译,更有助于提高英语阅读理解的能力。(特别适合我这样的英语学渣)

import requests
from hashlib import md5
import time
import random


#请求地址
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/84.0.4147.125 Safari/537.36"

headers = {
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Content-Length": "244",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Cookie": "[email protected]; JSESSIONID=aaaUggpd8kfhja1AIJYpx; OUTFOX_SEARCH_USER_ID_NCOO=108436537.92676207; ___rl__test__cookies=1597502296408",
    "Host": "fanyi.youdao.com",
    "Origin": "http://fanyi.youdao.com",
    "Referer": "http://fanyi.youdao.com/",
    "user-agent": appVersion,
    "X-Requested-With": "XMLHttpRequest",
}


def r(e):
    # bv
    t = md5(appVersion.encode()).hexdigest()

    # lts
    r = str(int(time.time() * 1000))

    # i
    i = r + str(random.randint(0,9))

    return {
        "ts": r,
        "bv": t,
        "salt": i,
        "sign": md5(("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m").encode()).hexdigest()
    }


def fanyi(word):

    data = r(word)
    params = {
        "i": word,
        "from": "UTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": data["salt"],
        "sign": data["sign"],
        "lts": data["ts"],
        "bv": data["bv"],
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTlME",
    }

    response = requests.post(url=url,headers=headers,data=params)
    return response.json()


if __name__ == "__main__":
	#打开需要翻译的文章
    with open("文章.txt",mode="r",encoding="utf-8") as f:
        #获取文章全部内容
        text = f.read()

    result = fanyi(text)
    r_data = result["translateResult"]
    
    #翻译结果保存
    with open("test.txt",mode="w",encoding="utf-8") as f:
        for data in r_data:
            f.write(data[0]["tgt"])
            f.write('\n')
            f.write(data[0]["src"])
            f.write('\n')
            print(data[0]["tgt"])
            print(data[0]["src"])

 

5.1、实现效果

如果想要视频教程或者完整代码  就加下老弟的群哈:1136192749  无偿免费分享


原作者:Code皮皮虾 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43881394/article/details/108100426

智能推荐

VS Code使用code runner插件无法识别gcc编译C语言程序_vscode无法识别gcc-程序员宅基地

文章浏览阅读1.2k次。VS Code配置Code runner_vscode无法识别gcc

Unity3D中使用mesh collider和box collider的区别-程序员宅基地

文章浏览阅读1.5w次,点赞10次,收藏14次。Unity3D中使用mesh collider和box collider的区别踩坑过程记录。设备是HTC的VIVE 和 Unity 5.xCPU: Intel Xeon Silver 4116 * 2GPU: NVIDIA Quadro P6000RAM: 64GB这个问题是在解决项目卡顿问题的同时出现的:最近在用U3D做一个VR项目,需求是要给网格加碰撞体以实现获取手柄射线与..._mesh collider和box collider

关于jar包后台运行及端口占用问题_centos启动jar包不显示端口占用-程序员宅基地

文章浏览阅读4.7k次。问题场景问题一:后端项目jar包打包上传运行,终端上正常,终端退出后,项目未能运行。问题二:第二次上传jar包并运行时提示该端口被占用。解决方法问题一:使用nohub命令启动jar包。nohup java -jar 1.0.0.jar &问题二:由于两次使用的同一个端口,先查找到当前端口正在运行的进程的进程号。netstat -lnp|grep 端口号然后用杀掉进程..._centos启动jar包不显示端口占用

MySql—视图、函数、存储过程、触发器_触发器 存储过程 函数 视图-程序员宅基地

文章浏览阅读3.9k次,点赞6次,收藏39次。MySql高级—视图、函数、存储过程、触发器目录 一、视图 11、视图的定义 1 2、视图的作用 1 (1)可以简化查询。 1 (2)可以进行权限控制, 3 3、查询视图 4 4、修改视图 4 5、删除视图 4_触发器 存储过程 函数 视图

linux下载错误130,IPFire 2.21 Core Update 130发布下载,修复错误和安全更新-程序员宅基地

文章浏览阅读90次。IPFire 2.21核心更新130发布了,提供x86_64、i586、arm版本下载,这是一个紧急更新,包含各种错误修复和大量安全修复程序的版本,搭载Linux 4.14.103、gcc 7.3.0、samba 3.6.25组件,以下是更新的详细内容。IPFire 2.21 Core Update 130主要更新注:IPFire 2.21 Core Update 130包含以下软件包的安全更新,..._ipfire arm

处理海量小文件——本地文件读成sequenceFile文件_local.liststatus(new path)-程序员宅基地

文章浏览阅读1k次。个人观点:当处理海量小文件时,先将小文件进行sequenceFile操作或者类似操作处理,然后再上传到HDFS系统进行下一步的处理。(如有其它建议,欢迎留言)一、直接上传本地栅格数据将导致的问题根据栅格数据的特点,每层的图片个数都为上层数量的四倍。在第20层时,仅仅第20层的图片的数量达到了“2199023255552”张(世界地图在第一层被切成了两张图片,第二十层的数量为:4**7*2),且..._local.liststatus(new path)

随便推点

最新版ffmpeg 提取视频关键帧_从视频中获取flag-程序员宅基地

文章浏览阅读8.9k次,点赞2次,收藏9次。对于ffmpeg的配置请看我的上篇博客:http://blog.csdn.net/kuaile123/article/details/11367309所用视频为 flv格式的,用的vs2010,电脑为64位,下面的也是64位,别下错了。因为ffmpeg的函数和版本有关系,这里记录下我所用的整合的版本,是昨天下的最新版的,需要请下载http://download.csdn.n_从视频中获取flag

【ARM Cache 系列文章 11 -- ARM Cache 直接映射 详细介绍】

在直接映射缓存中,每个内存地址通过某种映射函数(通常是地址的一部分)映射到一个特定的缓存行。这种结构简单,硬件实现成本较低,但可能会导致较高的缓存冲突(两个内存地址映射到同一缓存行),从而降低缓存效率。在介绍直接映射之前,以停车场停车作为例子,先把结构的特点简单地概括出来,便于读者了解。

Objective-C学习计划

持续学习,跟进Objective-C的最新发展和技术。了解Objective-C的基本语法和编程概念。掌握Objective-C的高级特性和常用框架。应用所学知识,完成实际项目。

【数据结构】最小生成树(Prim算法、Kruskal算法)解析+完整代码

设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称为G的最小生成树(MST)。每次选则一条权值最小的边,使这条边的两头连通(原本已经连通的不选),直到所有结点都连通。,生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。1.最小生成树可能有多个,但边的权值之和总是唯一且最小的;每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。数组,找到最小值,将其加入树中,并继续遍历与其相连的边。数组,初始为false,判断结点是否加入树。最低的,且还没加入树的顶点。

python访问组策略_python 模块 wmi 远程连接 windows 获取配置信息-程序员宅基地

文章浏览阅读216次。python 模块 wmi 远程连接 windows 获取配置信息_python windows组策略

html把div做成透明背景,DIV半透明层 CSS来实现网页背景半透明-程序员宅基地

文章浏览阅读868次,点赞2次,收藏5次。DIV半通明完成,运用CSS完成DIV成半透明效果,CSS实现层与后台半通明成果。一、DIV CSS半通明底子介绍设置装备摆设DIV半通明CSS代码:div{filter:alpha(Opacity=80);-moz-opacity:0.5;opacity:0.5;}阐明: 1、filter:对win IE设置半通明滤镜成就,filter:alpha(Opacity=80)代表该对象80%半透明..._html 背景div层