采用开源项目微信机器人wxpy的api,wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展

pip install -U wxpy

登陆微信:

# 导入模块
from wxpy import *

# 初始化机器人,扫码登陆
bot = Bot()
找到好友:
# 搜索名称含有 "游否" 的男性深圳好友
my_friend = bot.friends().search('游否', sex=MALE, city="深圳")[0]

发送消息:

# 发送文本给好友
my_friend.send('Hello WeChat!')

# 发送图片
my_friend.send_image('my_picture.jpg')

自动响应各类消息:

# 打印来自其他好友、群聊和公众号的消息
@bot.register()
def print_others(msg):
    print(msg)

# 回复 my_friend 的消息 (优先匹配后注册的函数!)
@bot.register(my_friend)
def reply_my_friend(msg):
    return 'received: {} ({})'.format(msg.text, msg.type)


# 自动接受新的好友请求
@bot.register(msg_types=FRIENDS)
def auto_accept_friends(msg):
    # 接受好友请求
    new_friend = msg.card.accept()
    # 向新的好友发送消息
    new_friend.send('哈哈,我自动接受了你的好友请求')

保持登陆/运行:

# 进入 Python 命令行、让程序保持运行
embed()

# 或者仅仅堵塞线程
# bot.join()

#encoding=utf-8
from wxpy import *
import numpy
	
def removeAll(the_list, val):
	return [value for value in the_list if value != val]

def stats_text(target_group, group_name):
	print(group_name + "群共有:" + str(len(target_group)) + "人,其中:")
	all_stats_text = []
	all_dict = {}
	
	# 乱序先整理一份省份 + 地点的列表
	for user in target_group.members:
		trimed_data = user.province.replace(' ', '') + user.city.replace(' ', '')
		if trimed_data != '':
			all_stats_text.append(trimed_data)
	# 计数
	for data in all_stats_text:
		if all_stats_text.count(data) != 0:
			all_dict[data] = all_stats_text.count(data)
			all_stats_text = removeAll(all_stats_text, data)		
	final_dict = {}
	for i in sorted(all_dict.keys()):
		final_dict[i] = all_dict[i]
	return final_dict

def stats_sex(target_group):
	male = 0
	female = 0
	other = 0
	
	for user in target_group.members:
		if user.sex == 1:
			male = male + 1
		if user.sex == 2:
			female = female + 1
		else:
			other = other + 1
	
	print("男的有:" + str(male) + "人")
	print("女的有:" + str(female) + "人")
	msg = "男的有:" + str(male) + "人\n" + "女的有:" + str(female) + "人\n"
	return msg

bot = Bot()

target_group = bot.groups(update=True, contact_only=False)

for curr_group in target_group:
	# 小于 10 人的群过滤掉
	if len(curr_group) < 10:
		continue
	curr_group.update_group(members_details=True)
	print(curr_group.name + "一共有:" + str(len(curr_group)) + "人\n")
	msg = stats_sex(curr_group)
	curr_group.send("Sorry, 刚才测试发现有 Bug,再发最后一次哈")
	curr_group.send(curr_group.name + "群,一共有:" + str(len(curr_group)) + "人\n" + msg)


如上述代码,指的是微信群中男女比例分析图。

那么如何用可视化的角度来直观分析数据呢?

推荐
开源工具pyecharts,由Echarts 是一个由百度开源的数据可视化工具而来,Echarts凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。
特性

  • 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
  • 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
  • 可轻松集成至 Flask,Sanic,Django 等主流 Web 框架
  • 多达 400+ 地图文件,并且支持原生百度地图,为地理数据可视化提供强有力的支持

下面以mac平台为例,安装步骤如下(默认python3):

你可以通过以下命令来判断是否已安装:

pip --version
如果你还未安装,则可以使用以下方法来安装:
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 下载安装脚本
$ sudo python3 get-pip.py    # 运行安装脚本。   

# 安装 python3.6 以上版本
$ pip install pyecharts -U

安装过的可以选择性升级pip

pip install -U pip

源码的安装:

# 安装 v1 以上版本
$ git clone https://github.com/pyecharts/pyecharts.git
# 如果需要安装 0.5.11 版本,请使用 git clone https://github.com/pyecharts/pyecharts.git -b v05x
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install

生成HTML

from pyecharts.charts import Bar
from pyecharts import options as opts

# V1 版本开始支持链式调用
bar = (
    Bar()
    .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
    .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
    .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
    .set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))
)
bar.render()

# 不习惯链式调用的开发者依旧可以单独调用方法
bar = Bar()
bar.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
bar.set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))
bar.render()

生成图片


from snapshot_selenium import snapshot as driver

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot


def bar_chart() -> Bar:
    c = (
        Bar()
        .add_xaxis(["a", "b", "c", "d"])
        .add_yaxis("w", [23, 55, 23, 105])
        .add_yaxis("m", [164, 34, 64, 498])
        .reversal_axis()
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片"))
    )
    return c

# 需要安装 snapshot-selenium 或者 snapshot-phantomjs
make_snapshot(driver, bar_chart().render(), "bar.png")

之后,运行即可

注意:使用anocada或者pycharm都可以,但是注意版本的选择,否则报错。