国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

微信網(wǎng)頁(yè)版登錄原理暨查看將自己刪除掉的人項(xiàng)目

sean / 1036人閱讀

摘要:項(xiàng)目作用訪問(wèn)項(xiàng)目的網(wǎng)頁(yè),掃一掃網(wǎng)頁(yè)上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實(shí)現(xiàn)網(wǎng)頁(yè)微信登錄原理項(xiàng)目源碼項(xiàng)目源碼

項(xiàng)目作用

訪問(wèn)項(xiàng)目的網(wǎng)頁(yè),掃一掃網(wǎng)頁(yè)上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。

在線網(wǎng)址:

訪問(wèn)115.29.55.54:8080/WXApi就可以使用該項(xiàng)目所說(shuō)的網(wǎng)頁(yè)

項(xiàng)目原理

在微信中,將你刪掉的好友是無(wú)法加入你創(chuàng)建的群聊的,而微信網(wǎng)頁(yè)版也可以創(chuàng)建群聊,所以使用微信網(wǎng)頁(yè)版的接口可以實(shí)現(xiàn)分辨一個(gè)好友是不是將你刪除了。

流程和Java實(shí)現(xiàn) 1. 獲取UUID

微信在生成二維碼之前,會(huì)先生成一個(gè)UUID,作為一個(gè)識(shí)別的標(biāo)記,攜帶這個(gè)UUID訪問(wèn)微信的接口就可以獲取到二維碼。同時(shí)也是查看二維碼是否被掃描的一個(gè)重要參數(shù)。
參數(shù)列表如下:

appid (可寫(xiě)死,wx782c26e4c19acffb)

fun : new

lang : zh-CN (中國(guó)地區(qū))

_ : 時(shí)間戳

// 參考代碼:
// 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 False
2. 獲取二維碼

將uuid放在url中然后使用get請(qǐng)求,會(huì)收到一個(gè)一張二維碼的圖片.當(dāng)然,如果在網(wǎng)頁(yè)中使用的標(biāo)簽可以直接將這個(gè)URL放進(jìn)去,就可以直接顯示一張二維碼。
參數(shù)列表如下:

uuid:也就是上面所獲取的UUID

//java版本
// 如果忽略注釋直接返回獲取圖片的url放在網(wǎng)頁(yè)中的的標(biāo)簽下可以直接顯示,如果使用注釋中的內(nèi)容會(huì)將其下載為本地圖片
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;
        // 同時(shí)提供使其變?yōu)楸镜貓D片的方法
        // httpGet = new HttpGet(QRurl);
        // response = httpClient.execute(httpGet);
        // entity = response.getEntity();
        // InputStream in = entity.getContent();
        // //注意這里要對(duì)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. 獲取用戶(hù)登錄狀態(tài)

登陸狀態(tài)主要是兩種,一種是用戶(hù)已經(jīng)掃描,一種是用戶(hù)掃描后在手機(jī)端已經(jīng)點(diǎn)擊確認(rèn)了。這兩種狀態(tài)的獲取訪問(wèn)的url是一樣的,區(qū)別是一個(gè)叫做tip的參數(shù),當(dāng)tip=1的時(shí)候,如果沒(méi)有掃描,服務(wù)端會(huì)一直等待,如果已經(jīng)掃描,服務(wù)端會(huì)返回代買(mǎi)201.當(dāng)tip=0的時(shí)候,如果用戶(hù)沒(méi)有點(diǎn)擊確定,那么就會(huì)一直等待,直到用戶(hù)點(diǎn)擊確定后返回200.所以問(wèn)題來(lái)了,如果不改變tip讓他一直為1也是可以的,但是就需要不斷的輪詢(xún),而如果改變tip的話(huà),就可以while的循環(huán)。
參數(shù)如下:

uuid : 就是之前獲得的uuid

_ : 時(shí)間戳

tip : 判斷是要獲得點(diǎn)擊狀態(tài)還是掃描狀態(tài)

狀態(tài)=200時(shí),返回值是redirect_url:該返回值是一個(gè)url,訪問(wèn)該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 "成功掃描,請(qǐng)?jiān)谑謾C(jī)上點(diǎn)擊確認(rèn)以登錄"
        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": #超時(shí)
        pass
    return code
4. 正式登陸

手機(jī)端已經(jīng)授權(quán)通過(guò),上一步會(huì)返回一個(gè)Redirect_Url,這是一個(gè)真正的登陸url,使用get方法訪問(wèn)該url會(huì)返回一個(gè)xml格式的字符串,其中的屬性將是接下來(lái)動(dòng)作的重要參數(shù)。解析該字符串有如下的屬性:

int ret;//返回值為0時(shí)表示本次請(qǐng)求成功

String message;//一些信息(比如失敗原因等)

String skey;//后面請(qǐng)求會(huì)用到的參數(shù)

String wxsid;//同上

long wxuin;// 本人編碼

String pass_ticket;//重要!!后面很多請(qǐng)求都會(huì)用到這張通行證

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 True
5. init初始化

該方法可有可無(wú),作用主要是初始化幾個(gè)聯(lián)系人,可能是最近聯(lián)系人還是怎樣,并且能獲得的是登陸人的信息。如果不需要獲取這些東西就可以跳過(guò)這一步。該方法是post方法,但在url中也可以放幾個(gè)值
主要參數(shù):
url中:

pass_ticket

skey 這兩個(gè)參數(shù)都是login時(shí)的返回值之一

r 時(shí)間戳

post 文中攜帶:BaseRequst=Json格式的BaseRequest,BaseRequest類(lèi)中有如下參數(shù):、

long Uin;

String Sid;

String Skey;

String DeviceID; DeviceID是一串e開(kāi)頭的隨機(jī)數(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的包裝類(lèi)
        String re = getResponse(url, gson.toJson(initRequestJson));//這是自己寫(xiě)的一個(gè)公有方法,可以直接看源碼
        InitResponseJson initResponseJson = gson.fromJson(re, InitResponseJson.class);
        mine = initResponseJson.getUser();// 獲取當(dāng)前用戶(hù)信息
    }
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 True
6. 后面部分

由于登陸成功后后面部分基本就是調(diào)用接口了,難點(diǎn)基本沒(méi)有,可以直接看源碼,我在這里貼上操作步驟

獲取所有的用戶(hù)
通過(guò)post方法訪問(wèn)一個(gè)url(源碼中可以看),就可以獲取所有的用戶(hù)列表。

創(chuàng)建聊天室
注意一次最多40人否則會(huì)出現(xiàn)問(wèn)題

刪除聊天室的成員

為聊天室添加成員
微信會(huì)返回該成員的一個(gè)狀態(tài),如果狀態(tài)等于4,那么添加失敗,就可以判斷該用戶(hù)已經(jīng)刪除了登陸用戶(hù)。

封裝為網(wǎng)頁(yè)

得到uuid,并將其包裝直接插入標(biāo)簽中就可以在網(wǎng)頁(yè)中顯示該二維碼

使用AJAX請(qǐng)求,請(qǐng)求waitforlogging()方法,當(dāng)返回值為200時(shí)成功,此時(shí)遍歷該用戶(hù)每一個(gè)好友,判斷其是否刪除了該用戶(hù)。

顯示

參考文檔

該功能的python實(shí)現(xiàn)

網(wǎng)頁(yè)微信登錄原理

項(xiàng)目源碼

項(xiàng)目源碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65370.html

相關(guān)文章

  • 微信網(wǎng)頁(yè)登錄原理查看自己刪除的人項(xiàng)目

    摘要:項(xiàng)目作用訪問(wèn)項(xiàng)目的網(wǎng)頁(yè),掃一掃網(wǎng)頁(yè)上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實(shí)現(xiàn)網(wǎng)頁(yè)微信登錄原理項(xiàng)目源碼項(xiàng)目源碼 項(xiàng)目作用 訪問(wèn)項(xiàng)目的網(wǎng)頁(yè),掃一掃網(wǎng)頁(yè)上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。 在線網(wǎng)址: 訪問(wèn)115.29.55.54:8080/WXApi就可以使用該項(xiàng)目所說(shuō)的網(wǎng)頁(yè) 項(xiàng)目原理 在微信中,將你刪掉的好友是無(wú)法加入你創(chuàng)建的群...

    sourcenode 評(píng)論0 收藏0
  • Python清理微信僵尸粉,基于itchat模塊

    摘要:按鍵繼續(xù)微信,用自己賬戶(hù)給所有好友發(fā)送消息,當(dāng)添加自己為好友時(shí),只有自己能收到此信息,如果沒(méi)添加自己為好友沒(méi)有人能收到此信息,筆者此刻日期為,到目前為止微信還沒(méi)修復(fù)。檢測(cè)到第位好友發(fā)送信息速度過(guò)快會(huì)被微信檢測(cè)到異常行為。 showImg(https://segmentfault.com/img/bVbqjcJ?w=765&h=742); 原理 通過(guò)Pyhton調(diào)用itchat模塊登錄網(wǎng)...

    Yumenokanata 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<