互联网发展零零散散都要20多年了,技术发展的重心也一直在演变。今天这篇文章很特别,起因是最近有一些关于微信机器人以及公众号爬虫的需求,本以为这种老透了需求其实现在根本不需要花什么时间精力去搞,结果没想到这个东西在过去的十几年里经过了很多次变化,于是决定记录下这篇文章,一方面是留个技术存档,另一方面也是想看看10年之前的技术相比现在和10年之后发生过又或者会发生什么的变化?
公众号爬虫
公众号爬虫在我看来按理说应该是老掉牙的技术了才对,2012年8月17日,微信公众平台正式向普通用户开放。而正式上线则是8月23日,命名为“官号平台/媒体平台”。
基于搜狗搜索的爬取
微信从制作公众号开始其实意图就是在微信的平台基础上营造一个新的互联网生态,而公众号早期就有搜索和爬虫的问题在,而早期的微信公众号搜索大部分都是基于搜狗搜索制作的。
但比较麻烦的问题是,搜狗搜索在使用的过程过程中加入了很多很多限制。
- 大量请求之后会触发验证码
- 无法精确搜索指定公众号,输入公众号名会搜出多个公众号,且对应的文章链接是临时链接,几个小时之后会失效。
主要的问题就是后面这个限制,如果爬虫搜到的文章链接都是临时的,那你爬取的结果就只能用作临时处理,这显然不符合大部分人的需求。所以这种爬虫方式已经被废弃了,市面上主流的公众号爬虫都不使用这个方案。
2019年后这类爬虫工具纷纷失效
基于中间人的爬取
在搜狗搜索之后,爬虫的从业者又开始想点子了,既然没有办法在互联网上搜索到公众号,那就把视角回到微信上面,基于中间人代理的方式抓取数据。简单来说就是通过mitm来拦截微信中对公众号的请求,并对内容做处理。Github上高星的微信公众号爬虫都是基于这个方案制作的。很可惜的是,哪怕是最新的工具最少都是3年前才更新过。
这个爬虫有几个比较大的问题
- 必须独立使用一台windows服务器去做,因为微信只有win和mac版本,你想要把他跑在线上就必须搞一台windows服务器,而且还必须挂一个微信上去,成本就很高
- 微信在不知道什么时候做了额外的反爬机制,根据我的搜索应该就是22、23年左右添加的,触发某种反爬机制之后,惩罚从以前的封禁24小时修改成了永久封禁。这个封禁方式也很有意思,他阻止你访问微信公众号的历史列表
被封禁的微信账号不能访问公众号的历史文章,不影响其他的任何功能,比较有意思的一点是,这个功能我在新版本的微信中找不到了,换成了一个其他的页面。
如果你尝试使用中间人的方案去爬微信公众号的文章,那么你会在触发反爬规则之后被阻止访问触发规则的页面(我猜测是这样,我被封了3个号都没找到被封的具体原因),这样的话可以最小限度的避免对普通用户的影响,毕竟普通用户刷微信公众号的频率也很高。但事实则是,由于我们无法访问历史文章列表,即便我们还可以读取文章内容,但也无法实现自动更新了。
基于微信公众号的爬取
其实到上一个方案已经涵盖了99%的主流方案了,现在随便搜一搜微信公众号爬虫基本都是3年前左右的东西基本都是基于中间人做的,这也给了我很大的困扰,我不知道是不是真的有现在还能用的工具,但我的确找不到一个很靠谱的方案。
在我努力挖掘下,我找到了一些零散的接口,可以用来获取某些信息。
不知道大家有没有用过微信公众号的后台,新建草稿箱里插入超链接可以引入微信公众号的链接。
选择公众号之后可以通过下面的文章列表来查看,这里可以获取到所有的文章链接,然后再利用前面的中间人方案爬取文章内容。
这个方案最大的问题就是cookie会失效,不是全自动,就是需要每隔几天更新一次cookie还是挺麻烦的。
并且公众号的这个功能也有反爬,相比单篇的页面内容爬取,公众号的这个功能使用频率更低,你可能需要设置3分钟以上。但总得来说起码可以实现我们的目的。
爬虫本身
前面零零散散的讲了很多方案,现在我们把视角转回到这个事情本身上,看看问题的难点到底在哪里。
首先,爬虫的第一部分就是,标志微信公众号的东西是什么?
微信公众号和微信不太一样,没有微信号之类的存在,所谓公众号名呢更是可以修改,所以在公众号的体系下引入了名为biz的标志码,当我们随便打开一篇微信文章,就可以从源代码里搜到这个标志码。
这个base64编码过后的字符串就是微信公众号的id,通过__biz可以获取微信公众号的很多内容,其中就包括微信公众号的信息。在之前的很多文章当中,大量的引入了使用biz获取微信公众号信息的方案。
但不知道从何时开始,微信在这个页面加入了对应的限制,如果浏览器直接访问会返回。
这里插入一个笑话,我在搜索相关资料的时候看到的。:>
网上搜索到的信息到这里基本都是错的,事实上在现在微信的防护策略里面,是对页面的分级策略的,在pc版本的微信打开的每一个弹出窗口,大部分都是web页面,其中的区别是,点击链接只是单纯的使用内置浏览器打开页面,而点击内置功能,则可能使用在中间加入额外的限制以及权限验证,就比如前面的链接,就是验证了微信账户,如果没有相应的权限则返回”请在微信客户端打开链接”,这点可以用一个特殊的方式来验证。
1 | Wechat.exe -remote-debugging-port=9222 |
通过加参数的方式打开微信并登录之后,随便打开一个页面,并访问http://127.0.0.1:9222/json,我们可以在返回中找到对应的链接,这个接口是webdriver的CEF协议接口。
而更大的问题在于,这套老版本pc微信被废弃了,新版本的微信废弃了这部分的实现方案。
我用了一些方案去调新版本的微信,我发现解决问题的难度已经远大于问题本身,于是,解决问题的方案还是回到老版本的方案中。
微信机器人
qq机器人
相比公众号爬虫来说,可能微信机器人对于很多人都是一个远古的记忆。比起微信机器人来说,其实大家了解更多的可能是qq机器人,又或者是基于微信公众号或者企业微信使用的机器人,再到后来大家比较熟知的类似于飞书机器人。但微信机器人其实是一个相对比较空白的场景,主要是定位的区别。
qq机器人的发展史及其复杂,早期的qq技术力比较弱,很多qq机器人的用的都是直接逆向qq用底层的接口实现的。甚至早期有大量的qq机器人就是直接用qq的接口重写实现。
到中期,以酷Q为代表的基于Docker和wine实现的酷Q on Docker成为更稳定和主流的实现方案,当然,在2020年由于腾讯的执法追责,酷Q下线,很多第三方QQ机器人就此结束。
当然除了早期的各种机器人以外,还有很多至今为止仍然好用的东西,其中一个很有名的就是mirai。
与此同时,QQ也推出了内置的机器人接口,甚至也推出了官方机器人可以直接添加到qq群里,除了qq群还有qq频道的专属机器人,开发者可以直接用官方的平台来定制化机器人实现。
相比QQ漫长而又复杂的变化来讲,其实微信机器人的演化更为粗暴。
微信机器人演化
早期的微信机器人大部分都是基于微信web版本
既然有方案,那自然也就有相对的方案,一个是web版本的微信在后续的更新中删除了很多很多功能,基本没剩下什么接口了,而且cookie的过期时间也被加速了,几个小时就会掉。另一个是现在权重低的微信号(小号、新注册的)根本就没办法登录web版本的微信,所以这个方案在后续的演化中被放弃了。
微信官方接口
类似QQ,微信相对的也拆分出了很多场景,在微信中承担交互作用的是公众号、订阅号、小程序。而公众号、订阅号和小程序都有相应的api和平台用于实现自动回复以及交互功能。
之前比较主流的机器人+扫描器场景,其实都是在这个基础上实现的交互方案,这个东西有api可以用,也有很成熟的库可以直接调。企业微信也提供了自建应用的方案来实现类似的功能。
作为机器人无法解决的问题就是群管理和好友管理问题。但其实微信也设计了相应的场景就是企业微信,在企业微信的后台可以直接新建客户群,并且依托客户群的功能来管理微信群。这里有个很大的优势是,微信群默认超过200人就不能通过二维码进群了,而客户群可以配置用一套模板自动建群进群,原意应该是为了维护私域客户群。
比如说如果想通过API来交互调用消息推送到所有客户群,企业微信也提供了相应的API,但是每个用户每天只能推送一次。
但是以上的所有方案里面最大的问题在于企业微信的很多功能都是需要认证之后才能用。
而且这个东西还挺坑的一点在于,这个认证不是直接付费使用,而是必须用公司营业执照或者法人代表等东西认证。
而更坑的是企业微信的外部群,就是前面提到的客户群,目前是阉割功能的,不能添加类似群机器人的东西。这个东西几年前就是这样,可能企业微信不希望你用这种方式管理群。
除了比较基础的群管理,自动回复等等以外,企业微信的小程序接口也是自由度相当高。这块东西是很多人使用企业微信的主因之一
在这里创建企业微信应用之后,可以直接通过相应的api来向应用发送消息,也可以配置api接受消息来实现信息的交互。
就比如现在很流行的给微信机器人接ChatGPT,其中就比如
就支持通过API接受消息来实现和chatgpt的交互。
但我又遇到了一个新的问题就是,怎么把企业微信的内部应用对外使用呢?正常来讲,企业微信自建应用主要是对内的,企业内部使用,企业微信本身其实没有设置相关的场景。
之前也看到过那种用这个方案实现应用对外共享的应用,他们直接选择建一个企业卫星来解决这个问题,用户可以直接加入企业然后使用工作台里的自建应用。
在我研究了一段时间之后,抛开企业微信的企业内场景,现在微信也提供了官方的智能对话接口可以实现类似于微信客服的东西。
在微信对话开放平台你可以自己注册一个自己的机器人,在这里你可以通过很多种方式配置自动回复,其中有比较简单粗暴的培养式,也有高级的基于接口开发。
除了简单的对话式设定,还支持高级的词典式解读对话。当然我觉得相对比较实用的是在高级对话里可以关联接口,甚至可以自定义接口,这就为这个接口增加了很多的可能性,你可以通过自定义接口来实现某些功能。
通过微信客服的接入功能,我们可以用微信的智能客服来替代原本只能自动回复的原客服机器人,用户可以在客户群里添加客服助理并对话。
)
我花了一段时间把相关的各种api都研究了一遍,但其中的问题都不少,主要问题就是他总是有各种各样的限制场景,相比可以自由操作的普通微信账号功能差距还是很大。
第三方接口
抛开官方提供的方案以外,和qq的方案类似,微信机器人也用了类似的逆向破解接口的方案来实现对部分功能的调用,其中很大程度上依赖的是历史版本的微信,这也得益于微信对于旧版本的支持,很多机器人运行的还算流畅。
我研究了很久,现在比较成熟的工具是可爱猫。
当然由于各种各样的原因,可爱猫现在已经没有公开的渠道获取了,想要的话需要找社群去弄。而可爱猫虽然是一个易语言写的工具,但是却实现了一套很成熟的http接口插件方案。
通过插件可以配合自己实现的web接口来实现各种各样的功能
整体还是比较简单好用的,唯一的问题是可爱猫在服务器运行会有很大的概率导致微信闪退,最关键的是无法稳定。我曾经稳定运行了半年,之后一直闪退怎么都开不起来,再到后来突然又好了。
除此之外,还有很多类似的方案可以直接操作微信的dll
但是这个东西最大的问题是容易封号。我了解了以下是第一次警告踢下线,第二次封号。
顺这个我也看了不少相关的东西,有比较靠谱的方案就是直接在桌面版的微信上注入DLL操作。
这个方案据说比较靠谱。使用这种方案最大的优势就是你可以操作完成微信中需要的各种部分,就比如监控管理好友、群,自动回复私聊和微信群消息。
写在最后
其实前面记录了那么多,大体上把过去的很多方案都聊到了,这篇文章其实是没有讲到什么新东西,主要是花时间在研究已经有的东西,其中遇到最多的问题,就是探索微信官方对于各类功能的程序是如何认可和定义的。这本身不是一个技术上的问题,所以很多部分只能逐渐探索,无法得到准确的结果。