原文 偷懒省略了一些细节。有争议再解释讨论吧。
自从有了 itchat 这个神器之后,一直在考虑能做些什么东西。 先后做了发送撤回消息的 bot 和推荐 spotify 音乐的 bot,到头来,所有的聊天记录都静静地躺在我的 redis 里面,需要利用起来也十分麻烦。 于是最近,我突然想到,既然 ELK 能用来可视化 log,那何尝不能用来可视化一下微信的聊天记录呢。
ELK 全家桶。
Redis,用来通过在 itchat 中 pub,在 logstash 中 sub 来获取微信聊天内容。
Itchat。基于 web 微信的第三方 SDK。
首先自然需要写个 Itchat 的脚本来获取群消息。例子看文档已经足够。
接下来假设我们获取到一个类似
message = {"msg_from": "gyorou", "msg_content": "fuck the world"}
的消息内容。我们需要把 message 传递给 logstash,再由 logstash 写入 elasticsearch。
我想到的方法是使用 Redis 的 pubsub 方法。
先把 message dump 成 string 的形式,交给 redis publish 出去。
import json import redis import itchat # 省略 redis = redis.client(...) message = json.dumps(message) redis.publish('wechat_message', message)
为了接收 publish 的 message,logstash 应该有如下的输入配置。
input { redis { data_type => "channel" codec => "json" key => "wechat_message" } }
注意点是需要codec => "json"
这一项,因为,我们 publish 的是一个 string,我们要需要将其按照 json 的格式解析出来>里面的内容。
接下来,配置 logstash 的输出。
output { elasticsearch { index => "from_my_wechat" doucument_type => "chatlog" } }
以上两项分别对应 elasticsearch 的 index 和 type。这样我们可以通过localhost:9200/from_my_wechat/chatlog
的形式访 问和操作被索引的聊天内容。
最后打开 kibana,把我们的索引项目称from_my_wechat
填进去就大功告成了。 随便点开图标一览,画两个图呗,比如统计一下谁特么发言最多这种。
以上。
1 ke1e 2017-06-23 00:35:10 +08:00 via Android 推荐 index 使用 time based 命名,只是推荐 |
2 xujialiang 2017-06-23 00:51:40 +08:00 嗯。。。我是用 Docker 跑的,然后 elk 是记录 Docker 的日志,这样全都有了。。自己在 kibana 上做 filter |
3 SharkIng 2017-06-23 07:43:42 +08:00 via iPhone 有没有可能不用 Redis ? |
![]() | 4 gyorou OP @ke1e 这个是之前写的,现在用了微信的 messeage id 命名,每次取消的时候找出相同的 message 还可以标注一下改 message 已经取消这种。 |
![]() | 6 misaka19000 2017-06-23 08:41:40 +08:00 via Android 这个数据量有点小吧。。 |
![]() | 7 crayygy 2017-06-23 08:52:22 +08:00 via iPhone 挺有兴趣的,改天研究一下 hhh 多谢 |
![]() | 9 gyorou OP |
10 SharkIng 2017-06-23 09:53:59 +08:00 @gyorou #9 主要 logstash 也是占资源的,Elasticsearch 已经很占资源了.. 小搞一下玩玩也不想花太多钱 (我可能是被我司的 ELK 的开销吓到了,哈哈) |
13 aksoft 2017-06-24 09:26:38 +08:00 微信聊天记录? |
14 bingchengcool 2017-06-27 11:00:45 +08:00 能否通过分词词性分析,找出热门话题~ |
![]() | 15 gyorou OP @bingchengcool 那当然是可以的了。 |