专题05-python操作微信(wxpy)

笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。

我的公众号为:livandata

python因为其自身的设计优越性,可以方便的操作各种软件平台,微信作为我们平时不可或缺的部分逐渐的凸显他的重要性,但是作为一个日常交互平台,微信当中的数据存在着非常重要的价值,那么,如何利用这部分数据,如何用代码实现微信操作,日益显现出重要性,本篇文章主要是整理微信中常用的一些技巧,希望有些用处:

1、统计微信中的男女比例:

主要是用了wxpy与pyecharts,wxpy是为了链接微信,pyecharts主要是进行图像处理。

from wxpy import *
from pyecharts import Pie
#定义一个微信机器人
bot = Bot(cache_path = True)
#获取更新好友列表
friends = bot.friends(update=False)
male = female = other = 0
#[1:]是因为整个好友列表里面自己是在第一个,排除掉
for i in friends[1:]:
    sex = i.sex
    if sex == 1:
        male += 1
    elif sex == 2:
        female += 1
    else:
        other += 1
#计算总数
total = len(friends[1:])
print(total)
#下面为分析
attr = ["男性","女性","其他"]
v1 = [float(male),float(female),float(other)]
pie = Pie("饼图-圆环图示例", title_pos='center')
pie.add("", attr, v1, radius=[40, 75], label_text_color=None, is_label_show=True,
        legend_orient='vertical', legend_pos='left')
pie.render("sex.html")

运行结果为:

2、查看好友地区分布:

通过程序运行,可以对信息进行图形化处理。

#!/usr/bin/env python
# _*_ UTF-8 _*_
from wxpy import *
from pyecharts import Map
#因为获取的列表城市都没有带市字,而pyecharts需要带个市字
b = '市'
def s(x):
    return x+b
#因为我好友里面除了广东的外和其他的,剩下非广东的寥寥无几,所以只提取广东的
bot = Bot(cache_path = True)
friends = bot.friends(update=False).search(province = '山东')
citys = []
for f in friends :
    city = f.city
    citys.append(city)
r = map(s,citys)
cityss = list(r)
#为城市计数
a = {}
for i in cityss:
    a[i] = cityss.count(i)
print(a)
#把字典进行有序拆分为2个列表
attrs = []
values = []
for value, attr in a.items():
    values.append(attr)
    attrs.append(value)
#开始绘图
map = Map("山东地图示例", width=1200, height=600)
map.add("", attrs, values, maptype='山东', is_visualmap=False, visual_text_color='#000')
map.render("city.html")

运行结果为:

map的参考资料为:

https://blog.csdn.net/m0_37360684/article/details/84873019

https://blog.csdn.net/m0_37360684/article/details/84874640

地图不显示问题:

https://blog.csdn.net/xiamoyanyulrq/article/details/80025105

3、查看好友签名并做词云图:

#!/usr/bin/env python
# _*_ UTF-8 _*_

from wxpy import *
import re
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import PIL.Image as Image

bot = Bot(cache_path = True)
friends = bot.friends(update=False)
male = female = other = 0

#提取好友签名,并去掉span,class,emoji,emoji1f3c3等的字段
signatures = []
for i in friends:
    signature = i.signature.strip().replace("span", "").replace("class", "").replace("emoji", "")
# 正则匹配过滤掉emoji表情,例如emoji1f3c3等
    rep = re.compile("1f\d.+")
    signature = rep.sub("", signature)
    signatures.append(signature)
# 拼接字符串
text = "".join(signatures)
# jieba分词
wordlist_jieba = jieba.cut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)

# wordcloud词云
my_wordcloud = WordCloud(background_color="white",
                         max_words=2000,
                         max_font_size=1000,
                         random_state=42,
                         font_path='./simsun.ttc').generate(wl_space_split)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()

分析了一下我的好友签名,结果为:

难以想象,我的朋友圈是有多正能量。

4、给好友发送信息:

这段代码可以定时循环的向你的好友发送信息,也可以批量发送

#!/usr/bin/env python
# _*_ UTF-8 _*_
import wxpy,time
def get_next():
    new_text = "you were hacked by me,give me money"
    return new_text

def Dingshi():
    '''找到好友并发送信息'''
    try:
        # 打开微信,读取cooker信息cache_path=True。
        bot = wxpy.Bot(cache_path=True)
        # 从好友中找到要发送的具体的那个人
        my_friend = bot.friends().search(u'愤怒***')[0]
        print(my_friend)
        # 在登录后调用获取获取发送信息函数
        a = get_next()
        print(a)
        # 发送信息
        my_friend.send(a)
    except:
        pass
if __name__ == '__main__':
    for i in range(10):
        time.sleep(10)
        Dingshi()

5、微信自动回复功能:

如果需要添加条件,则可以在两个方法中添加:

#!/usr/bin/env python
# _*_ UTF-8 _*_

import itchat
from itchat.content import *

# 如果对方发的是文字,则我们给对方回复以下的东西
@itchat.msg_register([TEXT])
def text_reply(msg):
    itchat.send(('那我就祝你狗年大吉大利,新的一年事事顺心'),
                    msg['FromUserName'])

# 如果对方发送的是图片,音频,视频和分享的东西我们都做出以下回复。
@itchat.msg_register([PICTURE, RECORDING, VIDEO, SHARING])
def other_reply(msg):
    itchat.send(('那我就祝你狗年大吉大利,新的一年事事顺心'),
                msg['FromUserName'])

itchat.auto_login(hotReload=True)
itchat.run()

6、交互机器人:

一般在使用微信时会存在自动回复,以及与机器人的交互等功能,主要是调用了微信的机器人。

from wxpy import *
import csv
# 自动添加好友的条件
addfriend_request = '加好友'
# 定义管理员微信名(必须是机器人的好友)
# ps:raw_content字段需要自己手动更改微信名,微信号
admin_request_name = '胥京波'
#定义管理员微信号(必须是机器人的好友)
admin_request_num = 'wxjb_710517539'
invite_text = "Helo!回复'功能 + 数字'获取对应功能\n1.我要加群\n2.我要加入协会\n3.我要购买鞋子\n4.了解我们\n5.我需要帮助\n例如:要获取我要加群的功能时回复\n\n功能1"  #任意回复获取的菜单
#定义要查找群的名字
group_name = '17中南轮滑协会萌新裙'
#菜单选项1 定义加群的条件
menu_1 = '功能1'
#菜单选项2
menu_2 = '功能2'
#菜单选项3
menu_3 = '功能3'
#菜单选项4
menu_4 = '功能4'
#菜单选项5
menu_5 = '功能5'
#表格1
csv_1 = 'test.csv'

bot = Bot(cache_path = True)
#启用聊天对象的puis属性
bot.enable_puid()
#小i机器人接口
xiaoi = XiaoI('PQunMu3c66bM', 'FrQl1oi1YzpDSULeAIit')
adminer = bot.friends(update=True).search(admin_request_name)[0]
my_group = bot.groups(update=True).search(group_name)[0]
group_admin = my_group.members.search(admin_request_name)[0]

#不可变集合
admin_puids = frozenset(['XX', 'YY'])
admins = list(map(lambda x: bot.friends().search(puid=x), admin_puids))

def invite(user):
    # sorted用于排序,lambda x:x.name用于群名排序
    groups = sorted(bot.groups(update=True).search(group_name),
                    key=lambda x: x.name)
    if len(groups) > 0:
        for group in groups:
            if len(group.members) == 500:
                continue
            if user in group:
                # 经过format格式化的内容传递到{}
                content = "您已经加入了{} [微笑]".format(group.nick_name)
                user.send(content)
            else:
                group.add_members(user, use_invitation=True)
            return
        else:
            # 当前群的名字后面+1
            next_topic = group_tmpl.format(re.search(r'\d+', s).group() + 1)
            new_group = bot.create_group(admins, topic=next_topic)
            #以上3句代码的解释为:利用for if else语句进行判断,如果从查找的群名里面找不到对应的群就自动创建一个新群并添加进去
    else:
        print('Invite Failed')

#写表函数
def table(user, text):
    #提取用户的文本,把有用的写入表里
    msg_text = text
    tables = msg_text.split('\n')
    table_name = tables[1].split(':')[1]
    table_stu_num = tables[2].split(':')[1]
    table_phone_num = tables[3].split(':')[1]
    table_department = tables[4].split(':')[1]
    table_list = [table_name,
                  table_stu_num,
                  table_phone_num,
                  table_department,
                  '等待缴费']
    user.send('请稍等,后台处理中')
    # 检查表里是否有登记的学号
    with open(csv_1, 'r') as f:
        fr_csv = csv.reader(f)
        for row in fr_csv:
            if table_stu_num in row:
                user.send('报名失败,该学号已经登记过了')
                break
        else:
            # 写入表
            with open(csv_1, 'a') as f:
                fw_csv = csv.writer(f)
                fw_csv.writerow(table_list)
                # 查看是否写入成功
            with open(csv_1, 'r') as f:
                fr_csv = csv.reader(f)
                for row in fr_csv:
                    if table_stu_num in row:
                        user.send('报名成功,请回复‘支付宝’或者‘微信’进行支付')
                        break
                else:
                    user.send('报名失败,请重新报名或者联系管理员')

#查询表函数
def check(user, text):
    check_text = text.split(':')[1]
    with open(csv_1, 'r') as f:
        fr_csv = csv.reader(f)
        for row in fr_csv:
            if check_text in row:
                user.send('登记信息如下,如有疑问请联系管理员')
                user.send('学号:'+row[1]+"\n缴费情况:"+row[-1])
                break
        else:
            user.send('暂无学号登记记录')

# 注册好友请求类消息
@bot.register(msg_types=FRIENDS,enabled=True)
# 自动接受验证信息中包含 'wxpy' 的好友请求
def auto_accept_friends(msg):
    # 判断好友请求中的验证文本
    if addfriend_request in msg.text.lower():
        # 接受好友 (msg.card 为该请求的用户对象)
        new_friend = bot.accept_friend(msg.card)
        # 或 new_friend = msg.card.accept()
        # 向新的好友发送消息
        new_friend.send('机器人自动接受了你的请求,你可以任意回复获取功能菜单,若机器人没回复菜单则表明机器人尚未工作,请等待')

#注册自动回复好友消息
@bot.register(Friend, msg_types=TEXT)
def exist_friends(msg):
    if menu_1 in msg.text.lower():
        invite(msg.sender)
    elif menu_2 in msg.text.lower():
        content_2_1 = "请复制下面的模板回复\nps:部门可以多填,如果是技术部和Hockey就填写 部门:技术部、Hockey\n填写示例:\n姓名:小明\n学号:111111111\n电话:18888888888\n部门:技术部"
        content_2_2 = "报名表\n姓名:\n学号:\n电话:\n部门:"
        msg.sender.send(content_2_1)
        msg.sender.send(content_2_2)
    elif menu_3 in msg.text.lower():
        # 跟报名的功能差不多就不写了。。。
        return '购买鞋子功能测试中'
    elif menu_4 in msg.text.lower():
        msg.sender.send('关注公众号可以了解更多')
        msg.sender.send_raw_msg(
        # 名片的原始消息类型
        raw_type=42,
        # 注意 `username` 在这里应为微信 ID,且被发送的名片必须为自己的好友
        raw_content='<msg username="zdnflunhua" nickname="中大南方RNF"/>'
        )
    elif menu_5 in msg.text.lower():
        # 最初设想是返回从公众号获取的素材,结果没有相对应的Api。只能返回图片,
        # 语音,或者文本了,不过这个就一行代码的事,就不写了
        return '我要帮助功能测试中'
    elif '报名表' in msg.text.lower():
        table(msg.sender, msg.text)
    elif '支付宝' in msg.text.lower():
        msg.sender.send('请进入支付宝扫描二维码支付,备注姓名,电话\n支付完成后请第二天回复“查询:+学生号“查询情况\n示例:\n查询:111111111')
        msg.sender.send('二维码生成中')
        msg.sender.send_image('zfb.png')
    elif '微信' in msg.text.lower():
        msg.sender.send('请进入微信扫描二维码支付,备注姓名,电话\n支付完成后请第二天回复“查询:+学生号“查询情况\n示例:\n查询:111111111')
        msg.sender.send('二维码生成中')
        msg.sender.send_image('wx.png')
    elif '查询' in msg.text:
        check(msg.sender, msg.text)
    elif '管理员' in msg.text:
        msg.sender.send('请添加名片联系管理员')
        msg.sender.send_raw_msg(
        # 名片的原始消息类型
        raw_type=42,
        # 注意 `username` 在这里应为微信 ID,且被发送的名片必须为自己的好友
        raw_content='<msg username="bc9526" nickname="陈思煜"/>'
        )
    else:
        return invite_text

#处理管理员信息
@bot.register(adminer, msg_types=TEXT)
def adminer(msg):
    if '备份' in msg.text:
        msg.sender.send_file('test.csv')
    else:
        return "请检查命令是否输入正确"

#群聊管理
@bot.register(my_group, msg_types=TEXT)
def group(msg):
    if msg.is_at :
        if '踢出' in msg.text:
            if msg.member == group_admin :
                for member_name in msg.text.split('@')[2:]:
                    print(member_name)
                    re_name = my_group.members.search(member_name)[0].remove()
                    print(re_name)
                    msg.sender.send("已经移出:"+member_name)
            else:
                return "你不是管理员不能进行踢人操作"
        else:
            xiaoi.do_reply(msg)
bot.join()

常用的命令即为上面的功能,如果后面有新的功能,会做相应的添加。

发布了137 篇原创文章 · 获赞 93 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/livan1234/article/details/86711044
今日推荐