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

2019年1月25日 Jerry 6933 2019年6月22日

      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

微信
jerry微信赞助
支付宝
jerry支付宝赞助

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

0 人参与 | 0 条评论