標籤:
×
本篇主要是: 發送QQ訊息(to:好友,群),以及對小黃雞抓包利用它的語言庫
本文是WebQQ流程的最後一章
最後一章內容不多但我還是囉嗦,可能對大部分人都已知曉的流程方法我也會介紹一下
前面幾個demo我已經上傳到對應頁面的尾部,剩下的會抽時間補,外包經常加班且沒外網,盡量本周弄完
目前總進度大概100%全系列預計會有這些步驟,當然某些步驟可能會合并:
- 驗證碼
- 第一次登陸
- 第二次登陸
- 保持線上和接收訊息
- 擷取好友和群列表
- 發送訊息
- 變成智能的(*?∀?*)
回顧基礎
一般抓包類比請求的方式
熟悉流程:
- 在頁面上普通操作,熟悉基本的操作過程
- 開啟抓包軟體(httpwatch,IE9+,FF,Chrome),再到頁面操作一遍,根據功能和請求把整體分為各個步驟
- 對應每一個步驟,多次操作,瞭解每一步需要的http請求,不斷類比每一次的請求該步驟
注意事項:
- 敏感頁面需要儲存
Cookie
- 尋找請求的
參數,這個我喜歡用IE9+,可以從cookie,返回本文裡面搜尋.Chrome我沒有找到這個功能. 即參數可能來源Cookie,或者頁面,或者某次傳回值內等等
- 請求的
referer
- 多次類比請求某個域後接下來突然失敗,代碼找不到錯誤?
換個IP試試
- 萬變不離其宗,當你實在不知道哪裡有問題的時候,去跟瀏覽器比比看,總之跟瀏覽器一樣是准沒錯的
Tips
WebQQ中是無法取得好友QQ號碼的
每個好友在你本次登陸後,都會產生一個當前唯一的uid碼給你,群的是gid,前篇文章中已經介紹了
在你關閉網頁前,你跟好友、群所有的資訊互動,都要通過這個唯一碼。所以上一步中需要儲存好友的資訊,來識別poll得到的訊息,是從哪裡來,誰說的
發送訊息也是,你想要跟誰說,這個唯一的標識即為上述的uid或者gid
開始
發送訊息
Chrome這點好,可以幫你拿到url轉碼之前的資料,還能幫你還原序列化成對象。IE就只能看到轉碼之後的字串了。
先把資料格式化看看:
r: { "to": 3088776308, "content": "[\"你在幹啥?\",[\"font\",{\"name\":\"宋體\",\"size\":10,\"style\":[0,0,0],\"color\":\"000000\"}]]", "face": 585, "clientid": 53999199, "msg_id": 38160001, "psessionid": "8368046764001d636f6e6e7365727665725f77656271714031302e3133332e34312e383400006a5800000425016e0400f36afba86d0000000a404c30634555727447716d000000287b74805042214d42b7fa4930eb31c8421c1e24bfe90f6b2f35e8221fb3b505f79a85d6b0a97a5252"}ResponseHeadersviewsource
一下子就明朗好多了,主要參數如下:
- to:本次是發送給好友,這裡即為好友的uin
- content是訊息本文和字型顏色樣式,在webqq中訊息的換行是:
\n
- face大概枚舉的某個預設頭像
- clientid是之前說過的,代表本人的一個id,固定不變的
- msg_id 這裡要
注意,它是一個8位元字的參數,在每次發送訊息之後都會++,自增1,無論好友還是群訊息,都用的是這個值
- psessionid 之前儲存的QQ令牌
那麼我們請求的post字串就是:
string postData = "{\"to\":" + uin + ",\"content\":\"[\\\"" + content.Replace(Environment.NewLine, "\\\\n") + "\\\",[\\\"font\\\",{\\\"name\\\":\\\"宋體\\\",\\\"size\\\":10,\\\"style\\\":[0,0,0],\\\"color\\\":\\\"000000\\\"}]]\",\"face\":549,\"clientid\":" + ClientID + ",\"msg_id\":" + MsgId + ",\"psessionid\":\"" + PSessionID + "\"}"; postData = "r=" + HttpUtility.UrlEncode(postData);
Http請求中的資料,一般是將索引值對用"="相連,將每一個索引值對用"&"相連
而且會把每個索引值對的值進行url編碼,你可能會說,我不編碼也能用啊!當然大部分網站這樣沒問題,但是瀏覽器確實是這麼做的,盡量跟瀏覽器保持一致可以避免很多錯誤,比如這裡。
C#中進行url編碼一般用:HttpUtility.UrlEncode(string),需要引用System.Web
- 請求的referer:
http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=2
- 請求的url:
http://d.web2.qq.com/channel/send_buddy_msg2
- 請求成功後返回:
{"retcode":0,"result":"ok"},注意,如果你的資料格式什麼的都正確,但是msg_id不對,也有可能返回這個,但是實際上訊息沒有發送出去。TX會以為你重複請求了,因此返回給你一個成功資訊。
發送群訊息跟這個很類似,唯一的區別就是post字串有點小小的改動:
string postData = "{\"group_uin\":" + uin + ",\"content\":\"[\\\"" + content.Replace(Environment.NewLine, "\\\\n") + "\\\",[\\\"font\\\",{\\\"name\\\":\\\"宋體\\\",\\\"size\\\":10,\\\"style\\\":[0,0,0],\\\"color\\\":\\\"000000\\\"}]]\",\"face\":549,\"clientid\":" + ClientID + ",\"msg_id\":" + MsgId + ",\"psessionid\":\"" + PSessionID + "\"}"; postData = "r=" + HttpUtility.UrlEncode(postData);
×到此為止webqq類比請求流程已經分析完畢。
剩下幾章的demo我在本周陸續補齊.
下面我們去抓抓小黃雞,回顧一下,順便讓你的webqq項目實現機器人功能。
我是結束的分割線
小黃雞
實現機器人
我想,這一張圖已經包含全部了吧,當我看到這個的第一反應就是:
不管有沒有用,先訪問一下這個頁面得到cookie,然後帶上這個referer,照著這個網址,post這個字串"para="+HttpUtility.UrlEncode("你在幹嘛?")
當然上面的cookie和referer在後來我測試是沒用的...
×Close到目前為止,所有內容已經完畢
各個章節demo儘快補全
使用C#類比http請求可以參考猛戳這裡
您有沒有對這篇文章感興趣呢?
還好啦 WQNMLGB
.
一步一步來做WebQQ機器人-(五)(發送訊息||完結)