0


【js逆向爬虫】-有道翻译js逆向实战

**大家好 我是毕加锁(锁!) **

今天给大家带来的是【js逆向爬虫】-有道翻译js逆向实战

网页分析

打开网页,随意输入几个单词,发现网页不是静态加载的。不着急,我们换方式,抓包。

通过查找,我们在Payload里面发现了输入的需要翻译的信息,比如我这里的“人民”,然后在Preview里面发现了返回的翻译信息,这里我没有上传图片,接着继续看Headers里面的数据,通过观察,会发现网页是post请求,大概的思路就已经出来了,先尝试写一下。

初步代码实现

post请求需要携带的参数我这里就不再说明了,headers,cookies,data等等基本上都会添加。这里需要说明的一点,如参数补全后还报错的话,重新抓取请求,我就是在这里卡了好久,后来换了下面的“生活”一词。

  1. import requests
  2. url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
  3. headers={
  4. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
  5. "Cookie": "OUTFOX_SEARCH_USER_ID=2030291441@10.169.0.102; JSESSIONID=aaaL9cZGnEYP5anryhK2x; OUTFOX_SEARCH_USER_ID_NCOO=624916323.622491; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcbn5lLEK4FC4F7BhK2x; ___rl__test__cookies=1639138497978",
  6. "Referer": "https://fanyi.youdao.com",
  7. "Content-Length": "252"
  8. }
  9. Payload = {
  10. "i":"生活",
  11. "smartresult": "dict",
  12. "client": "fanyideskweb",
  13. "salt": "16391384979865",
  14. "sign": "b1e30cb6bb14501ea6827a83a554dcae",
  15. "lts": "1639138497986",
  16. "bv": "e70edeacd2efbca394a58b9e43a6ed2a",
  17. "doctype": "json",
  18. "version": "2.1",
  19. "keyfrom": "fanyi.web",
  20. "action": "FY_BY_REALTlME"
  21. }
  22. res = requests.post(url, headers=headers, data=Payload)
  23. print(res.status_code)
  24. print(res.text)

第一步基本上就成功了,看一下返回后的结果:

可是当我们想更换一个单词的时候,系统又会报错,比如,我这里换了太阳:

那怎么办呢?我们开始第二步,也就是js逆向

逆向查找参数

通过对上面的代码进行分析我们可以看出,"salt"、"sign"、"lts"、"bv"这四个参数不清楚怎么回事,那就需要打开Initiator下面的js代码去一一查找,定位。

打开后,按ctrl+f搜索,比如我这里搜索的第一个参数“salt”,这里一共12,通过观察找到这一个:

然后将需要的代码复制到Console,回车运行查找规律。比如我这里salt: i,然后i = r + parseInt(10 * Math.random(), 10),r = "" + (new Date).getTime(),通过在console运行后发现,“parseInt(10 * Math.random(), 10)”的意思是随机生成一个0-9的随机数;(new Date).getTime()是当前的一个时间,也叫时间戳。再观察又发现ts: r,bv: t,t = n.md5(navigator.appVersion),运行后得知,t就是我们在发起请求时的 "User-Agent"

那么我们开始代码实现:

  1. 先搞定ts
  1. import time
  2. r = time.time()
  3. r = int(r*1000)
  4. print(r)
  5. >>>1639141944732

可以看到ts也就是上面的r和Payload里面的“lts”已经搞定。

  1. 再搞定salt

先来生成parseInt(10 * Math.random(), 10)的随机数:

  1. import random
  2. s = random.randint(0,10)
  3. print(s)

再来实现i = r + parseInt(10 * Math.random(), 10):

  1. import time
  2. import random
  3. r = time.time()
  4. r = int(r*1000)
  5. s = random.randint(0,10)
  6. i = r+s
  7. print(i)

至此,我们已经拿到了三个参数,代码也可以改写一下了:

  1. import requests
  2. import time
  3. import random
  4. url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
  5. headers={
  6. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
  7. "Cookie": "OUTFOX_SEARCH_USER_ID=2030291441@10.169.0.102; JSESSIONID=aaaL9cZGnEYP5anryhK2x; OUTFOX_SEARCH_USER_ID_NCOO=624916323.622491; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcbn5lLEK4FC4F7BhK2x; ___rl__test__cookies=1639138497978",
  8. "Referer": "https://fanyi.youdao.com",
  9. "Content-Length": "252"
  10. }
  11. #获取时间戳
  12. r = time.time()
  13. r = int(r*1000)
  14. #获取salt
  15. s = random.randint(0,10)
  16. i = r+s
  17. Payload = {
  18. "i":"太阳",
  19. "smartresult": "dict",
  20. "client": "fanyideskweb",
  21. "salt": i,
  22. "sign": "b1e30cb6bb14501ea6827a83a554dcae",
  23. "lts": r,
  24. "bv": "e70edeacd2efbca394a58b9e43a6ed2a",
  25. "doctype": "json",
  26. "version": "2.1",
  27. "keyfrom": "fanyi.web",
  28. "action": "FY_BY_REALTlME"
  29. }
  30. res = requests.post(url, headers=headers, data=Payload)
  31. print(res.status_code)
  32. print(res.text)
  1. 最后搞定sign

通过观察可以发现:sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT"),能得到的信息有:1.这个是md5加密,2."fanyideskweb"是固定的,3.i前面已经生成了,4.e不知道是什么,5."Y2FYu%TNSbMCxc3t2u^XT"这一部分是固定的。

通过断点调试后发现,e就是我们输入的文字。

最后一步,百度md5怎么加密,这里我感觉是最难的地方,说实话这一块我也不懂,百度的结果如下:

  1. from hashlib import md5
  2. string = "**********"
  3. m = md5()
  4. m.update(string.encode())
  5. sign = m.hexdigest()

改写代码

  1. import requests
  2. import time
  3. import random
  4. from hashlib import md5
  5. import json
  6. url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
  7. headers={
  8. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
  9. "Cookie": "OUTFOX_SEARCH_USER_ID=2030291441@10.169.0.102; JSESSIONID=aaaL9cZGnEYP5anryhK2x; OUTFOX_SEARCH_USER_ID_NCOO=624916323.622491; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcbn5lLEK4FC4F7BhK2x; ___rl__test__cookies=1639138497978",
  10. "Referer": "https://fanyi.youdao.com",
  11. "Content-Length": "252"
  12. }
  13. def get_param():
  14. lts = int(time.time()*1000) #获取时间戳lts
  15. random_num = random.randint(0,10)
  16. salt = lts+random_num #获取salt
  17. word = input("请输入需要翻译的单词:")
  18. string = "fanyideskweb" + word + str(salt) + "Y2FYu%TNSbMCxc3t2u^XT"
  19. m = md5()
  20. m.update(string.encode())
  21. sign = m.hexdigest() #获取md5加密的sign
  22. return word,salt,lts,sign
  23. word,salt,lts,sign = get_param()
  24. Payload = {
  25. "i":word,
  26. "smartresult": "dict",
  27. "client": "fanyideskweb",
  28. "salt": salt,
  29. "sign": sign,
  30. "lts": lts,
  31. "bv": "e70edeacd2efbca394a58b9e43a6ed2a",
  32. "doctype": "json",
  33. "version": "2.1",
  34. "keyfrom": "fanyi.web",
  35. "action": "FY_BY_REALTlME"
  36. }
  37. res = requests.post(url, headers=headers, data=Payload)
  38. # print(res.text)
  39. data_json = json.loads(res.text)
  40. result = data_json['translateResult'][0][0]
  41. tgt = result['tgt']
  42. src = result['src']
  43. print(f"需要翻译的单词为:{tgt}")
  44. print(f"翻译的结果为:{src}")

成果展示

我是毕加锁 (锁!) 期待你的关注

标签: 大数据

本文转载自: https://blog.csdn.net/weixin_69999177/article/details/125832170
版权归原作者 毕加锁 所有, 如有侵权,请联系我们删除。

“【js逆向爬虫】-有道翻译js逆向实战”的评论:

还没有评论