有道词典反爬的破解

目录

 

(一)课题目的

(二)遇到的障碍

(三)障碍分析

(四)找到js

(五)在js中找到改变salt,sign,ts的函数

(六)找到数据来源

 (七)python实现相同逻辑


(一)课题目的

自己实现在pycharm中输入每一个单词都能查询到翻译内容

(二)遇到的障碍

我们通常会拿到翻译接口,将Form Data的数据提交过去就能拿到翻译结果,因为Form Data中会有我们输入的查询单词,只要我们在python中用变量接收输入值放到字典里,再将字典传输到翻译接口就行了。但是我们发现,我们只能查到mode单词的意思,其他单词都会报错,为什么呢?

(三)障碍分析

首先,有道翻译接口不会错,那么就是我们Form Data的问题了。会不会每个单词的Form Data除了除了第一个键值对还有不一样的呢?(会)。因为我们拿到了mode单词的Form Data放到了代码里,只是将i:mode这里的mode改成了动态获取所查询单词,其他键值都没改动过,那么其他键值动态的来源是谁?

我们首先尝试搜索三个单词,对应三个单词的Form Data发现,salt,sign,ts也是会动态改变的。见下图

既然不是用户动态输入,那就是js了,那么js在哪?    是怎么改变他们的呢?

(四)找到js

找网站的js文件双击打开,复制粘贴后在线格式化,再复制到pycharm里就好了

(五)在js中找到改变salt,sign,ts的函数

怎么找呢?

在复制到pycharm后按ctrl+f查找salt。

为什么查找salt呢?

headers中的数据来源于客户端,目的地是服务器,所以headers中的数据要么是用户输入的值,要么是js自己或根据用户输入产生的动态值,js生成的数据会用变量接收,Form Data中的键名一般会(99.99%)与js中的变量名一致,因为是同一个人开发的这一模块。我们根据salt,sign,ts到js文件中按住ctrl+f查找找就能找到相应的功能函数,找到了就可以发现他们三个键的值是怎么生成的了,我们再用python实现js同样的功能就好了

(六)找到数据来源

在js代码中按ctrl+f查找salt找到下面代码块(可能有多个salt,按照理解分析找到对的地方)。

图中的e是以参数传进来的,我们要找他可以ctrl+f查询谁调用了这个r函数,就能得到参数e是啥了,即:查询r(e)或 = r(  ,没错就是等号和单括号。 我找到的结果是:e就是我们输入的查询单词mode

最后一行给定了两个字符串,并且将e和i放进去一起进行md5加密

 (七)python实现相同逻辑

实现五处动态:

第五处:不输入单词时是233,输入单词会动态变化

代码实现js相同逻辑:

import requests
import time
import random

# 生成md5字符串
def getMd5(value):
    import hashlib
    md5 = hashlib.md5()
    md5.update(bytes(value, encoding='Utf-8'))
    md5_str = md5.hexdigest()
    return md5_str

if __name__ == '__main__':
    #输入单词
    keyword = input('翻译的单词:')

    #生成salt的值
    r = str(int(time.time()*1000))
    salt = r + str(int(random.random()*10))

    #生成sign
    value = "fanyideskweb" + keyword + salt + "@6f#X3=cCuncYssPsuRUE"
    md5_str = getMd5(value)

    #生成header
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Language': 'zh-CN,zh;q=0.9,und;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'Content-Length': str(233+len(keyword)),
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=6241167.578427844; _ga=GA1.2.1519057173.1535511777; JSESSIONID=aaamFTGK4qLCf4uKcrxPw; ___rl__test__cookies=1556242390777',
        'Host': 'fanyi.youdao.com',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }

    #生成表单数据
    data_dic = {
        'i': keyword,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': salt,
        'sign': md5_str,
        'ts': r,
        'bv': 'ae62d2e2541901f6ebf99ec18e429e3f',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME'
    }

    #接口地址
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    #发起网络请求
    response = requests.post(url=url,data=data_dic,headers=headers)
    print(response.text)

猜你喜欢

转载自blog.csdn.net/sinat_38068807/article/details/89537251