概述

Part I

使用须知:以下教程只适合2018年之前注册且支持登录网页版微信的用户使用。不符合条件的用户无法发起请求,即下述教程及代码无效!

也许你不知道微信还可以这样玩:由于微信给用户开放了一个调用对话等请求的API。于是乎,github上一大神便开发了ItChat开源项目,并进行了封装。ItChat可以干什么呢?不妨往下看看!

Part II

原理:利用爬虫技术和微信网页版的API接口来利用Python模拟登陆网页版微信,可以实现绝大部分网页版微信可以实现的功能,同时也具备网页版微信不具备的能力和乐趣。
功能:可以实现对微信的自动化管理。例如添加、删除好友,查看好友头像图片、昵称、签名,消息转发等。
要求:Python3.6.0以上版本(目前python最新版本3.8.1)
python

安装python完毕后最好在管理员命令提示符中输入`python`检查环境是否配置好,否则后续无法正常操作。

安装配置好python环境后接着看下面,ItChat功能丰富,题主也没有一一分析亲自测试,只是用了少部分功能,以下例举ItChat可以完成的几个工作

part III

下述源码均需要在管理员命令提示符(cmd)中安装itchat函数库后方可使用,请执行以下代码:

python -m pip install --upgrade pip
pip install itchat

词云图的自动生成

利用python爬虫爬取微信朋友圈近期好友发布的动态主题,分析朋友圈近期的生活状态,以朋友前使用频率最高的关键词为例生成词云图。

源码
# coding:utf-8
import itchat
import re
itchat.login()
friends = itchat.get_friends(update=True)[0:]
tList = []
for i in friends:
    signature = i["Signature"].replace(" ", "").replace("span", "").replace("class", "").replace("emoji", "")
    rep = re.compile("1f\d.+")
    signature = rep.sub("", signature)
    tList.append(signature)
text = "".join(tList)
import jieba
wordlist_jieba = jieba.cut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import os
import numpy as np
import PIL.Image as Image
d = os.path.dirname(__file__)
# 更改目录下Wordcloud生成图片,如:./me.jpg
alice_coloring = np.array(Image.open(os.path.join(d, "./me.jpg")))
my_wordcloud = WordCloud(background_color="white", max_words=50000, mask=alice_coloring,
                         max_font_size=2000, random_state=60,
                         font_path='C:\Windows\Fonts\simhei.ttf')\
    .generate(wl_space_split)
image_colors = ImageColorGenerator(alice_coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
my_wordcloud.to_file(os.path.join(d, "me_cloud.png"))
itchat.send_image("me_cloud.png", 'filehelper')
操作步骤

安装运行py的函数库依赖(在cmd中输入以下代码):
1)更新pip依赖:

python -m pip install --upgrade pip

2)依次安装函数库:

pip install jieba
pip install pillow
pip install wordcloud
pip install rb

3)准备一张png/jpg图片作为词云图合成背景(该图片最好轮廓清晰,不要太花里胡哨,像素尽量高,否则效果不佳!),并在源码中修改背景图的路径和和名称。
4)双击py文件即可运行,此时会生成一个二维码图片2QCode,用手机微信扫码登陆,接着就是耐心等待python爬虫爬取和生成词云图。

例如下图作为词云图合成背景:
合成背景图

合成词云图效果

合成效果图

微信自动回复

如果你不在线的时候该程序可以替你秒回复,支持实时显示收到消息的时间节点

import itchat
import time
@itchat.msg_register('Text')
def text_reply(msg):
    if not msg['FromUserName'] == myUserName:
        itchat.send_msg(u"[%s]收到好友@%s 的信息:%s\n" %
                        (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(msg['CreateTime'])),
                         msg['User']['NickName'],
                         msg['Text']), 'filehelper')
        return u'[%s-Digran温馨提示您]\n国家有难,咱不添乱;坐在家里,就是贡献;\n亲戚不走,来年还有;朋友不聚,回头再叙;\n坐在家里,大火烤起;家人一聚,电影看起;\n健康第一,哪都不去;若要出去,口罩带起;\n远离人群,注意身体;隔离疫情,关注消息;\nDigran祝你,健康嗨皮!' % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(msg['CreateTime'])))

if __name__ == '__main__':
    itchat.auto_login()
    myUserName = itchat.get_friends(update=True)[0]["UserName"]
    itchat.run()

微信群发消息

该代码适合用于管理者群发消息或者节日期间,由于微信好友太多没法一一祝福。该代码改变了以往群发消息死板的方式,可以获取微信好友备注,更显得人性化和真诚

#-*- coding:utf-8 -*-
import itchat
from time import sleep
itchat.auto_login()
friends=itchat.get_friends(update=True)[0:]
#myfriends = itchat.get_friends()
m=0
count=0
for i in friends:
    #beizhu1=i['UserName']
    Mark=i['RemarkName']
    if len(Mark)<30 and len(Mark)>1:
        message = '''国家有难,咱不添乱;坐在家里,就是贡献;\n亲戚不走,来年还有;朋友不聚,回头再叙;\n坐在家里,大火烤起;家人一聚,电影看起;\n健康第一,哪都不去;若要出去,口罩带起;\n到处检查,道路封闭;远离人群,注意身体;\n隔离疫情,关注消息;Digran愿你,健康嗨皮!'''
        itchat.send(msg=message, toUserName=i['UserName'])
        count+=1
        print(count)
        print('%s 的祝福已经发出!'% Mark)
        print('发送成功')
        print("\n")
        sleep(0.5)
        m=m+1
        
print('共发出%d条祝福!' % m)

图片转字符

玩过抖音/快手的朋友应该看过有种视频,全是由字符构成的人在跳舞。以下代码不是合成视频,而是把图片转化成字符画。由于本人是用女朋友头像做的实验,不方便展示,敬请见谅!

注意:在运行前需要自己按标注修改成适合你的代码,且可能因缺少必要组件会报错,有疑问可以联系和咨询题主,联系方式见"关于我"页面

import numpy
import matplotlib.pyplot
import cv2
KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]
# 先准备好图片转换后会变成哪些字符,一会儿还会对字符进行排序
charset = ['.', '!', '~', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '+']
# orders用于存放排序后字符的顺序
orders = numpy.zeros(len(charset))
# 计算出每个符号再点阵中有多少个点显示
def numsofone_in_charbytes(text):
    # 先获取字符的ascii码值
    offset = ord(text)
    # 然后打开字库文件找到位置
    with open("./ASC16", "rb") as ASC16:
        location = offset*16
        ASC16.seek(location)
        retbytes = ASC16.read(16)
    # 已经获取到该字符的点阵表示字节retbytes,现在要计算这16字节中有多少个1
    count = 0
    for i in range(len(retbytes)):
        # 对于retbytes中的每一个字节
        for j in range(len(KEYS)):
            if KEYS[j] & retbytes[i]:
                count += 1
    return count
for s in range(len(charset)):
    orders[s] = numsofone_in_charbytes(charset[s])
print(orders)
# 依据这个对点进行排序
# numpy.argsort()可以给出排序后各元素在原来数组中的索引
s = numpy.argsort(orders)
print(s)
# 依据上面的索引重新对charset排序
charsetnew = []
for i in range(len(charset)):
    charsetnew.append(charset[s[i]])
print(charsetnew)
# 排序完成后就可以建立图片像素和字符的映射
# 建立映射并不是简单的一个像素对应一个字符,考虑到图片的大小问题
# 有时需要进行缩放,不然做出来的字符画会过大无法显示
# 这里我们将图片中每16*8大小的一个像素块的平均像素值映射成一个字符
# 先写一个函数,将输入图片都裁剪成宽为8的倍数,高为16的倍数,即去掉右边和下面的余值
def trim_pic(img):
    shape = numpy.shape(img)
    # 如果图片本身的长宽不满足要求就直接返回空
    if shape[0] < 16 or shape[1] < 8:
        return None
    height = shape[0]//16
    width = shape[1]//8
    print(height)
    print(width)
    trimed_pic = img[:height*16, :width*8]
    return trimed_pic
# 裁剪完成后,将图片看成16*8大小像素块的组成,然后计算每一个像素块的平均像素值
# 得到平均像素值的矩阵,其实相当于池化操作,这里的图片一律先转成灰度图再输入
def pool16_8(img):
    # shape,第一个元素是矩阵行数,所以是图片的高
    shape = numpy.shape(img)
    row = shape[0] // 16
    cow = shape[1] // 8
    avgpixel = numpy.zeros((row,cow), dtype=float)
    for i in range(row):
        for j in range(cow):
            # 此处计算各个像素块的平均值
            t = 0.0
            for t1 in range(16):
                for t2 in range(8):
                   t += img[t1+i*16, t2+j*8]
            avgpixel[i, j] = t/(16*8)
    return avgpixel
# 上面的函数完成后,再根据映射将元素替换成字符
def cvt2char(avgpixel, charset):
    # avgpixel是计算后的像素平均值,charset是用于制作字符画的字符集
    chars = len(charset)
    race = 255.0/chars
    shape = numpy.shape(avgpixel)
    retcharmatrix = []
    rowchar = []
    for i in range(shape[0]):
        for j in range(shape[1]):
            # 获取像素的等级
            s = avgpixel[i, j] // race
            # 得到对应的字符
            rowchar.append(charset[int(s)])
        retcharmatrix.append(rowchar[:])
        rowchar.clear()
    return retcharmatrix
# stackoverflow上一位大佬写的彩色图片转换成灰度图的代码
def rgb2gray(rgb):
    return numpy.dot(rgb[..., :3], [0.299, 0.587, 0.114])
# 至此,所有的步骤都完成,下面是用图片做实验了
# 读入一张图片
srcimg = matplotlib.pyplot.imread("D:\itchat\mine.jpg")
# 转换成灰度图
grayimg = rgb2gray(srcimg)
# 先裁剪一下
trimedimg = trim_pic(grayimg)
# 再进行池化平均
pooledimg = pool16_8(trimedimg)
# 再得到转换后的字符矩阵
charpic = cvt2char(pooledimg, charsetnew)
# 简单输出看一下
for r in charpic:
    for c in r:
        print(c, end='')
    print()
'''
t = []
rect_list = []
for i in range(16):
    rect_list.append([])
print(rect_list)
text = ""
# 获取text的gb2312编码
gb2312 = text.encode('gb2312')
print(gb2312)
# 将gb2312转换成十六进制的表示,hex_str是bytes类的实例
hex_str = binascii.b2a_hex(gb2312)
print(type(hex_str))
# 按照UTF-8编码转换成字符串
result = str(hex_str, encoding='utf-8')
# eval()函数执行一个字符串表达式,并返回表达式的值
# 前两位对应汉字的第一个字节:区码
area = eval('0x'+result[:2]) - 0xA0
# 后两位对应汉字的第二个字节:位码
index = eval('0x'+result[2:]) - 0xA0
offset = (94*(area-1) + (index-1)) * 32
front_rect = None
# 读取HZK16的汉字库文件
with open("./HZK16", "rb") as f:
    # 找到text字的字模
    f.seek(offset)
    # 读取该字模
    font_rect = f.read(32)
for k in range(len(font_rect) // 2):
    每两个字节一行,一共16行
    row_list = rect_list[k]
    for j in range(2):
        for i in range(8):
            asc = font_rect[k*2+j]
            flag = asc & KEYS[i]
            row_list.append(flag)

for row in rect_list:
    for i in row:
        if i:
            print('0', end=' ')
        else:
            print('.', end=' ')
    print()
'''

由于篇幅有限,这里只是展示部分代码,喜欢的本文话请给作者赞赏一下,你的赞赏是我坚持的动力!

Last modification:September 29th, 2020 at 08:05 pm
小编饿得写不动了,请给小编加鸡腿