最近在学习python的过程中发现了一些比较好玩的东西----------爬取微信好友的信息,并可以制作一些酷炫的效果,比如:统计微信好友男女比例、实现图灵机器人自动回复消息、抓取好友头像并拼接成图、获取好友签名信息并制作成云图等。
itchat是一个开源的微信个人接口,首先我们先安装itchat
方法一:可以使用本命令安装itchat
pip install itchat
方法二(适用于PyCharm):
通过此路径:File--->Settings----> Project Interpreter----> + 搜索itchat安装即可
如果下面的 apikey无法使用的话,可在图灵机器人官网(http://www.tuling123.com/)自己注册一个
import requests
import itchat
apikey = '1841f627d8924f5ba0bb9ca12e76ad71'
# 定义机器人得到消息并获取回复内容的函数
def get_response(msg):
apiUrl = 'http://www.tuling123.com/openapi/api'
data = {
'key' : apikey,
'info': msg,
'userid' : 'wechat-robot'
}
try :
r = requests.post(apiUrl,data).json()
# 字典里的get方法在没有“text”值的时候会返回None,而不会抛出异常
return r.get('text')
except :
# 如果服务器没能正常交互(返回非json或无法来连接),那么return None
return
# 定义机器人回复的函数
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
# 为了保证apikey出现问题时仍旧可以恢复,这里设置一个默认的回复
defaultReply = 'I received : '+ msg['Text']
# 如果apikey出现问题,那么reply将会是None
reply = get_response(msg['Text'])
# a or b 的意思是:如果a有内容,那么返回 a,否则返回 b
return reply or defaultReply
# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动
itchat.auto_login(hotReload=True)
itchat.run()
import itchat
import matplotlib.pyplot as plt
# 登录方法,会弹出二维码,用微信扫描登录
itchat.auto_login()
friends = itchat.get_friends(update=True)
#统计好友的性别,微信中男性为1,女性为2,未知为0
def sex(friends):
total_friends = len(friends)
male = female = other = 0
for friend in friends:
sex = friend['Sex']
if sex == 1:
male = male + 1
elif sex == 2:
female = female + 1
else:
other = other + 1
sex_list = ["男生","女生","不明性别"]
sex_number_list = [male,female,other]
# 此行代码用来设置中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title(friends[0]['NickName'] +'微信中的男女比例')
plt.bar(range(len(sex_list)),sex_number_list,tick_label=sex_list,color="yellow")
plt.show()
print("男性好友 : ", male)
print("女性好友 : ", female)
print("不明性别好友 : ", other)
print("好友总数 ; ", total_friends)
# 调用函数sex()
sex(friends)
import itchat
import os
from os import listdir
import math
import PIL.Image
itchat.auto_login()
friends = itchat.get_friends(update=True)
user = friends[0]["NickName"]
print(user)
# 建立文件夹来装好友的头像----- mkdir()方法用来创建文件夹(目录)
os.mkdir(user)
# 将头像存到一个文件夹下
number = 0
for friend in friends:
img = itchat.get_head_img(userName=friend["UserName"])
fileImage = open(user + "/" + str(number) + ".jpg",'wb')
fileImage.write(img)
fileImage.close()
number += 1
# listdir()方法用于返回指定文件夹下包含的文件或文件夹的名字的列表,在此处就是:每一张图片的名字
pics = listdir(user)
# 获取照片的张数
numberPics = len(pics)
# 设置每张照片的大小
eachsize = int(math.sqrt(float(640*640)/numberPics))
# 获取每一行放置多少张图片
numbline = int(640/eachsize)
# 设置图片的大小为 640*640
toImage = PIL.Image.new("RGBA",(640,640))
x = 0
y = 0
# pic 为每一张图片
for pic in pics:
try:
# 打开图片
img = PIL.Image.open(user + "/" + pic)
except IOError:
print("Error : 没有找到文件或读取文件失败")
else:
# 缩小图片 && ANTIALIAS(抗锯齿)
img = img.resize((eachsize,eachsize),PIL.Image.ANTIALIAS)
#拼接图片 paste()方法,粘贴图片,在拼接图片时将图片一张张粘贴上去
toImage.paste(img, (x * eachsize,y * eachsize))
x += 1
if x == numbline:
x = 0
y += 1
# 保存拼接后的抬头像
toImage.save(user + ".BMP")
# 将拼接好的图片发送给文件传输助手
itchat.send_image(user + ".BMP" , 'filehelper')
import itchat
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
import PIL.Image as Image
import re
# 设置登录方法
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)
# 获取好友签名信息并储存在 siglist 中
siglist = []
for indedx,friend in enumerate(friends):
sigture = friend['Signature']
# 如果存在签名的话
if len(friend['Signature']) > 0:
# 将个性签名中的表情符号去掉(这里没有去除干净,利用正则表达式)
sigture = sigture.replace('span','').replace('class','').replace('emoji','').replace('< =','').replace('"','').replace('>','').replace('>','')
siglist.append(sigture)
# 将siglist中的元素拼接为一个字符串
text = ''.join(siglist)
# jieba(结巴分词:有全模式、精确模式、默认模式、新词识别、搜索引擎模式)
# jieba.cut()所接收的两个参数,第一个参数为需要分词的字符串,第二个为是否采用全模式
word_list = jieba.cut(text, cut_all=True)
# 空格拼接
word_space_split = ' '.join(word_list)
# 字体的颜色为对应路径的背景图片的颜色
coloring = np.array(Image.open("D:/PythonWorkplace/WeChat/image.png"))
# font_path: 字体路径; random_state: 为每个字体返回一个PIL颜色; scale:按照比例放大画布;max_font_size:显示的最大字体的大小
# 如果参数 mask 为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代
my_wordcloud = WordCloud(background_color="white", max_words=2000,
mask=coloring, max_font_size=150, random_state=42, scale=3,
font_path="C:/Windows/Fonts/simkai.ttf").generate(word_space_split)
# 画布的颜色
image_colors = ImageColorGenerator(coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
可承接各种项目,有意者加QQ:1217898975