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