标签归档:微信

Python 企业微信群通知原来这么简单

上次介绍了如何通过钉钉进行群通知,有同学反馈自己更习惯使用企业微信或公司使用了企业微信,希望也能出个基于Python的企业微信的群通知教程,于是便有了本文。

事实上两者的配置方法和使用方法非常相似,都是通过机器人进行通知,下面就教大家如何使用Python对企业微信进行群通知。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install requests

2.配置企业微信机器人

为了能够通过Python发送企业微信通知,首先我们需要在企业微信群聊(这个群里可以只有你和机器人)中添加一个群机器人:

然后填写机器人名称:

最后会获得一个webhook地址:

通过这个webhook地址,我们就能通过Python给企业微信发送通知了。

3.Python 发送企业微信通知

通过requests模块对webhook地址发送post请求就能发送通知:

# 公众号:Python实用宝典
import requests
def send_weixin(content):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "text",
        "text": {
            "content": content,  # 让群机器人发送的消息内容。
            "mentioned_list": [],
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("人工智能: 175")

效果如下:

在 menthoned_list 参数中,你还可以增加 @所有人 的选项:

# 公众号:Python实用宝典
import requests
def send_weixin(content):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "text",
        "text": {
            "content": content,  # 让群机器人发送的消息内容。
            "mentioned_list": ["@all", ],  # @全体成员
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("人工智能: 175")

这样会在消息发出的同时,提醒所有人查看信息。

此外,机器人的msgtype支持文本(text)、markdown(markdown)、图片(image)、图文(news)四种消息类型。

Markdown的发送方法如下:

# 公众号:Python实用宝典
import requests
def send_weixin_md(content):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "markdown",
        "markdown": {
            "content": content,
            "mentioned_list": ["@all", ],  # @全体成员
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("实时新增用户反馈<font color=\"warning\">132例</font>,请相关同事注意。\n
         >类型:<font color=\"comment\">用户反馈</font>
         >普通用户反馈:<font color=\"comment\">117例</font>
         >VIP用户反馈:<font color=\"comment\">15例</font>")

如果你需要发单独的图片,请使用image类型,并将图片的md5和base64传入到image参数,完整的data的格式如下:

# 公众号:Python实用宝典
import requests
def send_weixin_images(MD5, base64data):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "image",
        "image": {
            "base64": base64data,
            "md5": MD5
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin(MD5, base64data)

注:图片(base64编码前)最大不能超过2M,支持JPG,PNG格式,效果如下:

图文类型你只需要配置图片、说明文字及跳转链接,也非常方便:

# 公众号:Python实用宝典
import requests
def send_weixin_images(title, description, url, picurl):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "news",
        "news": {
           "articles" : [
               {
                   "title" : title,
                   "description" : description,
                   "url" : url, 
                   "picurl" : picurl
               }
            ]
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("中秋节礼品领取", "今年中秋节公司有豪礼相送", "www.qq.com", "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png")

怎么样,上述四种通知类型中有你需要的吗?有的话就赶快拿去使用吧!

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python超简单玩转微信自动回复

今天给大家介绍一个Python模块叫wxpy,它在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展

注意:强烈建议仅使用小号运行机器人!从近期 (17年6月下旬) 反馈来看,使用机器人存在一定概率被限制登录的可能性。主要表现为无法登陆 Web 微信 (但不影响手机等其他平台)。

项目主页

https://github.com/youfou/wxpy

用来干啥

一些常见的场景

  • 控制路由器、智能家居等具有开放接口的玩意儿
  • 运行脚本时自动把日志发送到你的微信
  • 加群主为好友,自动拉进群中
  • 跨号或跨群转发消息
  • 自动陪人聊天
  • 逗人玩

总而言之,可用来实现各种微信个人号的自动化操作

轻松安装

wxpy 支持 Python 3.4-3.6,以及 2.7 版本,假设你已经完成了Python的基本安装,如果没有的话请见这篇教程:Python 安装教程

  1. 从 PYPI 官方源下载安装 (在国内可能比较慢或不稳定):
pip install -U wxpy
  1. 从豆瓣 PYPI 镜像源下载安装 (推荐国内用户选用):
pip install -U wxpy -i "https://pypi.doubanio.com/simple/"

超简单上手

登陆微信:

# 导入模块
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()

其他

强大的wxpy模块还有其他功能哦,比如:

  1. 发送文本、图片、视频、文件
  2. 通过关键词或用户属性搜索 好友、群聊、群成员等
  3. 获取好友/群成员的昵称、备注、性别、地区等信息
  4. 加好友,建群,邀请入群,移出群

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 情人节超强技能 导出微信聊天记录生成词云

明天又双叒叕是一年一度的七夕恋爱节了!

又是一波绝好的机会!恩爱秀起来!

购物车清空!礼物送起来!朋友圈晒起来!

等等! 什么?!

你还没准备好七夕礼物么?

但其实你不知道要送啥?

原来又双叒叕要到了

全民不知道送什么礼物的系列日子了…

哎呦 你们这些

磨人的小(lao)妖(you)精(tiao)!

Python倒是觉得你还可以抢救一下!

说到词云应该不陌生,不知道的童靴往下看

词云,就是把网络文本中出现频率较高

“关键词”予以视觉上的突出

浏览者只要一眼扫过文本就可以领略其主旨 

瞧 这是不是一个有声音、有画面的小爱心~

今天 我们采集情侣们之间的聊天日常

用此制作一份只属于你们的小浪漫!


第一步,我们需要导出自己和对象的数据~

微信的备份功能并不能直接给你导出文本格式,它导出来其实是一种叫sqlite的数据。如果说用网上流传的方法提取文本数据,iOS则需要下载itunes备份整机,安卓则需要本机的root权限,无论是哪种都非常麻烦,在这里给大家介绍一种不需要整机备份和本机root权限,只导出和对象的聊天数据的方法。

那就是使用安卓模拟器导出,这样既能ios/安卓通用,又能够避免对本机造成不良影响,首先需要用电脑版的微信备份你和你对象的聊天记录。以windows系统为例:

1. 下载夜神模拟器
2. 在夜神模拟器中下载微信
3. 使用windows客户端版的微信进行备份,如图左下角
4. 点击备份聊天记录至电脑
5. 手机端选择备份的对象

点击进入下方的选择聊天记录,然后选择和你对象的记录就可以啦

6. 导出完毕后打开模拟器,登录模拟器的微信
登录成功
7. 登录成功后返回电脑版微信登录,打开备份与恢复,选择恢复聊天记录到手机
备份与恢复

8. 勾选我们刚刚导出的聊天记录,并在手机上点击开始恢复

9. 打开夜神模拟器的root权限
10. 用模拟器的浏览器百度搜索RE文件管理器,下载(图一)安装后打开,会弹出对话框让你给予root权限,选择永久给予,打开RE文件管理器(图二),进入以下文件夹(图三), 这是应用存放数据的地方。

/data/data/com.tencent.mm/MicroMsg

图一
图二
图三

然后进入一个由数字和字母组合而成的文件夹,如上 图三 的 4262333387ddefc95fee35aa68003cc5

11. 找到该文件夹下的EnMicroMsg.db文件,将其复制到夜神模拟器的共享文件夹(图四)。
共享文件夹的位置为 /mnt/shell/emulated/0/others ( 图五 ),现在访问windows的 C:\Users\你的用户名\Nox_share\OtherShare 获取该数据文件( EnMicroMsg.db )
图四
图五
12. 导出该数据后,使用一款叫 sqlcipher 的软件读取数据(链接: https://pan.baidu.com/s/1Im3n02yseo-4IxeDY9srqQ 提取码: ka4z)

在这之前,我们还需要知道该数据的密码,根据前人的经验,该密码的公式如下

字符串 ” IMEI (手机序列号) UIN(用户信息号)

将该字符串进行MD5计算后的前七位便是该数据的密码,如 “355757010761231 857456862” 实际上中间没有空格,然后放入MD5计算取前面七位数字,后续会详细介绍。

哇,真是“简单易懂”啊,没关系,接下来告诉大家IMEI和UIN怎么获得。

首先是IMEI,在模拟器右上角的系统设置 —— 属性设置里就可以找得到啦,如图所示。

IMEI

现在我们获得了IMEI号,那UIN号呢?

同样地,用RE文件管理器打开这个文件

/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml

长按改文件,点击右上角的三个点—选择打开方式—文本浏览器,找到default_uin,后面的数字就是了 !

得到这两串数字后,就可以开始计算密码啦,如果我的IMEI是355757010762041,Uin是857749862,那么合起来就是355757010762041857749862,将这串数字放入免费MD5在线计算

得到的数字的前七位就是我们的密码了,像这一串就是 6782538.

如果uin是负的话,可以试试uin拼接手机IMEI码(就是和正的相反,进行拼接),取MD5的32位小写密文前7个字符。再不行就重装模拟器。

然后我们就可以进入我们的核心环节:使用 sqlcipher 导出聊天文本数据!

sqlcipher

点击 File – open database – 选择我们刚刚的数据文件,会弹出框框让你输入密码,我们输入刚刚得到的七位密码,就可以进入到数据了,选择message表格,这就是你与你的对象的聊天记录!

我们可以将它导出成csv文件:File – export – table as csv.

接下来,我们将使用Python代码,将里面真正的聊天内容:content信息提取出来,如下所示。虽然这个软件也允许select,但是它select后不允许导出,非常不好用,因此还不如我们自己写一个:

#!/usr/bin/python
import pandas
import csv, sqlite3
conn= sqlite3.connect('chat_log.db')
# 新建数据库为 chat_log.db
df = pandas.read_csv('chat_logs.csv', sep=",")
# 读取我们上一步提取出来的csv文件,这里要改成你自己的文件名
df.to_sql('my_chat', conn, if_exists='append', index=False)
# 存入my_chat表中

conn = sqlite3.connect('chat_log.db') 
# 连接数据库
cursor = conn.cursor()
# 获得游标
cursor.execute('select content from my_chat where length(content)&lt;30') 
# 将content长度限定30以下,因为content中有时候会有微信发过来的东西
value=cursor.fetchall()
# fetchall返回筛选结果

data=open("聊天记录.txt",'w+',encoding='utf-8') 
for i in value:
    data.write(i[0]+'\n')
# 将筛选结果写入 聊天记录.txt

data.close()
cursor.close()
conn.close()
# 关闭连接

记得把csv文件的编码格式转换成utf-8哦,不然可能会运行不下去:

用记事本打开—文件—另存为—编码改为UTF-8即可

当然你还可以用正则表达式去除以下内容

  1. 微信发送的数据:wxid.*
  2. 表情:\[.*\]

 

不过我觉得这些也是必要的聊天信息之一,留着也无妨,因此在这里就不加入进去啦,有需要的同学可以阅读这个文档

最后得到的文本格式就是一行一句聊天内容,处理后我们就准备好进入下一个环节了!那就是令人激动的!生成词云!!

第二步,根据第一步得到的聊天数据生成词云

1. 导入我们的聊天记录,并对每一行进行分词

聊天记录是一行一行的句子,我们需要使用分词工具把这一行行句子分解成由词语组成的数组,这时候我们就需要用到结巴分词了。

分词后我们还需要去除词语里一些语气词、标点符号等等(停用词),然后还要自定义一些词典,比如说你们之间恩恩爱爱的话,一般结巴分词是无法识别出来的,需要你自行定义,比如说:小傻瓜别感冒了,一般分词结果是

小/傻瓜/别/感冒/了

如果你把“小傻瓜”加入到自定义词典里(我们下面的例子里是mywords.txt),则分词结果则会是

小傻瓜/别/感冒/了

下面对我们的聊天记录进行分词:

# segment.py
import jieba
import codecs
def load_file_segment():
    # 读取文本文件并分词
    jieba.load_userdict("mywords.txt")
    # 加载我们自己的词典
    f = codecs.open(u"聊天记录.txt",'r',encoding='utf-8')
    # 打开文件
    content = f.read()
    # 读取文件到content中
    f.close()
    # 关闭文件
    segment=[]
    # 保存分词结果
    segs=jieba.cut(content) 
    # 对整体进行分词
    for seg in segs:
        if len(seg) &gt; 1 and seg != '\r\n':
            # 如果说分词得到的结果非单字,且不是换行符,则加入到数组中
            segment.append(seg)
    return segment
print(load_file_segment())

在这个函数里,我们使用了codecs打开我们的聊天记录文件,然后进行结巴分词,最终返回一个包含所有词语的数组。记得运行前要安装jieba分词包,默认你已经安装了python3,如果没有请查阅这个文档:安装Python

windows打开CMD/macOS系统打开Terminal 输入:

pip install jieba

安装完成后,在编辑器中输入我们刚刚的Python代码,我将其命名为segment.py,切记在同个目录下放置 聊天记录.txt 及 自定义词表 mywords.txt, 然后在CMD/Terminal中输入命令运行

python segment.py

你就可以看见你们的聊天记录分词后的效果啦

2. 计算分词后的词语对应的频数

为了方便计算,我们需要引入一个叫pandas的包,然后为了计算每个词的个数,我们还要引入一个叫numpy的包,cmd/terminal中输入以下命令安装pandas和numpy:

pip install pandas==0.25.1
pip install numpy

详细的解析我都写在下方的注释里啦,大家可以自行阅读并实践。不过需要注意的是,里面的load_file_segment()是我们第一步里的函数,如果你不知道如何把这两个步骤合在一起,没关系,最后我们会提供一份完整的代码.

import pandas
import numpy
def get_words_count_dict():
    segment = load_file_segment()
    # 获得分词结果
    df = pandas.DataFrame({'segment':segment})
    # 将分词数组转化为pandas数据结构
    stopwords = pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf-8")
    # 加载停用词
    df = df[~df.segment.isin(stopwords.stopword)]
    # 如果不是在停用词中
    words_count = df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
    # 按词分组,计算每个词的个数
    words_count = words_count.reset_index().sort_values(by="计数",ascending=False)
    # reset_index是为了保留segment字段,排序,数字大的在前面
    return words_count
print(get_words_count_dict())

同第一步一样,运行这份代码你就可以看到每个词语及其对应的频数。需要注意的是,这里有个加载停用词的操作,你需要把停用词表放在当前文件夹下,我们这里提供一份停用词表下载:stopwords.txt

3. 生成词云

终于到了最后一部分啦!你是不是开心而又满怀激动的心情呢(滑稽,在这一步开始之前,我们需要先安装需要使用的包,我们需要用到的包有:

pip install matplot
pip install scipy==1.2.1
pip install wordcloud

打开CMD/Terminal 输入以上命令即可安装,加上之前两个步骤的包,有:

pip install jieba
pip install codecs
pip install pandas==0.25.1
pip install numpy

如果你在安装这些包的时候出现了什么问题,请记得在我们下方评论区提出,我们会一一解答的哦。

运行目录的文件结构如下:

  • 聊天记录.txt
  • mywords.txt(如果你没有自定义的词的话可以为空)
  • stopwords.txt
  • wordCloud.py
  • ai.jpg (可以为任意的图片,你喜欢就行)

完整代码,wordCloud.py 如下,附有详细的解析(simhei字体可在此下载):

# coding:utf-8
import jieba
import numpy
import codecs
import pandas
import matplotlib.pyplot as plt
from scipy.misc import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from wordcloud import WordCloud

def load_file_segment():
    # 读取文本文件并分词
    jieba.load_userdict("mywords.txt")
    # 加载我们自己的词典
    f = codecs.open(u"聊天记录.txt",'r',encoding='utf-8')
    # 打开文件
    content = f.read()
    # 读取文件到content中
    f.close()
    # 关闭文件
    segment=[]
    # 保存分词结果
    segs=jieba.cut(content) 
    # 对整体进行分词
    for seg in segs:
        if len(seg) &gt; 1 and seg != '\r\n':
            # 如果说分词得到的结果非单字,且不是换行符,则加入到数组中
            segment.append(seg)
    return segment

def get_words_count_dict():
    segment = load_file_segment()
    # 获得分词结果
    df = pandas.DataFrame({'segment':segment})
    # 将分词数组转化为pandas数据结构
    stopwords = pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf-8")
    # 加载停用词
    df = df[~df.segment.isin(stopwords.stopword)]
    # 如果不是在停用词中
    words_count = df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
    # 按词分组,计算每个词的个数
    words_count = words_count.reset_index().sort_values(by="计数",ascending=False)
    # reset_index是为了保留segment字段,排序,数字大的在前面
    return words_count

words_count = get_words_count_dict()
# 获得词语和频数

bimg = imread('ai.jpg')
# 读取我们想要生成词云的模板图片
wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simhei.ttf')
# 获得词云对象,设定词云背景颜色及其图片和字体

# 如果你的背景色是透明的,请用这两条语句替换上面两条 
# bimg = imread('ai.png')
# wordcloud = WordCloud(background_color=None, mode='RGBA', mask=bimg, font_path='simhei.ttf')

words = words_count.set_index("segment").to_dict()
# 将词语和频率转为字典
wordcloud = wordcloud.fit_words(words["计数"])
# 将词语及频率映射到词云对象上
bimgColors = ImageColorGenerator(bimg)
# 生成颜色
plt.axis("off")
# 关闭坐标轴
plt.imshow(wordcloud.recolor(color_func=bimgColors))
# 绘色
plt.show()

值得注意的是这里面的bimg和wordcloud对象的生成,我们知道png格式背景一般是透明的,因此如果你的图像是png格式的话,其生成词云的时候背景色应该设为None,然后mode应该设为RGBA。

我们还可以控制词云字体的大小和数目的多少,使用下面这两个参数:

max_font_size=60, max_words=3000

将其放入 wordcloud = WordCloud(background_color=’white’, mask=bimg, max_font_size=60, max_words=3000, font_path=’simhei.ttf’) 即可

运行前,确保安装了所有的包,并且当前目录下有我们所需要的所有文件哦

下面就可以用我们的聊天记录,画心型词云啦!!!:

CMD/Terminal 进入代码所在文件夹,运行:python wordcloud.py

得到的图像如下:

喜欢吗?喜欢就拿去用吧!

怎么样,是不是很好看,如果你想要这些图片的原图做一个属于自己的词云的话,请访问python实用宝典的官网(https://pythondict.com)的置顶文章,或者点击下方阅读原文直达!还有源代码等着你哦!最后,祝大家有情人众人眷属!七夕完美相会!

​我们的文章到此结束啦!如果你喜欢我们的文章,持续关注Python实用宝典哦!请记住我们的官方网站:https://pythondict.com , 公众号:python实用宝典。