河北某日报移动端python数据采集 eds加密新闻内容

写在最前面,此移动端采用EDS 的js加密,核心的js加密代码 贴在

个人爱好尝试破解,仅提供技术交流用

目标地址 :抓取的详情页地址

var e = "4Qjir8b019EIXH0FBzIJIuElne7uRYd6AB7qOIQg+TdtJrwVSB14GtcSzJdjmyN5u+g+hznC1bk6I7hrY3eDz8oLesWxaYm5isct6vbX4zvHXvZYh\/QRGDG3sQ61KguvnhBY4Vzodc7yEayJ6JQHPkgHBV+zY\/uwms00QsiZF7Qlh4iGJZK4Gm1kdwxSTDjQ+Jb+rKftMYhkmgEF\/z5qia5GNMl+qzEf4+4OUCLUCPrV08WQstiqYzCajrRrzPni+5+\/xrbUbLXsJIfkqOnAeSgUUj0i2JdSfXuLEYzHh3nJP1VhpozJ\/TLRF+bt7njKOzmLYFIwfryQX7j9FL1DgDRl54TKtnBwjNnUyRSRGpFFBmPn\/vgwXPLmtjJZxFJC9B\/aiRVI0Yf43Jlsl+520xzFXH4CaiM6SB+zgHrVKiF9koXsioYeYvP0nuZbz\/JS0aEanzNvL9Zwo9y+alD1pTqFMiCv9WyQgMDIyeT6yM6DodOkytWTZg\/pO4VBnv0oiFPsUFKKBkakR59mQfdPcGwQgwHbob2WW4utJnP9nnKt3KnD5IlmvZwwLutXhvIvucI\/30iZAUq0o7FnDurr6S0UM+aebXs3pJheMAMbZ6DJ058mi9jFk+9ZiXaG127WXLfCOR+xTqvT8+LyWYnKWdE5FXmGs02k26uoi6w8tBbTeZppt0l2z4fIZVGqjWmJnLSGmmju0\/rbbn+5GDhxEuiqZ9ogJMF+DEEZqx2NsPxLeTvu+qBLOepzTZuhTyZrm81vYLAxEcR2fa\/ngNXw0mJLVB5jvQs2AX55BR3j+674OKw9qzMCniQ43BDvGzdxZARxU1a3sXIJh4gdIGfi8yzxOZnDczfTPR\/z\/W2QUf27Vwn5JPQk40UPJdFS2jEJg9UNRCHN1813pzucli\/aIEt5O+76oEs5+VHWpQtxwMhGvnkDPKReIzG3sQ61KguvnhBY4Vzodc7yEayJ6JQHPkgHBV+zY\/uwms00QsiZF7Qlh4iGJZK4Gm1kdwxSTDjQ+Jb+rKftMYjp5iey5aHcRRGblhCshCZQfqM81e8jkGa8zTBzwGoeffnl4oOrACAn5iS+V8k4BsIc+2u0mdsgm7UDDTcl66\/BzLyAxrYPcVrgwhvroaG+suv6C5Y2EYkAvgTGWBLF+W9ti4bRuodqLOxafiFTRA+LhiETK+XqHEjpASTyqHfaCthgIZ9AvmAqtz+BuwQ3vq+T4Zr16pgGnY3vfBLPmkrRJ3F85btrqomLUJaZsLgURjNsQNgjIAyv7KjrnIBx\/yLpS93h6+KtS4phBVSvsegY3nSD4HaMejay5PKvZ7tuHcxx3Y2cIBY9rFS9RboiY6lWdXqnk2IBGZ\/M\/5yJ8PIwWBESpaSn0O1lRq9utMa5ds44K\/tY3AOF5U8mBMNURzgzZT12Pm\/RINRjbt79FSZSTfbUjkcZU9bHR8nUp7CSGgQzUfsIGaIaCDJciCDB3NwF5QC9KO8mOOwptwFPdiNmCiYk\/3gGfWKQnJfo9tsg53+umJjCLOUj4UXY\/oqJZA7PpKGlI2h0mn\/b0uVwxDPpnRzdR3XIdQGYib2kHfxiW4iL26jFqT\/jlJfsSKk87CQvXmBWFMXBxweQ7V6hC0GclRt6X2kP0gqhf5k8R0Ndq\/xx6Ls\/LuHbG0E7uoX2rqKhlu62hpqRHfP7NgXBY5xak\/lcF6NWmMqyRLT+WwoVE2vxl1H1qmx7bvl7yh+V+4ij3azaBMrWIU2j0btWZUaQ+0iO9xO2lFGP5xsqF\/4aPeHN9VzHPspazzWJjCLtoEi7Cqf3iVunAmvq4F5gZtEqmS+mORhUzKq95X49DyW5L0KnYJ4x3DNW0GpoLuepKzbwqBt05jVVERExG8AENGCBME1WgColy2Rrujiark9od\/ZvLJYxgT2kyKZjKvFtP4gFbv28j6\/iiSTL8aRRni1lIK8pr8okfSxuCC1VD5iN2xKGP\/uHTAryA8Nx2FHz1WhLhstK2zYKpjx3gJiBqJtifqv7RnHSvzEbk\/8HQ1cYbtsYvSvyqgWpWUul9wmuIqtCXTPszNTPZ5Mmr3fjYdTYKb2ehowY\/PGRlIOxm6qGLdJkG+J+bcBODBgkLhr5RmJZ0X8cA2plCnTHwF+u\/NjxEqnhoCqRX\/1vl6xiQNtMBlMznzG5rGrGASjoCUEiPKop5xXjs+slYbj9KPXEAIxKAeaUvspiBGw105atRYNLmv2utQgwUGFfzcB9mSFhO9WM2dTJFJEakaorp37on3\/3nZIMAK5bpc0CuyXW\/cPDBO6ADLCntUPLzuHwm6MgQhXiOivjCW29djYDNCmbd+aLyv1y\/R48KTSZZ+0AngxTKFw5VqslhF3w7qy\/vCC+viCgjEQtflLzkAZw29aUiIQtfMpdwCIUpMNEArzlK4yFLxV0tlDdrZjVobENz6BWCVvHPd6iZPPRD2uEt5pQka2OOy6J3taepA9wTUB2pPj0f6TdI0ss5hra6Bh4FwP90ZWprHJw2S2CNOJ0IfI8CWWZWrLGgRfSrJAed+QcT2Fk1PPbeRAa3GgSq66TRGC\/zb+emlvgrubdDQNThyevMfJBnppb4K7m3Q3NRwAE2M\/e0Hz22ZH5aXkP7MklJjGprYfhJZ3u7kWHere90uE27x0vaq3Mv1PU1rY6oqXtyY4Bxtgrkw2HEhCR3qx\/o9+gslNnUK+KZpNcmRDfsiRoiz1WyE2ihH9vL60wu2qWQUf1hjX3y61zMnEyAPDwie7FpEqEYj\/2+ASlamqdwyvhjNTsyl1LbPL6nrneQrqWhilNurjDrALAydpuBW7JXcDzfTSsVJK3gBeb88oCMS6zul\/uAEklTUZchQWRoJJCOl+P4gM7kjUUCM6IpNVa5DVlLxzHAwYwKhz9zG0mvBVIHXga7uanZDJ6x4EYnrGO7h+K6rbAQ4t+wp7QzFqFf9oSviOf8tokPYqJQ4JYoM8PxQz2LUfXOm41YZFlYTpfz5PPspc5dA03oYnTGltypHOtWeYMoEguB5PSqnMke9HxYCyr+OuKZ39Q4BypzkAMXbFLCt4I+C98LkiMD7rj24UhLuUoGt\/QchJaRpBnfWijhhgZFfYzQzEyOjbC2yPOVYp4DtFOd5xLNiYTwtsjzlWKeA4xHSVTYcSTYhk6caaWjLZZrRlWptwKoVBmsMUTLN\/WAlCiGzOZCv+NfHiff32lwAA\/2Enp5tZTkD7kWkKLoswz6MFaojAhsFNVkFMX1GWpx\/jSKQFvmZIPXFTwo4JfYVvN1V2H4Dige\/m+DoScW12LnOkSzQ62YnpXsjQLdQ7H5ZP87C8VPIivdVBo8H7Th3RBQ6ZbHs6D7L++eauP+xfHrD6C5DjVl27Z76Cq80j4bIbHeEF5K3+pyCDb6lSX7iyFG8yxJLMBe6F8tdgYRgOUKAKatqWZ5QH3EfSo2loa8+awFzamt\/57Ub57BNDv\/sXPg8FGf\/5+y\/vjNeEO4g3EdzVP\/KWojuJEIy6fBrPIKzEdJVNhxJNidaCsgcZjUBdYcGxRg94upEWkkG9K24vel317mH8FD9cQ0ZaNnZBxY0UfcinhERxFjMJDRD+QO0iLsiP+KhdS+LsQgH2L8ALs0lVjx4KMw7PpkxaEBoG9WbWsqxIKYJqIrFSSt4AXm\/Osu+wuwrwhIq\/CKfW1c6aGqwZl6TeFejrbGL0r8qoFqSdfVkpxDuzWCsN2vjufISmdNn2sjG2bUKaQz3ZZHrQQnTZ9rIxtm1CXMj5b7fJwqxjKSUAKm\/8\/by5KNtY63XaaDSuwwOhWWwlDOeLYg3hRIvsTd8mpo2meRasYziTYeGNWE4K9Vsp2IlRZmLTdLNFYhlgBGCLGj0lrsUY3VoiGQqdgnjHcM1bQamgu56krNvCoG3TmNVURETEbwAQ0YIEwTVaAKiXLZGu6OJquT2h39m8sljGBPaTIpmMq8W0\/iAVu\/byPr+KJ7+z8ANFhKOfzoBu2UNRkN5CxAkzBcJrgKgeG7wCCh5CRHDnRDd2lzZCGt9TREaY6gRPGgbRN4Vfnzc0iI5t458IxuV0Bef3PrFS9RboiY6nKzUyo9dPoeGxGVJ76ik8W225\/uRg4cRJvzkebMM1UY4uyI\/4qF1L4oq440DX1HL\/2xt9euEov7lyyhS40N3A94rGVzZbo6Lu76D6HOcLVuVamlOFsm07YCAuqsCszsOAu98GBfGpJcTH3Y\/s942l8rbu1kdLy5Jlzfje94Z7YvEIoRe2HVN\/Dk2KEY9RQAcBvzhBw+i4u7Uk7vTEYr97Lns3NkEies8kQ0IYNvqIacjECtqcl3CYHRYkrUVcbR6\/mSU4lwyxENdcgl6Hd2Wf4URrhFgW5FpYAbfwVN\/pe8YOLRuw1u8lF8IyZYEqQc5kUpRmRRKD\/4aNj0FuMaApbBAzBZ8xWQkuGSo\/Zk2KEFTPhZnp44FaOm84e9oa5bkvdWSysP8jn5WZRQa7D3g++X1lFdp3K01Hyvp12QZBM9VM\/K5w2OA+h05RTxL1IKH8jqde9jEZYoq5AF3c2CIK4ILUqR\/klfII2vRA41S8thXWEkei58fZfZRzSksQzadZEqh+PGYqvrI6\/gTBPPOZJiGyyaTfd1xG\/OtjhU\/E+FRVe59JvAUAtDhlz\/CmLOm8oqByhCpArmYhT7FBSigZGpEefZkH3T3CeYM8eIhhIDu4y84+fPOeCp5K65JhUp7m4\/Sj1xACMSr\/2m+UDVuM7O5OoL+uHG0+7qkmYykr1FLKt\/AIP0MU7HYj8Z7\/DJhJKX5tyqlk4\/VN\/pE4Cts1e90r5Re+BZkRsi2l8vNFksLpl9pH5kco\/eFBilp2q3h\/vsg9klEervc+wzQ49+D+6+SICWGbR97rPd6DpR+m\/xo7dZHaZbJHC7bfJj8XEqA4\/gpZrQKYZrjIXOdEPVCQS9clnzK\/IO8xjk++UgSEaX4OQpFOBE\/2gbGzf8VmNDKXNP5zTLh0M+Uu6lZOQm+nop6iZ5Qzo3GZFjX1d7DvIGqlqFtWrgVLceMItf14jcnRJ\/GlI5Caiv36OlTgV9RYUei+UVe6\/nAbiEGR\/\/dSFIQ5Uvs2sM3kvC1hcsRGyqZ9yn7FgjScsyVSu6YZ56ye1QMNz\/Aa89l59oRut6VmMtq8E1on9L1kHxwIDz5cgjidndO5Z\/diRsiKmK6XEkhTmC9l3noxVQiOmpJYVjpGqRyexJ26HySbcsfeqHPSieqt2TdS71uwjjXZZr6a8lv5oTlRk1ZRuB58oApq2pZnlAfcR9KjaWhrz9r8Ppekgmj0UqndiX+KMxgl9VqqSn06Gi\/5CMwxJiWSB10mQz\/+g+QLVm1xnkkSLPu2r3EtKKxfLtTMYiY9Jn7uqSZjKSvUUsq38Ag\/QxTsdiPxnv8MmEujkvdqoLfSctjTbqgyUsVP3SvlF74FmRGyLaXy80WSwumX2kfmRyj94UGKWnareH++yD2SUR6u9z7DNDj34P7r5IgJYZtH3us93oOlH6b\/Gjt1kdplskcLtt8mPxcSoDj+ClmtAphmuMhc50Q9UJBL1yWfMr8g7zGOT75SBIRpfg5CkU4ET\/aBsbN\/xWY0Mpc0\/nNMuHQz5S7qVk5Cb6einqJnlDOjcZkWNfV3sO8gaqWoW1auBUtx4wi1\/XiNydEn8aUjkJqK\/fo6VOBX1FhR6L5RV7r+cBuIQZH\/91IUhDlS+zawzeS8ZVYBLvVIVOQ=="
JSON.parse((e = e,
            CryptoJS.TripleDES.decrypt({
                ciphertext: CryptoJS.enc.Base64.parse(e)
            }, CryptoJS.enc.Utf8.parse(CryptoJS.MD5("123qwe!@#hbrb;,&7*8(9)0^6%5$").toString()), {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
            }).toString(CryptoJS.enc.Utf8)))

CryptoJS 是js的加密库 下载地址下载地址
其中的 var e 的值是 其移动端分享出来链接的xhr返回值,下面

curl 'https://hb3app.hbrb.hebnews.cn/four/subscribe/news_detail' -H 'Connection: keep-alive' -H 'Accept: application/json, text/plain, */*' -H 'Sec-Fetch-Dest: empty' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36' -H 'Content-Type: application/json;charset=UTF-8' -H 'Origin: https://hb3app.hbrb.hebnews.cn' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-Mode: cors' -H 'Referer: https://hb3app.hbrb.hebnews.cn/share/hbrb_share4/news_detail.html?file_type=1&list_style=2&news_id=150016&app_news_id=0&subscribe_id=0' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'Cookie: acw_tc=7b39758715840793052754418ea8a37b816529f1e85862d091b30f4a74c89c; Hm_lvt_fc19c432c6dd37e78d6593b2756fb674=1584429026; zycna=51Rt85ovk5ABAXlFJx7nSfAq; UM_distinctid=170e75518984f6-0d83408e2193ed-396d7406-13c680-170e755189974c; Hm_lpvt_fc19c432c6dd37e78d6593b2756fb674=1584429084; SERVERID=f4256547a4b299574faf0fd8c3fa6428|1584536364|1584536346' --data-binary '{"news_id":"150016","subscribe_id":"0","device_id":"web","app_news_id":"0","webShare":1,"version":4.1,"isDes":1}' --compressed

以上差不多你就懂我意思了,接下来 就是单纯介绍我采集数据的步骤和用到的库,留作记录。

需求:需要某日报移动端新闻页数据,包括标题,时间,图片,以及html内容,

生产环境: python ,以及相关的 各种库
BTW:执行js 我使用的是 execjs 这个库

  1. 首先 常规操作
    直接请求 果不其然河北某日报移动端python数据采集 eds加密新闻内容_第1张图片
    现在正常网站都不会直接显示的,看看是否是ajax请求
    河北某日报移动端python数据采集 eds加密新闻内容_第2张图片
    确实是ajax请求 但是这一大串的字符串明显就是加密的呀。。。。

  2. 使用selenium?
    好几十万条新闻链接不得干废了,

  3. 使用多快好省的 pyppuetter?
    虽然比selenium强的多,快的多,不过万不得已还是算了,尝试滑块验证什么的倒是可以用,绝大部分网站都已经可以检测selenium现在都在用异步的pyppuetter。

  4. 歪门邪道的 mitmproxy 执行python脚本抓响应吗?
    不是不可以,这种方法简直暴力的不行,手动点击 不管你什么加密,只要有响应有请求,直接给我抓最后的显示结果。不过好几十万条链接还是留给机器吧。
    可能你会说加上自动化测试工具?appnium?airtest?思路没问题 就是要快 就是要快。

  5. 最后我只能老老实实的去看js代码
    这里就是各种断点调试,首先祈祷js文件别太多
    河北某日报移动端python数据采集 eds加密新闻内容_第3张图片
    小老弟,就三个文件,还是可以一战的,虽然我曾经看过腾讯视频的js代码,哪真的是 一望无际的海洋。

BTW:以前刚入行练断点调试都不会,当然现在也是个垃圾,我给后来者点小技巧,找到 加密的键值对,类似 key=xxx 或者 “key”:value。js也需要通过这些键值来获取值,当然也可以直接在调试面板里捕获响应的链接,

河北某日报移动端python数据采集 eds加密新闻内容_第4张图片
然后你就发现在js文件 commond这里发现了 和ajax加密的字符串一样的东西,还有图右边 return value 里面有熟悉的标题和熟悉的json格式的数据。是不是感觉到了,ajax请求的加密字符串跑不掉就是通过js解密了。
打断点这几行代码一看有点熟悉 现在都是加密库各种加密了,这是EDS加密的写法,

推荐个网址,里面有简单的EDS加密解密 看看就明白这几行代码的意思了。戳我跳转

既然知道了加密手段 就直接反向抽烟,自己模拟这个加密过程,既然是用的加密库 那就更简单了,文章开头有给加密库下载地址,好像要?wtf? 我会直接贴上需要的代码块 放心。

使用python的execjs 执行js代码,这个库听说会慢一点。so?

# 若能避开猛烈的欢喜,自然也不会有悲痛的来袭,
# 迎着风雨走 孤独且自由,
# Author: xyy, time:2020/3/13

import execjs


# e_info = "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"
e_info = "4Qjir8b019EIXH0FBzIJIuElne7uRYd6AB7qOIQg+TdtJrwVSB14GtcSzJdjmyN5u+g+hznC1bk6I7hrY3eDz8oLesWxaYm5isct6vbX4zvHXvZYh\/QRGDG3sQ61KguvnhBY4Vzodc7yEayJ6JQHPkgHBV+zY\/uwms00QsiZF7Qlh4iGJZK4Gm1kdwxSTDjQ+Jb+rKftMYhkmgEF\/z5qia5GNMl+qzEf4+4OUCLUCPrV08WQstiqYzCajrRrzPni+5+\/xrbUbLXsJIfkqOnAeSgUUj0i2JdSfXuLEYzHh3nJP1VhpozJ\/TLRF+bt7njKOzmLYFIwfryQX7j9FL1DgDRl54TKtnBwjNnUyRSRGpFFBmPn\/vgwXPLmtjJZxFJC9B\/aiRVI0Yf43Jlsl+520xzFXH4CaiM6SB+zgHrVKiF9koXsioYeYvP0nuZbz\/JS0aEanzNvL9Zwo9y+alD1pTqFMiCv9WyQgMDIyeT6yM6DodOkytWTZg\/pO4VBnv0oiFPsUFKKBkakR59mQfdPcGwQgwHbob2WW4utJnP9nnKt3KnD5IlmvZwwLutXhvIvucI\/30iZAUq0o7FnDurr6S0UM+aebXs3pJheMAMbZ6DJ058mi9jFk+9ZiXaG127WXLfCOR+xTqvT8+LyWYnKWdE5FXmGs02k26uoi6w8tBbTeZppt0l2z4fIZVGqjWmJnLSGmmju0\/rbbn+5GDhxEuiqZ9ogJMF+DEEZqx2NsPxLeTvu+qBLOepzTZuhTyZrm81vYLAxEcR2fa\/ngNXw0mJLVB5jvQs2AX55BR3j+674OKw9qzMCniQ43BDvGzdxZARxU1a3sXIJh4gdIGfi8yzxOZnDczfTPR\/z\/W2QUf27Vwn5JPQk40UPJdFS2jEJg9UNRCHN1813pzucli\/aIEt5O+76oEs5+VHWpQtxwMhGvnkDPKReIzG3sQ61KguvnhBY4Vzodc7yEayJ6JQHPkgHBV+zY\/uwms00QsiZF7Qlh4iGJZK4Gm1kdwxSTDjQ+Jb+rKftMYjp5iey5aHcRRGblhCshCZQfqM81e8jkGa8zTBzwGoeffnl4oOrACAn5iS+V8k4BsIc+2u0mdsgm7UDDTcl66\/BzLyAxrYPcVrgwhvroaG+suv6C5Y2EYkAvgTGWBLF+W9ti4bRuodqLOxafiFTRA+LhiETK+XqHEjpASTyqHfaCthgIZ9AvmAqtz+BuwQ3vq+T4Zr16pgGnY3vfBLPmkrRJ3F85btrqomLUJaZsLgURjNsQNgjIAyv7KjrnIBx\/yLpS93h6+KtS4phBVSvsegY3nSD4HaMejay5PKvZ7tuHcxx3Y2cIBY9rFS9RboiY6lWdXqnk2IBGZ\/M\/5yJ8PIwWBESpaSn0O1lRq9utMa5ds44K\/tY3AOF5U8mBMNURzgzZT12Pm\/RINRjbt79FSZSTfbUjkcZU9bHR8nUp7CSGgQzUfsIGaIaCDJciCDB3NwF5QC9KO8mOOwptwFPdiNmCiYk\/3gGfWKQnJfo9tsg53+umJjCLOUj4UXY\/oqJZA7PpKGlI2h0mn\/b0uVwxDPpnRzdR3XIdQGYib2kHfxiW4iL26jFqT\/jlJfsSKk87CQvXmBWFMXBxweQ7V6hC0GclRt6X2kP0gqhf5k8R0Ndq\/xx6Ls\/LuHbG0E7uoX2rqKhlu62hpqRHfP7NgXBY5xak\/lcF6NWmMqyRLT+WwoVE2vxl1H1qmx7bvl7yh+V+4ij3azaBMrWIU2j0btWZUaQ+0iO9xO2lFGP5xsqF\/4aPeHN9VzHPspazzWJjCLtoEi7Cqf3iVunAmvq4F5gZtEqmS+mORhUzKq95X49DyW5L0KnYJ4x3DNW0GpoLuepKzbwqBt05jVVERExG8AENGCBME1WgColy2Rrujiark9od\/ZvLJYxgT2kyKZjKvFtP4gFbv28j6\/iiSTL8aRRni1lIK8pr8okfSxuCC1VD5iN2xKGP\/uHTAryA8Nx2FHz1WhLhstK2zYKpjx3gJiBqJtifqv7RnHSvzEbk\/8HQ1cYbtsYvSvyqgWpWUul9wmuIqtCXTPszNTPZ5Mmr3fjYdTYKb2ehowY\/PGRlIOxm6qGLdJkG+J+bcBODBgkLhr5RmJZ0X8cA2plCnTHwF+u\/NjxEqnhoCqRX\/1vl6xiQNtMBlMznzG5rGrGASjoCUEiPKop5xXjs+slYbj9KPXEAIxKAeaUvspiBGw105atRYNLmv2utQgwUGFfzcB9mSFhO9WM2dTJFJEakaorp37on3\/3nZIMAK5bpc0CuyXW\/cPDBO6ADLCntUPLzuHwm6MgQhXiOivjCW29djYDNCmbd+aLyv1y\/R48KTSZZ+0AngxTKFw5VqslhF3w7qy\/vCC+viCgjEQtflLzkAZw29aUiIQtfMpdwCIUpMNEArzlK4yFLxV0tlDdrZjVobENz6BWCVvHPd6iZPPRD2uEt5pQka2OOy6J3taepA9wTUB2pPj0f6TdI0ss5hra6Bh4FwP90ZWprHJw2S2CNOJ0IfI8CWWZWrLGgRfSrJAed+QcT2Fk1PPbeRAa3GgSq66TRGC\/zb+emlvgrubdDQNThyevMfJBnppb4K7m3Q3NRwAE2M\/e0Hz22ZH5aXkP7MklJjGprYfhJZ3u7kWHere90uE27x0vaq3Mv1PU1rY6oqXtyY4Bxtgrkw2HEhCR3qx\/o9+gslNnUK+KZpNcmRDfsiRoiz1WyE2ihH9vL60wu2qWQUf1hjX3y61zMnEyAPDwie7FpEqEYj\/2+ASlamqdwyvhjNTsyl1LbPL6nrneQrqWhilNurjDrALAydpuBW7JXcDzfTSsVJK3gBeb88oCMS6zul\/uAEklTUZchQWRoJJCOl+P4gM7kjUUCM6IpNVa5DVlLxzHAwYwKhz9zG0mvBVIHXga7uanZDJ6x4EYnrGO7h+K6rbAQ4t+wp7QzFqFf9oSviOf8tokPYqJQ4JYoM8PxQz2LUfXOm41YZFlYTpfz5PPspc5dA03oYnTGltypHOtWeYMoEguB5PSqnMke9HxYCyr+OuKZ39Q4BypzkAMXbFLCt4I+C98LkiMD7rj24UhLuUoGt\/QchJaRpBnfWijhhgZFfYzQzEyOjbC2yPOVYp4DtFOd5xLNiYTwtsjzlWKeA4xHSVTYcSTYhk6caaWjLZZrRlWptwKoVBmsMUTLN\/WAlCiGzOZCv+NfHiff32lwAA\/2Enp5tZTkD7kWkKLoswz6MFaojAhsFNVkFMX1GWpx\/jSKQFvmZIPXFTwo4JfYVvN1V2H4Dige\/m+DoScW12LnOkSzQ62YnpXsjQLdQ7H5ZP87C8VPIivdVBo8H7Th3RBQ6ZbHs6D7L++eauP+xfHrD6C5DjVl27Z76Cq80j4bIbHeEF5K3+pyCDb6lSX7iyFG8yxJLMBe6F8tdgYRgOUKAKatqWZ5QH3EfSo2loa8+awFzamt\/57Ub57BNDv\/sXPg8FGf\/5+y\/vjNeEO4g3EdzVP\/KWojuJEIy6fBrPIKzEdJVNhxJNidaCsgcZjUBdYcGxRg94upEWkkG9K24vel317mH8FD9cQ0ZaNnZBxY0UfcinhERxFjMJDRD+QO0iLsiP+KhdS+LsQgH2L8ALs0lVjx4KMw7PpkxaEBoG9WbWsqxIKYJqIrFSSt4AXm\/Osu+wuwrwhIq\/CKfW1c6aGqwZl6TeFejrbGL0r8qoFqSdfVkpxDuzWCsN2vjufISmdNn2sjG2bUKaQz3ZZHrQQnTZ9rIxtm1CXMj5b7fJwqxjKSUAKm\/8\/by5KNtY63XaaDSuwwOhWWwlDOeLYg3hRIvsTd8mpo2meRasYziTYeGNWE4K9Vsp2IlRZmLTdLNFYhlgBGCLGj0lrsUY3VoiGQqdgnjHcM1bQamgu56krNvCoG3TmNVURETEbwAQ0YIEwTVaAKiXLZGu6OJquT2h39m8sljGBPaTIpmMq8W0\/iAVu\/byPr+KJ7+z8ANFhKOfzoBu2UNRkN5CxAkzBcJrgKgeG7wCCh5CRHDnRDd2lzZCGt9TREaY6gRPGgbRN4Vfnzc0iI5t458IxuV0Bef3PrFS9RboiY6nKzUyo9dPoeGxGVJ76ik8W225\/uRg4cRJvzkebMM1UY4uyI\/4qF1L4oq440DX1HL\/2xt9euEov7lyyhS40N3A94rGVzZbo6Lu76D6HOcLVuVamlOFsm07YCAuqsCszsOAu98GBfGpJcTH3Y\/s942l8rbu1kdLy5Jlzfje94Z7YvEIoRe2HVN\/Dk2KEY9RQAcBvzhBw+i4u7Uk7vTEYr97Lns3NkEies8kQ0IYNvqIacjECtqcl3CYHRYkrUVcbR6\/mSU4lwyxENdcgl6Hd2Wf4URrhFgW5FpYAbfwVN\/pe8YOLRuw1u8lF8IyZYEqQc5kUpRmRRKD\/4aNj0FuMaApbBAzBZ8xWQkuGSo\/Zk2KEFTPhZnp44FaOm84e9oa5bkvdWSysP8jn5WZRQa7D3g++X1lFdp3K01Hyvp12QZBM9VM\/K5w2OA+h05RTxL1IKH8jqde9jEZYoq5AF3c2CIK4ILUqR\/klfII2vRA41S8thXWEkei58fZfZRzSksQzadZEqh+PGYqvrI6\/gTBPPOZJiGyyaTfd1xG\/OtjhU\/E+FRVe59JvAUAtDhlz\/CmLOm8oqByhCpArmYhT7FBSigZGpEefZkH3T3CeYM8eIhhIDu4y84+fPOeCp5K65JhUp7m4\/Sj1xACMSr\/2m+UDVuM7O5OoL+uHG0+7qkmYykr1FLKt\/AIP0MU7HYj8Z7\/DJhJKX5tyqlk4\/VN\/pE4Cts1e90r5Re+BZkRsi2l8vNFksLpl9pH5kco\/eFBilp2q3h\/vsg9klEervc+wzQ49+D+6+SICWGbR97rPd6DpR+m\/xo7dZHaZbJHC7bfJj8XEqA4\/gpZrQKYZrjIXOdEPVCQS9clnzK\/IO8xjk++UgSEaX4OQpFOBE\/2gbGzf8VmNDKXNP5zTLh0M+Uu6lZOQm+nop6iZ5Qzo3GZFjX1d7DvIGqlqFtWrgVLceMItf14jcnRJ\/GlI5Caiv36OlTgV9RYUei+UVe6\/nAbiEGR\/\/dSFIQ5Uvs2sM3kvC1hcsRGyqZ9yn7FgjScsyVSu6YZ56ye1QMNz\/Aa89l59oRut6VmMtq8E1on9L1kHxwIDz5cgjidndO5Z\/diRsiKmK6XEkhTmC9l3noxVQiOmpJYVjpGqRyexJ26HySbcsfeqHPSieqt2TdS71uwjjXZZr6a8lv5oTlRk1ZRuB58oApq2pZnlAfcR9KjaWhrz9r8Ppekgmj0UqndiX+KMxgl9VqqSn06Gi\/5CMwxJiWSB10mQz\/+g+QLVm1xnkkSLPu2r3EtKKxfLtTMYiY9Jn7uqSZjKSvUUsq38Ag\/QxTsdiPxnv8MmEujkvdqoLfSctjTbqgyUsVP3SvlF74FmRGyLaXy80WSwumX2kfmRyj94UGKWnareH++yD2SUR6u9z7DNDj34P7r5IgJYZtH3us93oOlH6b\/Gjt1kdplskcLtt8mPxcSoDj+ClmtAphmuMhc50Q9UJBL1yWfMr8g7zGOT75SBIRpfg5CkU4ET\/aBsbN\/xWY0Mpc0\/nNMuHQz5S7qVk5Cb6einqJnlDOjcZkWNfV3sO8gaqWoW1auBUtx4wi1\/XiNydEn8aUjkJqK\/fo6VOBX1FhR6L5RV7r+cBuIQZH\/91IUhDlS+zawzeS8ZVYBLvVIVOQ=="

key_info = "123qwe!@#hbrb;,&7*8(9)0^6%5$"

js = execjs.compile("""

var CryptoJS=CryptoJS||function(u,l){var d={},n=d.lib={},p=function(){},s=n.Base={extend:function(a){p.prototype=this;var c=new p;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
q=n.WordArray=s.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,m=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var t=0;t>>2]|=(m[t>>>2]>>>24-8*(t%4)&255)<<24-8*((f+t)%4);else if(65535>>2]=m[t>>>2];else c.push.apply(c,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=s.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],m=0;m>>2]>>>24-8*(f%4)&255;m.push((t>>>4).toString(16));m.push((t&15).toString(16))}return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f>>3]|=parseInt(a.substr(f,
2),16)<<24-4*(f%8);return new q.init(m,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f>>2]>>>24-8*(f%4)&255));return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new q.init(m,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
r=n.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,m=c.words,f=c.sigBytes,t=this.blockSize,b=f/(4*t),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*t;f=u.min(4*a,f);if(a){for(var e=0;e>>2]>>>24-8*(q%4)&255)<<16|(n[q+1>>>2]>>>24-8*((q+1)%4)&255)<<8|n[q+2>>>2]>>>24-8*((q+2)%4)&255,v=0;4>v&&q+0.75*v>>6*(3-v)&63));if(n=s.charAt(64))for(;d.length%4;)d.push(n);return d.join("")},parse:function(d){var n=d.length,p=this._map,s=p.charAt(64);s&&(s=d.indexOf(s),-1!=s&&(n=s));for(var s=[],q=0,w=0;w<
n;w++)if(w%4){var v=p.indexOf(d.charAt(w-1))<<2*(w%4),b=p.indexOf(d.charAt(w))>>>6-2*(w%4);s[q>>>2]|=(v|b)<<24-8*(q%4);q++}return l.create(s,q)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
(function(u){function l(b,e,a,c,m,f,t){b=b+(e&a|~e&c)+m+t;return(b<>>32-f)+e}function d(b,e,a,c,m,f,t){b=b+(e&c|a&~c)+m+t;return(b<>>32-f)+e}function n(b,e,a,c,m,f,t){b=b+(e^a^c)+m+t;return(b<>>32-f)+e}function p(b,e,a,c,m,f,t){b=b+(a^(e|~c))+m+t;return(b<>>32-f)+e}for(var s=CryptoJS,q=s.lib,w=q.WordArray,v=q.Hasher,q=s.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;q=q.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(r,e){for(var a=0;16>a;a++){var c=e+a,m=r[c];r[c]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var a=this._hash.words,c=r[e+0],m=r[e+1],f=r[e+2],t=r[e+3],y=r[e+4],q=r[e+5],s=r[e+6],w=r[e+7],v=r[e+8],u=r[e+9],x=r[e+10],z=r[e+11],A=r[e+12],B=r[e+13],C=r[e+14],D=r[e+15],g=a[0],h=a[1],j=a[2],k=a[3],g=l(g,h,j,k,c,7,b[0]),k=l(k,g,h,j,m,12,b[1]),j=l(j,k,g,h,f,17,b[2]),h=l(h,j,k,g,t,22,b[3]),g=l(g,h,j,k,y,7,b[4]),k=l(k,g,h,j,q,12,b[5]),j=l(j,k,g,h,s,17,b[6]),h=l(h,j,k,g,w,22,b[7]),
g=l(g,h,j,k,v,7,b[8]),k=l(k,g,h,j,u,12,b[9]),j=l(j,k,g,h,x,17,b[10]),h=l(h,j,k,g,z,22,b[11]),g=l(g,h,j,k,A,7,b[12]),k=l(k,g,h,j,B,12,b[13]),j=l(j,k,g,h,C,17,b[14]),h=l(h,j,k,g,D,22,b[15]),g=d(g,h,j,k,m,5,b[16]),k=d(k,g,h,j,s,9,b[17]),j=d(j,k,g,h,z,14,b[18]),h=d(h,j,k,g,c,20,b[19]),g=d(g,h,j,k,q,5,b[20]),k=d(k,g,h,j,x,9,b[21]),j=d(j,k,g,h,D,14,b[22]),h=d(h,j,k,g,y,20,b[23]),g=d(g,h,j,k,u,5,b[24]),k=d(k,g,h,j,C,9,b[25]),j=d(j,k,g,h,t,14,b[26]),h=d(h,j,k,g,v,20,b[27]),g=d(g,h,j,k,B,5,b[28]),k=d(k,g,
h,j,f,9,b[29]),j=d(j,k,g,h,w,14,b[30]),h=d(h,j,k,g,A,20,b[31]),g=n(g,h,j,k,q,4,b[32]),k=n(k,g,h,j,v,11,b[33]),j=n(j,k,g,h,z,16,b[34]),h=n(h,j,k,g,C,23,b[35]),g=n(g,h,j,k,m,4,b[36]),k=n(k,g,h,j,y,11,b[37]),j=n(j,k,g,h,w,16,b[38]),h=n(h,j,k,g,x,23,b[39]),g=n(g,h,j,k,B,4,b[40]),k=n(k,g,h,j,c,11,b[41]),j=n(j,k,g,h,t,16,b[42]),h=n(h,j,k,g,s,23,b[43]),g=n(g,h,j,k,u,4,b[44]),k=n(k,g,h,j,A,11,b[45]),j=n(j,k,g,h,D,16,b[46]),h=n(h,j,k,g,f,23,b[47]),g=p(g,h,j,k,c,6,b[48]),k=p(k,g,h,j,w,10,b[49]),j=p(j,k,g,h,
C,15,b[50]),h=p(h,j,k,g,q,21,b[51]),g=p(g,h,j,k,A,6,b[52]),k=p(k,g,h,j,t,10,b[53]),j=p(j,k,g,h,x,15,b[54]),h=p(h,j,k,g,m,21,b[55]),g=p(g,h,j,k,v,6,b[56]),k=p(k,g,h,j,D,10,b[57]),j=p(j,k,g,h,s,15,b[58]),h=p(h,j,k,g,B,21,b[59]),g=p(g,h,j,k,y,6,b[60]),k=p(k,g,h,j,z,10,b[61]),j=p(j,k,g,h,f,15,b[62]),h=p(h,j,k,g,u,21,b[63]);a[0]=a[0]+g|0;a[1]=a[1]+h|0;a[2]=a[2]+j|0;a[3]=a[3]+k|0},_doFinalize:function(){var b=this._data,e=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;e[c>>>5]|=128<<24-c%32;var m=u.floor(a/
4294967296);e[(c+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;e[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(e.length+1);this._process();b=this._hash;e=b.words;for(a=0;4>a;a++)c=e[a],e[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});s.MD5=v._createHelper(q);s.HmacMD5=v._createHmacHelper(q)})(Math);
(function(){var u=CryptoJS,l=u.lib,d=l.Base,n=l.WordArray,l=u.algo,p=l.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:l.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,l){for(var p=this.cfg,v=p.hasher.create(),b=n.create(),u=b.words,r=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:r}),reset:function(){v.reset.call(this);var a=this.cfg,c=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var b=a.createEncryptor;else b=a.createDecryptor,this._minBufferSize=1;this._mode=b.call(a,
this,c&&c.words)},_doProcessBlock:function(a,c){this._mode.processBlock(a,c)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var c=this._process(!0)}else c=this._process(!0),a.unpad(c);return c},blockSize:4});var e=d.CipherParams=n.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(l.format={}).OpenSSL={stringify:function(a){var c=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
1701076831]).concat(a).concat(c):c).toString(q)},parse:function(a){a=q.parse(a);var c=a.words;if(1398893684==c[0]&&1701076831==c[1]){var b=p.create(c.slice(2,4));c.splice(0,4);a.sigBytes-=16}return e.create({ciphertext:a,salt:b})}},a=d.SerializableCipher=n.extend({cfg:n.extend({format:b}),encrypt:function(a,c,b,d){d=this.cfg.extend(d);var l=a.createEncryptor(b,d);c=l.finalize(c);l=l.cfg;return e.create({ciphertext:c,key:b,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
decrypt:function(a,c,b,e){e=this.cfg.extend(e);c=this._parse(c,e.format);return a.createDecryptor(b,e).finalize(c.ciphertext)},_parse:function(a,c){return"string"==typeof a?c.parse(a,this):a}}),l=(l.kdf={}).OpenSSL={execute:function(a,c,b,d){d||(d=p.random(8));a=w.create({keySize:c+b}).compute(a,d);b=p.create(a.words.slice(c),4*b);a.sigBytes=4*c;return e.create({key:a,iv:b,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:l}),encrypt:function(c,b,e,d){d=this.cfg.extend(d);e=d.kdf.execute(e,
c.keySize,c.ivSize);d.iv=e.iv;c=a.encrypt.call(this,c,b,e.key,d);c.mixIn(e);return c},decrypt:function(c,b,e,d){d=this.cfg.extend(d);b=this._parse(b,d.format);e=d.kdf.execute(e,c.keySize,c.ivSize,b.salt);d.iv=e.iv;return a.decrypt.call(this,c,b,e.key,d)}})}();
(function(){function u(b,a){var c=(this._lBlock>>>b^this._rBlock)&a;this._rBlock^=c;this._lBlock^=c<>>b^this._lBlock)&a;this._lBlock^=c;this._rBlock^=c<c;c++){var d=q[c]-1;a[c]=b[d>>>5]>>>31-d%32&1}b=this._subKeys=[];for(d=0;16>d;d++){for(var f=b[d]=[],l=v[d],c=0;24>c;c++)f[c/6|0]|=a[(w[c]-1+l)%28]<<31-c%6,f[4+(c/6|0)]|=a[28+(w[c+24]-1+l)%28]<<31-c%6;f[0]=f[0]<<1|f[0]>>>31;for(c=1;7>c;c++)f[c]>>>=
4*(c-1)+3;f[7]=f[7]<<5|f[7]>>>27}a=this._invSubKeys=[];for(c=0;16>c;c++)a[c]=b[15-c]},encryptBlock:function(b,a){this._doCryptBlock(b,a,this._subKeys)},decryptBlock:function(b,a){this._doCryptBlock(b,a,this._invSubKeys)},_doCryptBlock:function(e,a,c){this._lBlock=e[a];this._rBlock=e[a+1];u.call(this,4,252645135);u.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);u.call(this,1,1431655765);for(var d=0;16>d;d++){for(var f=c[d],n=this._lBlock,p=this._rBlock,q=0,r=0;8>r;r++)q|=b[r][((p^
f[r])&x[r])>>>0];this._lBlock=p;this._rBlock=n^q}c=this._lBlock;this._lBlock=this._rBlock;this._rBlock=c;u.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);u.call(this,16,65535);u.call(this,4,252645135);e[a]=this._lBlock;e[a+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});d.DES=n._createHelper(r);s=s.TripleDES=n.extend({_doReset:function(){var b=this._key.words;this._des1=r.createEncryptor(p.create(b.slice(0,2)));this._des2=r.createEncryptor(p.create(b.slice(2,4)));this._des3=
r.createEncryptor(p.create(b.slice(4,6)))},encryptBlock:function(b,a){this._des1.encryptBlock(b,a);this._des2.decryptBlock(b,a);this._des3.encryptBlock(b,a)},decryptBlock:function(b,a){this._des3.decryptBlock(b,a);this._des2.encryptBlock(b,a);this._des1.decryptBlock(b,a)},keySize:6,ivSize:2,blockSize:2});d.TripleDES=n._createHelper(s)})();

CryptoJS.mode.ECB = (function () {
    var ECB = CryptoJS.lib.BlockCipherMode.extend();

    ECB.Encryptor = ECB.extend({
        processBlock: function (words, offset) {
            this._cipher.encryptBlock(words, offset);
        }
    });

    ECB.Decryptor = ECB.extend({
        processBlock: function (words, offset) {
            this._cipher.decryptBlock(words, offset);
        }
    });

    return ECB;
}());

xyy = function(e){var info = JSON.parse((e = e,
            CryptoJS.TripleDES.decrypt({
                ciphertext: CryptoJS.enc.Base64.parse(e)
            }, CryptoJS.enc.Utf8.parse(CryptoJS.MD5("123qwe!@#hbrb;,&7*8(9)0^6%5$").toString()), {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
            }).toString(CryptoJS.enc.Utf8)));return info}
                """)

info = js.call("xyy",e_info.replace("\/","/"))
# print(repr(e_info))
# print(repr(e_info))
# print(e_info.replace("\/","/"))
print(info)
print(type(info))

这里都是看的懂的吧,直接给加密的字符串 就能得到对应的解。
这里和对方文件中有点点不一样

JSON.parse((	e = t.data.data,
            		d.TripleDES.decrypt(
						{ciphertext: d.enc.Base64.parse(e)}, 
						p,  // 这里的p 它单独重新写过 这里是个小坑 按照我开头的代码去理解
					{
                				mode: d.mode.ECB,
                				padding: d.pad.Pkcs7
            				}
					).toString(d.enc.Utf8)	
			))


以上就是获取解密的全部过程了。

有问题 欢迎留言 一起讨论

你可能感兴趣的:(爬虫档案袋,python)