• x-zse-96的JSRPC解决方案


    该博文仅限技术交流,请勿滥用

    也是刚跑通这个JSRPC的解决方案,所以会一步一步比较详细的去介绍使用方法。

    个人认为呀,需要补环境但是jsdom无法解决的时候。扣算法能力不足,对js了解不深的时候。直接扣下的js代码无法用python的第三方库运行的时候(或可运行但结果不可用)。

    这时候,可能就需要用到JSRPC去解决了。

    当你完全不了解JSRPC,但却需要使用它的时候。你需要怎么办?

    1,首先到git下载exe文件:

     它是可运行的,下载完直接点两下会弹一个cmd,就运行起来了。如下图:

     

    2,打开知乎页面之后在打开控制台:

     

    3,然后我们需要JSRPC项目里的JsEnv.js文件。可以进到链接,直接去copy它的这个js代码,然后粘贴到控制台,效果如下:

     

    4,继续在控制台粘贴如下代码:

     var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zhihu&name=xze96");

    在上面代码有 group=zhihu&name=xze96 这个。这里面的zhihu,xze96,这是可以改的,但是要确保我们等会写的python代码里,跟这俩字段保持一致就行。

     输入之后回车:

     这样子就代表已经连接通信了。

    5,我们扣下来的代码,在末尾添加如下代码:

     然后把整个扣下来改完的js粘贴进控制台:

     6,这个时候,我们写一下python连接JSRPC的代码:

    7:然后我们就不用再去操作浏览器或者其他了,直接写好代码在pycharm运行。运行结果:

     

    可以看到数据都正常返回了的。改写关键词依旧是可以从这个接口拿到数据。

    下面是python代码:

    1. import hashlib
    2. import urllib.parse
    3. import requests
    4. def md5hex(word):
    5. m = hashlib.md5()
    6. m.update(word.encode("utf-8"))
    7. return m.hexdigest()
    8. def getSign(md5):
    9. # 一,启动exe程序
    10. # 二,打开浏览器网站,在控制台注入jsEnv中的代码
    11. # 三,继续在控制台 var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zhihu&name=xze96"); 注入通信
    12. # 四,复制缺失环境的js代码粘贴到控制台
    13. data = {
    14. "group": "zhihu",
    15. "name": "xze96",
    16. "action": "zhihuSign",
    17. "param": md5
    18. }
    19. url = "http://127.0.0.1:12080/go"
    20. res = requests.post(url, data=data)
    21. sign = res.json()['data']
    22. return sign
    23. def zhiHu(keyword):
    24. cookie = '"AJBsNreRQBCPTnUIjLaLd2xSWLQtcZGToV8=|1571991072"'
    25. headers = {
    26. 'accept': '*/*',
    27. 'cookie': 'd_c0={};'.format(cookie),
    28. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
    29. 'x-api-version': '3.0.91',
    30. 'x-app-za': 'OS=Web',
    31. 'x-requested-with': 'fetch',
    32. 'x-zse-93': '101_3_3.0',
    33. 'x-zst-81': '3_2.0aR_sn77yn6O92wOB8hPZnQr0EMYxc4f18wNBUgpTQ6nxERFZKRY0-4Lm-h3_tufIwJS8gcxTgJS_AuPZNcXCTwxI78YxEM20s4PGDwN8gGcYAupMWufIeQuK7AFpS6O1vukyQ_R0rRnsyukMGvxBEqeCiRnxEL2ZZrxmDucmqhPXnXFMTAoTF6RhRuLPF7FBFcNGaqwmSwX8Iht9WgYGwv3Bf9psc0o_Y_wqx9SmjuFxceXMTDH0IbeTv4xMeXwM6gt0eLLfJGHxeMcqGXY99DrqZCe8UhxB6UxCTwO1cqwpUwVLNGtGtvOyFCHsZD38Q9o1ubgB09Sp20N1MAXOCqwONceMrRgBkJxMowe_VJSxOqfzKLFqYqU_JMoKhgH1YuYqFugMQie1CCYfdggONJuKiGwLZDS1Zw38EJNMc8VsCcfOBDofkQgO2Co8bLS9HDC0gg9MI9gXYUC8KHw0xhpfAJOYwwLCGrSC'
    34. }
    35. uri = '/api/v4/search_v3?gk_version=gz-gaokao&t=general&q={}&correction=1&offset=0' \
    36. '&limit=20&filter_fields=&lc_idx=0&show_all_topics=0&search_source=Normal'.format(urllib.parse.quote(keyword))
    37. print(uri)
    38. s = headers['x-zse-93'] + '+' + uri + '+' + cookie + '+' + headers['x-zst-81']
    39. smd5 = md5hex(s)
    40. sign = getSign(smd5)
    41. print(sign)
    42. info = '2.0_' + sign
    43. headers['x-zse-96'] = info
    44. api = 'https://www.zhihu.com' + uri
    45. resp = requests.get(api, headers=headers)
    46. print(resp.json())
    47. if __name__ == '__main__':
    48. zhiHu('贵阳通报 27 死车祸情况')

     整篇下来其实没有去讲怎么把某乎的js代码抠出来。因为网上资源比较多,这里多说也没有意义,但是有个难点就是js代码扣下来其实是不能用的。

     exports is not defined。

    因为对js了解不多,这个问题也是卡了我很久。

    最后还是看了很多资料和大佬的博客才解决:

    另外,JSRPC也适用某条的_signature。

     

  • 相关阅读:
    小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核
    浅谈阵列天线及布阵
    拒绝一次性芯片,新技术:无线升级芯片
    Python装饰器与面向切面编程
    Bert基础(十六)--Bert实战:中文文本分类任务-- transformers库实现
    毫秒时间位数,时而1位,时而2位,时而3位,搞得我好乱呐!
    详解CAN通信的标识符掩码和标识符列表两种过滤机制
    MongoDB(一) windows 和 linux 之 Ubuntu 安装
    海南大学金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书​
    【Mongoose笔记】HTTP 反向代理
  • 原文地址:https://blog.csdn.net/s_kangkang_A/article/details/126955040