使用 ELK 来可视化微信群聊记录 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
gyorou
V2EX    分享创造

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

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

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

    自从有了 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     Solana     878 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:16 PVG 05:16 LAX 14:16 JFK 17:16
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86