抓取熊貓TV彈幕

前天看到了別人寫的抓取鬥魚彈幕的程序,抓取鬥魚彈幕是我很早以前的一個想法,但是無奈不會寫,不懂得tcp傳過來的那些字節的含義,所以沒寫出來,當我看到別人寫好的代碼,我就參照人家的博客自己實現了一遍,今天我就想熊貓tv應該也是差不多的,所以自己寫了一個抓熊貓TV彈幕的代碼。

有想抓鬥魚彈幕的建議去看這個博客,有詳細步驟
http://brucezz.github.io/articles/2016/01/11/douyu-crawler/

下面說抓取熊貓tv彈幕

(一)抓包分析

分析

這個比鬥魚的簡單多了,最開始只有兩個要發送的包,只要把這兩個發過去,就可以接收到彈幕了。

現在的問題是第一次發送的那些數據從哪來。

分兩步:

(1)h ttp://www.panda.tv/ajax_chatroom?roomid=10255&_=1454038739756
得到
{
“errno”: 0,
“data”: {
“sign”: “e629e9eca8b561e0dbc2fbf2681e79f7”,
“roomid”: 10255,
“rid”: -35304032,
“ts”: 1454038744994
},
“errmsg”: “”
}
(2)h ttp://api.homer.panda.tv/chatroom/getinfo?rid=-35304032&roomid=10255&retry=0&sign=e629e9eca8b561e0dbc2fbf2681e79f7&ts=1454038744994&_=1454038740461
得到:
{
“errno”: 0,
“errmsg”: “”,
“data”: {
“rid”: -35304032,
“appid”: “18421055”,
“chat_addr_list”: [
“180.163.220.15:80”,
“180.163.220.15:80”
],
“ts”: 1454038745481,
“sign”: “fb4039b64439298bd6869cbec1bb1d0c”,
“authType”: “3”
}
}
這就是所有需要的數據了。其中還有彈幕服務器的地址,每次返回兩個,有時候兩個一樣,有時候不一樣,都可以用。

(二)發送數據的格式是什麼?

發送數據的格式

前面4個字節00 06 00 02是固定的,00 60代表後面參數的長度。注意的是後面參數之間都由回車符隔開。

第二個包其實是呼吸包,格式固定式00 06 00 00

(三)接收到的數據格式是什麼?

接收到的數據格式

每一條彈幕數據都是由 00 06 00 03這四個字節開頭的,然後後面第8個字節開始4個字節是此次接收到的數據長度,計算方法如下:
計算方法

然後從41開始接收824個字節,就是這次的所有數據,這一次的數據裏面可能有好幾條彈幕信息,必須依次取出,每條彈幕開頭的4個字節在單次數據中都是一樣的,例如本次是01 15 5c 1f,這4個字節第一次出現位置是固定的,可以每次取出,然後比照着識別出每條彈幕信息的開頭,這四個字節後面4個字節就是彈幕信息的長度了,計算方法同上,然後就可以得到一條彈幕信息了,類似下面這樣的json串:
{
“type”: “1”,
“time”: 1454078535,
“data”: {
“from”: {
“identity”: “30”,
“rid”: “3604228”,
“__plat”: “pc_web”,
“nickName”: “翌江別鶴”,
“level”: “4”,
“userName”: “PandaTv3604228”
},
“to”: {
“toqid”: 1,
“toroom”: “10015”
},
“content”: “這圖作者心理太陰暗了”
}
}
這就很明瞭了。

(四)呼吸包

維持socket連接用的,我抓包發現熊貓tv的呼吸包間隔時間很長,好像有5分鐘,沒精確計算過,我程序中用的是1分鐘發一次呼吸包。
呼吸包就4個字節:00 06 00 00

這是今天一天的研究成果,分享之。
代碼在:https://github.com/gaopu/Java/tree/master/CrawlPandaDanmu
包含idea的工程文件,可在idea中直接打開

發佈了74 篇原創文章 · 獲贊 213 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章