微信推送報警消息實作
目錄
1 前言... 2
1.1 背景... 2
1.2 現有技術對比... 2
2 總體流程... 2
3 微信網頁接口解析... 3
3.1 擷取使用者uuid. 3
3.2 擷取二維碼圖檔... 4
3.3 輪詢檢測使用者是否登入... 4
3.4 重定向url登入微信并擷取公參... 5
3.5 微信初始化... 5
3.6 擷取聯系人清單... 11
3.7 批量擷取聯系人詳情... 13
3.8 檢測是否有微信消息... 16
3.9 擷取最新消息... 17
3.10 通過微信推送報警消息... 22
3.11 上傳檔案到微信伺服器... 24
3.12 發送圖檔... 27
4 一些狀态碼code值的說明... 28
4.1 BaseResponse裡的Ret 28
4.2 同步消息檢查傳回值中retcode和selector 28
4.3 傳回消息類型... 29
5 實作操作步驟... 30
6 技術制約... 32
7 技術應用推廣... 32
1 前言
1.1 背景
微信已經普遍被大家應用,而且手機微信友善快捷,可以随時随地的接受消息。目前項目中有需求通過微信推送報警消息。但是微信沒有對外接口,無法實作報警推送。微信的友善快捷沒有辦法使用。可以通過微信的網頁接口來實作微信的登入、擷取好友資訊、發送微信消息、擷取微信消息等;
1.2 現有技術對比
現有的技術主要是通過電腦用戶端、或者手機用戶端去接收報警,電腦用戶端隻能在電腦上檢視,不夠友善快捷。而手機用戶端需要開發對應手機系統的app,還要經過複雜的傳輸協定。開發周期長,實作複雜。而且需要安裝特定的app才可以接收報警。報警接收和發送不夠友善快捷。而通過微信的網頁端口去推送報警,可以實作報警的友善推送,報警可以發到微信使用者、微信群、微信公衆号。
2 總體流程
微信網頁接口的調用流程如圖2-1所示,
(1) 首先要擷取使用者UUID,用辨別一個使用者;
(2) 然後将UUID作為參數,擷取使用者登入掃描的二維碼,然後等待使用者去掃描二維碼;
(3) 使用者掃描之後,二維碼變成使用者的頭像;輪循去檢視使用者是否點選登入按鈕;
(4) 使用者登入之後,會傳回一個重定向的URL,作為使用者的登入URL;
用URL去登入微信伺服器,傳回使用者的key值、使用者id、使用者辨別id、cookie
(5) 調用初始化的接口,初始化微信主界面,首頁使用者資訊,登入使用者自己的使用者資訊,檢測是否有人發消息過來的鍵值組。每個鍵值針對不同的消息;
(6) 擷取所有好友、微信群、公衆号的資訊;
(7) 查詢伺服器是否有微信消息發給登入使用者,包括微信通訊消息,好友修改備注消息等。解析消息協定,顯示在視窗中;
(8) 指定使用者發送微信消息;也可以将報警消息通過微信發送接口進行發送;
圖2-1 微信接口調用流程
3 微信網頁接口解析
3.1 擷取使用者uuid
- 說明:用于擷取顯示二維碼以及登入所需的uuid,辨別擷取二維碼和掃碼的為同一個使用者
- 請求方式:GET
- 位址:https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&fun=new&lang=zh_CN
- get參數:
參數 | 示例值 | 說明 |
appid | wx782c26e4c19acffb | 固定值 |
fun | new | 固定值 |
lang | zh_CN | 表示中文字元集 |
- 傳回:
window.QRLogin.code = 200; window.QRLogin.uuid = "wb7R2kx9dA==";
3.2 擷取二維碼圖檔
- 說明:展示一張用于登陸的二維碼圖檔,位址裡的{uuid}傳第一步所擷取的uuid
- 請求方式:GET
- 位址:https://login.wx.qq.com/qrcode/{uuid}
- get參數:
參數 | 示例值 | 說明 |
t | webwx | 固定值 |
- 傳回:二維碼的二進制流,浏覽器打開會直接顯示一張二維碼圖檔,用戶端需要儲存到本地檔案,然後用label加載顯示;
3.3 輪詢檢測使用者是否登入
- 說明:嘗試登入。若此時使用者手機已完成掃碼并點選登入,則傳回一個真正用于登入的url位址。否則接口大概10s後傳回未掃碼或未登入的狀态碼
- 請求方式:GET
- 位址:https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login
- get參數:
參數 | 示例值 | 說明 |
tip | 1 | 1:未掃描 0:一掃描 |
uuid | wb7R2kx9dA== | 第一步所擷取的uuid |
- 傳回:redirect_uri的值可以直接用于下一步的“登入并擷取公參”請求
window.code=200(408為未掃碼,201為已掃碼但未點選登入,200為成功登入);window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AfrMMbhsnElmA7xc1R9CWUq-@qrticket_0&uuid=4ZnG7WZ0Cg==&lang=zh_CN&scan=1520738372";
3.4 重定向url登入微信并擷取公參
- 說明:通路後可擷取一組公參,用于之後通路所有的接口。這也意味着如果這部分資料洩露,代表其他人可以在這段時間内随意操作你的微信(僅限于網頁版支援的操作)
- 請求方式:GET
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
- get參數:直接用上一步傳回的redirect_uri中的所有參數即可
- 傳回:擷取并存儲該傳回值中的四個參數skey、wxsid、wxuin、pass_ticket,傳回cookie儲存到本地檔案中,下面有接口調用時需要帶上這個cookie檔案。
傳回結果:
<error>
<ret>0</ret>
<message></message>
<skey>@crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4</skey>
<wxsid>+urBrYI292xoIknf</wxsid>
<wxuin>211722515</wxuin>
<pass_ticket>qg%2BL%2BfjNnoHyqYsL3xj0KoNi5nqchsInPWWSxDwqCJ8%3D</pass_ticket>
<isgrayscale>1</isgrayscale>
</error>
3.5 微信初始化
- 說明:初始化微信首頁欄的聯系人、公衆号等(不是通訊錄裡的聯系人),初始化登入者自己的資訊(包括昵稱等),初始化同步消息所用的SycnKey
- 請求方式:POST
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit
- get參數:
參數 | 示例值 | 說明 |
pass_ticket | qg%2BL%2BfjNnoHyqYsL3xj0KoNi5nqchsInPWWSxDwqCJ8%3D | 公參中的值 |
- post參數:(json格式)
{
BaseRequest: {
Uin: 211722515,
Sid: +urBrYI292xoIknf,
Skey: @crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4,
DeviceID: e545297464380306
上邊的DeviceID可以用如下代碼生成,每次登入過程中保持一緻。String DeviceID = "e" + String.valueOf(new Random().nextLong()).substring(1, 16);
}
}
- 傳回:擷取并存儲該傳回值中的四個參數skey、wxsid、wxuin、pass_ticket,以及所傳回Cookie中的webwx_data_ticket,webwx_auth_ticket
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
"Count": 11,
"ContactList": [{微信首頁的聯系人,不是儲存在通訊錄中的聯系人
"Uin": 0,
"UserName": "filehelper",
"NickName": "檔案傳輸助手",
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=680769514&username=filehelper&skey=@crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4",
"ContactFlag": 1,
"MemberCount": 0,
"MemberList": [],
"RemarkName": "",
"HideInputBarFlag": 0,
"Sex": 0,
"Signature": "",
"VerifyFlag": 0,
"OwnerUin": 0,
"PYInitial": "WJCSZS",
"PYQuanPin": "wenjianchuanshuzhushou",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"StarFriend": 0,
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 0,
"Province": "",
"City": "",
"Alias": "",
"SnsFlag": 0,
"UniFriend": 0,
"DisplayName": "",
"ChatRoomId": 0,
"KeyWord": "fil",
"EncryChatRoomId": "",
"IsOwner": 0
},
......此處省略剩下的10個聯系人資訊
],
"SyncKey": { 同步消息時用的syncKey,用于之後輪詢消息的接口
"Count": 4,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700723184
}, {
"Key": 3,
"Val": 700723136
}, {
"Key": 1000,
"Val": 1520723642
}]
},
"User": { 登入者的資訊
"Uin": 211722515,
"UserName": "@f4c054c78f40743b095b85409dbdc1b3", 微信随機碼,每個聯系人和群都有,每次登入由微信端随機配置設定
"NickName": "測試微信号的昵稱",
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1730335888&username=@f4c054c78f40743b095b85409dbdc1b3&skey=@crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4",
"RemarkName": "",
"PYInitial": "",
"PYQuanPin": "",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"HideInputBarFlag": 0,
"StarFriend": 0,
"Sex": 1,
"Signature": "這裡是簽名",
"AppAccountFlag": 0,
"VerifyFlag": 0,
"ContactFlag": 0,
"WebWxPluginSwitch": 0,
"HeadImgFlag": 1,
"SnsFlag": 17
},
"ChatSet": "filehelper,weixin,@52d5b97ca1bed2d76b405fba4c4ded6c893bd6b28cc514344dd9a7d8cd766286,@4baf3160e84b9e726efd1a0629d16b01,@@54a4fd2c81875aac779935330b67bf7905793bb66da9c6d4029f18f4927b3c1c,@@9542a551bfcafe1ae83b931d21b318573c8c6e2c67f3eaef189e7e9179cdb2d1,@ac3532106e21aa250cc746055a0c72d5,@d593e5745931641d060cdc9fcda5d996,@34f12e07290f62677137181998bf4c1eb0a9c128f2355562e8cc7967d0f9a044,@@31e445167b2fd23404b672f6f1a4a805fffbd369d6bae8efe959240a6c50cf46,@@c5fa6cb3779e217b5ae3e9b3d53faef09d6cde9615106ebe0a115de38976c7fc,@513fcb83ccc696b9d90206f0e80eb8e341e35e1f464b08446795132d180db040,@@b944058f6fd91b850867bb1f534205e86460b4b3a947f4ca4bd49109e532116f,@@859e98412d1faf03abdf784e97ed66b25c52dccc7ec446d681b2906525262fcd,@257fb1c805c1429ca45a737143d7a7e1302487d9bbb268bf2dd8a564bf814186,filehelper,@@dc3e7f04b1ccead2ecf8c50eaa476d6c71dc3f7396696be0724002e1ee228812,@@d1758feb60b1ff7ad262b8fb05ee9f1c1821722a0376a1431cee351c75cbebc3,@@e49ba13661221be9c9f81fb952391754ee74f98d2457f46364bdb745943b2bfc,@@a5cdd9eb797807cc081bc0e3ab3f101c9dc18d86d527c5defed8e8fd9010ec06,@@dfab3cde2a39ccdf31da803381528f130dae207583a5c088514bf4e1a0af49ab,@@13776e6ea475a8e86a46e4f242917db146664572e910dcca976047cb31e660f4,@@d1999c210e6f9a19d28b4a8fcc391a7b612c9765ff5bd078aaa022e1cc8bbf5c,",
"SKey": "@crypt_8b4f09cc_ce5178b3c156048fff69cdf1fccc31e4",
"ClientVersion": 637927733,
"SystemTime": 1520742050,
"GrayScale": 1,
"InviteStartCount": 40,
"MPSubscribeMsgCount": 1,
"MPSubscribeMsgList": [{
"UserName": "@4baf3160e84b9e726efd1a0629d16b01",
"MPArticleCount": 1,
"MPArticleList": [{
"Title": "不動手就能逛淘寶,這又是什麼“黑科技”?英國小哥表示:中文說得溜就是這麼友善! | 解碼新時代",
"Digest": "張口說話就能逛淘寶,沉溺“黑科技”的英國小哥表示不想回家了!",
"Cover": "http://mmbiz.qpic.cn/mmbiz_jpg/8vd2Hk2TS2Pfibh9ILZKicg5icBlWKHBIVibVM8Vupsg3NsfSnibzptB9XQxArqzFmfOw7nlk6ByTdNvWBoBf4NjVmQ/640?wxtype=jpeg&wxfrom=0",
"Url": "http://mp.weixin.qq.com/s?__biz=MjM5MzI3NTI2MA==&mid=2651224106&idx=1&sn=0a5772013ae7c14dd9ac854f30fad934&chksm=bd6b54398a1cdd2f6f9c1d61c93aa3248968b8b56206a0af85341f510322b21548c975d8ebba&scene=0#rd"
}],
"Time": 1520732033,
"NickName": "中國日報雙語新聞"
}],
"ClickReportInterval": 600000
}
3.6 擷取聯系人清單
- 說明:擷取手機通訊錄中的所有聯系人(包括人、群、公衆号等)
- 請求方式:POST
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact
- get參數:
參數 | 示例值 | 說明 |
pass_ticket | yp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D | 公參中的值 |
skey | @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050 | 公參中的值 |
- post參數:
{
"BaseRequest": {均是公參中的值
"Uin": 211722515,
"Sid": "+FhlgkGS3wD/GKQw",
"Skey": "@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050",
"DeviceID": "e609547902722302"
}
}
- 傳回:所有通訊錄中的聯系人資訊,主要在MemberList中檢視
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
"MemberCount": 771,
"MemberList": [{
"Uin": 0,
"UserName": "@9c30c8d81e75a7eff0603cdd5de860b18fe92995845473fc2f0cda6ed76053cb",(微信随機碼,潛規則:前面@為聯系人,@@為群)
"NickName": "Nandi Wardhana",(聯系人的微信昵稱)
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=620986971&username=@9c30c8d81e75a7eff0603cdd5de860b18fe92995845473fc2f0cda6ed76053cb&skey=@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050",
"ContactFlag": 3,
"MemberCount": 0,(如果是群,該字段表示成員數量)
"MemberList": [],(群成員清單)
"RemarkName": "",(備注名稱,如果空則說明沒有給他備注)
"HideInputBarFlag": 0,
"Sex": 1,(性别,1為男,2為女)
"Signature": "Stay young naturally...",(簽名)
"VerifyFlag": 0,(用來判斷是否是公衆号或服務号的字段)
"OwnerUin": 0,
"PYInitial": "NANDIWARDHANA",
"PYQuanPin": "NandiWardhana",(名字拼音全拼)
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"StarFriend": 0,
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 2359303,
"Province": "Jakarta Raya",(省份)
"City": "",(城市)
"Alias": "",
"SnsFlag": 17,
"UniFriend": 0,
"DisplayName": "",(如果是群内成員,該字段表示群内名稱)
"ChatRoomId": 0,
"KeyWord": "",
"EncryChatRoomId": "",(如果是群,該字段表示群的id,不同于微信随機碼@@那個)
"IsOwner": 0
},
... 此處省略剩下770個聯系人資訊
]
}
3.7 批量擷取聯系人詳情
- 說明:批量擷取聯系人詳情,人或群均可。擷取群詳情主要是擷取群内聯系人清單。擷取人詳情主要是擷取群内的某個人的詳細資訊。
- 請求方式:POST
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact
- get參數:
參數 | 示例值 | 說明 |
pass_ticket | yp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D | 公參中的值 |
type | ex | 我也不知道這是啥意思 |
- post參數:
{
"BaseRequest": {
"Uin": 211722515,
"Sid": "+FhlgkGS3wD/GKQw",
"Skey": "@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050",
"DeviceID": "e862192966399662"
},
"Count": 2,
"List": [{ 這裡表示需要擷取詳情的所有聯系人
"UserName": "@@e203c90e07d64242336d573acd4a1db1c01ccb92ca05410444a3003c282c21db",
"EncryChatRoomId": ""
},
{
"UserName": "@ba194a63575be7fd0f4ea4e4547b2942d0dccc7fffc00ef5a6d141f93adb7739",
"EncryChatRoomId": ""
}
]
}
- 傳回:
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
"Count": 2,
"ContactList": [{
"Uin": 0,
"UserName": "@ba194a63575be7fd0f4ea4e4547b2942d0dccc7fffc00ef5a6d141f93adb7739",
"NickName": "張三豐",
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=680786093&username=@ba194a63575be7fd0f4ea4e4547b2942d0dccc7fffc00ef5a6d141f93adb7739&skey=",
"ContactFlag": 3,
"MemberCount": 0,
"MemberList": [],
"RemarkName": "豐哥",
"HideInputBarFlag": 0,
"Sex": 2,
"Signature": "<span class=\"emoji emoji2600\"></span> 一定會找到<span class=\"emoji emoji1f31b\"></span>",
"VerifyFlag": 0,
"OwnerUin": 0,
"PYInitial": "ZSF",
"PYQuanPin": "zhangsanfeng",
"RemarkPYInitial": "FG",
"RemarkPYQuanPin": "fengge",
"StarFriend": 0,
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 111719,
"Province": "北京",
"City": "平谷",
"Alias": "",
"SnsFlag": 17,
"UniFriend": 0,
"DisplayName": "",
"ChatRoomId": 0,
"KeyWord": "",
"EncryChatRoomId": "0",
"IsOwner": 0
}
...此處省略第二個聯系人資訊
]
}
3.8 檢測是否有微信消息
- 說明:同步消息檢查。這裡隻做檢查不做同步,如果檢查出有新消息,再掉具體同步的接口。
- 請求方式:GET,需要傳入擷取到的cookie,否則失敗
- 位址:https://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck
- get參數:
參數 | 示例值 | 說明 |
deviceid | e547171618594402 | 參考5中的生成方式 |
sid | +FhlgkGS3wD/GKQw | 公參中的值 |
skey | @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050 | 公參中的值 |
synckey | 1_700722177|2_700724323|3_700724315|1000_1520925834 | 微信初始化後擷取的4個key,這些key會随着每次擷取最新消息(參見9)後的傳回值更新,其目的在于每次同步消息後記錄一個目前同步的狀态。 |
uin | 211722515 | 公參中的值 |
- 傳回:
window.synccheck={retcode:"0",selector:"2"}
retcode
SUCCESS("0", "成功"),
TICKET_ERROR("-14", "ticket錯誤"),
PARAM_ERROR("1", "傳入參數錯誤"),
NOT_LOGIN_WARN("1100", "未登入提示"),
NOT_LOGIN_CHECK("1101", "未檢測到登入"),
COOKIE_INVALID_ERROR("1102", "cookie值無效"),
LOGIN_ENV_ERROR("1203", "目前登入環境異常,為了安全起見請不要在web端進行登入"),
TOO_OFEN("1205", "操作頻繁");
selector
NORMAL("0", "正常"),
NEW_MSG("2", "有新消息"),
MOD_CONTACT("4", "有人修改了自己的昵稱或你修改了别人的備注"),
ADD_OR_DEL_CONTACT("6", "存在删除或者新增的好友資訊"),
ENTER_OR_LEAVE_CHAT("7", "進入或離開聊天界面");
3.9 擷取最新消息
- 說明:當同步檢查接口顯示有新消息時,調用該接口擷取具體的新消息。此處的新消息為廣義的,包括消息,修改群名,群内成員變化,加好友等。
- 請求方式:POST,需要傳入擷取到的cookie,否則失敗
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync
- get參數:
參數 | 示例值 | 說明 |
sid | +FhlgkGS3wD/GKQw | 公參中的值 |
skey | @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050 | 公參中的值 |
uin | 211722515 | 公參中的值 |
- post參數:
{
"BaseRequest": {
"Uin": 211722515,
"Sid": "+FhlgkGS3wD/GKQw",
"Skey": "@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050",
"DeviceID": "e304534670317808"
},
"SyncKey": {
"Count": 4,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700724323
}, {
"Key": 3,
"Val": 700724315
}, {
"Key": 1000,
"Val": 1520925834
}]
},
"rr": -508959981 String.valueOf(-new Date().getTime() / 1000)
}
- 傳回:主要有AddMsgList,ModContactList,DelContactList,新一輪消息同步的檢測消息的鍵值SyncCheckKey ,新一輪擷取消息的synckey
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
"AddMsgCount": 1, 新增資訊
"AddMsgList": [{
"MsgId": "320984672637990367", 服務端傳回的消息id,可用于撤回接口參數。如果是圖檔,該參數還可以作為調用微信擷取圖檔接口的參數之一。
"FromUserName": "@abf90232027117affa7f0c0df3d1bf20", 發消息的人
"ToUserName": "@abf90232027117affa7f0c0df3d1bf20", 發給誰
"MsgType": 51, 消息類型,1為文字,3為圖檔...,具體請參照消息類型表
"Content": "",
"Status": 3,
"ImgStatus": 1,
"CreateTime": 1520927383,
"VoiceLength": 0,
"PlayLength": 0,
"FileName": "",
"FileSize": "",
"MediaId": "",
"Url": "",
"AppMsgType": 0,
"StatusNotifyCode": 4,
"ForwardFlag": 0,
"AppInfo": {
"AppID": "",
"Type": 0
},
"HasProductId": 0,
"Ticket": "",
"ImgHeight": 0,
"ImgWidth": 0,
"SubMsgType": 0,
"NewMsgId": 320984672637990367,
"OriContent": "",
"EncryFileName": ""
}],
"ModContactCount": 0, 聯系人修改
"ModContactList": [],
"DelContactCount": 0, 聯系人删除
"DelContactList": [],
"ModChatRoomMemberCount": 0, 群内成員變動
"ModChatRoomMemberList": [],"ContinueFlag": 0,
"SyncKey": { 新一輪消息更新用這些SyncKey
"Count": 7,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700724325
}, {
"Key": 3,
"Val": 700724315
}, {
"Key": 11,
"Val": 700724093
}, {
"Key": 201,
"Val": 1520927383
}, {
"Key": 1000,
"Val": 1520925834
}, {
"Key": 1001,
"Val": 1520917874
}]
},
"SKey": "",
"SyncCheckKey": { 新一輪消息檢測用這些Key
"Count": 7,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700724325
}, {
"Key": 3,
"Val": 700724315
}, {
"Key": 11,
"Val": 700724093
}, {
"Key": 201,
"Val": 1520927383
}, {
"Key": 1000,
"Val": 1520925834
}, {
"Key": 1001,
"Val": 1520917874
}]
}
}
3.10 通過微信推送報警消息
- 說明:發送文本消息(包括表情),不能發送圖檔或檔案。
- 請求方式:POST,需要傳入擷取到的cookie,否則失敗
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg
- get參數:
參數 | 示例值 | 說明 |
pass_ticket | yp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D | 公參中的值 |
- post參數:
{
"BaseRequest": {
"Uin": 211722515,
"Sid": "+FhlgkGS3wD/GKQw",
"Skey": "@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050",
"DeviceID": "e107694022625701"
},
"Msg": {
"Type": 1,
"Content": "呵呵",
"FromUserName": "@abf90232027117affa7f0c0df3d1bf20",
"ToUserName": "filehelper",
"LocalID": "15209344559450477", 時間戳左移4位随後補上4位随機數
"ClientMsgId": "15209344559450477"
"MediaId": "" 如果是圖檔才傳這個值
},
"Scene": 0
}
- 傳回:
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
"MsgID": "7615282929538795099", 服務端傳回的消息id,可用于撤回等接口的參數
"LocalID": "15209344559450477" 本地的消息id,是你自己發請求時的參數
}
3.11 上傳檔案到微信伺服器
- 說明:發送圖檔時需要先調用該接口将圖檔上傳至微信伺服器,微信會傳回一個圖檔的id,發送消息時攜帶該id即可發送圖檔。
- 請求方式:POST(此處的Content-Type應該設定為multipart/form-data; boundary=…------------------41184676334)
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia
- get參數:
參數 | 示例值 | 說明 |
pass_ticket | yp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D | 公參中的值 |
- post參數:
-----------------------------41184676334
Content-Disposition: form-data; name="id" 此處随意
WU_FILE_0
-----------------------------41184676334
Content-Disposition: form-data; name="name" 圖檔名稱
Desert.jpg
-----------------------------41184676334
Content-Disposition: form-data; name="type" 圖檔類型
image/jpeg
-----------------------------41184676334
Content-Disposition: form-data; name="lastModifiedDate" 發送時間,該參數可無
Tue Jul 14 2009 13:32:31 GMT+0800
-----------------------------41184676334
Content-Disposition: form-data; name="size" 圖檔大小
845941
-----------------------------41184676334
Content-Disposition: form-data; name="chunks" 總共分多少批上傳
2
-----------------------------41184676334
Content-Disposition: form-data; name="chunk" 目前是第幾批
-----------------------------41184676334
Content-Disposition: form-data; name="mediatype" 當傳圖檔時,此處寫pic
pic
-----------------------------41184676334
Content-Disposition: form-data; name="uploadmediarequest"
{
"UploadType": 2, 固定為2
"BaseRequest": {
"Uin": 211722515,
"Sid": "+FhlgkGS3wD/GKQw",
"Skey": "@crypt_8b4f09cc_1b827f84b1535b6be801f00427499050",
"DeviceID": "e787605163473377"
},
"ClientMediaId": 1520935168955,
"TotalLen": 845941, 檔案大小
"StartPos": 0,
"DataLen": 845941, 檔案大小
"MediaType": 4, 固定為4,表示圖檔
"FromUserName": "@abf90232027117affa7f0c0df3d1bf20", 該參數可填可不填
"ToUserName": "filehelper", 該參數可填可不填
"FileMd5": "ba45c8f60456a672e003a875e469d0eb" 該參數随機一個uuid即可
}
-----------------------------41184676334
Content-Disposition: form-data; name="webwx_data_ticket"
gSenocajd7UaXQesCD3smJ5p
-----------------------------41184676334
Content-Disposition: form-data; name="pass_ticket"
yp5RfCpb/sNVex0Uepn1BWXNCYCqTfqe8NOYzan+4Y4=
-----------------------------41184676334
Content-Disposition: form-data; name="filename"; filename="Desert.jpg"
Content-Type: application/octet-stream
此處為該檔案的流,前端寫成<input type="file">就是這個效果
- 傳回:可能分批次上傳,最後上傳成功時傳回如下結果
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
下面的MediaId參數,作為下一步發送圖檔接口的入參,就可以發送該圖檔了
"MediaId": "@crypt_14402eb3_bb9eee20e7239fcd3323a0ea5a36cfd5e7fd162b72e03088efa4f63f53219c6f672c6be3ec1865291a70f38bb82bc5bf1d42166996b4a0313abe95454bff0316c19bfd29b71f4f98ccb7d301eed7b74995e35eabfd3f8264a3d684b8e9f08485ad00c3955cdc5b60ac96e67a9ca24bf7a01b9363ae0364f75fa0c9e6235e2dc91aef95b34c71c503deada9898a28ce5bf13d908f7834f7cae427aaba68aff5500125314f73b79f5a63103d430aa162420262e3d1a5e5f110cba0f2ee20017aaf0f127303153dcf63f9e5a56ff8c64f5dfb3f229011374b34fe7a905b0ee055d85b76827e2e68b8947c7b5fcd56c98ede9f012b6160a193762f63842886dca36872727db0c3cd4761af96c56bfdfb0a42630fee9954c764b5cd31f6ff666649b028bb1852366e639e1008cee678d5e587aabbe78014307ae1fbe638e2c0b52115",
"StartPos": 845941,
"CDNThumbImgHeight": 75,
"CDNThumbImgWidth": 100,
"EncryFileName": "Desert.jpg"
}
3.12 發送圖檔
- 說明:上一步上傳檔案到微信伺服器成功後,調用該發送圖檔接口。
- 請求方式:POST
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg
- get參數:
參數 | 示例值 | 說明 |
pass_ticket | yp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D | 公參中的值 |
fun | async |
- post參數:同發文本消息,隻是多一個MediaId
- 傳回:同發文本消息
15、擷取圖檔
- 說明:上一步上傳檔案到微信伺服器成功後,調用該發送圖檔接口。
- 請求方式:GET
- 位址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg
- get參數:
參數 | 示例值 | 說明 |
MsgID | 3176600141007621447 | 服務端傳回的消息id |
skey | @crypt_8b4f09cc_1b827f84b1535b6be801f00427499050 | 公參中的值 |
type | slave | 該參數有則為縮略圖,沒有則為原圖 |
- 攜帶3個cookie的值:wxuin,wxsid,webwx_data_ticket
- 傳回:圖檔的流
4 一些狀态碼code值的說明
4.1 BaseResponse裡的Ret
SUCCESS("0", "成功"),
TICKET_ERROR("-14", "ticket錯誤"),
PARAM_ERROR("1", "傳入參數錯誤"),
NOT_LOGIN_WARN("1100", "未登入提示"),
NOT_LOGIN_CHECK("1101", "未檢測到登入"),
COOKIE_INVALID_ERROR("1102", "cookie值無效"),
LOGIN_ENV_ERROR("1203", "目前登入環境異常,為了安全起見請不要在web端進行登入"),
TOO_OFEN("1205", "操作頻繁");
4.2 同步消息檢查傳回值中retcode和selector
retcode
SUCCESS("0", "成功"),
TICKET_ERROR("-14", "ticket錯誤"),
PARAM_ERROR("1", "傳入參數錯誤"),
NOT_LOGIN_WARN("1100", "未登入提示"),
NOT_LOGIN_CHECK("1101", "未檢測到登入"),
COOKIE_INVALID_ERROR("1102", "cookie值無效"),
LOGIN_ENV_ERROR("1203", "目前登入環境異常,為了安全起見請不要在web端進行登入"),
TOO_OFEN("1205", "操作頻繁");
selector
NORMAL("0", "正常"),
NEW_MSG("2", "有新消息"),
MOD_CONTACT("4", "有人修改了自己的昵稱或你修改了别人的備注"),
ADD_OR_DEL_CONTACT("6", "存在删除或者新增的好友資訊"),
ENTER_OR_LEAVE_CHAT("7", "進入或離開聊天界面");
4.3 傳回消息類型
TEXT(1, "文本消息類型"),
IMAGE(3, "圖檔消息"),
VOICE(34, "語音消息"),
VIDEO(43, "小視訊消息"),
MICRO_VIDEO(62, "短視訊消息"),
EMOTI_CON(47, "表情消息"),
MEDIA(49, "多媒體消息"),
VOIP_MSG(50, ""),
VOIP_NOTIFY(52, ""),
VOIP_INVITE(53, ""),
LOCATION(48, ""),
STATUS_NOTIFY(51, "狀态通知,自己通路了某一個聊天頁面"),
SYS_NOTICE(9999, ""),
POSSIBLE_FRIEND_MSG(40, ""),
VERIFY_MSG(37, "好友請求"),
SHARE_CARD(42, "分享名片"),
SYS(10000, "系統消息"),
RECALLED(10002, "撤回消息");
5 實作操作步驟
(1)開發QT界面,點選重新登入按鈕,下載下傳二維碼,等待使用者掃描;
(2)用手機掃描二維碼,登入微信;
登入成功之後,選擇要發送的微信使用者、檔案傳輸助手、微信群、公衆号等。勾選是否推送到微信複選框,表示是否要發送到微信,修改好之後點選儲存按鈕。預設情況是發給檔案傳輸助手,然後點選測試發送。看是否能夠發送成功。心跳發送按鈕是每隔一分鐘發送一條時間消息,讓你知道通訊連接配接正常,測試用的。沒有實際的作用。由于微信的限制,無法自己發給自己,發給檔案傳輸助手、微信群、微信公衆号,自己隻能顯示消息,手機端不會出現螢幕消息提示。是以最好有兩個手機賬号,一個登陸發送,一個接收消息。因為微信同時隻能登入一個網頁端或者window的用戶端,是以微信登入了之後,不能再去登入網頁或者用戶端,否則會擠掉登入,導緻發送失敗。
(3)在手機端檢視微信,可以檢視到報警推送消息,電腦用戶端的報警消息會同步推送到手機指定使用者。
(4)如上圖所示,為了避免報警消息打擾到使用者,當使用者不想接收報警消息時,登入發送報警的使用者或者接受報警消息的使用者,都可以在手機微信上通過反向控制指令:QStockView:Stop(或者QStockView:停止)停止接收報警消息,也可以通過反向控制指令QStockView:Start(或者QStockView:開始)來開始接收報警消息;不區分大小寫,中間不能有空格,否則指令無效。發送指令成功之後,會傳回一個通知消息。表示指令發送成功。
6 技術制約
由于微信的限制,無法自己發給自己,發給檔案傳輸助手、微信群、微信公衆号,自己隻能顯示消息,手機端不會出現螢幕消息提示。是以最好有兩個手機賬号,一個登陸發送,一個接收消息。因為微信同時隻能登入一個網頁端或者window的用戶端,是以微信登入了之後,不能再去登入網頁或者用戶端,否則會擠掉登入,導緻發送失敗。而且微信發送頻率不能太快,否則會導緻微信發送頻繁而被限制發送,需要等待30-60分鐘,才可以繼續發送。是以可以使用定時器去發送消息,消息發送頻率在1次/秒;
7 技術應用推廣
在其他項目現場,如果有需求要推送報警消息到微信,可以複用該方法,去對接微信網頁接口,采用微信的友善快捷實作報警推送;
下載下傳位址:
https://www.cnblogs.com/bclshuai/p/11380657.html
百度雲盤下載下傳位址:
連結:https://pan.baidu.com/s/1swkQzCIKI3g3ObcebgpIDg
提取碼:mc8l
微信公衆号擷取最新的軟體和視訊介紹
QStockView