#weixin.py

#coding:utf-8

# !/usr/bin/env python

# coding=utf-8

#通过该程序可以发现被删除的好友

import os

import urllib, urllib2

import re

import cookielib

import time

import xml.dom.minidom

import json

import sys

import math

DEBUG = False

MAX_GROUP_NUM = 35 # 每组人数

QRImagePath = os.getcwd() + '/qrcode.jpg'

tip = 0

uuid = ''

base_uri = ''

redirect_uri = ''

skey = ''

wxsid = ''

wxuin = ''

pass_ticket = ''

deviceId = 'e000000000000000'

BaseRequest = {}

ContactList = []

My = []

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

# 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.weixin.qq.com/qrcode/' + uuid

params = {

't': 'webwx',

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

}

request = urllib2.Request(url=url, data=urllib.urlencode(params))

response = urllib2.urlopen(request)

tip = 1

f = open(QRImagePath, 'wb')

f.write(response.read())

f.close()

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

os.system('open %s' % QRImagePath)

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

os.system('xdg-open %s' % QRImagePath)

else:

os.system('call %s' % QRImagePath)

print '请使用微信扫描二维码以登录'

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

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

elif code == '408': # 超时

pass

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

return code

def login():

global skey, wxsid, wxuin, pass_ticket, BaseRequest

request = urllib2.Request(url=redirect_uri)

response = urllib2.urlopen(request)

data = response.read()

# print data

'''

0

OK

xxx

xxx

xxx

xxx

1

'''

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 skey == '' or wxsid == '' or wxuin == '' or 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 = urllib2.Request(url=url, data=json.dumps(params))

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

response = urllib2.urlopen(request)

data = response.read()

if DEBUG == True:

f = open(os.getcwd() + '/webwxinit.json', 'wb')

f.write(data)

f.close()

# print data

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

def webwxgetcontact():

url = base_uri + '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (pass_ticket, skey, int(time.time()))

request = urllib2.Request(url=url)

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

response = urllib2.urlopen(request)

data = response.read()

if DEBUG == True:

f = open(os.getcwd() + '/webwxgetcontact.json', 'wb')

f.write(data)

f.close()

# print data

dic = json.loads(data)

MemberList = dic['MemberList']

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

SpecialUsers = ['newsapp', 'fmessage', 'filehelper', 'weibo', 'qqmail', 'fmessage', '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', 'wxid_novlwrv3lqwv11', 'gh_22b87fa7cb3c', 'wxitil',

'userexperience_alarm', 'notification_messages']

for i in xrange(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 = []

for UserName in UserNames:

MemberList.append({'UserName': UserName})

url = base_uri + '/webwxcreatechatroom?pass_ticket=%s&r=%s' % (pass_ticket, int(time.time()))

params = {

'BaseRequest': BaseRequest,

'MemberCount': len(MemberList),

'MemberList': MemberList,

'Topic': '',

}

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

# print data

dic = json.loads(data)

ChatRoomName = dic['ChatRoomName']

MemberList = dic['MemberList']

DeletedList = []

for Member in MemberList:

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

DeletedList.append(Member['UserName'])

ErrMsg = dic['BaseResponse']['ErrMsg']

if len(ErrMsg) > 0:

print ErrMsg

return (ChatRoomName, DeletedList)

def deleteMember(ChatRoomName, UserNames):

url = base_uri + '/webwxupdatechatroom?fun=delmember&pass_ticket=%s' % (pass_ticket)

params = {

'BaseRequest': BaseRequest,

'ChatRoomName': ChatRoomName,

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

}

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

# print data

dic = json.loads(data)

ErrMsg = dic['BaseResponse']['ErrMsg']

if len(ErrMsg) > 0:

print ErrMsg

Ret = dic['BaseResponse']['Ret']

if Ret != 0:

return False

return True

def addMember(ChatRoomName, UserNames):

url = base_uri + '/webwxupdatechatroom?fun=addmember&pass_ticket=%s' % (pass_ticket)

params = {

'BaseRequest': BaseRequest,

'ChatRoomName': ChatRoomName,

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

}

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

# print data

dic = json.loads(data)

MemberList = dic['MemberList']

DeletedList = []

for Member in MemberList:

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

DeletedList.append(Member['UserName'])

ErrMsg = dic['BaseResponse']['ErrMsg']

if len(ErrMsg) > 0:

print ErrMsg

return DeletedList

def main():

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))

urllib2.install_opener(opener)

if getUUID() == False:

print '获取uuid失败'

return

showQRImage()

time.sleep(1)

while waitForLogin() != '200':

pass

os.remove(QRImagePath)

if login() == False:

print '登录失败'

return

if webwxinit() == False:

print '初始化失败'

return

MemberList = webwxgetcontact()

MemberCount = len(MemberList)

print '通讯录共%s位好友' % MemberCount

ChatRoomName = ''

result = []

for i in xrange(0, int(math.ceil(MemberCount / float(MAX_GROUP_NUM)))):

UserNames = []

NickNames = []

DeletedList = ''

for j in xrange(0, MAX_GROUP_NUM):

if i * MAX_GROUP_NUM + j >= MemberCount:

break

Member = MemberList[i * MAX_GROUP_NUM + j]

UserNames.append(Member['UserName'])

NickNames.append(Member['NickName'].encode('utf-8'))

print '第%s组...' % (i + 1)

print ', '.join(NickNames)

print '回车键继续...'

raw_input()

# 新建群组/添加成员

if ChatRoomName == '':

(ChatRoomName, DeletedList) = createChatroom(UserNames)

else:

DeletedList = addMember(ChatRoomName, UserNames)

DeletedCount = len(DeletedList)

if DeletedCount > 0:

result += DeletedList

print '找到%s个被删好友' % DeletedCount

# raw_input()

# 删除成员

deleteMember(ChatRoomName, UserNames)

# todo 删除群组

resultNames = []

for Member in MemberList:

if Member['UserName'] in result:

NickName = Member['NickName']

if Member['RemarkName'] != '':

NickName += '(%s)' % Member['RemarkName']

resultNames.append(NickName.encode('utf-8'))

print '---------- 被删除的好友列表 ----------'

print '\n'.join(resultNames)

print '-----------------------------------'

# windows下编码问题修复

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 '本程序的查询结果可能会引起一些心理上的不适,请小心使用...'

print '回车键继续...'

raw_input()

main()

print '回车键结束'

raw_input()

python开发程序知道微信好友是否已读信息吗_python查看微信好友是否删除自己相关推荐

  1. python开发程序知道微信好友是否已读信息吗_用Python来检测微信好友是否拉黑你...

    Python Python开发 Python语言 用Python来检测微信好友是否拉黑你 来自知乎,作者:林萌 链接:https://www.zhihu.com/question/307914345/ ...

  2. python开发程序知道微信好友是否已读信息吗_微商成功神器,python程序员教你,一键分析微信好友近期所有信息...

    好友太多怎么保活 相信做微商的微信好友都会很多,多到很多都成了"僵尸"好友,但是想要成为一个成功的微商,要有两点: 1.好友多,基数决定高度 2."活的"好友多 ...

  3. python开发程序知道微信好友是否已读信息吗_基于Python+adb实现微信是否好友检测...

    本文介绍的基于Python+adb实现的微信好友检测,是通过adb操控手机,模拟人的点击.截屏.然后调用OCR接口实现好友检测,对应用无侵入,无需扫描登录即可实现好友检测.网上看到一些文章类似功能的实 ...

  4. 微信内链接已禁止访问是什么情况?微信链接防封细节

    有时候我们在微信上浏览一些网址的时候会出现这样的情况,比如提示已停止访问该网页,其实提示这个也是为了广大用户的安全着想,毕竟有很多不法网址存在的,但是也由于错杀等原因导致打不开,点击链接提示已禁止访问 ...

  5. 金融快借贷款app下载域名微信内显示已停止访问该网页---被微信封杀或屏蔽的原因及预防措施

    微信官方在对微信中推广活动的第三方网页内容管控越来越严格,如果活动效果稍微好一些,自己的网址域名可能就会被封杀,用户打不开,造成页面流量的损失和客户的流失.搞这个没啥可说的,微信如果不拿出屏蔽手段,任 ...

  6. python源代码程序编译后的文件扩展名是什么_Python源代码程序编译后的文件扩展名为_________。...

    Python源代码程序编译后的文件扩展名为_________. 答:pyc 某合同价格条款规定如下:"每打FOB上海15欧元,总值4500欧元".则此时欧元为 答:计价货币 生态文 ...

  7. 微信支付 postman_微信信用分是什么怎么回事 如何查看微信支付分图文攻略

    [海峡网] 去年 11 月就有报道称,「微信支付分」在广东地区开启了小范围的内测.其实,微信支付分就是类似支付宝芝麻信用的互联网信用服务类产品,未来通过微信支付分,你很有可能在微信上实现免押租借等功能 ...

  8. 安卓微信 返回显示未读条数_Android仿微信底部菜单栏功能显示未读消息数量

    底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏,这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了 ...

  9. 零基础转行如何快速成为一名高薪的Python开发程序员

    现在Python挺火的,很多人都在学,有些零基础的也想加入到这行中,那如果是零基础应该怎么学Python呢?下面,小编带你来了解下. Python对于初学者来说,比起其他编程语言,Python 更容易 ...

最新文章

  1. JQuery读书笔记--JQuery-Form中的AjaxForm和AjaxSubmit的区别
  2. Kafka Architecture
  3. python总结函数图像_PIL使用小结(crop和paste函数)
  4. 单元测试怎么测试线程_单元测试线程代码的5个技巧
  5. android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...
  6. Grasshopper 2.0 MP Color FireWire 1394b (Sony ICX274)
  7. OOP的核心思想是什么?请简述你对OOP的理解
  8. hlw8032功率计测试软件,功率计量芯片LAYOUT指南
  9. PMP-PMBOK(第六版)--49个过程ITTO汇总
  10. windows跨设备实现复制粘贴
  11. fastDB核心心得
  12. from functools import reduce——从典型实例做抓手看reduce函数使用
  13. SnowNLP包情感分析
  14. python微信小程序实例制作入门_python flask零基础打造微信小程序实战教程
  15. 蒲公英内测分发平台是干什么的呢?
  16. AOP注解和切入点表达式
  17. 简述结构化范型和面向对象范型的要点,并分析它们的优缺点。
  18. windows 常用快捷键(常用)
  19. 【100%通过率】华为OD机试真题 C++ 实现【简单的自动曝光】【2022.11 Q4 新题】
  20. 程序员脱发?看看各个创始人的发量?

热门文章

  1. 记录一下自己的头脑风暴
  2. XDOJ 消除类游戏
  3. 完全自主可控三维云CAD:CrownCAD便捷的命令搜索,快速定位所需命令具体位置。
  4. 秀如松柏立青岑,眸若流星透碧空
  5. 一分钟带你了解配置好一切软件环境变量
  6. 0.1+0.2等于多少 详解
  7. 微信扫码支付(模式二)
  8. 贪心算法|柠檬水找零
  9. 穷举法应用-百钱买鸡问题
  10. 2007年金猪年各生肖运势