摘要:項目作用訪問項目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實現(xiàn)網(wǎng)頁微信登錄原理項目源碼項目源碼
項目作用
訪問項目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。
在線網(wǎng)址:訪問115.29.55.54:8080/WXApi就可以使用該項目所說的網(wǎng)頁
項目原理在微信中,將你刪掉的好友是無法加入你創(chuàng)建的群聊的,而微信網(wǎng)頁版也可以創(chuàng)建群聊,所以使用微信網(wǎng)頁版的接口可以實現(xiàn)分辨一個好友是不是將你刪除了。
流程和Java實現(xiàn) 1. 獲取UUID微信在生成二維碼之前,會先生成一個UUID,作為一個識別的標記,攜帶這個UUID訪問微信的接口就可以獲取到二維碼。同時也是查看二維碼是否被掃描的一個重要參數(shù)。
參數(shù)列表如下:
appid (可寫死,wx782c26e4c19acffb)
fun : new
lang : zh-CN (中國地區(qū))
_ : 時間戳
// 參考代碼: // Java版本 public String getUUID(){ String url = "https://login.weixin.qq.com/jslogin?appid=%s&fun=new&lang=zh-CN&_=%s"; url = String.format(url, appID,System.currentTimeMillis()); httpGet = new HttpGet(url); try { response = httpClient.execute(httpGet); entity = response.getEntity(); String result = EntityUtils.toString(entity); logger.debug(result); String[] res = result.split(";"); if (res[0].replace("window.QRLogin.code = ", "").equals("200")) { uuid = res[1].replace(" window.QRLogin.uuid = ", "").replace(""", ""); return uuid; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
# python版本 def getuuid(): global uuid url = "https://login.weixin.qq.com/jslogin" params = { "appid": "wx782c26e4c19acffb", "fun": "new", "lang": "zh_CN", "_": int(time.time()), } request = urllib2.Request(url=url, data=urllib.urlencode(params)) response = urllib2.urlopen(request) data = response.read() regx = r"window.QRLogin.code = (d+); window.QRLogin.uuid = "(S+?)"" pm = re.search(regx, data) code = pm.group(1) uuid = pm.group(2) if code == "200": return True return False2. 獲取二維碼
將uuid放在url中然后使用get請求,會收到一個一張二維碼的圖片.當然,如果在網(wǎng)頁中使用的標簽可以直接將這個URL放進去,就可以直接顯示一張二維碼。
參數(shù)列表如下:
uuid:也就是上面所獲取的UUID
//java版本 // 如果忽略注釋直接返回獲取圖片的url放在網(wǎng)頁中的的標簽下可以直接顯示,如果使用注釋中的內(nèi)容會將其下載為本地圖片 public String getQR(String uuid) { if (uuid == null || "".equals(uuid)) { return null; } String QRurl = "http://login.weixin.qq.com/qrcode/" + uuid; logger.debug(QRurl); return QRurl; // 同時提供使其變?yōu)楸镜貓D片的方法 // httpGet = new HttpGet(QRurl); // response = httpClient.execute(httpGet); // entity = response.getEntity(); // InputStream in = entity.getContent(); // //注意這里要對filepath賦值 // OutputStream out = new FileOutputStream(new File("FilePath"+".png")); // byte[] b = new byte[1024]; // int t; // while((t=in.read())!=-1){ // out.write(b, 0, t); // } // out.flush(); // in.close(); // out.close(); }
# Python版本 def showQRImage(): global tip url = "https://login.weixin.qq.com/qrcode/" + uuid request = urllib2.Request(url=url) response = urllib2.urlopen(request) f = open(QRImagePath, "wb") f.write(response.read()) f.close() # 保存到本地3. 獲取用戶登錄狀態(tài)
登陸狀態(tài)主要是兩種,一種是用戶已經(jīng)掃描,一種是用戶掃描后在手機端已經(jīng)點擊確認了。這兩種狀態(tài)的獲取訪問的url是一樣的,區(qū)別是一個叫做tip的參數(shù),當tip=1的時候,如果沒有掃描,服務(wù)端會一直等待,如果已經(jīng)掃描,服務(wù)端會返回代買201.當tip=0的時候,如果用戶沒有點擊確定,那么就會一直等待,直到用戶點擊確定后返回200.所以問題來了,如果不改變tip讓他一直為1也是可以的,但是就需要不斷的輪詢,而如果改變tip的話,就可以while的循環(huán)。
參數(shù)如下:
uuid : 就是之前獲得的uuid
_ : 時間戳
tip : 判斷是要獲得點擊狀態(tài)還是掃描狀態(tài)
狀態(tài)=200時,返回值是redirect_url:該返回值是一個url,訪問該url就算是正式的登陸。
//java版本 public int waitForLogin(String uuid, int tip) { String urlString = "http://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s"; urlString = String.format(urlString, tip, uuid, System.currentTimeMillis()); httpGet = new HttpGet(urlString); try { response = httpClient.execute(httpGet); String re = EntityUtils.toString(response.getEntity()); String[] result = re.split(";"); logger.debug(re); if (result[0].replace("window.code=", "").equals("201")) { tip = 0; return 201; } else if (result[0].replace("window.code=", "").equals("200")) { redirectUri = (result[1].replace("window.redirect_uri=", "").replace(""", "") + "&fun=new").trim(); return 200; } else { return 400; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return -1; }
# python版本 def waitForLogin(): global tip, base_uri, redirect_uri url = "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s" % (tip, uuid, int(time.time())) request = urllib2.Request(url = url) response = urllib2.urlopen(request) data = response.read() regx = r"window.code=(d+);" pm = re.search(regx, data) code = pm.group(1) if code == "201": #已掃描 print "成功掃描,請在手機上點擊確認以登錄" tip = 0 elif code == "200": #已登錄 regx = r"window.redirect_uri="(S+?)";" pm = re.search(regx, data) redirect_uri = pm.group(1) + "&fun=new" base_uri = redirect_uri[:redirect_uri.rfind("/")] elif code == "408": #超時 pass return code4. 正式登陸
手機端已經(jīng)授權(quán)通過,上一步會返回一個Redirect_Url,這是一個真正的登陸url,使用get方法訪問該url會返回一個xml格式的字符串,其中的屬性將是接下來動作的重要參數(shù)。解析該字符串有如下的屬性:
int ret;//返回值為0時表示本次請求成功
String message;//一些信息(比如失敗原因等)
String skey;//后面請求會用到的參數(shù)
String wxsid;//同上
long wxuin;// 本人編碼
String pass_ticket;//重要!!后面很多請求都會用到這張通行證
int isgrayscale;//不明
代碼如下:
//java private boolean login() { String url = redirectUri; httpGet = new HttpGet(url); try { response = httpClient.execute(httpGet); entity = response.getEntity(); String data = EntityUtils.toString(entity); logger.debug(data); loginResponse = CommonUtil.parseLoginResult(data); baseRequest = new BaseRequest(loginResponse.getWxuin(), loginResponse.getWxsid(), loginResponse.getSkey(), loginResponse.getDeviceID()); return true; } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; }
#python版本 def login(): global skey, wxsid, wxuin, pass_ticket, BaseRequest request = urllib2.Request(url = redirect_uri) response = urllib2.urlopen(request) data = response.read() doc = xml.dom.minidom.parseString(data) root = doc.documentElement for node in root.childNodes: if node.nodeName == "skey": skey = node.childNodes[0].data elif node.nodeName == "wxsid": wxsid = node.childNodes[0].data elif node.nodeName == "wxuin": wxuin = node.childNodes[0].data elif node.nodeName == "pass_ticket": pass_ticket = node.childNodes[0].data if skey == "" or wxsid == "" or wxuin == "" or pass_ticket == "": return False BaseRequest = { "Uin": int(wxuin), "Sid": wxsid, "Skey": skey, "DeviceID": deviceId, } return True5. init初始化
該方法可有可無,作用主要是初始化幾個聯(lián)系人,可能是最近聯(lián)系人還是怎樣,并且能獲得的是登陸人的信息。如果不需要獲取這些東西就可以跳過這一步。該方法是post方法,但在url中也可以放幾個值
主要參數(shù):
url中:
pass_ticket
skey 這兩個參數(shù)都是login時的返回值之一
r 時間戳
post 文中攜帶:BaseRequst=Json格式的BaseRequest,BaseRequest類中有如下參數(shù):、
long Uin;
String Sid;
String Skey;
String DeviceID; DeviceID是一串e開頭的隨機數(shù),隨便填就可以。
//java private void initWX() { String url = String.format("http://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?pass_ticket=%s&skey=%s&r=%s", loginResponse.getPass_ticket(), loginResponse.getSkey(), System.currentTimeMillis()); InitRequestJson initRequestJson = new InitRequestJson(baseRequest);//Java中包含了BaseRequest的包裝類 String re = getResponse(url, gson.toJson(initRequestJson));//這是自己寫的一個公有方法,可以直接看源碼 InitResponseJson initResponseJson = gson.fromJson(re, InitResponseJson.class); mine = initResponseJson.getUser();// 獲取當前用戶信息 }
def webwxinit(): url = base_uri + "/webwxinit?pass_ticket=%s&skey=%s&r=%s" % (pass_ticket, skey, int(time.time())) params = { "BaseRequest": json.dumps(BaseRequest) } request = urllib2.Request(url=url, data=json.dumps(params)) request.add_header("ContentType", "application/json; charset=UTF-8") response = urllib2.urlopen(request) data = response.read() global ContactList, My dic = json.loads(data) ContactList = dic["ContactList"] My = dic["User"] ErrMsg = dic["BaseResponse"]["ErrMsg"] if len(ErrMsg) > 0: print ErrMsg Ret = dic["BaseResponse"]["Ret"] if Ret != 0: return False return True6. 后面部分
由于登陸成功后后面部分基本就是調(diào)用接口了,難點基本沒有,可以直接看源碼,我在這里貼上操作步驟
獲取所有的用戶
通過post方法訪問一個url(源碼中可以看),就可以獲取所有的用戶列表。
創(chuàng)建聊天室
注意一次最多40人否則會出現(xiàn)問題
刪除聊天室的成員
為聊天室添加成員
微信會返回該成員的一個狀態(tài),如果狀態(tài)等于4,那么添加失敗,就可以判斷該用戶已經(jīng)刪除了登陸用戶。
得到uuid,并將其包裝直接插入標簽中就可以在網(wǎng)頁中顯示該二維碼
使用AJAX請求,請求waitforlogging()方法,當返回值為200時成功,此時遍歷該用戶每一個好友,判斷其是否刪除了該用戶。
顯示
參考文檔該功能的python實現(xiàn)
網(wǎng)頁微信登錄原理
項目源碼項目源碼
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65370.html
摘要:項目作用訪問項目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實現(xiàn)網(wǎng)頁微信登錄原理項目源碼項目源碼 項目作用 訪問項目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。 在線網(wǎng)址: 訪問115.29.55.54:8080/WXApi就可以使用該項目所說的網(wǎng)頁 項目原理 在微信中,將你刪掉的好友是無法加入你創(chuàng)建的群...
摘要:按鍵繼續(xù)微信,用自己賬戶給所有好友發(fā)送消息,當添加自己為好友時,只有自己能收到此信息,如果沒添加自己為好友沒有人能收到此信息,筆者此刻日期為,到目前為止微信還沒修復(fù)。檢測到第位好友發(fā)送信息速度過快會被微信檢測到異常行為。 showImg(https://segmentfault.com/img/bVbqjcJ?w=765&h=742); 原理 通過Pyhton調(diào)用itchat模塊登錄網(wǎng)...
閱讀 1081·2021-11-16 11:45
閱讀 2726·2021-09-27 13:59
閱讀 1322·2021-08-31 09:38
閱讀 3152·2019-08-30 15:52
閱讀 1320·2019-08-29 13:46
閱讀 2094·2019-08-29 11:23
閱讀 1643·2019-08-26 13:47
閱讀 2495·2019-08-26 11:54