python与微信的那点事

前言

最近想学python,因此就在网上找了点关于python有趣的例子来学学,本文的代码很多都是copy,我只是想总结一下 ^-^

以下展示一个用户日志的json格式数据

[{
'UserName': '@8fdbd07d46ecc1f46891684b46281227488b5b7d4459a156ac84b7beda00a603',
'City': '',
'DisplayName': '',
'PYQuanPin': 'Gedeon',
'RemarkPYInitial': '',
'Province': '',
'KeyWord': '',
'RemarkName': '',
'PYInitial': 'GEDEON',
'EncryChatRoomId': '',
'Alias': '',
'Signature': '',
'NickName': 'Gedeon',
'RemarkPYQuanPin': '',
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=620790952&username=@8fdbd07d46ecc1f46891684b46281227488b5b7d4459a156ac84b7beda00a603&skey=@crypt_ba50f405_373f914b6b682da1b402322602fc8617',
'UniFriend': 0,
'Sex': 1,
'AppAccountFlag': 0,
'VerifyFlag': 0,
'ChatRoomId': 0,
'HideInputBarFlag': 0,
'AttrStatus': 105381,
'SnsFlag': 17,
'MemberCount': 0,
'OwnerUin': 0,
'ContactFlag': 1,
'Uin': 680213541,
'StarFriend': 0,
'Statues': 0,
'MemberList': [],
'WebWxPluginSwitch': 0,
'HeadImgFlag': 1,
'IsOwner': 0

},

1、分析好友性别

本部分主要爬去用户的性别信息,然后分析比例,最后会用饼图的形式进行展示。

1.1 代码展示

def parse_friedns():
    # 扫码登录
    itchat.login()
    text = dict()
    # 获取所有的好友信息
    friedns = itchat.get_friends(update=True)[0:]
    # 打印所有好友信息,即为上面的json格式数据
    print(friedns)
    male = "male"
    female = "female"
    other = "other"
    # 其中 标志位为1表示为男,标志位为2表示女。还有未知的。。。
    for i in friedns[1:]:
        sex = i['Sex']
        if sex == 1:
            text[male] = text.get(male, 0) + 1
        elif sex == 2:
            text[female] = text.get(female, 0) + 1
        else:
            text[other] = text.get(other, 0) + 1
    total = len(friedns[1:])
    print("男性好友: %.2f%%" % (float(text[male]) / total * 100) + "\n" +
          "女性好友: %.2f%%" % (float(text[female]) / total * 100) + "\n" +

          "不明性别好友: %.2f%%" % (float(text[other]) / total * 100))
    print(text)
    # 调用画图 方法
    draw(text)

def draw(datas):
    l =[]
    for key in datas.keys():
        l.append(datas[key])
    # 定义饼图的标签
    names = ['male','female','unkonw']
    # 模拟饼图数值
    num = [134, 93, 6]
    # 第二块离开圆心0.06
    exp =[0,0.06,0]
    fig = plt.figure()
    plt.pie(l,explode=exp,labels=names,autopct='%1.2f%%')
    # 设置标签格式
    plt.title('Gedeon\'s sex analyze', bbox={'facecolor': '0.8', 'pad': 5})
    plt.show()

结果展示

男性好友: 56.60%
女性好友: 40.85%
不明性别好友: 2.55%
{'female': 96, 'male': 133, 'other': 6}

python与微信的那点事_第1张图片

2、好友地域分析

地域分析中,我网上查找资料,参考使用了echarts,即程序输出的结果定义为json格式,符合echarts的数据输入格式

2.1 代码展示

def map():
    #爬取好友地域分析,并使用地图格式来显示

    # 使用一个字典统计各省好友数量
    province_dict = {'北京': 0, '上海': 0, '天津': 0, '重庆': 0,
        '河北': 0, '山西': 0, '吉林': 0, '辽宁': 0, '黑龙江': 0,
        '陕西': 0, '甘肃': 0, '青海': 0, '山东': 0, '福建': 0,
        '浙江': 0, '台湾': 0, '河南': 0, '湖北': 0, '湖南': 0,
        '江西': 0, '江苏': 0, '安徽': 0, '广东': 0, '海南': 0,
        '四川': 0, '贵州': 0, '云南': 0,
        '内蒙古': 0, '新疆': 0, '宁夏': 0, '广西': 0, '西藏': 0,
        '香港': 0, '澳门': 0}

    # 统计省份
    bot = Bot()
    my_friends = bot.friends()
    for friend in my_friends:
        if friend.province in province_dict.keys():
            province_dict[friend.province] += 1

    # 为了方便数据的呈现,生成JSON Array格式数据
    data = []
    for key, value in province_dict.items():
        data.append({'name': key, 'value': value})

    print(data)

2.2 结果展示

[{
'name': '北京',
'value': 19
}, {
    'name': '上海',
    'value': 3
}, {
    'name': '天津',
    'value': 34
}, {
    'name': '重庆',
    'value': 3
}, {
    'name': '河北',
    'value': 2
}, {
    'name': '山西',
    'value': 1
}, {
    'name': '吉林',
    'value': 0
}, {
    'name': '辽宁',
    'value': 1
}, {
    'name': '黑龙江',
    'value': 0
}, {
    'name': '陕西',
    'value': 1
}, {
    'name': '甘肃',
    'value': 1
}, {
    'name': '青海',
    'value': 2
}, {
    'name': '山东',
    'value': 2
}, {
    'name': '福建',
    'value': 2
}, {
    'name': '浙江',
    'value': 13
}, {
    'name': '台湾',
    'value': 0
}, {
    'name': '河南',
    'value': 58
}, {
    'name': '湖北',
    'value': 1
}]

然后点击echarts 复制上面的结果,替换 页面中左边的var data中的值
python与微信的那点事_第2张图片

3、个性签名词云

本部分主要通过python爬去用户的个性化签名,然后使用结巴分词对个性化签名进行分词。按照词频会在词云中显示不一样的大小,具体结巴分词的使用可以看这里

3.1 代码展示

# 爬取好友个性签名
def parse_signature():
     # 扫码登录
    itchat.login()
    siglist = []
    friedns = itchat.get_friends(update=True)[1:]
    for i in friedns:
        # 使用正则对个性化签名进行清洗 包括取出空格,表情
        signature = i["Signature"].strip().replace("span", "").replace("class", "").replace("emoji", "")
        rep = re.compile("1f\d+\w*|[<>/=]")
        signature = rep.sub("", signature)
        siglist.append(signature)
    text = "".join(siglist)
    with io.open('text.txt', 'a', encoding='utf-8') as f:
        wordlist = jieba.cut(text, cut_all=True)
        word_space_split = " ".join(wordlist)
        f.write(word_space_split)
        f.close()

#根据爬取的好友个性签名绘制词云
def draw_signature():
    text = open(u'text.txt', encoding='utf-8').read()
    #词云的背景图,一般背景图的地板要纯白色
    coloring = np.array(Image.open('shade.jpg'))
    #绘制词云,词云图片的北京为黑色,尺寸等,字体样式为 simhei.ttf
    my_wordcloud = WordCloud(background_color="black",
                         mask=coloring, max_font_size=60, random_state=42, scale=2,
                         font_path="simhei.ttf").generate(text)
    image_colors = ImageColorGenerator(coloring)
    # plt.imshow(my_wordcloud.recolor(color_func=image_colors))
    plt.imshow(my_wordcloud)
    plt.axis("off")
    # 存储为图片
    plt.savefig("demo.jpg",dpi=200)
    plt.show()

3.2 结果展示

python与微信的那点事_第3张图片

4、头像拼图

爬去好友头像,然后拼接成一张图片

4.1 代码展示

itchat.login()
friends = itchat.get_friends(update=True)[0:]
user = friends[0]["UserName"]
os.mkdir(user)
num = 0
# 通过循环获取好友的头像
for i in friends:
    img = itchat.get_head_img(userName=i["UserName"])
    fileImage = open(user + "/" + str(num) + ".jpg",'wb')
    fileImage.write(img)
    fileImage.close()
    num += 1
pics = listdir(user)
numPic = len(pics)
print(numPic)
# 通过好友数量来计算每行和每列要展示的图片数量
eachsize = int(math.sqrt(float(640 * 640) / numPic))
print(eachsize)
numline = int(640 / eachsize)
# 创建一个新的图像
toImage = Image.new('RGB', (618, 657))
print(numline)
x = 0
y = 0
for i in pics:
    try:
        #打开图片
        img = Image.open(user + "/" + i)
    except IOError:
        print("Error: 没有找到文件或读取文件失败")
    else:
        #缩小图片
        img = img.resize((eachsize, eachsize), Image.ANTIALIAS)
        #拼接图片
        toImage.paste(img, (x * eachsize, y * eachsize))
        x += 1
        if x == numline:
            x = 0
            y += 1
toImage.save(user + ".jpg")

4.2 结果展示

python与微信的那点事_第4张图片

5、图灵机器人

首先 去图灵 申请你得专属机器人,然后你在机器人设置找到一个 API key 。 本程序启动后会 对所有收到的信息自动回复,包括群里的消息,所以慎重

5.1 代码展示

#向图灵机器人申请,然后会获得一个 API KEY 请替换为你得
key ="f4f4cafaac86464082acebd30b153b94"

def get_response(msg):
    # 构造了要发送给服务器的接口
    #使用图灵机器人提供的接口
    apiUrl = 'http://www.tuling123.com/openapi/api'
    # 一个发动的api的数据
    data={
        'key' :key,
        'info':msg,
        'userid':'wechat-robot'
    }
    try:
        # 使用post方法去请求
        r=requests.post(apiUrl,data=data).json()
        # 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
        return r.get('text')
        # 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
        # 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
    except:
        return
# 使用装饰器
@itchat.msg_register(itchat.content.TEXT)
#获取图灵机器人返回的数据
#处理图灵机器人出现异常的时候
def tuling_reply(msg):
    # 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复
    defaultReply = 'I received: ' + msg['Text']
    # 如果图灵Key出现问题,那么reply将会是None
    reply = get_response(msg['Text'])
    # a or b的意思是,如果a有内容,那么返回a,否则返回b
    # 有内容一般就是指非空或者非None,你可以用`if a: print('True')`来测试
    return reply or defaultReply

# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动
itchat.auto_login(hotReload=True)
itchat.run()

详细代码在看 这里

python与微信的那点事_第5张图片

你可能感兴趣的:(python)