时间: 2020-11-24|47次围观|0 条评论

目录

  1. 需求分析
  2. 选型
  3. 设计与流程
  4. 实现过程
  5. 结果展示

1 需求分析

  在一些业务场景中需要拿到IM上的通信记录来做一些数据分析,例如对QQ平台中的消息进行领域分类等。

2 选型

环境与工具:

  • python 2.7
  • Ubuntu 16.04
  • ElasticSearch 5.5.2
  • Kibana 5.5.2
  • Firefox 57.0.1 (64-bit)

Python第三方依赖:

  • pypcap(1.2.0)【捕包】
  • dpkt(1.9.1)【解析包】
  • elasticsearch(6.0.0) 【es的python客户端】
  • tgrocery(0.1.3)【短文本分类】

3 分析与设计

  为了降低嗅探的难度,避免使用https的连接,从连接http://w.qq.com/ 抓取消息。

观察业务逻辑

  使用火狐浏览器的前端工具(F12)来观察我们的研究对象

【原创】python嗅探QQ消息实战插图

  发现前端不断查询是否有新的消息产生以便获取到页面中,如果当前没有新消息,则返回一个特定的JSON。如图所示。
  当有发言产生时,返回一个有意义的结果如下图所示。

【原创】python嗅探QQ消息实战插图1

流程设计

  1. 登录了QQ账号
  2. 使用pypcap自动嗅探收到的网络包
  3. 使用dpkt解析收到的网络包并过滤出有消息内容的数据包
  4. 对消息进行分类,将发言时间、发送方ID号,接收方ID号、发言内容、发言分类结果和置信度这几个信息索引到Elasticsearch中
  5. 使用Kibana进行可视化

4 实现过程

4.1 包嗅探与包解析

import pcap
import dpkt
def captData():
    pc=pcap.pcap('wlp5s0')  #参数可为网卡名,可以使用ifconfig命令查看
    pc.setfilter('tcp port 80')    #设置监听过滤器
    for ptime,pdata in pc:    #ptime为收到时间,pdata为收到数据
        pkt = dpkt.ethernet.Ethernet(pdata)  
        if pkt.data.data.__class__.__name__ != 'TCP':
            continue
        ip_data=pkt.data
        tcp_data=ip_data.data
        app_data=tcp_data.data#向上层层解析直到应用层的内容

        if app_data.find('poll_type')!=-1:#以特定字符串作为有消息的标识
            process(app_data)

4.2 短文本分类

from tgrocery import Grocery
def labelmaker(self):
    result=[]
    grocery = Grocery('11c_20k_20171226')#参数是分类模型的名称
    grocery.load()  
    label_confidence=sorted(grocery.predict(self.shorttext).dec_values.items(), lambda x, y: cmp(x[1], y[1]), reverse=True)[0]
    result.append(label_confidence[0])#置信度最高的分类结果
    result.append(label_confidence[1])# 置信度
    return result

4.3 将数据索引到ES

from elasticsearch import Elasticsearch
import hashlib
class Index2ES:
    def __init__(self,index,doctype,response_body):
        self.body=response_body
        self.index=index
        self.doctype=doctype
        self.id=hashlib.md5(str(response_body['time'])).hexdigest()
        self.es = Elasticsearch()

    def putdoc(self):
        self.es.index(index=self.index,doc_type=self.doctype,id=self.id,body=self.body)

4.4 新建并配置Kibana图表

【原创】python嗅探QQ消息实战插图2

5 结果展示

【原创】python嗅探QQ消息实战插图3

【原创】python嗅探QQ消息实战插图4

源码

Github:qqSnifferAndClassifier

转载于:https://www.cnblogs.com/d0main/p/8146632.html

原文链接:https://blog.csdn.net/weixin_30342827/article/details/96128547

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《【原创】python嗅探QQ消息实战
   

还没有人抢沙发呢~