最近在学习一点python,先找了找有趣的应用,实际修改跑了一下提高兴趣程度。
找到itchat,它的简介是这样的:
“itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。
使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。
当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些。
该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。
如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。”
http://itchat.readthedocs.io/zh/latest/
itchat使用需要先下载安装,安装过程很简单,直接
pip install itchat
我安装的python3.6自带pip,如果没有pip的话我建议升级python。
在网上已经有不少itchat的应用,最简单的就是查找特定用户来发送微信消息。我结合另一个示范将消息扩展了一点:间隔特定时间给特定的好友发送微信消息提醒(久坐提醒?)
代码如下:
#-*-coding:utf8-*-
import itchat
import datetime, os, platform,time def timerfun(sched_time) :
flag = 0
while True:
now = datetime.datetime.now()
if now > sched_time and now < sched_time + datetime.timedelta(seconds=1) : # 因为时间秒之后的小数部分不一定相等,要标记一个范围判断
send_move()
time.sleep(1) # 每次判断间隔1s,避免多次触发事件
flag = 1
else :
#print('schedual time is {0}'.format(sched_time))
#print('now is {0}'.format(now))
if flag == 1 :
sched_time = sched_time + datetime.timedelta(hours=1) # 把目标时间增加一个小时,一个小时后触发再次执行
flag = 0 def send_move:
# nickname = input('please input your firends\' nickname : ' )
# 想给谁发信息,先查找到这个朋友,name后填微信备注即可,deepin测试成功
# users = itchat.search_friends(name=nickname)
users = itchat.search_friends(name='大壮') # 使用备注名来查找实际用户名
#获取好友全部信息,返回一个列表,列表内是一个字典
print(users)
#获取`UserName`,用于发送消息
userName = users[0]['UserName']
itchat.send("该起来动一下了!",toUserName = userName)
print('succeed') if __name__=='__main__':
itchat.auto_login(hotReload=True) # 首次扫描登录后后续自动登录
sched_time = datetime.datetime(2017,11,6,16,24,10) #设定初次触发事件的事件点
print('run the timer task at {0}'.format(sched_time))
timerfun(sched_time)
有几个地方调试了一下:
- 第9行判断时间是否到达指定时间处,因为now = datetime.datetime.now()返回的时间精确到了ms,所以直接拿精确到s的特定时间去比较会移植为False。所以我改用了判断是否在时间范围内。并且判断完后会用time.sleep(1)延时1s再次比较,避免多次命中或多次判断。
- 第17行内,每次时间判断满足指定时间范围时,将指定时间往后延一定时间,这里 + datetime.timedelta(hours=1)表示延后一个小时,达到每过一个小时触发一次send_move函数的目的
- 第33行,itchat.auto_login(hotReload=True)如注释说明的一样,避免每次都要扫描二维码登录,在登录一次之后“保持在线状态”
- 第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,让其能够以原来时间格式与前面待打印的字符串进行字符串拼接。
- 第32行,if __name__=='__main__'表示当前模块仅在自己运行时才运行后续的语句,否则当该模块被其他模块引用时,不会运行后续语句。每个模块都有__name__属性,当它等于'__main__'时,表示该模块被用户单独运行,可以执行特殊的操作。
这个程序正常情况下直接运行即可,第一次运行可能需要扫码登录一下。另外可以将第11行的判断间隔增大一些,减少程序运行消耗。
后续还是要继续学习python基础,只学习网上现成的实例的话,根基不稳,后续学习效率高不了。