目錄
- 需求分析
- 選型
- 設計與流程
- 實現過程
- 結果展示
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)來觀察我們的研究對象

發現前端不斷查詢是否有新的消息產生以便獲取到頁面中,如果當前沒有新消息,則返回一個特定的JSON。如圖所示。
當有發言產生時,返回一個有意義的結果如下圖所示。

流程設計
- 登錄了QQ賬號
- 使用pypcap自動嗅探收到的網絡包
- 使用dpkt解析收到的網絡包並過濾出有消息內容的數據包
- 對消息進行分類,將發言時間、發送方ID號,接收方ID號、發言內容、發言分類結果和置信度這幾個信息索引到Elasticsearch中
- 使用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圖表

5 結果展示


