个人微信公众号背后装入强大搜索引擎可以这么玩

1,169 阅读4分钟
原文链接: mp.weixin.qq.com

刚开始,只是想为公众号加上搜索功能,方便回复关键字查询历史文。在去掉一些早期七七八八的文章,能返回的搜索资源就更少了,而且技术占了大部分,这该有多么的单调,略显尴尬。对于搜索功能的添加,是需要把文章、链接一个个录入数据库的,有了文章基础数据,就可以编写搜索接口。一个个个录,是枯燥的重复,于是想到找一个微信文章收录平台,为自动获取提供可能,发现了搜狗搜索引擎有微信专栏。

月发文二篇???我这月有十来啊篇啊喂,点进去一看,下方一行小字,仅显示最近十条群发,得嘞一个个录吧。做了个简易的录入小系统clear。

念念不忘必有回响

搜狗微信有很丰富的内容,在搜索引擎市场中却不是那么引人注目,对于此刻的我来说就是发现了新大陆

这个微信热词不错,加上加上

当时测试获取的代码

搜狗有针对整个微信文章的收录,对个人公众号来说,就像一艘星际小船冲进了宇宙。只有微信文章才能以卡片的形式作为结果推送,如果在公众号中的搜索,也可以依靠强大的搜狗就太酷了。现在真的实现了。

了解 [关键字][空格][页码]  的规则,就可以在其中自由驰骋。自由驰骋,搜你所想。

临渊羡鱼,退而结网

在搜狗微信搜索中,每一页有10条数据,每条数据都是一篇微信文章。我们需要获取其中的标题、摘要、链接、图片这四个信息。

画出简要的页面结构分析:

整个页面的编码是utf8,但是当搜索关键字包含中文时,需要是gb2312编码,否则页面关键字是按乱码进行搜索,会出现一些意想不到的奇异搜索结果。

在实现网页内容解析后,就可以进行图文回复的设计了。在微信推送中,一次最多可以推送8篇文章,对于接受者,屏幕会被占得满满的。所以开始设计图文回复时,尽可能少一些,最终采用了5+2原则。

5+2原则

在搜索中前5篇来源于搜狗,后0~2篇来自于这个公众号。在分页的时候其实是两部分联动搜索,在搜狗中以5为单位和在本地数据库以2为单位,在不同的区域分别搜索,组合结果。搜索引擎一页10篇,5正好分10为上下两页。

所以page是搜索引擎中的页码,myPage是自定义页码。只输入关键字,当然默认是第一页。知道这个就可以方便的和电脑上的搜索结果做对比了。

代码实现

在上次微信机器人小雅(小雅是啥,试试后台回复小雅)代码的基础,继续扩展了一个API接口,使用一个SogouWx的类调用搜狗引擎。当用户发送关键字给小雅时,如果不符合小雅的预设关键字列表,小雅在搜索自己的数据库时,也把请求发送给搜狗,最后组合文章列表返回给用户。

在实际物理实现用到了两台服务器,原因是云服务器1只有1G内存,同时跑MySQL非常内存消耗很大,正好有台阿里云3个月2G内存的,独立跑MySQL,系统是CentOS7.3和7.4,这样腾讯云服务器1缓解不卡了。只要一个服务器也是可以的,我也想用一台服务器啊,关键是卡啊,传个代码都要等半天。这大概就是分布式系统的雏形吧。有几个云服务器看来越来越重要了~

在代码实现时,也有有不少细节。这里是用的PHP,印象深的有两个:

1、PHP解析HTML结构的页面时。开始没指明即使用mb_string转码也会有部分字符异常

//这个属于hack,不加utf-8指明dom会以iso-8859-1的方式编码$dom = new DOMDocument();$dom->loadHTML(''.$htmlStr);

2、json_encode函数无输出也不报错。原因是要求参数不是utf8编码,不知道这个调试猝不及防啊。

//当内容非utf8编码,json_encode函数无输出也不报错$name = mb_convert_encoding('《君畅·加油向前跑》','gb2312');$arr = [   'name'=>$name];echo json_encode($arr);//没有输出$error = json_last_error();echo $error;//调试错误

诸多细节尽在源码:

https://github.com/nasaplayer/WeChatRobotYa

就是这个公众号了