1. 程式人生 > >C++微信網頁協議實現和應用

C++微信網頁協議實現和應用

微信推送報警訊息實現

目錄

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" 當前是第幾批

 

0

-----------------------------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

&n