python timestamp转string_Python 爬虫 | 某道翻译的获取

有小伙伴和我反馈上次的那篇某云音乐评论的爬取js逆向难度挺大的,不太好理解,有没有简单点的案例,正好这几天了解到了一个简单的js逆向网站十分适合入门学习。如果对你有帮助的话记得点赞喔。

目标网站:

aHR0cDovL2ZhbnlpLnlvdWRhby5jb20v

目的:

实现翻译软件的翻译功能

目录:

1、环境

2、分析网站

3、功能实现

1、环境

Python3.7、requests、hashlib

2、分析网站

在翻译框内输入需要翻译的文本(这里以网络为例)

20700014f4f5e9a51100e9b8c64560bf.png

输入网络后右边的框内会出现对应的翻译结果,同时在Network会出现几个请求,第一个请求translate_o?smartresult=dict…直接翻译过来就是“翻译 智能的结果”结果是一个字典。进入第一个请求查看Preview,可以看到第一行的字典中包含了我们需要的结果

2ec13db95b93bd01540cbb41e285c0ce.png

接下来就是分析这个请求的接口了

37cae1904ef4f59cd316d94d81abd7b7.png

这个接口需要传入这些参数,这么多参数肯定有些的不变的,请求一次这个接口找出不变的和变了的参数,发现

2a05e3238dd499811fa44a0415da8683.png

07653c5b89238999e2c0a073d48abd5b.png

可以发现参数salt、sign、ts是变化的,其他参数是不变的,其中salt是ts加了一位数,ts我估计就是时间戳了,加的那个数字估计是随机数,说那么多废话干嘛,直接开始找就行了,还估计什么呀。

按照之前的习惯先全局搜索关键字,这里搜sign

354086157535c9575193ea60fd52915b.png

1ff28405628cc0593e00e249128c0344.png

这里只有一个结果,太舒服了吧,进入这个js文件查看,是被压缩过的代码,正常格式化就好了,再在这个结果中查找sign(Ctrl + F)

3728e88c1da08971b2cb0cf457b709f0.png

这里有15个结果

9c49ad971c7adbebb9481117c7d998a1.png

在第5处发现一个疑似的,在这里打个断点(点击旁边的行数即可),继续往下翻

9cb9079ded6fc803a831868008bcec36.png

在第6处看到了一个md5加密的sign,这个大概就是了,打个断点。在文本框中输入“网络”看看这里的参数是什么样的

0b0ea9a3a5a5f2cc8101d6f0d236873b.png

成功的在这里断住了,右侧框内也没有结果,看来这个请求没被发出去

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 + "mmbP%A-r6U3Nw(n]BjuEU")
    }
};

分析这段代码的各个参数,e是输入的文本、t是将app版本进行了编码或加密、r是时间戳、i是r加一个0~10的随机数取整,ts对应的就是r、bv对应t、salt对应i、sign是将两端固定字符与e、i相加并进行md5加密。

3、功能实现

先不急着用python实现先观察哪些数值可以直接写死的,ts版本号、r加的那个随机数也可以写死(都是随机的,就固定为1把,反正识别不出来)

先实现md5的加密

def sign_md5(text, timestamp):
    string = 'fanyideskweb' + text + f'{timestmp}1' + 'mmbP%A-r6U3Nw(n]BjuEU'
    return hashlib.md5(string.encode('utf-8')).hexdigest()

参数text就是需要翻译的文本,timestmp为时间戳乘1000并取整

md5需要byte的格式,可以直接用utf-8的编码方式,也可以在参数前添加b来转换类型

hashlib.md5(b’123’) .hexdigest()

请求函数

08a52694d6687ad36184a4526ea6466b.png

这里要用post方法,没什么好说的,直接上代码吧

def get_page(url, data):
    try:
        response = requests.post(url=url, headers=headers, data=data)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('Error', e.args)

哦,对了这里的请求头还是要说一下的

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',
}

如果你只加一个ua是会出问题的

6f628ec5a7ccc6e66870aac653594c7f.png

这里需要再添加Cookie、Referer

4d86cc7a270246742b275493511d6899.png

尽可能的去模拟ta的请求,ta有的参数我们也添加就好了

主函数

8cfe7d31e6c6a9eb0d341e2c9510d733.png

这个函数需要传入这全部的参数,最大程度的模拟真实请求。

def main():
    need_translate_text = input('输入需要翻译的文本:')
    timestamp = int(time.time() * 1000)
    sign = sign_md5(text=need_translate_text, timestamp=timestamp)
    data = {
        'i': need_translate_text,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': f'{timestamp}1',
        'sign': sign,
        'ts': f'{timestamp}',
        'bv': '07f15609aa4583527f9a1c22f48db662',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME',
    }
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    result = get_page(url=url, data=data)
    print(f"需要翻译的文本:{need_translate_text} n结果为:{result.get('translateResult')[0][0].get('tgt')}")

运行结果:

eccc158030b78dee712347367e9c7f1b.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值