翼度科技»论坛 编程开发 python 查看内容

aardio爬虫) 实战篇:逆向有道翻译web接口

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
前言

之前的文章把js引擎(aardio封装库) 微软开源的js引擎(ChakraCore))写好了,这篇文章整点js代码来测一下bug。测试网站:https://fanyi.youdao.com/index.html#/
逆向思路

逆向思路可以看有道翻译js逆向(MD5加密,AES加密)附完整源码,逆向我就不赘述了。这篇文章说一下怎么将文章中给的Python代码翻译成aardio调用和扣js代码用ChakraCore调用。
扣js代码

有道翻译的js是webpack,扣webpack主要有两个内容,一个是加载器函数,还有就是实际调用的函数。这个可以去看b站志远一期的内容,讲的很详细。

这个我看了下,把整个js放到nodejs里执行就行,不需要扣函数,函数和函数之间关联太多了,扣反而不方便。上面补个window,然后导出成全局函数。
91565这个函数在另一个js文件里,把整个大对象拿下来和e合并一下。

然后就可以直接调用
  1. var r = n(91565)
  2. console.log(r.createHash("md5").update("11111111").digest("hex"))
复制代码
再封装两个函数给外部调用:
  1. function md5(content){
  2.     let r = n(91565);
  3.     return r.createHash("md5").update(content).digest("hex");
  4. };
  5. function aes_cbc_decrypt(key, iv, content){
  6.     let r = n(91565);
  7.     let o = r.createHash("md5").update(key).digest();
  8.     let a = r.createHash("md5").update(iv).digest() ;
  9.     let i = r.createDecipheriv("aes-128-cbc", o, a);
  10.     let c = i.update(content, "base64", "utf-8");
  11.     return c += i.final("utf-8");
  12. };
复制代码
测试了封装的ChakraCore库,有个莫名其妙的bug:如果不在js里调用这两个函数,那你再aardio使用run或者callFunction调用可能会报错,测试了半天也没找到具体原因,主要是ChakraCore的文档有点少。
没办法,目前只能在javaScript里先调用一次,这个bug后面看看能不能解决
  1. var decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";
  2. var decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl";
  3. var text = "";
  4. // 需要先在js里调用一次,不然aardio调用报错
  5. md5("1111")
  6. aes_cbc_decrypt(decodekey, decodeiv, text)
复制代码
用ChakraCore调用的完整代码(js文件我放到了aardio-extlibs那个github仓库里作为ChakraCore的用例):
  1. import console;
  2. import kirequests;
  3. import ChakraCore;
  4. io.open()
  5. var core = ChakraCore()
  6. core.start()
  7. core.run(string.load("./有道翻译.js"))
  8. var client = "fanyideskweb";
  9. var product = "webfanyi";
  10. var key = "fsdsogkndfokasodnaso";
  11. var signStr = `client=%s&mysticTime=%s&product=%s&key=%s`;
  12. // 先请求主页获取cookie
  13. var session = kirequests.session();
  14. var url = "https://fanyi.youdao.com/index.html"
  15. var resp = session.get(url);
  16. // 要翻译的内容
  17. var word = "中国";
  18. // 内容是什么语言
  19. var from = "auto";
  20. // 想翻译成什么语言
  21. var to = "";
  22. var webtranslateApi = "https://dict.youdao.com/webtranslate";
  23. var timestamp = tostring(tonumber(time())) + string.random(3,"1234567890");
  24. var postData = {
  25.         "i": word,
  26.         "from": from,
  27.         "to": to,
  28.         "domain": "0",
  29.         "dictResult": "true",
  30.         "keyid": product,
  31.         "client": client,
  32.         "product": product,
  33.         "appVersion": "1.0.0",
  34.         "vendor": "web",
  35.         "pointParam": "client,mysticTime,product",
  36.         "mysticTime": timestamp,
  37.         "keyfrom": "fanyi.web",
  38.         "mid": "1",
  39.         "screen": "1",
  40.         "model": "1",
  41.         "network": "wifi",
  42.         "abtest": "0",
  43.         "yduuid": "abcdefg"
  44. }
  45. var s = string.format(signStr, client,timestamp,product,key)
  46. postData["sign"] =  core.callFunction("window.md5",s);
  47. var resp = session.post(url=webtranslateApi,data=postData);
  48. // 开始解密
  49. var decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";
  50. var decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl";
  51. var result = core.callFunction("window.aes_cbc_decrypt", decodekey, decodeiv,resp.text)
  52. console.log(result)
  53. console.pause(true);
复制代码
aardio实现

这里在给个不用ChakraCore用上篇文章写的aes库调用的代码。
  1. import console;
  2. import kirequests;
  3. import kicrypt.aes;
  4. import crypt;
  5. import crypt.bin;
  6. var client = "fanyideskweb";
  7. var product = "webfanyi";
  8. var key = "fsdsogkndfokasodnaso";
  9. var signStr = `client=%s&mysticTime=%s&product=%s&key=%s`;
  10. // 先请求主页获取cookie
  11. var session = kirequests.session();
  12. var url = "https://fanyi.youdao.com/index.html"
  13. var resp = session.get(url);
  14. // 要翻译的内容
  15. var word = "hello";
  16. // 内容是什么语言
  17. var from = "auto";
  18. // 想翻译成什么语言
  19. var to = "";
  20. var webtranslateApi = "https://dict.youdao.com/webtranslate";
  21. var timestamp = tostring(tonumber(time())) + string.random(3,"1234567890");
  22. var postData = {
  23.         "i": word,
  24.         "from": from,
  25.         "to": to,
  26.         "domain": "0",
  27.         "dictResult": "true",
  28.         "keyid": product,
  29.         "client": client,
  30.         "product": product,
  31.         "appVersion": "1.0.0",
  32.         "vendor": "web",
  33.         "pointParam": "client,mysticTime,product",
  34.         "mysticTime": timestamp,
  35.         "keyfrom": "fanyi.web",
  36.         "mid": "1",
  37.         "screen": "1",
  38.         "model": "1",
  39.         "network": "wifi",
  40.         "abtest": "0",
  41.         "yduuid": "abcdefg"
  42. }
  43. postData["sign"] = crypt.md5(string.format(signStr, client,timestamp,product,key),false);
  44. var resp = session.post(url=webtranslateApi,data=postData);
  45. // 开始解密
  46. var decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";
  47. var decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl";
  48. var key = string.unhex(crypt.md5(decodekey,false),"")
  49. var iv = string.unhex(crypt.md5(decodeiv,false),"")
  50. var aesObj = kicrypt.aes(key, iv);
  51. var data = crypt.bin.decodeUrlBase64(resp.text)
  52. var result = aesObj.decrypt(data, kicrypt.aes.CBC)
  53. console.log(result)
  54. console.pause(true);
复制代码
本文由博客一文多发平台 OpenWrite 发布!

来源:https://www.cnblogs.com/kanadeblisst/p/18174306
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具