{"id":28445,"date":"2024-11-25T14:16:09","date_gmt":"2024-11-25T06:16:09","guid":{"rendered":"https:\/\/fwq.ai\/blog\/28445\/"},"modified":"2024-11-25T14:16:09","modified_gmt":"2024-11-25T06:16:09","slug":"%e5%be%ae%e4%bf%a1%e5%bc%80%e5%8f%91%e4%b9%8b%e5%a6%82%e4%bd%95%e7%94%a8%e8%84%9a%e6%9c%ac%e6%9f%a5%e7%9c%8b%e6%98%af%e5%90%a6%e8%a2%ab%e5%be%ae%e4%bf%a1%e5%a5%bd%e5%8f%8b%e5%88%a0%e9%99%a4","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/28445\/","title":{"rendered":"\u5fae\u4fe1\u5f00\u53d1\u4e4b\u5982\u4f55\u7528\u811a\u672c\u67e5\u770b\u662f\u5426\u88ab\u5fae\u4fe1\u597d\u53cb\u5220\u9664"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86\u5fae\u4fe1 &nbsp;\u7528\u811a\u672c\u67e5\u770b\u662f\u5426\u88ab\u5fae\u4fe1\u597d\u53cb\u5220\u9664\u7684\u76f8\u5173\u8d44\u6599,\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/000\/013\/f87aa78ab16f4ebe597ffb1d6b0a8520-0.jpg\" class=\"aligncenter\" title=\"\u5fae\u4fe1\u5f00\u53d1\u4e4b\u5982\u4f55\u7528\u811a\u672c\u67e5\u770b\u662f\u5426\u88ab\u5fae\u4fe1\u597d\u53cb\u5220\u9664\u63d2\u56fe\" alt=\"\u5fae\u4fe1\u5f00\u53d1\u4e4b\u5982\u4f55\u7528\u811a\u672c\u67e5\u770b\u662f\u5426\u88ab\u5fae\u4fe1\u597d\u53cb\u5220\u9664\u63d2\u56fe\" \/><\/p>\n<p>\u67d0\u65e5\uff0c\u4e00\u540c\u5b66\u7ed9\u5c0f\u7684\u53d1\u4e86 Github \u6e90\u7801\uff0c\u8bf4\u662f\u53ef\u4ee5\u8f7b\u677e\u67e5\u5230\u5220\u9664\u81ea\u5df1\u7684\u5fae\u4fe1\u597d\u53cb\uff0c\u4e8e\u662f\u5c31\u5f00\u59cb\u4e86\u4f5c\u6b7b\u4e4b\u8def\u3002<\/p>\n<p>Github \u6e90\u7801\u8bf7\u770b\uff1a0x5e\/wechat-deleted-friends<\/p>\n<p><strong>\u524d\u8a00<\/strong><\/p>\n<p>\u76f8\u4fe1\u5404\u4f4d\u4e00\u5b9a\u6709\u6536\u5230\u8fc7\u8fd9\u6837\u7684\u7fa4\u53d1\u77ed\u4fe1\uff0c\u636e\u8bf4\u8fd8\u88ab\u5f52\u7c7b\u4e3a\u73a9\u8f6c\u5fae\u4fe1\u7684\u4e94\u5927\u6280\u5de7\u4e4b\u4e00\u256e(\u256f\u25bd\u2570)\u256d\u4f46\uff0c\u5176\u5b9e\uff0c\u53ea\u8981\u8dd1\u4e00\u4e0b\u811a\u672c\uff0c\u5c31\u8f7b\u677e\u627e\u51fa\u5220\u9664\u81ea\u5df1\u7684\u597d\u53cb\uff08\u8f7b\u677e\u6454\u788e\u73bb\u7483\u5fc3\uff0c\u9003<\/p>\n<p>GitHub\uff1a\u5f00\u6e90\u602a\u6211\u54af\uff1f<\/p>\n<p><strong>\u539f\u7406<\/strong><\/p>\n<p>\u65b0\u5efa\u7fa4\u7ec4\uff0c\u5982\u679c\u52a0\u4e0d\u8fdb\u6765\u5c31\u662f\u88ab\u5220\u597d\u53cb\u4e86\uff08\u4e0d\u8981\u5728\u7fa4\u7ec4\u91cc\u8bb2\u8bdd\uff0c\u522b\u4eba\u662f\u770b\u4e0d\u89c1\u7684\uff09\u3002<\/p>\n<p>\u7528\u7684\u662f\u5fae\u4fe1\u7f51\u9875\u7248\u7684\u63a5\u53e3\uff0c\u8fd8\u6709\u4e9b\u5c0f\u95ee\u9898\uff0c\u4e0d\u8fc7\u73b0\u5728\u7ed3\u679c\u597d\u50cf\u6709\u758f\u6f0f\u4e00\u5c0f\u90e8\u5206\uff0c\u539f\u56e0\u4e0d\u660e\u2026\u2026\u4e5f\u6ca1\u8bd5\u8fc7\u88ab\u62c9\u9ed1\u7684\u60c5\u51b5\u3002\u6700\u7ec8\u4f1a\u9057\u7559\u4e0b\u4e00\u4e2a\u53ea\u6709\u81ea\u5df1\u7684\u7fa4\u7ec4\uff0c\u9700\u8981\u624b\u5de5\u5220\u4e00\u4e0b\u3002<\/p>\n<p>\u65b9\u6cd5<\/p>\n<p>\u4e0b\u8f7d python \u811a\u672c\uff0c\u8dd1\u4e00\u4e0b\u3002\u542f\u52a8 Terminal\uff0c\u5207\u5230\u6587\u4ef6\u76ee\u5f55\u4e0b\uff1a<\/p>\n<p>python wdf.py<\/p>\n<p>\u4ee3\u7801\u5982\u4e0b<\/p>\n<p><\/p>\n<pre>#!\/usr\/bin\/env&nbsp;python\r\n#&nbsp;coding=utf-8\r\n\r\nimport&nbsp;os\r\nimport&nbsp;urllib,&nbsp;urllib2\r\nimport&nbsp;re\r\nimport&nbsp;cookielib\r\nimport&nbsp;time\r\nimport&nbsp;xml.dom.minidom\r\nimport&nbsp;json\r\nimport&nbsp;sys\r\nimport&nbsp;math\r\n\r\nDEBUG&nbsp;=&nbsp;False\r\n\r\nMAX_GROUP_NUM&nbsp;=&nbsp;35&nbsp;#&nbsp;\u6bcf\u7ec4\u4eba\u6570\r\n\r\nQRImagePath&nbsp;=&nbsp;os.getcwd()&nbsp;+&nbsp;'\/qrcode.jpg'\r\n\r\ntip&nbsp;=&nbsp;0\r\nuuid&nbsp;=&nbsp;''\r\n\r\nbase_uri&nbsp;=&nbsp;''\r\nredirect_uri&nbsp;=&nbsp;''\r\n\r\nskey&nbsp;=&nbsp;''\r\nwxsid&nbsp;=&nbsp;''\r\nwxuin&nbsp;=&nbsp;''\r\npass_ticket&nbsp;=&nbsp;''\r\ndeviceId&nbsp;=&nbsp;'e000000000000000'\r\n\r\nBaseRequest&nbsp;=&nbsp;{}\r\n\r\nContactList&nbsp;=&nbsp;[]\r\nMy&nbsp;=&nbsp;[]\r\n\r\ndef&nbsp;getUUID():\r\n&nbsp;&nbsp;global&nbsp;uuid\r\n\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;'https:\/\/login.weixin.qq.com\/jslogin'\r\n&nbsp;&nbsp;params&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;'appid':&nbsp;'wx782c26e4c19acffb',\r\n&nbsp;&nbsp;&nbsp;&nbsp;'fun':&nbsp;'new',\r\n&nbsp;&nbsp;&nbsp;&nbsp;'lang':&nbsp;'zh_CN',\r\n&nbsp;&nbsp;&nbsp;&nbsp;'_':&nbsp;int(time.time()),\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url,&nbsp;data&nbsp;=&nbsp;urllib.urlencode(params))\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;#&nbsp;window.QRLogin.code&nbsp;=&nbsp;200;&nbsp;window.QRLogin.uuid&nbsp;=&nbsp;\"oZwt_bFfRg==\";\r\n&nbsp;&nbsp;regx&nbsp;=&nbsp;r'window.QRLogin.code&nbsp;=&nbsp;(d+);&nbsp;window.QRLogin.uuid&nbsp;=&nbsp;\"(S+?)\"'\r\n&nbsp;&nbsp;pm&nbsp;=&nbsp;re.search(regx,&nbsp;data)\r\n\r\n&nbsp;&nbsp;code&nbsp;=&nbsp;pm.group(1)\r\n&nbsp;&nbsp;uuid&nbsp;=&nbsp;pm.group(2)\r\n\r\n&nbsp;&nbsp;if&nbsp;code&nbsp;==&nbsp;'200':\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;True\r\n\r\n&nbsp;&nbsp;return&nbsp;False\r\n\r\ndef&nbsp;showQRImage():\r\n&nbsp;&nbsp;global&nbsp;tip\r\n\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;'https:\/\/login.weixin.qq.com\/qrcode\/'&nbsp;+&nbsp;uuid\r\n&nbsp;&nbsp;params&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;'t':&nbsp;'webwx',\r\n&nbsp;&nbsp;&nbsp;&nbsp;'_':&nbsp;int(time.time()),\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url,&nbsp;data&nbsp;=&nbsp;urllib.urlencode(params))\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n\r\n&nbsp;&nbsp;tip&nbsp;=&nbsp;1\r\n\r\n&nbsp;&nbsp;f&nbsp;=&nbsp;open(QRImagePath,&nbsp;'wb')\r\n&nbsp;&nbsp;f.write(response.read())\r\n&nbsp;&nbsp;f.close()\r\n\r\n&nbsp;&nbsp;if&nbsp;sys.platform.find('darwin')&nbsp;&amp;gt;=&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;os.system('open&nbsp;%s'&nbsp;%&nbsp;QRImagePath)\r\n&nbsp;&nbsp;elif&nbsp;sys.platform.find('linux')&nbsp;&amp;gt;=&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;os.system('xdg-open&nbsp;%s'&nbsp;%&nbsp;QRImagePath)\r\n&nbsp;&nbsp;else:\r\n&nbsp;&nbsp;&nbsp;&nbsp;os.system('call&nbsp;%s'&nbsp;%&nbsp;QRImagePath)\r\n\r\n&nbsp;&nbsp;print&nbsp;'\u8bf7\u4f7f\u7528\u5fae\u4fe1\u626b\u63cf\u4e8c\u7ef4\u7801\u4ee5\u767b\u5f55'\r\n\r\ndef&nbsp;waitForLogin():\r\n&nbsp;&nbsp;global&nbsp;tip,&nbsp;base_uri,&nbsp;redirect_uri\r\n\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;'https:\/\/login.weixin.qq.com\/cgi-bin\/mmwebwx-bin\/login?tip=%s&amp;amp;uuid=%s&amp;amp;_=%s'&nbsp;%&nbsp;(tip,&nbsp;uuid,&nbsp;int(time.time()))\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url)\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;#&nbsp;window.code=500;\r\n&nbsp;&nbsp;regx&nbsp;=&nbsp;r'window.code=(d+);'\r\n&nbsp;&nbsp;pm&nbsp;=&nbsp;re.search(regx,&nbsp;data)\r\n\r\n&nbsp;&nbsp;code&nbsp;=&nbsp;pm.group(1)\r\n\r\n&nbsp;&nbsp;if&nbsp;code&nbsp;==&nbsp;'201':&nbsp;#\u5df2\u626b\u63cf\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u6210\u529f\u626b\u63cf,\u8bf7\u5728\u624b\u673a\u4e0a\u70b9\u51fb\u786e\u8ba4\u4ee5\u767b\u5f55'\r\n&nbsp;&nbsp;&nbsp;&nbsp;tip&nbsp;=&nbsp;0\r\n&nbsp;&nbsp;elif&nbsp;code&nbsp;==&nbsp;'200':&nbsp;#\u5df2\u767b\u5f55\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u6b63\u5728\u767b\u5f55...'\r\n&nbsp;&nbsp;&nbsp;&nbsp;regx&nbsp;=&nbsp;r'window.redirect_uri=\"(S+?)\";'\r\n&nbsp;&nbsp;&nbsp;&nbsp;pm&nbsp;=&nbsp;re.search(regx,&nbsp;data)\r\n&nbsp;&nbsp;&nbsp;&nbsp;redirect_uri&nbsp;=&nbsp;pm.group(1)&nbsp;+&nbsp;'&amp;amp;fun=new'\r\n&nbsp;&nbsp;&nbsp;&nbsp;base_uri&nbsp;=&nbsp;redirect_uri[:redirect_uri.rfind('\/')]\r\n&nbsp;&nbsp;elif&nbsp;code&nbsp;==&nbsp;'408':&nbsp;#\u8d85\u65f6\r\n&nbsp;&nbsp;&nbsp;&nbsp;pass\r\n&nbsp;&nbsp;#&nbsp;elif&nbsp;code&nbsp;==&nbsp;'400'&nbsp;or&nbsp;code&nbsp;==&nbsp;'500':\r\n\r\n&nbsp;&nbsp;return&nbsp;code\r\n\r\ndef&nbsp;login():\r\n&nbsp;&nbsp;global&nbsp;skey,&nbsp;wxsid,&nbsp;wxuin,&nbsp;pass_ticket,&nbsp;BaseRequest\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;redirect_uri)\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;'''\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;error&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ret&gt;0&lt;\/ret&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;message&gt;OK&lt;\/message&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;skey&gt;xxx&lt;\/skey&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wxsid&gt;xxx&lt;\/wxsid&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wxuin&gt;xxx&lt;\/wxuin&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pass_ticket&gt;xxx&lt;\/pass_ticket&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;isgrayscale&gt;1&lt;\/isgrayscale&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/error&gt;\r\n&nbsp;&nbsp;'''\r\n\r\n&nbsp;&nbsp;doc&nbsp;=&nbsp;xml.dom.minidom.parseString(data)\r\n&nbsp;&nbsp;root&nbsp;=&nbsp;doc.documentElement\r\n\r\n&nbsp;&nbsp;for&nbsp;node&nbsp;in&nbsp;root.childNodes:\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;node.nodeName&nbsp;==&nbsp;'skey':\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skey&nbsp;=&nbsp;node.childNodes[0].data\r\n&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;node.nodeName&nbsp;==&nbsp;'wxsid':\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wxsid&nbsp;=&nbsp;node.childNodes[0].data\r\n&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;node.nodeName&nbsp;==&nbsp;'wxuin':\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wxuin&nbsp;=&nbsp;node.childNodes[0].data\r\n&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;node.nodeName&nbsp;==&nbsp;'pass_ticket':\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass_ticket&nbsp;=&nbsp;node.childNodes[0].data\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;'skey:&nbsp;%s,&nbsp;wxsid:&nbsp;%s,&nbsp;wxuin:&nbsp;%s,&nbsp;pass_ticket:&nbsp;%s'&nbsp;%&nbsp;(skey,&nbsp;wxsid,&nbsp;wxuin,&nbsp;pass_ticket)\r\n\r\n&nbsp;&nbsp;if&nbsp;skey&nbsp;==&nbsp;''&nbsp;or&nbsp;wxsid&nbsp;==&nbsp;''&nbsp;or&nbsp;wxuin&nbsp;==&nbsp;''&nbsp;or&nbsp;pass_ticket&nbsp;==&nbsp;'':\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;False\r\n\r\n&nbsp;&nbsp;BaseRequest&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;'Uin':&nbsp;int(wxuin),\r\n&nbsp;&nbsp;&nbsp;&nbsp;'Sid':&nbsp;wxsid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'Skey':&nbsp;skey,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'DeviceID':&nbsp;deviceId,\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;return&nbsp;True\r\n\r\ndef&nbsp;webwxinit():\r\n\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;base_uri&nbsp;+&nbsp;'\/webwxinit?pass_ticket=%s&amp;amp;skey=%s&amp;amp;r=%s'&nbsp;%&nbsp;(pass_ticket,&nbsp;skey,&nbsp;int(time.time()))\r\n&nbsp;&nbsp;params&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;'BaseRequest':&nbsp;BaseRequest\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url,&nbsp;data&nbsp;=&nbsp;json.dumps(params))\r\n&nbsp;&nbsp;request.add_header('ContentType',&nbsp;'application\/json;&nbsp;charset=UTF-8')\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n\r\n&nbsp;&nbsp;if&nbsp;DEBUG&nbsp;==&nbsp;True:\r\n&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;open(os.getcwd()&nbsp;+&nbsp;'\/webwxinit.json',&nbsp;'wb')\r\n&nbsp;&nbsp;&nbsp;&nbsp;f.write(data)\r\n&nbsp;&nbsp;&nbsp;&nbsp;f.close()\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;global&nbsp;ContactList,&nbsp;My\r\n&nbsp;&nbsp;dic&nbsp;=&nbsp;json.loads(data)\r\n&nbsp;&nbsp;ContactList&nbsp;=&nbsp;dic['ContactList']\r\n&nbsp;&nbsp;My&nbsp;=&nbsp;dic['User']\r\n\r\n&nbsp;&nbsp;ErrMsg&nbsp;=&nbsp;dic['BaseResponse']['ErrMsg']\r\n&nbsp;&nbsp;if&nbsp;len(ErrMsg)&nbsp;&amp;gt;&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;ErrMsg\r\n\r\n&nbsp;&nbsp;Ret&nbsp;=&nbsp;dic['BaseResponse']['Ret']\r\n&nbsp;&nbsp;if&nbsp;Ret&nbsp;!=&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;False\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;return&nbsp;True\r\n\r\ndef&nbsp;webwxgetcontact():\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;base_uri&nbsp;+&nbsp;'\/webwxgetcontact?pass_ticket=%s&amp;amp;skey=%s&amp;amp;r=%s'&nbsp;%&nbsp;(pass_ticket,&nbsp;skey,&nbsp;int(time.time()))\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url)\r\n&nbsp;&nbsp;request.add_header('ContentType',&nbsp;'application\/json;&nbsp;charset=UTF-8')\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n\r\n&nbsp;&nbsp;if&nbsp;DEBUG&nbsp;==&nbsp;True:\r\n&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;open(os.getcwd()&nbsp;+&nbsp;'\/webwxgetcontact.json',&nbsp;'wb')\r\n&nbsp;&nbsp;&nbsp;&nbsp;f.write(data)\r\n&nbsp;&nbsp;&nbsp;&nbsp;f.close()\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;dic&nbsp;=&nbsp;json.loads(data)\r\n&nbsp;&nbsp;MemberList&nbsp;=&nbsp;dic['MemberList']\r\n\r\n&nbsp;&nbsp;#&nbsp;\u5012\u5e8f\u904d\u5386,\u4e0d\u7136\u5220\u9664\u7684\u65f6\u5019\u51fa\u95ee\u9898..\r\n&nbsp;&nbsp;SpecialUsers&nbsp;=&nbsp;['newsapp',&nbsp;'fmessage',&nbsp;'filehelper',&nbsp;'weibo',&nbsp;'qqmail',&nbsp;'fmessage',&nbsp;'tmessage',&nbsp;'qmessage',&nbsp;'qqsync',&nbsp;'floatbottle',&nbsp;'lbsapp',&nbsp;'shakeapp',&nbsp;'medianote',&nbsp;'qqfriend',&nbsp;'readerapp',&nbsp;'blogapp',&nbsp;'facebookapp',&nbsp;'masssendapp',&nbsp;'meishiapp',&nbsp;'feedsapp',&nbsp;'voip',&nbsp;'blogappweixin',&nbsp;'weixin',&nbsp;'brandsessionholder',&nbsp;'weixinreminder',&nbsp;'wxid_novlwrv3lqwv11',&nbsp;'gh_22b87fa7cb3c',&nbsp;'officialaccounts',&nbsp;'notification_messages',&nbsp;'wxid_novlwrv3lqwv11',&nbsp;'gh_22b87fa7cb3c',&nbsp;'wxitil',&nbsp;'userexperience_alarm',&nbsp;'notification_messages']\r\n&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(len(MemberList)&nbsp;-&nbsp;1,&nbsp;-1,&nbsp;-1):\r\n&nbsp;&nbsp;&nbsp;&nbsp;Member&nbsp;=&nbsp;MemberList[i]\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Member['VerifyFlag']&nbsp;&amp;amp;&nbsp;8&nbsp;!=&nbsp;0:&nbsp;#&nbsp;\u516c\u4f17\u53f7\/\u670d\u52a1\u53f7\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemberList.remove(Member)\r\n&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;Member['UserName']&nbsp;in&nbsp;SpecialUsers:&nbsp;#&nbsp;\u7279\u6b8a\u8d26\u53f7\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemberList.remove(Member)\r\n&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;Member['UserName'].find('@@')&nbsp;!=&nbsp;-1:&nbsp;#&nbsp;\u7fa4\u804a\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemberList.remove(Member)\r\n&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;Member['UserName']&nbsp;==&nbsp;My['UserName']:&nbsp;#&nbsp;\u81ea\u5df1\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemberList.remove(Member)\r\n\r\n&nbsp;&nbsp;return&nbsp;MemberList\r\n\r\ndef&nbsp;createChatroom(UserNames):\r\n&nbsp;&nbsp;MemberList&nbsp;=&nbsp;[]\r\n&nbsp;&nbsp;for&nbsp;UserName&nbsp;in&nbsp;UserNames:\r\n&nbsp;&nbsp;&nbsp;&nbsp;MemberList.append({'UserName':&nbsp;UserName})\r\n\r\n\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;base_uri&nbsp;+&nbsp;'\/webwxcreatechatroom?pass_ticket=%s&amp;amp;r=%s'&nbsp;%&nbsp;(pass_ticket,&nbsp;int(time.time()))\r\n&nbsp;&nbsp;params&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;'BaseRequest':&nbsp;BaseRequest,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'MemberCount':&nbsp;len(MemberList),\r\n&nbsp;&nbsp;&nbsp;&nbsp;'MemberList':&nbsp;MemberList,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'Topic':&nbsp;'',\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url,&nbsp;data&nbsp;=&nbsp;json.dumps(params))\r\n&nbsp;&nbsp;request.add_header('ContentType',&nbsp;'application\/json;&nbsp;charset=UTF-8')\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;dic&nbsp;=&nbsp;json.loads(data)\r\n&nbsp;&nbsp;ChatRoomName&nbsp;=&nbsp;dic['ChatRoomName']\r\n&nbsp;&nbsp;MemberList&nbsp;=&nbsp;dic['MemberList']\r\n&nbsp;&nbsp;DeletedList&nbsp;=&nbsp;[]\r\n&nbsp;&nbsp;for&nbsp;Member&nbsp;in&nbsp;MemberList:\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Member['MemberStatus']&nbsp;==&nbsp;4:&nbsp;#\u88ab\u5bf9\u65b9\u5220\u9664\u4e86\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeletedList.append(Member['UserName'])\r\n\r\n&nbsp;&nbsp;ErrMsg&nbsp;=&nbsp;dic['BaseResponse']['ErrMsg']\r\n&nbsp;&nbsp;if&nbsp;len(ErrMsg)&nbsp;&amp;gt;&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;ErrMsg\r\n\r\n&nbsp;&nbsp;return&nbsp;(ChatRoomName,&nbsp;DeletedList)\r\n\r\ndef&nbsp;deleteMember(ChatRoomName,&nbsp;UserNames):\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;base_uri&nbsp;+&nbsp;'\/webwxupdatechatroom?fun=delmember&amp;amp;pass_ticket=%s'&nbsp;%&nbsp;(pass_ticket)\r\n&nbsp;&nbsp;params&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;'BaseRequest':&nbsp;BaseRequest,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'ChatRoomName':&nbsp;ChatRoomName,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'DelMemberList':&nbsp;','.join(UserNames),\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url,&nbsp;data&nbsp;=&nbsp;json.dumps(params))\r\n&nbsp;&nbsp;request.add_header('ContentType',&nbsp;'application\/json;&nbsp;charset=UTF-8')\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;dic&nbsp;=&nbsp;json.loads(data)\r\n&nbsp;&nbsp;ErrMsg&nbsp;=&nbsp;dic['BaseResponse']['ErrMsg']\r\n&nbsp;&nbsp;if&nbsp;len(ErrMsg)&nbsp;&amp;gt;&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;ErrMsg\r\n\r\n&nbsp;&nbsp;Ret&nbsp;=&nbsp;dic['BaseResponse']['Ret']\r\n&nbsp;&nbsp;if&nbsp;Ret&nbsp;!=&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;False\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;return&nbsp;True\r\n\r\ndef&nbsp;addMember(ChatRoomName,&nbsp;UserNames):\r\n&nbsp;&nbsp;url&nbsp;=&nbsp;base_uri&nbsp;+&nbsp;'\/webwxupdatechatroom?fun=addmember&amp;amp;pass_ticket=%s'&nbsp;%&nbsp;(pass_ticket)\r\n&nbsp;&nbsp;params&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;'BaseRequest':&nbsp;BaseRequest,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'ChatRoomName':&nbsp;ChatRoomName,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'AddMemberList':&nbsp;','.join(UserNames),\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;request&nbsp;=&nbsp;urllib2.Request(url&nbsp;=&nbsp;url,&nbsp;data&nbsp;=&nbsp;json.dumps(params))\r\n&nbsp;&nbsp;request.add_header('ContentType',&nbsp;'application\/json;&nbsp;charset=UTF-8')\r\n&nbsp;&nbsp;response&nbsp;=&nbsp;urllib2.urlopen(request)\r\n&nbsp;&nbsp;data&nbsp;=&nbsp;response.read()\r\n\r\n&nbsp;&nbsp;#&nbsp;print&nbsp;data\r\n\r\n&nbsp;&nbsp;dic&nbsp;=&nbsp;json.loads(data)\r\n&nbsp;&nbsp;MemberList&nbsp;=&nbsp;dic['MemberList']\r\n&nbsp;&nbsp;DeletedList&nbsp;=&nbsp;[]\r\n&nbsp;&nbsp;for&nbsp;Member&nbsp;in&nbsp;MemberList:\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Member['MemberStatus']&nbsp;==&nbsp;4:&nbsp;#\u88ab\u5bf9\u65b9\u5220\u9664\u4e86\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeletedList.append(Member['UserName'])\r\n\r\n&nbsp;&nbsp;ErrMsg&nbsp;=&nbsp;dic['BaseResponse']['ErrMsg']\r\n&nbsp;&nbsp;if&nbsp;len(ErrMsg)&nbsp;&amp;gt;&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;ErrMsg\r\n\r\n&nbsp;&nbsp;return&nbsp;DeletedList\r\n\r\ndef&nbsp;main():\r\n\r\n&nbsp;&nbsp;opener&nbsp;=&nbsp;urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))\r\n&nbsp;&nbsp;urllib2.install_opener(opener)\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;if&nbsp;getUUID()&nbsp;==&nbsp;False:\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u83b7\u53d6uuid\u5931\u8d25'\r\n&nbsp;&nbsp;&nbsp;&nbsp;return\r\n\r\n&nbsp;&nbsp;showQRImage()\r\n&nbsp;&nbsp;time.sleep(1)\r\n\r\n&nbsp;&nbsp;while&nbsp;waitForLogin()&nbsp;!=&nbsp;'200':\r\n&nbsp;&nbsp;&nbsp;&nbsp;pass\r\n\r\n&nbsp;&nbsp;os.remove(QRImagePath)\r\n\r\n&nbsp;&nbsp;if&nbsp;login()&nbsp;==&nbsp;False:\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u767b\u5f55\u5931\u8d25'\r\n&nbsp;&nbsp;&nbsp;&nbsp;return\r\n\r\n&nbsp;&nbsp;if&nbsp;webwxinit()&nbsp;==&nbsp;False:\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u521d\u59cb\u5316\u5931\u8d25'\r\n&nbsp;&nbsp;&nbsp;&nbsp;return\r\n\r\n&nbsp;&nbsp;MemberList&nbsp;=&nbsp;webwxgetcontact()\r\n\r\n&nbsp;&nbsp;MemberCount&nbsp;=&nbsp;len(MemberList)\r\n&nbsp;&nbsp;print&nbsp;'\u901a\u8baf\u5f55\u5171%s\u4f4d\u597d\u53cb'&nbsp;%&nbsp;MemberCount\r\n\r\n&nbsp;&nbsp;ChatRoomName&nbsp;=&nbsp;''\r\n&nbsp;&nbsp;result&nbsp;=&nbsp;[]\r\n&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(0,&nbsp;int(math.ceil(MemberCount&nbsp;\/&nbsp;float(MAX_GROUP_NUM)))):\r\n&nbsp;&nbsp;&nbsp;&nbsp;UserNames&nbsp;=&nbsp;[]\r\n&nbsp;&nbsp;&nbsp;&nbsp;NickNames&nbsp;=&nbsp;[]\r\n&nbsp;&nbsp;&nbsp;&nbsp;DeletedList&nbsp;=&nbsp;''\r\n&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;j&nbsp;in&nbsp;xrange(0,&nbsp;MAX_GROUP_NUM):\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&nbsp;*&nbsp;MAX_GROUP_NUM&nbsp;+&nbsp;j&nbsp;&amp;gt;=&nbsp;MemberCount:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Member&nbsp;=&nbsp;MemberList[i&nbsp;*&nbsp;MAX_GROUP_NUM&nbsp;+&nbsp;j]\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserNames.append(Member['UserName'])\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NickNames.append(Member['NickName'].encode('utf-8'))\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u7b2c%s\u7ec4...'&nbsp;%&nbsp;(i&nbsp;+&nbsp;1)\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;',&nbsp;'.join(NickNames)\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u56de\u8f66\u952e\u7ee7\u7eed...'\r\n&nbsp;&nbsp;&nbsp;&nbsp;raw_input()\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;\u65b0\u5efa\u7fa4\u7ec4\/\u6dfb\u52a0\u6210\u5458\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ChatRoomName&nbsp;==&nbsp;'':\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ChatRoomName,&nbsp;DeletedList)&nbsp;=&nbsp;createChatroom(UserNames)\r\n&nbsp;&nbsp;&nbsp;&nbsp;else:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeletedList&nbsp;=&nbsp;addMember(ChatRoomName,&nbsp;UserNames)\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;DeletedCount&nbsp;=&nbsp;len(DeletedList)\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;DeletedCount&nbsp;&amp;gt;&nbsp;0:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;DeletedList\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'\u627e\u5230%s\u4e2a\u88ab\u5220\u597d\u53cb'&nbsp;%&nbsp;DeletedCount\r\n&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;raw_input()\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;\u5220\u9664\u6210\u5458\r\n&nbsp;&nbsp;&nbsp;&nbsp;deleteMember(ChatRoomName,&nbsp;UserNames)\r\n\r\n&nbsp;&nbsp;#&nbsp;todo&nbsp;\u5220\u9664\u7fa4\u7ec4\r\n\r\n\r\n&nbsp;&nbsp;resultNames&nbsp;=&nbsp;[]\r\n&nbsp;&nbsp;for&nbsp;Member&nbsp;in&nbsp;MemberList:\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Member['UserName']&nbsp;in&nbsp;result:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NickName&nbsp;=&nbsp;Member['NickName']\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Member['RemarkName']&nbsp;!=&nbsp;'':\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NickName&nbsp;+=&nbsp;'(%s)'&nbsp;%&nbsp;Member['RemarkName']\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultNames.append(NickName.encode('utf-8'))\r\n\r\n&nbsp;&nbsp;print&nbsp;'----------&nbsp;\u88ab\u5220\u9664\u7684\u597d\u53cb\u5217\u8868&nbsp;----------'\r\n&nbsp;&nbsp;print&nbsp;'\n'.join(resultNames)\r\n&nbsp;&nbsp;print&nbsp;'-----------------------------------'\r\n\r\n#&nbsp;windows\u4e0b\u7f16\u7801\u95ee\u9898\u4fee\u590d\r\n#&nbsp;http:\/\/www.php.cn\/\r\nclass&nbsp;UnicodeStreamFilter:&nbsp;\r\n&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;target):&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;self.target&nbsp;=&nbsp;target&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;self.encoding&nbsp;=&nbsp;'utf-8'&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;self.errors&nbsp;=&nbsp;'replace'&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;self.encode_to&nbsp;=&nbsp;self.target.encoding&nbsp;\r\n&nbsp;&nbsp;def&nbsp;write(self,&nbsp;s):&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;type(s)&nbsp;==&nbsp;str:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;s.decode('utf-8')&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;s.encode(self.encode_to,&nbsp;self.errors).decode(self.encode_to)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;self.target.write(s)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\nif&nbsp;sys.stdout.encoding&nbsp;==&nbsp;'cp936':&nbsp;\r\n&nbsp;&nbsp;sys.stdout&nbsp;=&nbsp;UnicodeStreamFilter(sys.stdout)\r\n\r\nif&nbsp;__name__&nbsp;==&nbsp;'__main__'&nbsp;:\r\n\r\n&nbsp;&nbsp;print&nbsp;'\u672c\u7a0b\u5e8f\u7684\u67e5\u8be2\u7ed3\u679c\u53ef\u80fd\u4f1a\u5f15\u8d77\u4e00\u4e9b\u5fc3\u7406\u4e0a\u7684\u4e0d\u9002,\u8bf7\u5c0f\u5fc3\u4f7f\u7528...'\r\n&nbsp;&nbsp;print&nbsp;'\u56de\u8f66\u952e\u7ee7\u7eed...'\r\n&nbsp;&nbsp;raw_input()\r\n\r\n&nbsp;&nbsp;main()\r\n\r\n&nbsp;&nbsp;print&nbsp;'\u56de\u8f66\u952e\u7ed3\u675f'\r\n&nbsp;&nbsp;raw_input()<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u611f\u8c22\u9605\u8bfb\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u5230\u5927\u5bb6\uff0c\u8c22\u8c22\u5927\u5bb6\u5bf9\u672c\u7ad9\u7684\u652f\u6301\uff01<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5fae\u4fe1\u5f00\u53d1\u4e4b\u5982\u4f55\u7528\u811a\u672c\u67e5\u770b\u662f\u5426\u88ab\u5fae\u4fe1\u597d\u53cb\u5220\u9664\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86\u5fae\u4fe1 &nbsp;\u7528\u811a\u672c\u67e5\u770b\u662f\u5426\u88ab\u5fae\u4fe1\u597d\u53cb\u5220\u9664\u7684\u76f8\u5173\u8d44\u6599,\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b \u67d0\u65e5\uff0c\u4e00\u540c\u5b66\u7ed9\u5c0f\u7684\u53d1\u4e86 Github \u6e90\u7801\uff0c\u8bf4\u662f\u53ef\u4ee5\u8f7b\u677e\u67e5\u5230\u5220\u9664\u81ea\u5df1\u7684\u5fae\u4fe1\u597d\u53cb\uff0c\u4e8e\u662f\u5c31\u5f00\u59cb\u4e86\u4f5c\u6b7b\u4e4b\u8def\u3002 Github \u6e90\u7801\u8bf7\u770b\uff1a0x5e\/wechat-deleted-friends \u524d\u8a00 \u76f8\u4fe1\u5404\u4f4d\u4e00\u5b9a\u6709\u6536\u5230\u8fc7\u8fd9\u6837\u7684\u7fa4\u53d1\u77ed\u4fe1\uff0c\u636e\u8bf4\u8fd8\u88ab\u5f52\u7c7b\u4e3a\u73a9\u8f6c\u5fae\u4fe1\u7684\u4e94\u5927\u6280\u5de7\u4e4b\u4e00\u256e(\u256f\u25bd\u2570)\u256d\u4f46\uff0c\u5176\u5b9e\uff0c\u53ea\u8981\u8dd1\u4e00\u4e0b\u811a\u672c\uff0c\u5c31\u8f7b\u677e\u627e\u51fa\u5220\u9664\u81ea\u5df1\u7684\u597d\u53cb\uff08\u8f7b\u677e\u6454\u788e\u73bb\u7483\u5fc3\uff0c\u9003 GitHub\uff1a\u5f00\u6e90\u602a\u6211\u54af\uff1f \u539f\u7406 \u65b0\u5efa\u7fa4\u7ec4\uff0c\u5982\u679c\u52a0\u4e0d\u8fdb\u6765\u5c31\u662f\u88ab\u5220\u597d\u53cb\u4e86\uff08\u4e0d\u8981\u5728\u7fa4\u7ec4\u91cc\u8bb2\u8bdd\uff0c\u522b\u4eba\u662f\u770b\u4e0d\u89c1\u7684\uff09\u3002 \u7528\u7684\u662f\u5fae\u4fe1\u7f51\u9875\u7248\u7684\u63a5\u53e3\uff0c\u8fd8\u6709\u4e9b\u5c0f\u95ee\u9898\uff0c\u4e0d\u8fc7\u73b0\u5728\u7ed3\u679c\u597d\u50cf\u6709\u758f\u6f0f\u4e00\u5c0f\u90e8\u5206\uff0c\u539f\u56e0\u4e0d\u660e\u2026\u2026\u4e5f\u6ca1\u8bd5\u8fc7\u88ab\u62c9\u9ed1\u7684\u60c5\u51b5\u3002\u6700\u7ec8\u4f1a\u9057\u7559\u4e0b\u4e00\u4e2a\u53ea\u6709\u81ea\u5df1\u7684\u7fa4\u7ec4\uff0c\u9700\u8981\u624b\u5de5\u5220\u4e00\u4e0b\u3002 \u65b9\u6cd5 \u4e0b\u8f7d python \u811a\u672c\uff0c\u8dd1\u4e00\u4e0b\u3002\u542f\u52a8 Terminal\uff0c\u5207\u5230\u6587\u4ef6\u76ee\u5f55\u4e0b\uff1a python wdf.py \u4ee3\u7801\u5982\u4e0b #!\/usr\/bin\/env&nbsp;python #&nbsp;coding=utf-8 import&nbsp;os import&nbsp;urllib,&nbsp;urllib2 import&nbsp;re import&nbsp;cookielib import&nbsp;time import&nbsp;xml.dom.minidom import&nbsp;json import&nbsp;sys import&nbsp;math DEBUG&nbsp;=&nbsp;False MAX_GROUP_NUM&nbsp;=&nbsp;35&nbsp;#&nbsp;\u6bcf\u7ec4\u4eba\u6570 QRImagePath&nbsp;=&nbsp;os.getcwd()&nbsp;+&nbsp;&#8216;\/qrcode.jpg&#8217; tip&nbsp;=&nbsp;0 uuid&nbsp;=&nbsp;&#8221; base_uri&nbsp;=&nbsp;&#8221; redirect_uri&nbsp;=&nbsp;&#8221; skey&nbsp;=&nbsp;&#8221; wxsid&nbsp;=&nbsp;&#8221; wxuin&nbsp;=&nbsp;&#8221; pass_ticket&nbsp;=&nbsp;&#8221; deviceId&nbsp;=&nbsp;&#8216;e000000000000000&#8217; BaseRequest&nbsp;=&nbsp;{} ContactList&nbsp;=&nbsp;[] My&nbsp;=&nbsp;[] def&nbsp;getUUID(): &nbsp;&nbsp;global&nbsp;uuid &nbsp;&nbsp;url&nbsp;=&nbsp;&#8216;https:\/\/login.weixin.qq.com\/jslogin&#8217; &nbsp;&nbsp;params&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&#8216;appid&#8217;:&nbsp;&#8216;wx782c26e4c19acffb&#8217;, &nbsp;&nbsp;&nbsp;&nbsp;&#8216;fun&#8217;:&nbsp;&#8216;new&#8217;, &nbsp;&nbsp;&nbsp;&nbsp;&#8216;lang&#8217;:&nbsp;&#8216;zh_CN&#8217;, &nbsp;&nbsp;&nbsp;&nbsp;&#8216;_&#8217;:&nbsp;int(time.time()), [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-28445","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/28445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=28445"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/28445\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=28445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=28445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=28445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}