python结合js逆向与影刀RPA——开发影刀指令(生成淘宝sign加密参数)

        在一些平台,我们在拿数据的时候,都会遇需要逆向才能拿到数据,就比如某宝的卖家、买家平台,大部分是请求参数sign参数加密,那就以这个为例,我们用影刀RPA工具,结合python,js逆向,来开发一个通用的影刀RPA指令——生成某宝sign加密参数指令。这样我们不管是在某宝的卖家或者买家平台拿数据,遇到sign参数加密,直接调用这个指令就可以生成加密参数,减少我们逆向的次数。

一,查看逻辑,找出加密函数

        我们随便打开某宝中的一个商品,查找接口发现,在请求参数中有一个sign的加密参数,

一般,在请求参数加密的,是把请求参数中的几个或全部作为传参传进加密函数生成sign(这里提一嘴,某物中的sign参数也是这个原理),如下图:

像这样,我们直接全局搜索sign: 或sign=,如下图:

然后发现,在搜索sign:时,发现一个可疑的地方,点开,发现是通过赋值给sign的,那这样,打断点调试,验证sign,发现正确。如下图:

sign是由l赋值的,所以我们往上面找到l,发现是一个函数,我们直接把这个函数扣下来 

这个函数的传参为:r.token(cookie中拿),s(时间戳),o(常量),n.data(请求参数中的data),也刚好对应请求参数中的appkey, t, data,除了token是在cookie中拿。如下图:

拿下来的js代码经过修改如下: 

s = "12574478"
l = (new Date).getTime()
data = "{\"id\":\"737587704463\",\"ali_refid\":\"a3_430582_1006:1680540096:N:LM6ng4O4SfOJxxIk9LoWfze4KqSTEy%2BhvN7l%2BES3tx0%3D:717688e1ff53d10b8ed95ed6a49903b2\",\"ali_trackid\":\"230_717688e1ff53d10b8ed95ed6a49903b2\",\"spm\":\"a21n57.1.0.0\",\"detail_v\":\"3.3.0\"}"
token = "0be2373e0c00b08d010ad71b4b99e9c5"
h1 = token + "&" + l + "&" + s + "&" + data
c = function(e) {
    function t(e, t) {
        return e << t | e >>> 32 - t
    }
    function n(e, t) {
        var n, r, i, a, o;
        return i = 2147483648 & e,
        a = 2147483648 & t,
        o = (1073741823 & e) + (1073741823 & t),
        (n = 1073741824 & e) & (r = 1073741824 & t) ? 2147483648 ^ o ^ i ^ a : n | r ? 1073741824 & o ? 3221225472 ^ o ^ i ^ a : 1073741824 ^ o ^ i ^ a : o ^ i ^ a
    }
    function r(e, r, i, a, o, s, l) {
        return e = n(e, n(n(function(e, t, n) {
            return e & t | ~e & n
        }(r, i, a), o), l)),
        n(t(e, s), r)
    }
    function i(e, r, i, a, o, s, l) {
        return e = n(e, n(n(function(e, t, n) {
            return e & n | t & ~n
        }(r, i, a), o), l)),
        n(t(e, s), r)
    }
    function a(e, r, i, a, o, s, l) {
        return e = n(e, n(n(function(e, t, n) {
            return e ^ t ^ n
        }(r, i, a), o), l)),
        n(t(e, s), r)
    }
    function o(e, r, i, a, o, s, l) {
        return e = n(e, n(n(function(e, t, n) {
            return t ^ (e | ~n)
        }(r, i, a), o), l)),
        n(t(e, s), r)
    }
    function s(e) {
        var t, n = "", r = "";
        for (t = 0; 3 >= t; t++)
            n += (r = "0" + (e >>> 8 * t & 255).toString(16)).substr(r.length - 2, 2);
        return n
    }
    var l, c, p, u, d, f, m, g, h, v;
    for (v = function(e) {
        for (var t, n = e.length, r = n + 8, i = 16 * ((r - r % 64) / 64 + 1), a = new Array(i - 1), o = 0, s = 0; n > s; )
            o = s % 4 * 8,
            a[t = (s - s % 4) / 4] = a[t] | e.charCodeAt(s) << o,
            s++;
        return o = s % 4 * 8,
        a[t = (s - s % 4) / 4] = a[t] | 128 << o,
        a[i - 2] = n << 3,
        a[i - 1] = n >>> 29,
        a
    }(e = function(e) {
        e = e.replace(/\r\n/g, "\n");
        for (var t = "", n = 0; n < e.length; n++) {
            var r = e.charCodeAt(n);
            128 > r ? t += String.fromCharCode(r) : r > 127 && 2048 > r ? (t += String.fromCharCode(r >> 6 | 192),
            t += String.fromCharCode(63 & r | 128)) : (t += String.fromCharCode(r >> 12 | 224),
            t += String.fromCharCode(r >> 6 & 63 | 128),
            t += String.fromCharCode(63 & r | 128))
        }
        return t
    }(e)),
    f = 1732584193,
    m = 4023233417,
    g = 2562383102,
    h = 271733878,
    l = 0; l < v.length; l += 16)
        c = f,
        p = m,
        u = g,
        d = h,
        f = r(f, m, g, h, v[l + 0], 7, 3614090360),
        h = r(h, f, m, g, v[l + 1], 12, 3905402710),
        g = r(g, h, f, m, v[l + 2], 17, 606105819),
        m = r(m, g, h, f, v[l + 3], 22, 3250441966),
        f = r(f, m, g, h, v[l + 4], 7, 4118548399),
        h = r(h, f, m, g, v[l + 5], 12, 1200080426),
        g = r(g, h, f, m, v[l + 6], 17, 2821735955),
        m = r(m, g, h, f, v[l + 7], 22, 4249261313),
        f = r(f, m, g, h, v[l + 8], 7, 1770035416),
        h = r(h, f, m, g, v[l + 9], 12, 2336552879),
        g = r(g, h, f, m, v[l + 10], 17, 4294925233),
        m = r(m, g, h, f, v[l + 11], 22, 2304563134),
        f = r(f, m, g, h, v[l + 12], 7, 1804603682),
        h = r(h, f, m, g, v[l + 13], 12, 4254626195),
        g = r(g, h, f, m, v[l + 14], 17, 2792965006),
        f = i(f, m = r(m, g, h, f, v[l + 15], 22, 1236535329), g, h, v[l + 1], 5, 4129170786),
        h = i(h, f, m, g, v[l + 6], 9, 3225465664),
        g = i(g, h, f, m, v[l + 11], 14, 643717713),
        m = i(m, g, h, f, v[l + 0], 20, 3921069994),
        f = i(f, m, g, h, v[l + 5], 5, 3593408605),
        h = i(h, f, m, g, v[l + 10], 9, 38016083),
        g = i(g, h, f, m, v[l + 15], 14, 3634488961),
        m = i(m, g, h, f, v[l + 4], 20, 3889429448),
        f = i(f, m, g, h, v[l + 9], 5, 568446438),
        h = i(h, f, m, g, v[l + 14], 9, 3275163606),
        g = i(g, h, f, m, v[l + 3], 14, 4107603335),
        m = i(m, g, h, f, v[l + 8], 20, 1163531501),
        f = i(f, m, g, h, v[l + 13], 5, 2850285829),
        h = i(h, f, m, g, v[l + 2], 9, 4243563512),
        g = i(g, h, f, m, v[l + 7], 14, 1735328473),
        f = a(f, m = i(m, g, h, f, v[l + 12], 20, 2368359562), g, h, v[l + 5], 4, 4294588738),
        h = a(h, f, m, g, v[l + 8], 11, 2272392833),
        g = a(g, h, f, m, v[l + 11], 16, 1839030562),
        m = a(m, g, h, f, v[l + 14], 23, 4259657740),
        f = a(f, m, g, h, v[l + 1], 4, 2763975236),
        h = a(h, f, m, g, v[l + 4], 11, 1272893353),
        g = a(g, h, f, m, v[l + 7], 16, 4139469664),
        m = a(m, g, h, f, v[l + 10], 23, 3200236656),
        f = a(f, m, g, h, v[l + 13], 4, 681279174),
        h = a(h, f, m, g, v[l + 0], 11, 3936430074),
        g = a(g, h, f, m, v[l + 3], 16, 3572445317),
        m = a(m, g, h, f, v[l + 6], 23, 76029189),
        f = a(f, m, g, h, v[l + 9], 4, 3654602809),
        h = a(h, f, m, g, v[l + 12], 11, 3873151461),
        g = a(g, h, f, m, v[l + 15], 16, 530742520),
        f = o(f, m = a(m, g, h, f, v[l + 2], 23, 3299628645), g, h, v[l + 0], 6, 4096336452),
        h = o(h, f, m, g, v[l + 7], 10, 1126891415),
        g = o(g, h, f, m, v[l + 14], 15, 2878612391),
        m = o(m, g, h, f, v[l + 5], 21, 4237533241),
        f = o(f, m, g, h, v[l + 12], 6, 1700485571),
        h = o(h, f, m, g, v[l + 3], 10, 2399980690),
        g = o(g, h, f, m, v[l + 10], 15, 4293915773),
        m = o(m, g, h, f, v[l + 1], 21, 2240044497),
        f = o(f, m, g, h, v[l + 8], 6, 1873313359),
        h = o(h, f, m, g, v[l + 15], 10, 4264355552),
        g = o(g, h, f, m, v[l + 6], 15, 2734768916),
        m = o(m, g, h, f, v[l + 13], 21, 1309151649),
        f = o(f, m, g, h, v[l + 4], 6, 4149444226),
        h = o(h, f, m, g, v[l + 11], 10, 3174756917),
        g = o(g, h, f, m, v[l + 2], 15, 718787259),
        m = o(m, g, h, f, v[l + 9], 21, 3951481745),
        f = n(f, c),
        m = n(m, p),
        g = n(g, u),
        h = n(h, d);
    return (s(f) + s(m) + s(g) + s(h)).toLowerCase()
}(h1)
console.log(c)

运行结果如下:

 

 可以发现这就是我们需要的的js文件了

 二,js文件引入影刀RPA,开始开发指令

        我们在影刀RPA里面编写调用我们刚才导入的js文件,然后把参数准备好,传进去,验证我们的结果:

接下来是封装成指令,我们只要把设置的变量改为入参就行,如下图:

以上操作完成后,我们发版这个指令集,然后创建应用来验证我们的结果。

三,验证结果

        这里,我新建了一个影刀应用(淘宝),可以看到,在Tool指令集下有我们开发的生成sign指令

 我随便在淘宝里找一个商品,查看它的信息:

 我直接把data和 t 拿下来传进去,token我就直接去cookie里面那了,这里我就不演示了,如下图:

我们直接对比我们生成的sign和原来的sign:

 

可以看到,一模一样,OK 到这里,我们开发一个生成加密参数sign指令就完成了。如果有时间,我会在写一篇生成得物sign的指令。。。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
首先需要了解得物网站的数据结构和爬取方式,得物网站比较复杂,需要使用Selenium+BeautifulSoup进行爬取。 以下是一个简单的得物爬虫Python代码实现(注:仅供学习参考,请勿用于商业用途): ```python import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup options = Options() options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在报错的问题 options.add_argument('window-size=1920x3000') # 指定浏览器分辨率 options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面 options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度 options.add_argument('--headless') # 无界面 driver = webdriver.Chrome(options=options) url = 'https://www.dewu.com/' driver.get(url) # 等待页面加载完成 time.sleep(3) # 模拟鼠标点击,展开商品列表 driver.find_element_by_xpath('//div[text()="全部商品"]').click() # 等待页面加载完成 time.sleep(3) # 获取页面源代码 html = driver.page_source # 解析页面 soup = BeautifulSoup(html, 'html.parser') # 获取商品列表 items = soup.find_all('div', {'class': 'item-card'}) for item in items: # 获取商品标题 title = item.find('div', {'class': 'title'}).text.strip() # 获取商品价格 price = item.find('div', {'class': 'price'}).text.strip() # 获取商品链接 link = item.find('a', {'class': 'item-link'})['href'] print(title, price, link) # 关闭浏览器 driver.quit() ``` 这里的代码仅仅是一个简单的爬虫示例,如果想要更加深入地了解得物网站的数据结构和爬取方式,需要结合具体的需求进行更加详细的分析和实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林丑丑@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值