需求背景:由于小红书没有对外开放管理用户的文章等API,因此需要将小红书的“创作者平台”的API搬到自己的系统上;同时为了方便对用户的统一管理,也需要将授权搬移到自己的系统中;而授权中有一个查询扫码是否成功的接口请求中包含加密的内容X-s值
为了方便读者了解全程,我这里把授权的相关的过程都描述一下
- 第一步,拿到生成二维码的逻辑,以及找到二维码里面的内容是啥,可以很容易地分析到,生成二维码的接口如下:
其中,qrUrl就是二维码的内容,因此这里可以自行调用这个接口来生成二维码,这一步是很容易的;
- 第二步,可以看到有一个“queryQRCodeStatus”的接口请求,这个就是我今天解决的重点内容,如下截图,可以看到header里面有一个x-s的参数和x-t参数(x-t很容易理解是一个时间戳)
- 第三步,就是寻找这个x-s的值了,一般来讲,首先是搜索站点的所有源文件,结果并未找到相关的内容;这个时候就需要转换思路了;我们可以搜索接口,结果很容易发现调用接口的位置,如下图:
接下来就根据“QR_STATUS_GET”找到调用接口的位置,如下:
然后,我们可以开始打断点,逐步查找我们需要的x-s的值,我解密过很多类似的站点,但是小红书这个确实有点难度,需要一定的实践经验,才能做得到,最终找到了生成x-s的地方,如下图:
最后进入到sign方法中,得到了js代码,大概如下:
逐步分析这个文件,发现其实还是比较简单,其中是一个md5的算法和另外一个叫不上名字的算法处理;最终也发现了,其实x-s这个参数是被转成了十六进制的形式了,所以整个源文件搜索是找不到内容的,如下图:
- 第四步,也是比较关键的一步,把js代码转为PHP代码,这里其实可以直接把上面截图的sign算法整个文件封装一下,放到自己的项目,通过js计算x-s值也是可以的,我这里转为PHP代码,给大家作为一个参考:
function sign(string $str = 'test', string $o = 'A4NjFqYu5wPHsO0XTdDgMa2r1ZQocVte9UJBvk6/7=yRnhISGKblCWi+LpfE8xzm3')
{
$time = microtime(true) * 1000;
$str = md5($time . $str);
$var14 = 0;
$var7 = '';
while ($var14 < strlen($str)) {
$var1 = ($var9 = ord(substr($str, $var14++, 1))) >> 2;
$var2 = (3 & $var9) << 4 | ($e = ord(substr($str, $var14++, 1))) >> 4;
if ($var14 > strlen($str)) {
$e = '';//非数字
}
$var8 = (15 & $e) << 2 | ($n = ord(substr($str, $var14++, 1))) >> 6;
$var9 = 63 & $n;
if ($var14 >= strlen($str)) {
$n = '';//非数字
}
!is_numeric($e) ? ($var8 = $var9 = 64) : (!is_numeric($n) && ($var9 = 64));
$var7 .= substr($o, $var1, 1) . substr($o, $var2, 1) . substr($o, $var8, 1) . substr($o, $var9, 1);
}
return ['X-s' => $var7, 'X-t' => $time];
}
这里要特别说明一下,上面的sign函数的$o参数是js的sign方法那个文件里面提供的(_0x1ce8[59])。到这里,基本就实现了这个sign方法了; 后续就只是一些七七八八的小事情。
到这里基本就结束了,后续会不定期更新相关网站的解密过程 -_-
“JS代码地址:code.juejin.cn/pen/7126727…