V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
gyorou
V2EX  ›  分享创造

使用 ELK 来可视化微信群聊记录

  •  
  •   gyorou ·
    lengshuiyulangcn · 2017-06-23 00:16:05 +08:00 · 6042 次点击
    这是一个创建于 2693 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文 偷懒省略了一些细节。有争议再解释讨论吧。

    自从有了 itchat 这个神器之后,一直在考虑能做些什么东西。 先后做了发送撤回消息的 bot 和推荐 spotify 音乐的 bot,到头来,所有的聊天记录都静静地躺在我的 redis 里面,需要利用起来也十分麻烦。 于是最近,我突然想到,既然 ELK 能用来可视化 log,那何尝不能用来可视化一下微信的聊天记录呢。

    需要的东西

    1. ELK 全家桶。

    2. Redis,用来通过在 itchat 中 pub,在 logstash 中 sub 来获取微信聊天内容。

    3. Itchat。基于 web 微信的第三方 SDK。

    Step by Step

    首先自然需要写个 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填进去就大功告成了。 随便点开图标一览,画两个图呗,比如统计一下谁特么发言最多这种。

    To do

    • 对中文的 field 需要进行分词。
    • 对占用较大的无用 field 需要整理移除。

    以上。

    15 条回复    2017-06-27 19:34:36 +08:00
    ke1e
        1
    ke1e  
       2017-06-23 00:35:10 +08:00 via Android
    推荐 index 使用 time based 命名,只是推荐
    xujialiang
        2
    xujialiang  
       2017-06-23 00:51:40 +08:00
    嗯。。。我是用 Docker 跑的,然后 elk 是记录 Docker 的日志,这样全都有了。。自己在 kibana 上做 filter
    SharkIng
        3
    SharkIng  
       2017-06-23 07:43:42 +08:00 via iPhone
    有没有可能不用 Redis ?
    gyorou
        4
    gyorou  
    OP
       2017-06-23 08:09:01 +08:00
    @ke1e 这个是之前写的,现在用了微信的 messeage id 命名,每次取消的时候找出相同的 message 还可以标注一下改 message 已经取消这种。
    gyorou
        5
    gyorou  
    OP
       2017-06-23 08:10:03 +08:00
    @SharkIng 可以直接调用 Elasticsearch 的 API。
    misaka19000
        6
    misaka19000  
       2017-06-23 08:41:40 +08:00 via Android
    这个数据量有点小吧。。
    crayygy
        7
    crayygy  
       2017-06-23 08:52:22 +08:00 via iPhone
    挺有兴趣的,改天研究一下 hhh 多谢
    SharkIng
        8
    SharkIng  
       2017-06-23 09:35:30 +08:00
    @gyorou #5 好的,谢谢,这样省不少资源。而且也许 logstash 也可以不用,等有空试试看。
    gyorou
        9
    gyorou  
    OP
       2017-06-23 09:46:06 +08:00
    @SharkIng logstash 的话可以整理过滤一些东西,还是挺有用的。
    @misaka19000 建小号狂加几百个群就多了。
    SharkIng
        10
    SharkIng  
       2017-06-23 09:53:59 +08:00
    @gyorou #9 主要 logstash 也是占资源的,Elasticsearch 已经很占资源了.. 小搞一下玩玩也不想花太多钱
    (我可能是被我司的 ELK 的开销吓到了,哈哈)
    hienchu
        11
    hienchu  
       2017-06-23 13:04:30 +08:00
    @SharkIng ES 数据量上来以后,资源占用还是可以接收的,数据量太小就有点浪费
    sumuu
        12
    sumuu  
       2017-06-23 15:47:06 +08:00
    @SharkIng
    可以用 Filebeat 代替掉 Logstash ,资源占用会减缓.
    aksoft
        13
    aksoft  
       2017-06-24 09:26:38 +08:00
    微信聊天记录?
    bingchengcool
        14
    bingchengcool  
       2017-06-27 11:00:45 +08:00
    能否通过分词词性分析,找出热门话题~
    gyorou
        15
    gyorou  
    OP
       2017-06-27 19:34:36 +08:00
    @bingchengcool 那当然是可以的了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1307 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:34 · PVG 07:34 · LAX 15:34 · JFK 18:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.