微信也可以自动回复了?使用Python开发微信功能!

在移动社交时代,微信已经成为我们生活不可或缺的一部分。微信自上线以来,一直没有自动回复的功能,想必是有他们的理念。但是有些人群,确实很需要这个功能,例如:

  • 不愿时刻被消息打扰的人
  • 消息需要批量处理的人们(比如微商)

对此,我设计了几个功能:

  • 收到消息立即自动回复
  • 收到消息延迟指定时间回复
  • 对不同好友定制不同的回复内容
  • 在手机端随时进行控制

微信也可以自动回复了?使用Python开发微信功能!

和微信有关的第三方框架很多,比如「wxpy」「wxBot」等,今天要使用的是其中著名的「itchat」Python模块,它是由第三方开发者@LittleCoder等架构实现的接口,该API的使用场景可以不仅仅只是一个微信机器人,更多的功能可以由我们自己去发现拓展。

itchat的功能非常强大,调用却十分简单,同时,将「itchat」结合「matplotlib」「jieba」等模块,可以对我们的微信好友的信息进行一些收集与分析,让我们能更直观的了解我们自己的圈子。itchat的原理是通过扫码进行远程微信网页端的登录,然后通过在移动端进行操作,网页端进行响应,来实现一些功能,虽然似乎绕了个弯子,但是在微信的限制下,这似乎已经是一种最佳的方式了。 

微信也可以自动回复了?使用Python开发微信功能!

首先我们需要考虑别的问题是:程序如何在微信端接收到你的指令。此时出现了一个非常重要的角色:文件管理器。(当网页端微信登陆后,消息列表会出现)此时,文件管理器充当了移动端和web端的桥梁。比如你给文件管理器传一个字符串作为指令,网页端接收到数据后就能根据你的预定来执行相应操作。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#自动回复开关

SWITCH_REPLY=True

#延迟回复开关

SWITCH_DELAY=False

#延迟时间

DELAY_TIME=120

#消息前缀开关

SWITCH_PREFIX=True

#消息前缀内容

PREFIX_CONTENT="[自动回复]"

#回复内容字典

REPLY_DICT={}

#延迟回复字典

DELAY_REPLY_DICT={}

我是一名python开发工程师,整理了一套python的学习资料,从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习、面试真题等。想要的可以进群:688244617免费领取

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#获取发送消息的朋友的信息

  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和接收消息时的时间戳。这样将每条发送过来的朋友信息保存在这个字典中,再通过将设定延迟时间同消息时间戳求和与当前时间戳进行对比,若当前时间戳较大,那么执行发送消息的操作。

此时再开启一个线程作为定时任务,定时去检测字典中每条数据是否到达了发送的临界要求(当前时间戳>=消息时间戳+设定的延迟时间)可以采用threading的Timer来充当定时器,不过要注意使用递归,否则将会出现运行一次就结束的情况。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#延迟发送消息的函数

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()

这时功能基本已经完成了,这就结束了吗?

用过微信web端的同学应该知道,当web端长期处于未操作的状态下会失去连接。在这个情况下,假如你长时间未收到微信消息,后台程序将会与微信失去连接,再次开启需要登上服务器重启程序,这显然非常麻烦。有没有什么简单的解决办法呢?

一些应用的后台通常会做一道心跳检测机制,我们可以模仿这个思路,定时给我的”文件管理器“发一个字符串,来保持连接。

1

2

3

4

5

6

def keep_alive():

 text="保持登录"

 itchat.send(text, toUserName="filehelper")

 global timer2

 timer2 = threading.Timer(60*60,keep_alive)

 timer2.start()

最后,我们需要将这个程序发布在服务器上,让它全天候为我的微信服务。

 

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

觉得文章还可以的话不妨点个赞,有任何意见或者看法欢迎大家评论!