博客动态
Hi!欢迎来到Jerry Coding!喜欢请关注!谢谢!有问题可以留言或者点击下面的QQ交流哦!(最近博主划水中。。更新较慢。。。)
微信扫码

扫一扫关注我

More
关于
New
RSS

itchat打造微信智能助手(一)好友性别、地区统计

Jerry 2019年6月22日 1811  

      itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。将itchat的相关API整合起来,便可以打造一个多功能的微信小助手。

itchat相关的api介绍可以参考:这个链接

       计划实现的相关模块如下:

  • 好友管理
  • 群组管理
  • 消息管理
  • 公众号管理
  • 图灵机器人接入
  • 日志记录
  • 配置读取保存

      本文先实现简单的好友管理模块,主要功能如下:

  • 男女比例
  • 地域分布
  • 显示好友列表
  • 好友删除检测

     这里博主为了方便,没有搞成窗口界面程序,而是使用命令行做了个简单的界面供用户输入选项进行操作。

1、程序框架

      界面就是简单的一个死循环执行print来打印菜单选项,并等待客户的命令输入,对输入做简单的合法性校验。打印菜单时首先判断是否已经登陆,没有登陆提示客户扫码登陆;已登录则显示详细的功能菜单。简单伪代码如下:

def Choose_LoginMenu():
    ......

def Print_LoginMenu():
	print("============================================")
	print("\t\t1: 扫码登陆(windows)")
	print("\t\t2: 扫码登陆(linux)")
	print("\t\t0: 退出程序")
	print("============================================")

def Choose_MainMenu():
    .......

def Print_MainMenu():
	print("============================================")
	print("\t\t1: 好友管理")
	print("\t\t   1.1: 好友性别比例")
	print("\t\t   1.2: 地区分布比例")
	print("\t\t   1.3: 显示好友列表")
	print("\t\t8: 清空屏幕")
	print("\t\t9: 退出登陆")
	print("============================================")


def Print_Menu():
	global g_isLogin

	if g_isLogin == True:  #登陆成功
		Print_MainMenu()
		Choose_MainMenu()
	else:
		Print_LoginMenu()
		Choose_LoginMenu()

def main():
	Print_Menu()

if __name__ == '__main__':
	while(True):
		main()

2、扫码登陆

       当用户选择了扫码登陆后,我们调用login()进行登陆,该函数相关参数定义,都可以在api文档中搜到:

'''
enableCmdQR:开启命令行二维码,后面跟 -1,1,2等可以适应不同命令行环境
picDir:二维码保存路径,将打开一个图片
loginCallback:登陆成功后调用函数
exitCallback:退出登陆后调用函数
'''
def login(self, enableCmdQR=False, picDir=None, qrCallback=None, loginCallback=None, exitCallback=None):
    ....
    raise NotImplementedError()

其次,itchat还提供了一个检测登陆状态的函数,我们用来定时检测:

'''
返回值:
200:登陆成功
201:等待确认登陆
408:扫码超时
0:未知错误
'''
def check_login(self, uuid=None):
    ....
    raise NotImplementedError()

于是,我们新增了一个函数用于登陆成功后获取登陆的微信昵称等功能。代码如下:

def Login_Done():
	global g_isLogin
	getSelfInfo()                               #获取登陆信息
	
	print("登陆成功!")
	g_isLogin = True                            #全局登陆标记位

那么如何获取当前登陆的微信号昵称呢?用到了如下一个函数

def get_friends(self, update=False):
    ....
    raise NotImplementedError()

       这个函数的返回值是一个json,包含你所有好友的相关信息(昵称、备注、性别、地区、签名等等),而里面第一条数据就包含当前登陆的用户信息,我们这里只用了昵称:

def getSelfInfo():
	global g_loginName
	friends = itchat.get_friends(update=True)[0:] #获取好友信息
	g_loginName = friends[0]["NickName"]        #好友首位就是自己,获取昵称

到这里,就已经实现了微信的登陆和状态显示。

 

3、所有好友、性别统计、地区统计

      由于上面的 get_friends 函数已经帮我们轻松获取到了所有的好友信息,所以关于显示所有好友列表、性别、地区的统计就显得很简单了。

def getSexRate():
	global g_isDone
	g_isDone = False
	
	M = F = other = total = 0
	friends = itchat.get_friends(update=True)[0:]
	for i in friends[1:]:
		total += 1
		sex = i["Sex"]
		if sex == 1:
			M += 1
		elif sex == 2:
			F += 1
		else:
			other += 1
	
	table = PrettyTable(["序号", "性别", "总数", "比例(%)"])
	table.add_row(['0', '男生', M, round(((float(M)/total*100)),2)])
	table.add_row(['1', '女生', F, round(((float(F)/total*100)),2)])
	table.add_row(['2', '其他', other, round(((float(other)/total*100)),2)])

	print("分析完成:")
	print(table)
	print("全部好友合计 %d" %total)
	
	g_isDone = True
	return

def Choose_MainMenu():
	global g_isDone, 
	.....
	if c == '1.1':
		print("正在分析,请稍等",end="")
		Thread(target = getSexRate).start()
		while(True):
			if g_isDone == False:
				print(".",end="",flush=True)
				sleep(0.2)
			else:
				break
		
		return

      最终实现效果如下:起一个线程获取数据进行统计,主线程打点计时等待,当有结果时打印结果。这里还使用了prettytable包装结果,显得更直观一些。

      

    地区统计功能实现类似,这里不写了。

     代码上传至 GitHub


原创文章,转载请注明出处: https://jerrycoding.com/article/wechat-tool-1

微信
支付宝

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论

每日一句 (From ONE)
别怕美好的一切消失,咱们先来让它存在。