奇幻果园

博客园 首页 新随笔 联系 订阅 管理

最近在学习一点python,先找了找有趣的应用,实际修改跑了一下提高兴趣程度。

找到itchat,它的简介是这样的:


“itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。

使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。

当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些

该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。

如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。”

http://itchat.readthedocs.io/zh/latest/


 

itchat使用需要先下载安装,安装过程很简单,直接

pip install itchat

我安装的python3.6自带pip,如果没有pip的话我建议升级python。

在网上已经有不少itchat的应用,最简单的就是查找特定用户来发送微信消息。我结合另一个示范将消息扩展了一点:间隔特定时间给特定的好友发送微信消息提醒(久坐提醒?)

代码如下:

 1 #-*-coding:utf8-*-
 2 import itchat
 3 import datetime, os, platform,time
 4 
 5 def timerfun(sched_time) :
 6     flag = 0
 7     while True:
 8         now = datetime.datetime.now()
 9         if now > sched_time and now < sched_time + datetime.timedelta(seconds=1) :  # 因为时间秒之后的小数部分不一定相等,要标记一个范围判断
10             send_move()
11             time.sleep(1)    # 每次判断间隔1s,避免多次触发事件
12             flag = 1
13         else :
14             #print('schedual time is {0}'.format(sched_time))
15             #print('now is {0}'.format(now))
16             if flag == 1 :
17                 sched_time = sched_time + datetime.timedelta(hours=1)  # 把目标时间增加一个小时,一个小时后触发再次执行
18                 flag = 0
19 
20 def send_move:
21     # nickname = input('please input your firends\' nickname : ' )
22     #   想给谁发信息,先查找到这个朋友,name后填微信备注即可,deepin测试成功
23     # users = itchat.search_friends(name=nickname)
24     users = itchat.search_friends(name='大壮')   # 使用备注名来查找实际用户名
25     #获取好友全部信息,返回一个列表,列表内是一个字典
26     print(users)
27     #获取`UserName`,用于发送消息
28     userName = users[0]['UserName']
29     itchat.send("该起来动一下了!",toUserName = userName)
30     print('succeed')
31 
32 if __name__=='__main__':
33     itchat.auto_login(hotReload=True)  # 首次扫描登录后后续自动登录
34     sched_time = datetime.datetime(2017,11,6,16,24,10)   #设定初次触发事件的事件点
35     print('run the timer task at {0}'.format(sched_time))
36     timerfun(sched_time)

 

有几个地方调试了一下:

  1. 第9行判断时间是否到达指定时间处,因为now = datetime.datetime.now()返回的时间精确到了ms,所以直接拿精确到s的特定时间去比较会移植为False。所以我改用了判断是否在时间范围内。并且判断完后会用time.sleep(1)延时1s再次比较,避免多次命中或多次判断。
  2. 第17行内,每次时间判断满足指定时间范围时,将指定时间往后延一定时间,这里 + datetime.timedelta(hours=1)表示延后一个小时,达到每过一个小时触发一次send_move函数的目的
  3. 第33行,itchat.auto_login(hotReload=True)如注释说明的一样,避免每次都要扫描二维码登录,在登录一次之后“保持在线状态”
  4. 第35行,注意一下这里的print函数对sched_time字符串的使用方式。参考python手册:A datetime object is a single object containing all the information from a date object and a time object,为了按照一般时间格式打印输出,对sched_time进行了format格式化处理,我理解就是保持sched_time原本的时间形式不变,而按照字符串的方法进行处理。这里用{0}来表示格式化后的sched_time,让其能够以原来时间格式与前面待打印的字符串进行字符串拼接。
  5. 第32行,if __name__=='__main__'表示当前模块仅在自己运行时才运行后续的语句,否则当该模块被其他模块引用时,不会运行后续语句。每个模块都有__name__属性,当它等于'__main__'时,表示该模块被用户单独运行,可以执行特殊的操作。

 

这个程序正常情况下直接运行即可,第一次运行可能需要扫码登录一下。另外可以将第11行的判断间隔增大一些,减少程序运行消耗。

 

后续还是要继续学习python基础,只学习网上现成的实例的话,根基不稳,后续学习效率高不了。

posted on 2017-11-07 15:52  奇幻果园  阅读(17032)  评论(3编辑  收藏  举报