前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用Python调教微信,实现自动回复 和 微信好友分布,好友性别图,好友标签

用Python调教微信,实现自动回复 和 微信好友分布,好友性别图,好友标签

原创
作者头像
Python疯子
发布于 2018-08-26 17:43:05
发布于 2018-08-26 17:43:05
2.9K0
举报
文章被收录于专栏:Python疯子Python疯子

官方华丽的术语---略

#一个自动回复机器人

微信自上线以来,一直没有自动回复的功能,想必是有他们的理念。但是有些人群,确实对此功能有一定需求,我举两个栗子:

不愿时刻被消息打扰的人

消息需要批量处理的人们(比如微商)

设计了几个功能:

x 收到消息立即自动回复

x 收到消息延迟指定时间回复

x 对不同好友定制不同的回复内容

x 在手机端随时进行控制

itchat的原理是通过扫码进行远程微信网页端的登录,然后通过在移动端进行操作,网页端进行响应,来实现一些功能,虽然似乎绕了个弯子,但是在微信的限制下,这似乎已经是一种最佳的方式了,犹如戴着镣铐起舞。

我们可以先通过设定几个全局变量来做作为功能的开关和保存数据的容器

代码语言:txt
AI代码解释
复制
#自动回复开关
SWITCH_REPLY=True
#延迟回复开关
SWITCH_DELAY=False
#延迟时间
DELAY_TIME=120
#消息前缀开关
SWITCH_PREFIX=True
#消息前缀内容
PREFIX_CONTENT="[自动回复]"
#回复内容字典
REPLY_DICT={}
#延迟回复字典
DELAY_REPLY_DICT={}

然后通过判断web端在”文件管理器“中接收到的字符串指令来进行不同操作,这一部分的代码比较简单且冗长,这里就不贴出来了,完整源码地址将会在文末给出。

假如此时我们收到了朋友的消息,需要程序给出自动回复。

代码语言:txt
AI代码解释
复制
#获取发送消息的朋友的信息
    target_friend=itchat.search_friends(userName = msg['FromUserName'])
    if target_friend:
        #获取ta的昵称
        nickName=target_friend['NickName']
        if not REPLY_DICT.__contains__(nickName):
            #设置默认回复
            REPLY_DICT[nickName]="抱歉我有事暂未看到消息,稍后回复,若有急事可以电话联系(•ω•`)"
        
        reply_content=REPLY_DICT[nickName]
        #判断自动回复开关
        if SWITCH_REPLY:
            #判断延时回复开关
            if SWITCH_DELAY:
                localtime = time.time()
                DELAY_REPLY_DICT[nickName]=[localtime,msg['FromUserName']]
                print (DELAY_REPLY_DICT)
                
            if not SWITCH_DELAY:
                #判断消息前缀开关
                if SWITCH_PREFIX:
                    reply_content = PREFIX_CONTENT + REPLY_DICT[nickName]
                else:
                    reply_content = REPLY_DICT[nickName]
                #发送消息
                itchat.send(reply_content, toUserName=msg['FromUserName'])

收到朋友消息即时进行自动回复是很简单的,但是如何去做延时发送回复消息呢?(至于做这个功能有没有必要的问题可以先搁置,不过我认为在很多场景下是需要这个功能的,大家也可以在评论区讨论在什么场景下需要延迟自动回复)现在就回到技术的问题,如何实现可设置时间的延时自动回复。

我先谈一谈我的想法,抛砖引玉。一般发送消息需要用到队列,进行入队和出队,我在这里设置了一个字典来保存消息发送者的数据。键为消息发送者的昵称,值是一个长度为2的数组,分别保存消息发送者的微信id和接收消息时的时间戳。这样我将每条发送过来的朋友信息保存在这个字典中,再通过将设定延迟时间同消息时间戳求和与当前时间戳进行对比,若当前时间戳较大,那么执行发送消息的操作。

此时再开启一个线程作为定时任务,定时去检测字典中每条数据是否到达了发送的临界要求(当前时间戳>=消息时间戳+设定的延迟时间)Python中有个专门做定时任务的模块叫sched,但是我尝试了一下,sched会阻塞当前主线程,也会阻塞itchat的线程,所以并不合适。这里我还是采用了threading的Timer来充当定时器,不过要注意使用递归,否则将会出现运行一次就结束的情况。

代码语言:txt
AI代码解释
复制
#延迟发送消息的函数
def delay_reply():
    #print("开始执行")
    global DELAY_REPLY_DICT
    if SWITCH_DELAY:
        while len(DELAY_REPLY_DICT)>0:
            localtime = time.time()
            # print (localtime)
            # print (DELAY_REPLY_DICT[item][0])
            # print (int(DELAY_TIME))
            for item in list(DELAY_REPLY_DICT.keys()):
                if SWITCH_REPLY:
                    reply_content = item + "," + str(round(int(DELAY_TIME) / 60, 1)) + "分钟过去了," + REPLY_DICT[item]
                    itchat.send(reply_content, toUserName=DELAY_REPLY_DICT[item][1])
                    # print ("发送消息")
                    del DELAY_REPLY_DICT[item]
            print (DELAY_REPLY_DICT)

    global timer1
    timer1=threading.Timer(DELAY_TIME,delay_reply)
    timer1.start()

到此为止,主要的功能已经实现了,我用一个测试账号对我的微信进行了各种测试,看一下以下截图:

WechatIMG712.jpeg
WechatIMG712.jpeg
WechatIMG710.jpeg
WechatIMG710.jpeg

这时功能基本已经完成了,这就结束了吗?别着急,再想想有没有需要完善一下的地方?用过微信web端的同学应该知道,当web端长期处于未操作的状态下会失去连接。在我们这个情况下,假如你长时间未收到微信消息,后台程序将会与微信失去连接,再次开启需要登上服务器重启程序,这显然非常麻烦。有没有什么简单的解决办法呢?我想到一些应用的后台通常会做一道心跳检测机制,那我就模仿这个思路,定时给我的”文件管理器“发一个字符串,来保持连接。

代码语言:txt
AI代码解释
复制
def keep_alive():
text="保持登录"
itchat.send(text, toUserName="filehelper")
global timer2
timer2 = threading.Timer(60*60,keep_alive)
timer2.start()
最后,我们需要将这个程序发布在服务器上,让它全天候为我的微信服务。
image
image

这里需要注意,如果仅用python xxxx.py来运行的话,关闭shell会导致进程结束,所以我们需要使用nohup python xxxx.py &来全方位守护进程,这里啰嗦一句,nohup和&的功能是不一样的,很多人容易混淆,感兴趣的话可以去查下资料区分一下。

到此,微信经过了我们的稍稍调教,已经乖了一点。但是,这远远不够,思路可以继续拓展,比如实现通过手机微信来控制电脑的开关机,电脑软件的启动关闭,都是可以的,甚至实现控制家中的空调,理论上也未尝不可,只是比较有难度。

#简单分析微信好友信息

上文提到,既然我们能通过itchat来获取好友的信息,name自然会有很多好玩的信息(这里不做具体解析)。

性别比例

代码语言:txt
AI代码解释
复制
def get_sex():
# 获取好友数据
my_friends = itchat.get_friends(update=True)[0:]
sex = {"male": 0, "female": 0, "other": 0}
for item in my_friends[1:]:
    s = item["Sex"]
    if s == 1:
        sex["male"] += 1
    elif s == 2:
        sex["female"] += 1
    else:
        sex["other"] += 1
total = len(my_friends[1:])

# 开始画饼图
attr = list(sex.keys())
v1 = list(sex.values())
pie = Pie("好友性别比例")
pie.add("", attr, v1, v1, is_label_show=True)
pie.render(path="sex_html/sex.html")
性别比例
性别比例

全国好友省级分布

代码语言:txt
AI代码解释
复制
def friends_province():
# 获取好友省份
province= get_data("Province")
# 分类
province_distribution = {}
for item in province:
    #删除英文省份,因为中国地图表中没有
    if bool(re.search('[a-z]',item)):
        continue
    elif not province_distribution.__contains__(item):
        province_distribution[item] = 1
    else:
        province_distribution[item] += 1
#将省份名为空的删除
province_distribution.pop('')
#提取地图接口需要的数据格式
# print(province_distribution)
province_keys=province_distribution.keys()
province_values=province_distribution.values()

return province_keys,province_values

注意:这里需要自己安装地图,否则会只显示南海诸岛问题,https://cloud.tencent.com/developer/article/1330754

解决方案,手动安装地图

  1. 全球国家地图echarts-countries-pypkg (1.9MB): 世界地图和 213 个国家,包括中国地图
  2. 中国省级地图echarts-china-provinces-pypkg (730KB):23 个省,5 个自治区
  3. 中国市级地图echarts-china-cities-pypkg (3.8MB):370 个中国城市

需要这些地图的朋友,可以装 pip 命令行:

代码语言:txt
AI代码解释
复制
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg

特别注明,中国地图在 echarts-countries-pypkg 里。

全国好友分布
全国好友分布

好友标签

代码语言:txt
AI代码解释
复制
def friends_signature():
signature = get_data("Signature")
wash_signature=[]
for item in signature:
    #去除emoji表情等非文字
    if "emoji" in item:
        continue
    rep = re.compile("1f\d+\w*|[<>/=【】『』♂ω]")
    item=rep.sub("", item)
    wash_signature.append(item)

words="".join(wash_signature)

print(wash_signature)

wordlist = jieba.cut(words, cut_all=True)
word_space_split = " ".join(wordlist)

global NickName
global Sex

# print(NickName, Sex)

# 图片的作用:生成的图片是这个图片的两倍大小
# 根据性别选择对应的性别模板图
if Sex == 2:
    coloring = np.array(Image.open("standard/girl.jpg"))
elif Sex == 1:
    coloring = np.array(Image.open("standard/boy.jpg"))
else:
    coloring = np.array(Image.open("standard/num.jpg"))


# simkai.ttf 必填项 识别中文的字体,例:simkai.ttf,
my_wordcloud = WordCloud(background_color="white", max_words=800,
                         mask=coloring, max_font_size=120, random_state=30, scale=2,font_path="fonts/STKAITI.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()

# 保存图片
my_wordcloud.to_file('Signature/signature.png')

说明两点:

1、一定要有标签样版图,生成对应样式

2、要添加识别中文的字体

好友标签
好友标签

Github:https://github.com/silencesmile/Young_WeChart

如果您喜欢,希望能给个小星星

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go调用第三方API通用做法
在最近本人需要调用一些第三方服务,可是有些第三方服务并没有实现Go的官方SDK调用方法,本文将以一个实战案例教会你如何调用99%的第三方api
陈杪秋
2024/07/13
2610
写了 30 多个 Go 常用文件操作的示例,收藏这一篇就够了
Go官方提供的文件操作标准库分散在os、ioutil等多个包中,里面有非常多的方法涵盖了文件操作的所有场景,不过因为我平时开发过程中需要直接操作文件的场景其实并不多,在加上 Go 标准库的文档太难搜索,每次遇到要使用文件函数时都是去 Google 查该怎么用。
KevinYan
2022/04/06
6450
golang net 网络包 常用方法
// OpError is the error type usually returned by functions in the net
IT工作者
2022/07/28
1.3K0
Golang(十二)TLS 相关知识(三)理解并模拟简单代理
0. 前言 前面的介绍我们理解了数字签名等知识,同时学习了 OpenSSL 生成私钥和证书并验证 之前提过我们基于 BitTorrent 协议开发了一个 docker 镜像分发加速插件 中间涉及到了配置 docker 的代理 下面我们简单介绍下 Golang 的 http.transport 配置了网络代理后的网络行为并编写一个简单的代理转发,加深理解代理转发行为 1. http.Transport 配置代理 http 代理配置代码如下: func TLSTransport(caFile string)
西凉风雷
2022/11/23
6970
Golang(十二)TLS 相关知识(三)理解并模拟简单代理
从零开发区块链应用(五)--golang网络请求
理解 HTTP 构建的网络应用只要关注两个端--客户端(client)和服务端(server),两个端的交互来自 client 的 request,以及 server 端的 response。所谓的 http 服务器,主要在于如何接受 client 的 request,并向 client 返回 response。
Tiny熊
2022/02/22
7970
Golang fasthttp实践
原计划学完Golang语言HTTP客户端实践之后,就可以继续了,没想到才疏学浅,在搜资料的时候发现除了Golang SDK自带的net/http,还有一个更牛的HttpClient实现github.com/valyala/fasthttp,据说性能是net/http的10倍,我想可能是有点夸张了,后期我会进行测试,以正视听。
FunTester
2021/10/22
4.1K0
百度语音识别api使用python进行调用
百度语音现在是比较方便的接口,具体说明请看官方文档,本文分两个部分,先是使用python实现录音,然后再使用百度语音api进行识别上传。
十四君
2019/11/28
1.9K0
百度语音识别api使用python进行调用
go语言微信公众号开发后台接口封装
业余时间做了个有意思的小功能,每天早上7点准时给发天气预报,每晚8点发布一条英语说说,提醒自己不能忘记学习。
杨永贞
2020/08/04
2.2K0
万字长文 | Go语言上手-基础语言 | 第三届字节跳动青训营笔记
我们知道字节跳动已经全面拥抱了go语言,最开始公司的后端业务主要是web后端,早期团队非Java背景,C++不太适合在线Web业务,所以最开始的服务都是python的,大概从2014年开始,随着业务体量的增长,python 遇到一些性能问题。
千羽
2022/05/31
1.8K0
万字长文 | Go语言上手-基础语言 |  第三届字节跳动青训营笔记
玩一玩钉钉第三方授权
胖sir:小魔童,我今天收到了一个需求,期望我们做一个第三方登录的功能,用户可以通过第三方授权来登录我们的web
阿兵云原生
2023/02/16
6340
【Golang】对接百度翻译API-golang版本sdk代码
客服消息一键翻译为英文,详细演示效果可以注册唯一客服系统(gofly.v1kf.com),我审核通过后就可以体验了
唯一Chat
2022/07/24
3930
【Golang】对接百度翻译API-golang版本sdk代码
go笔记:go发起http get请求
直接上代码: package requests import ( "bytes" "io" "io/ioutil" "net/http" urltools "net/url" "strings" "time" "git.code.oa.com/bigdata/gobase/logging" ) var trans *http.Transport func init() { trans = &http.Transport{
超级大猪
2019/11/22
1.2K0
最佳实践 | 用腾讯云智能语音打造智能对话机器人
在AI技术的推动下,智能对话机器人逐渐成为我们工作、生活中的重要效率工具,乃至是伙伴,特别是为企业带来最原始最直观的“降本增效”落地实现。
腾讯云AI
2023/04/06
5.6K0
最佳实践 | 用腾讯云智能语音打造智能对话机器人
一文带你搞懂GitHub OAuth(下)
通过OAuth,第三方应用程序可以在用户授权的情况下安全地访问GitHub上的数据,而不需要获取用户的GitHub凭据。
闫同学
2024/01/15
4600
一文带你搞懂GitHub OAuth(下)
第三方微信授权登录APP接入_使用第三方应用打开是什么意思
在微信开放平台 https://open.weixin.qq.com/ 注册成为开发者,具体步骤略
全栈程序员站长
2022/09/20
1.5K0
第三方微信授权登录APP接入_使用第三方应用打开是什么意思
百度人脸识别API Java调用
工具类下载http://pan.baidu.com/s/1jIuo0N8 小Demo查询。 1.官网文档必须看 http://ai.baidu.com/docs 2.在管理中心创建应用及查看相关参数
小帅丶
2018/02/08
4.3K0
百度人脸识别API Java调用
Golang语言 之网络
Go语言标准库里提供的net包,支持基于IP层、TCP/UDP层及更高层面(如HTTP、FTP、SMTP)的网络操作,其中用于IP层的称为Raw Socket。 net包的Dial()函数用于创建网络连接,函数原型如下: func Dial(net, addr string) (Conn, error) 其中net参数是网络协议的名字,addr参数是IP地址或域名;如果连接成功,返回连接对象,否则返回error。 目前,Dial()函数支持如下几种网络协议:"tcp"、"udp"、"ip"、"ip6"等,例
李海彬
2018/03/21
8030
V3手动鉴权失败之Go篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/11/16
1.2K0
V3手动鉴权失败之Go篇
自动监控文件并上传S3对象存储服务器 | Golang
本地平台:Windows 10 专业版 21H2 (19044.1826)、开发语言:go1.18.3 windows/amd64
ZGGSONG
2022/09/23
1.3K0
Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇(内附开发 demo)
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
为少
2021/05/27
1.3K0
Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇(内附开发 demo)
相关推荐
go调用第三方API通用做法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档