ZHBot —— 知乎机器人

前言

ZHBot(ZhiHu Robot)是一个知乎帐号的自动运营程序。它的主要目的是协助主号(或者关注者),让他们更加及时的发现最新的有价值的、热门的问题。所以它是给小号使用的辅助工具。

ZHBot 做到这一点主要是靠知乎首页推荐,自动监听某些范围内的最新问题(范围可以是关键字、可以是主号的关注话题列表),符合其判定策略的问题将被关注,然后关注信息会被推送到关注者(例如主号)首页。当然它也受限于首页推荐,因为目前的知乎首页推荐算法导致对单个用户动态推送的权重不会太高。

功能

核心功能:

  • 监听指定用户的所有话题的最新热门问题

    这个指定用户通常是主号,目的是通过一个人感兴趣的点来限定问题范围,而不是一个个话题的配置。

  • 关注问题以推送至主号首页

    关注命中决策的问题。不会重复关注问题。

  • 监听触发指定关键字的最新问题并关注(支持正则)

    如果话题范围限定太局限了,关键字是个好的方案。但是关键字涉及知乎搜索,要知道搜索是有缓存的,所以不会那么的及时。

粉丝功能

  • 监听我的新关注者

    时刻帮你(或者指定帐号)监督新的关注者。

  • 给我的新关注者发私信

    这个是模仿微博的被关注者自动回复,例如你关注我的话,马上会收到我的机器人私信。他会告诉你我是一个怎样的人,适不适合关注。

登录功能

  • 自动检查 Cookies 的有效性

    毕竟是 24*7 小时运行的程序,不需要反复登录,所以无法避免遇到 Cookies 过期的情况。

  • 支持二维码展示与登录

    作为入口,直接 Web 端展示二维码扫描即可登录。

  • 支持帐号密码登录

    配置好帐号密码以后,在没有配置 Cookies 或者已经失效以后会自动登录。

  • 邮件提醒失效状态并附加登录二维码

    发现 Cookies 失效,会自动发送邮件通知,并在邮件中带入登录二维码。扫描邮件即可登录并且自动更新持久化的 Cookies 等信息。(注意:目前我没有测试过关于知乎对用户认证信息多久更新一次,也不知道。不过已知的是密码被修改一定会过期的)

辅助功能

  • 在指定问题下邀请推荐用户

    如果你不想用主号邀请,或者一个人邀请的力量不够(一个人只能发送 15 个邀请)。便可以用这个功能,小号来帮你。并且这个功能可以集成到知乎前端,我可能计划开发一个调用这个 API 的浏览器扩展,给知乎页面增加这个功能。

  • 私信提示指定用户指定问题有新回答

    这个功能是由于我前几天并不知道知乎其实可以设置新回答提醒。所以有可能在项目公开时被移除掉,因为目前想不到它有什么用处。

  • Cookies 等数据持久化到配置文件

    在没有手动配置 Cookies 的情况下,二维码或者帐号密码登录都会持久化到配置文件中保存。目的是防止二次启动时进行没必要的再次身份验证。

设计优化

  • 从配置文件中读取程序设置项

    目前对自定义参数还没构思完毕,目的当然是让程序更有定制性。例如一个大 V 的粉丝监控频率和一个小透明能一样吗?

  • 监听信号/捕获异常/执行子进程 等手段提高程序稳定性

    目前用了这些手段提高了程序的可用性。不会轻易的狗带。当然也正因为这些原因,不对 Windows 支持。(其实主要原因是我不用 Windows,更不用 Windows 服务器)

当前状态

目前 Robot 程序已经在测试了,我的小号已经在工作。对了,没必要取关然后又关注我测试关注者自动回复,我的小号不会给你私信的。因为程序运行期间不会立马给曾经是粉丝的人第二次关注时发私信,那样就成骚扰了。除非刚好你取关和关注的操作在程序端粉丝列表缓存开始更新和更新之间。

核心策略

目前是基于问题已有数据(提问时间、回答数量、关注数量)做主决策和时间线(从提问到后续时间的数据权重增大程度)做辅决策,判断一个问题是否是有价值可能值得关注。
我想还有很大的优化空间。但是有一点是肯定的,无人问津的(通常是无意义问题)一定不会被关注。

项目相关

最初是用 Ruby 设计和实现的,在大半个月前就已经开始并且完成了已经跑在我的服务器上,只是没当前的功能这么成型。我最初就是觉得知乎首页推荐很糟糕,也许他们用了很多高大上的技术,利用各种数据给用户建立模型,然后个性化推送。但是效果渣是事实,我简单的觉得我想看的内容最多的是我关注的话题的最新的有意义的问题,所以我开发了它。

然后几天前,我的路由器被我折腾成 Linux 了,突发奇想能不能让路由器跑这个程序,但是由于某些原因 Ruby 始终无法在路由器上的 Linux 发型版正常的运行,想解决付出的代价有点大,我已经没有耐心了。
于是我决定用路由器能完美跑程序的 Python 环境再开发一个版本。然后建立了新项目,闲得没事构思和设计了一段时间(之前都是边开发边构思功能的),然后就有了现在完整的形态。
主要花了一个晚上,和另外一个饭后打游戏时间大致开发完成。当然目前还需要完善。也因为构思比较好,所以上一个直接开撸的临时作品已经丢弃了。

最后

希望我有耐心能把这个项目完成,并且成功开源。因为我知道自己是个怎样的人,曾经做过很多有趣的东西,也受到过不少人的关注,当然最后没热情直接放弃了。就像这个博客的前端其实好几个月都没更新了,我的博客上传图片 BUG 导致我懒得在文章中加图片,然而我的开发计划下一个就是 Fix 上传问题,但是那已经是几个月前的安排了,所以现在都没继续安排了。热情是个很大的因素,我能坚持更新博客,就已经很需要毅力了。当然我知道,我必须这么做。