2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 基于Python实现通过微信搜索功能查看谁把你删除了

基于Python实现通过微信搜索功能查看谁把你删除了

时间:2018-12-26 05:57:03

相关推荐

基于Python实现通过微信搜索功能查看谁把你删除了

这篇文章主要介绍了基于Python实现微信搜索查看谁把你删除了的相关资料,需要的朋友可以参考下

场景:查找who删了我,直接copy代码保存到一个python文件who.py,在python环境下运行此文件

代码如下,copy保存到who.py文件在python环境直接运行:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

#!/usr/bin/env python

# coding=utf-8

from __future__ import print_function

import os

try:

from urllib import urlencode, quote_plus

except ImportError:

from urllib.parse import urlencode, quote_plus

try:

import urllib2 as wdf_urllib

from cookielib import CookieJar

except ImportError:

import urllib.request as wdf_urllib

from http.cookiejar import CookieJar

import re

import time

import xml.dom.minidom

import json

import sys

import math

import subprocess

import ssl

import thread

DEBUG = False

MAX_GROUP_NUM = 35 # 每组人数

INTERFACE_CALLING_INTERVAL = 20 # 接口调用时间间隔, 间隔太短容易出现"操作太频繁", 会被限制操作半小时左右

MAX_PROGRESS_LEN = 50

QRImagePath = os.path.join(os.getcwd(), "qrcode.jpg")

tip = 0

uuid = ""

base_uri = ""

redirect_uri = ""

push_uri = ""

skey = ""

wxsid = ""

wxuin = ""

pass_ticket = ""

deviceId = "e000000000000000"

BaseRequest = {}

ContactList = []

My = []

SyncKey = []

try:

xrange

range = xrange

except:

# python 3

pass

def responseState(func, BaseResponse):

ErrMsg = BaseResponse["ErrMsg"]

Ret = BaseResponse["Ret"]

if DEBUG or Ret != 0:

print("func: %s, Ret: %d, ErrMsg: %s" % (func, Ret, ErrMsg))

if Ret != 0:

return False

return True

def getRequest(url, data=None):

try:

data = data.encode("utf-8")

except:

pass

finally:

return wdf_urllib.Request(url=url, data=data)

def getUUID():

global uuid

url = "https://login./jslogin"

params = {

"appid": "wx782c26e4c19acffb",

"fun": "new",

"lang": "zh_CN",

"_": int(time.time()),

}

request = getRequest(url=url, data=urlencode(params))

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

# window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg==";

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

def showQRImage():

global tip

url = "https://login./qrcode/" + uuid

params = {

"t": "webwx",

"_": int(time.time()),

}

request = getRequest(url=url, data=urlencode(params))

response = wdf_urllib.urlopen(request)

tip = 1

f = open(QRImagePath, "wb")

f.write(response.read())

f.close()

if sys.platform.find("darwin") >= 0:

subprocess.call(["open", QRImagePath])

elif sys.platform.find("linux") >= 0:

subprocess.call(["xdg-open", QRImagePath])

else:

os.startfile(QRImagePath)

print("请使用微信扫描二维码以登录")

def waitForLogin():

global tip, base_uri, redirect_uri, push_uri

url = "https://login./cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s" % (

tip, uuid, int(time.time()))

request = getRequest(url=url)

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

# window.code=500;

regx = r"window.code=(\d+);"

pm = re.search(regx, data)

code = pm.group(1)

if code == "201": # 已扫描

print("成功扫描,请在手机上点击确认以登录")

tip = 0

elif code == "200": # 已登录

print("正在登录...")

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("/")]

# push_uri与base_uri对应关系(排名分先后)(就是这么奇葩..)

services = [

("", "webpush2."),

("", "webpush."),

("", ""),

("", ""),

("", ""),

("", ""),

]

push_uri = base_uri

for (searchUrl, pushUrl) in services:

if base_uri.find(searchUrl) >= 0:

push_uri = "https://%s/cgi-bin/mmwebwx-bin" % pushUrl

break

# closeQRImage

if sys.platform.find("darwin") >= 0: # for OSX with Preview

os.system("osascript -e "quit app \"Preview\""")

elif code == "408": # 超时

pass

# elif code == "400" or code == "500":

return code

def login():

global skey, wxsid, wxuin, pass_ticket, BaseRequest

request = getRequest(url=redirect_uri)

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

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

# print("skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s" % (skey, wxsid,

# wxuin, pass_ticket))

if not all((skey, wxsid, wxuin, pass_ticket)):

return False

BaseRequest = {

"Uin": int(wxuin),

"Sid": wxsid,

"Skey": skey,

"DeviceID": deviceId,

}

return True

def webwxinit():

url = base_uri + \

"/webwxinit?pass_ticket=%s&skey=%s&r=%s" % (

pass_ticket, skey, int(time.time()))

params = {

"BaseRequest": BaseRequest

}

request = getRequest(url=url, data=json.dumps(params))

request.add_header("ContentType", "application/json; charset=UTF-8")

response = wdf_urllib.urlopen(request)

data = response.read()

if DEBUG:

f = open(os.path.join(os.getcwd(), "webwxinit.json"), "wb")

f.write(data)

f.close()

data = data.decode("utf-8", "replace")

# print(data)

global ContactList, My, SyncKey

dic = json.loads(data)

ContactList = dic["ContactList"]

My = dic["User"]

SyncKey = dic["SyncKey"]

state = responseState("webwxinit", dic["BaseResponse"])

return state

def webwxgetcontact():

url = base_uri + \

"/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s" % (

pass_ticket, skey, int(time.time()))

request = getRequest(url=url)

request.add_header("ContentType", "application/json; charset=UTF-8")

response = wdf_urllib.urlopen(request)

data = response.read()

if DEBUG:

f = open(os.path.join(os.getcwd(), "webwxgetcontact.json"), "wb")

f.write(data)

f.close()

# print(data)

data = data.decode("utf-8", "replace")

dic = json.loads(data)

MemberList = dic["MemberList"]

# 倒序遍历,不然删除的时候出问题..

SpecialUsers = ["newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync", "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp", "masssendapp",

"meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil", "userexperience_alarm"]

for i in range(len(MemberList) - 1, -1, -1):

Member = MemberList[i]

if Member["VerifyFlag"] & 8 != 0: # 公众号/服务号

MemberList.remove(Member)

elif Member["UserName"] in SpecialUsers: # 特殊账号

MemberList.remove(Member)

elif Member["UserName"].find("@@") != -1: # 群聊

MemberList.remove(Member)

elif Member["UserName"] == My["UserName"]: # 自己

MemberList.remove(Member)

return MemberList

def createChatroom(UserNames):

MemberList = [{"UserName": UserName} for UserName in UserNames]

url = base_uri + \

"/webwxcreatechatroom?pass_ticket=%s&r=%s" % (

pass_ticket, int(time.time()))

params = {

"BaseRequest": BaseRequest,

"MemberCount": len(MemberList),

"MemberList": MemberList,

"Topic": "",

}

request = getRequest(url=url, data=json.dumps(params))

request.add_header("ContentType", "application/json; charset=UTF-8")

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

dic = json.loads(data)

ChatRoomName = dic["ChatRoomName"]

MemberList = dic["MemberList"]

DeletedList = []

BlockedList = []

for Member in MemberList:

if Member["MemberStatus"] == 4: # 被对方删除了

DeletedList.append(Member["UserName"])

elif Member["MemberStatus"] == 3: # 被加入黑名单

BlockedList.append(Member["UserName"])

state = responseState("createChatroom", dic["BaseResponse"])

return ChatRoomName, DeletedList, BlockedList

def deleteMember(ChatRoomName, UserNames):

url = base_uri + \

"/webwxupdatechatroom?fun=delmember&pass_ticket=%s" % (pass_ticket)

params = {

"BaseRequest": BaseRequest,

"ChatRoomName": ChatRoomName,

"DelMemberList": ",".join(UserNames),

}

request = getRequest(url=url, data=json.dumps(params))

request.add_header("ContentType", "application/json; charset=UTF-8")

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

dic = json.loads(data)

state = responseState("deleteMember", dic["BaseResponse"])

return state

def addMember(ChatRoomName, UserNames):

url = base_uri + \

"/webwxupdatechatroom?fun=addmember&pass_ticket=%s" % (pass_ticket)

params = {

"BaseRequest": BaseRequest,

"ChatRoomName": ChatRoomName,

"AddMemberList": ",".join(UserNames),

}

request = getRequest(url=url, data=json.dumps(params))

request.add_header("ContentType", "application/json; charset=UTF-8")

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

dic = json.loads(data)

MemberList = dic["MemberList"]

DeletedList = []

BlockedList = []

for Member in MemberList:

if Member["MemberStatus"] == 4: # 被对方删除了

DeletedList.append(Member["UserName"])

elif Member["MemberStatus"] == 3: # 被加入黑名单

BlockedList.append(Member["UserName"])

state = responseState("addMember", dic["BaseResponse"])

return DeletedList, BlockedList

def syncKey():

SyncKeyItems = ["%s_%s" % (item["Key"], item["Val"])

for item in SyncKey["List"]]

SyncKeyStr = "|".join(SyncKeyItems)

return SyncKeyStr

def syncCheck():

url = push_uri + "/synccheck?"

params = {

"skey": BaseRequest["Skey"],

"sid": BaseRequest["Sid"],

"uin": BaseRequest["Uin"],

"deviceId": BaseRequest["DeviceID"],

"synckey": syncKey(),

"r": int(time.time()),

}

request = getRequest(url=url + urlencode(params))

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

# window.synccheck={retcode:"0",selector:"2"}

regx = r"window.synccheck={retcode:"(\d+)",selector:"(\d+)"}"

pm = re.search(regx, data)

retcode = pm.group(1)

selector = pm.group(2)

return selector

def webwxsync():

global SyncKey

url = base_uri + "/webwxsync?lang=zh_CN&skey=%s&sid=%s&pass_ticket=%s" % (

BaseRequest["Skey"], BaseRequest["Sid"], quote_plus(pass_ticket))

params = {

"BaseRequest": BaseRequest,

"SyncKey": SyncKey,

"rr": ~int(time.time()),

}

request = getRequest(url=url, data=json.dumps(params))

request.add_header("ContentType", "application/json; charset=UTF-8")

response = wdf_urllib.urlopen(request)

data = response.read().decode("utf-8", "replace")

# print(data)

dic = json.loads(data)

SyncKey = dic["SyncKey"]

state = responseState("webwxsync", dic["BaseResponse"])

return state

def heartBeatLoop():

while True:

selector = syncCheck()

if selector != "0":

webwxsync()

time.sleep(1)

def main():

try:

ssl._create_default_https_context = ssl._create_unverified_context

opener = wdf_urllib.build_opener(

wdf_urllib.HTTPCookieProcessor(CookieJar()))

opener.addheaders = [

("User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36")]

wdf_urllib.install_opener(opener)

except:

pass

if not getUUID():

print("获取uuid失败")

return

print("正在获取二维码图片...")

showQRImage()

time.sleep(1)

while waitForLogin() != "200":

pass

os.remove(QRImagePath)

if not login():

print("登录失败")

return

if not webwxinit():

print("初始化失败")

return

MemberList = webwxgetcontact()

print("开启心跳线程")

thread.start_new_thread(heartBeatLoop, ())

MemberCount = len(MemberList)

print("通讯录共%s位好友" % MemberCount)

ChatRoomName = ""

result = []

d = {}

for Member in MemberList:

d[Member["UserName"]] = (Member["NickName"].encode(

"utf-8"), Member["RemarkName"].encode("utf-8"))

print("开始查找...")

group_num = int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))

for i in range(0, group_num):

UserNames = []

for j in range(0, MAX_GROUP_NUM):

if i * MAX_GROUP_NUM + j >= MemberCount:

break

Member = MemberList[i * MAX_GROUP_NUM + j]

UserNames.append(Member["UserName"])

# 新建群组/添加成员

if ChatRoomName == "":

(ChatRoomName, DeletedList, BlockedList) = createChatroom(

UserNames)

else:

(DeletedList, BlockedList) = addMember(ChatRoomName, UserNames)

# todo BlockedList 被拉黑列表

DeletedCount = len(DeletedList)

if DeletedCount > 0:

result += DeletedList

# 删除成员

deleteMember(ChatRoomName, UserNames)

# 进度条

progress = MAX_PROGRESS_LEN * (i + 1) / group_num

print("[", "#" * progress, "-" * (MAX_PROGRESS_LEN - progress), "]", end=" ")

print("新发现你被%d人删除" % DeletedCount)

for i in range(DeletedCount):

if d[DeletedList[i]][1] != "":

print(d[DeletedList[i]][0] + "(%s)" % d[DeletedList[i]][1])

else:

print(d[DeletedList[i]][0])

if i != group_num - 1:

print("正在继续查找,请耐心等待...")

# 下一次进行接口调用需要等待的时间

time.sleep(INTERFACE_CALLING_INTERVAL)

# todo 删除群组

print("\n结果汇总完毕,20s后可重试...")

resultNames = []

for r in result:

if d[r][1] != "":

resultNames.append(d[r][0] + "(%s)" % d[r][1])

else:

resultNames.append(d[r][0])

print("---------- 被删除的好友列表(共%d人) ----------" % len(result))

# 过滤emoji

resultNames = map(lambda x: re.sub(r"<span.+/span>", "", x), resultNames)

if len(resultNames):

print("\n".join(resultNames))

else:

print("无")

print("---------------------------------------------")

# windows下编码问题修复

#/heyuxuanzee/article/details/8442718

class UnicodeStreamFilter:

def __init__(self, target):

self.target = target

self.encoding = "utf-8"

self.errors = "replace"

self.encode_to = self.target.encoding

def write(self, s):

if type(s) == str:

s = s.decode("utf-8")

s = s.encode(self.encode_to, self.errors).decode(self.encode_to)

self.target.write(s)

if sys.stdout.encoding == "cp936":

sys.stdout = UnicodeStreamFilter(sys.stdout)

if __name__ == "__main__":

print("本程序的查询结果可能会引起一些心理上的不适,请小心使用...")

main()

print("回车键退出...")

以上所述是基于Python实现微信搜索查看谁把你删除了的相关内容,希望对大家有所帮助。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。