手搓RSS订阅微信公众号文章
阅读微信公众号文章的意义
部分微信公众号文章质量比较高,阅读会启发人往正道上思考,不偏激,不愚昧。学会多方位、多角度地去思考。
为什么使用RSS阅读
RSS是一项信息汇聚技术,它从特定网站抓取信息,并通过RSS阅读器将信息汇总呈现在你的眼前。 减少了你四处登陆,处理广告,寻找信息的时间。
调研情况
获取微信公众号文章有许多思路:
通过sogou的微信搜索接口
sogou接口只能查看前10页搜索结果。通过修改URL中的参数,还能搜索公众号。 该方案优点是sogou看起来比较稳定。但缺点是很难获取最新公众号文章。它在展示公众号时倒是能够显示最新的一篇文章,不太符合查看最近文章的要求。另外,它的最新文章的时延并不小。
通过第三方爬虫方案
github上有许多大神的数据抓取方案。 优点是不用重复造轮子。缺点是很容易被微信反制而失效。陷于各种与微信的斗智斗勇,看似有趣,实则消耗精力。 目前看起来比较好的方案有以下
- wnma3mz/wechat_articles_spider
- 1061700625/WeChat_Article 不一一列举。 不少项目中还一并分享了各种抓取思路。本文同样从中获准良多。
fiddle等嗅探工具抓包
通过fiddle等嗅探工具,可以抓包微信与服务器的交互信息。利用截获的地址,即可做RSS。 该方法十分彻底,但缺点是不太好自动处理。 有人提到可以使用anyproxy这个编程化工具,它实现了类似fiddle的功能,允许编程式地使用,方便自动化处理。
以公众号搜索公众号
在编写公众号文章时,可以搜索其他公众号。再通过抓包,同样可以抓到文章地址。
模拟微信
微信程序有公众号功能,如果能模拟微信,就可以得到公众号相关的信息。 比如wechaty。 经测试,wechaty似乎要收费了,而且是微信的反制大户,很不稳定。多作为广告的客户端,自带黑背景,并不推荐。
hook微信
模拟微信的变种,使用真实的微信,通过api来操控它。 上限十分强大,但需要很多前置基础知识。比较费时间。
总结
上述是我调研的结果,我认为用拦截嗅探的方法不适用,因为需要爬虫、反爬、反反爬的知识。 模拟、hook的方法也不好,我认为应该用正规合理的方式去使用微信。 如果微信自己能提供微信的SDK,那就再好不过了,我认为微信应该这样做。 微信应该去阻拦坏人,而不是给所有人增加门槛。
我的方法
再三思索后我认为应该用正规合理的方式去使用微信。 所以我的方案由以下子方案构成
模拟鼠标键盘,打开公众号文章 拦截浏览器,获取公众号文章 生成公众号文章列表 制作RSS源 由ttrss订阅RSS源
模拟鼠标键盘 - RPA
使用pyautogui也可以,但我选择RPA工具。算是学习一下RPA的使用。 顺便一说,我感觉RPA就是个图形化编程工具。但能力还是非常的弱。 过程中遇到inpsect窗口的问题,它是层层pane套下来的,大概有十几层,最后是button。 都能看到msg list了,但不知道为什么窗口刷新后就再也获取不到了。应该是微信有所控制。 所以还是鼠标点击比较实际。
解决远程执行时窗口消失导致RPA报错的问题
通常使用远程桌面来持续运行rpa任务。远程桌面工具我们通常又会使用微软自带mstsc。该工具在断开连接时,会将远程机进行锁定。该工具在最小化时,会让远程机的桌面变成非活动状态。这两种情况都会导致rpa任务运行与窗口有关(在pywinauto文档中介绍了受影响的函数,如click_input,set_focus等)的功能时出错。 pywinauto文档在此 https://pywinauto.readthedocs.io/en/latest/remote_execution.html 解决断开连接的方法,使用tscon切换远程连接,使远程机并不断开连接。 https://support.smartbear.com/testcomplete/docs/testing-with/running/via-rdp/keeping-computer-unlocked.html 即以下代码,并以管理员权限执行。实测有效。
for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (
%windir%\System32\tscon.exe %%s /dest:console1
)
解决远程执行RPA报错的问题
经过几天的测试,上述的命令在多次使用后会导致无法再远程连接,原因未知。 现在采用了某文档中建议的VNC的方法
拦截浏览器 - selenium
selenium是一个浏览器自动化库,可以拿到title和url,这对我来说就足够了。我并不需要全文输出RSS,只需要能跳转就可以。
生成公众号文章列表 - python
拿到title和url后,直接自己生成一个html的文章列表是小CASE,然后启动一个http服务器供抓取就好了。
制作RSS源 - RSSHub
感谢RSSHub作者和社区,这是非常好的工具。 通过RSSHub抓取上述生成的文章列表,RSSHub就会制作出一个RSS源供订阅。 当然RSSHub的抓取代码需要自己写,找内置实例试试,研究一下就会了。 用nodejs实现的,不会nodejs真难受。
订阅RSS - TTRSS
如图,是不是很好呢嘿嘿
总体部署
综上,部署共分为五部分: RPA server: 打开公众号 Article server: 生成文章列表 Http server: 文章列表服务器 Rsshub server: 制作rss源 TTRSS server: rss阅读器
希望
希望微信能开放微信操作SDK
写在最后
微信公众号上同样有很多糟粕,非常多的糟粕。要学会自己甄别。毕竟丑帝对我们的渗透无处不在。擦亮双眼,冷静思考,不要自觉的戴上愤怒和自恨的鼻环。