分组微博

其实最近写了一个作品分组微博。算是好久没有出作品的成果吧,产品设计的初衷是为了自己的信息共享。例如我就有几帮玩的比较好的朋友。那微博总是个富含创造力的地方,每天总是可以发现一些有价值的好玩的东西。但是我们怎么记得那么人的昵称,特别是有些小伙伴们一向坚持“换昵称大于更新微博的频率不动摇”这个基本准则,改着改着就不知道到底谁是他了。

根据这么个需求就写了这个分组微博,本想写出来给自己用,但是一想独乐了不如众乐乐,就做成了一个小的系统。但是由于新浪微博的各种限制和各种审核慢导致到现在还没有上线。但是好不容易发布一个产品还是写一篇文章好好记录其诞生的来龙去脉吧,我一向把自己做的产品当做一个有生命力的东西。之前写过一堆有意思没意思的东西,例如一些测试应用“谁at我最多”、“死亡时间测试”等等,也做过一些工具类的东西,但是基本都没有上线,有一个“懒人工具包”到现在也没做过任何推广,一直给自己用。之前还没毕业的时候搞过一个小圈子的微博,当然到现在它早就夭折了。但是通过它我还是学到了很多东西,认识了一批好玩的不好玩的人。

那这个分组微博的怎么实现的呢?其实它就是一个机器人,但是机器人的触发条件依赖SAE 的cron服务,因为按照被调用的方式能够唤醒它的方式无外乎两种。第一种就是通过评论的方式,第二种就是原创微博@分组微博 @用户设置的分组。所以我起了两个cron脚本,一个分析所有@到分组微博的评论,另外一个则专门用于分析微博@到分组微博。但这个时候有几个值得搞定的事情,第一个就是匹配出用户设置的微博分组,这里贡献一下我用到的正则。

$text = '微博正文内容啦,例如@分组微博 @小伙伴们 @土豪们';
$reg = "/@([\x{4e00}-\x{9fa5}a-z0-9A-Z_-]+)/u";
preg_match_all($reg, $text, $matches);

以上的正则可以搞定这个事情,可以完美的匹配出“分组微博”、“小伙伴们”、“土豪们”这几个分组。但是我毕竟只是按照自己设想的去测试的,有些极端的字符可以被新浪微博昵称接受的可能就匹配不出来了。那么匹配到了我们就可以检测这个用户到底是不是我们的用户,这个可以通过weibo uid这个搞定。另外这些分组用户是不是设置了,以上的判断可以剔除掉一部分所谓的脏数据。

如果只是给自己用,那么接下来就可以偷懒了,一般的做法是我们以上检测到确实是在召唤分组微博机器人帮你干活的信息,我们可以直接在这个地方利用存到数据库中的分组微博自己微博账号的token去给用户设置的分组成员发通知了。但这么搞显然存在很大的弊端。弊端之一就是不能胜任特别是当用户的数目巨大的时候,那php脚本执行总是会有一个最大的执行时间。加入在一分钟之内检测到了有1000个用户在召唤,那么不可能能同时处理这么多的请求。毕竟这么做,做的操作时串行的。另外一个弊端就是会对应用接口有效的调用频率造成冲击一下子就被禁用了。

那么鉴于以上的情况,我在发送微博的时候也用了一个队列,用到了sae的分布式任务taskqueue服务,如果想对以上的服务有详细的了解,可以参见 taskqueue文档。那么既然用到了分布式这么高端的东西,我们还是需要用到“锁”,因为不用锁就可能一个发送作业可能被不同的机器执行,由于我还是用了最简便的mysql做锁,那肯定需要做成“租约锁”。如果你对“租约锁”不熟悉的话,可以移步我的上篇文章关于租约机制Lease

晒晒高端大气上档次的首页吧:

这次前端的部分还是用到了bootstrap的3.0版本,我发现世界都快被他大一统了。但是人家搞的确实很上档次,确实越来越符合我的品位。值得一提的是用到了其中的一个js的插件叫“bootbox”,很好用,如果想了解。可以看看bootbox。我个人觉得这个还是完全由js来控制更好,例如下面简单的代码:

bootbox.dialog({
  message: "I am a custom dialog",
  title: "Custom title",
  buttons: {
    success: {
      label: "Success!",
      className: "btn-success",
      callback: function() {
        Example.show("great success");
      }
    },
    danger: {
      label: "Danger!",
      className: "btn-danger",
      callback: function() {
        Example.show("uh oh, look out!");
      }
    },
    main: {
      label: "Click ME!",
      className: "btn-primary",
      callback: function() {
        Example.show("Primary button");
      }
    }
  }
});

就可以实现很炫的弹窗效果了:

当然实用的还是其中的callback的设计。今天是中秋,北京天公不作美,月亮影子都看不到。愿家人、朋友们都快乐。