利用Python的第三方库实现QQ的定时回复
#因疫情宅在家的无聊的大学生#tkinter
首先看代码:(说明里有相关使用提示)
import tkinter as tk
from tkinter import messagebox as mes #弹窗
import win32con
import win32gui
import win32clipboard as w
import datetime
import time
class abc: #窗口部分(信息输入)
def __init__(self):
self.root=tk.Tk()
self.root.title('QQ消息定时发送')
self.root.geometry('1000x500+1000+500')
self.interface()
def interface(self):
def f(cw):
mes.showerror('错误',cw) #设置错误弹窗
def show():#设置提示弹窗
mes.showinfo('说明','''\n1、接收者的备注名是指备注名而非实际QQ昵称。
2、信息中的实时时间请用以下代号表示:\n 年:Y$; 月:M$;\n 日:D$; 时:s$;\n 分:f$; 秒:m$;\n 星期几:x$
3、时间需要输入三个数,分别代表:时、分、秒,中间以空格间隔。
4、使用时应重新单独打开接收者的QQ聊天框。
5、发送消息的时间不能完全相同,相隔不能过短,最好相隔几秒''')
self.Label0 = tk.Label(self.root, text="接收者的备注名")
self.Label0.grid(row=2, column=0)
self.Label1 = tk.Label(self.root, text="发送信息的条数")
self.Label1.grid(row=3, column=0)
self.Entry0 = tk.Entry(self.root)
self.Entry0.grid(row=2, column=1,padx=60)
self.Entry1 = tk.Entry(self.root)
self.Entry1.grid(row=3, column=1,padx=60,pady=30)
def get1(): #按第一个确定按钮触发的事件
global cs,msg,receiver,sj,xx #设置为全局变量
cs=int(self.Entry1.get())#cs指发送信息的条数
receiver=self.Entry0.get()#获取输入信息
if cs<=0:f('输入数字超出实际范围(应大于0)')
elif receiver=='':f('接收者的备注名不能为空')
else:
a = [self.Label0,self.Label1,self.Entry0,self.Entry1]
for i in a:i.destroy()#清除控件(不可恢复)
self.B0.grid_forget()#不显示控件(可恢复)
def get2():
global sr1
sr1=self.Entry0.get()
msg=self.Entry1.get()
try:#捕获异常
sr=sr1.split()
sr=list(map(int,sr))
if (len(sr)==3):
if ((-1<sr[0]<24) and (-1<sr[1]<60) and (-1<sr[2]<60)):
if msg=='':f('发送的信息不能为空')
else:
sj.append(sr)
msg=msg.replace('Y$','{0}').replace('M$','{1}').replace('D$','{2}').replace('s$','{3}').replace('f$','{4}').replace('m$','{5}').replace('x$','{6}')#替换代号
local_time = time.localtime(time.time())
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
week_index = local_time.tm_wday
week_list = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
xx.append(msg.format(time1[0],time1[1],time1[2],time1[3],time1[4],time1[5],week_list[week_index]))
self.root.quit()
else:f('输入数字超出实际范围')
else:f('输入的数字不是三个或数字间忘记间隔')
except Exception:
f('输入了除数字以外的其他字符')
sj=[];xx=[]
for i in range(cs):
self.Label0 = tk.Label(self.root, text="时间{}".format(i+1))
self.Label0.grid(row=1, column=0)
self.Label1 = tk.Label(self.root, text="消息{}".format(i+1))
self.Label1.grid(row=2, column=0)
self.Entry0 = tk.Entry(self.root)
self.Entry0.grid(row=1, column=1,padx=60)
self.Entry1 = tk.Entry(self.root)
self.Entry1.grid(row=2, column=1,padx=60)
self.B2 = tk.Button(self.root, text="-确定-",command=get2)#按钮
self.B2.grid(row=8, column=3,ipadx=100,padx=120,pady=120)
self.root.mainloop()
for wk in [self.Label0,self.Entry0,self.B2,self.Label1,self.Entry1]:
wk.destroy()
def c1():
global dj
dj=0
mes.showinfo('提示','已成功退出')
self.root.destroy()#关闭窗口
def bc1():
global dj
self.root.quit()
dj=1
for wk in [self.Label0,self.B3,self.B2]:
wk.destroy()
self.root.destroy()#关闭窗口
self.Label0 = tk.Label(self.root, text="你有一瓶后悔药,\n你要吃吗?")
self.Label0.grid(row=0, column=1,columnspan=3,ipady=30,ipadx=300,pady=30)
self.B2 = tk.Button(self.root, text="吃",command=c1)
self.B2.grid(row=1, column=1,ipady=30,ipadx=120,pady=150)
self.B3 = tk.Button(self.root, text="不吃",command=bc1)
self.B3.grid(row=1, column=3,ipady=30,ipadx=120,pady=150)
self.root.mainloop()
if dj==1:
root=tk.Tk()
root.withdraw()
mes.showinfo('提示','开始运行...')
root.destroy()
self.B0 = tk.Button(self.root, text="确定",command=get1)#按钮
self.B0.grid(row=8, column=3,ipadx=100,padx=80,pady=30)
self.B1=tk.Button(self.root, text="说明",command=show)
self.B1.grid(row=0,column=4,pady=30)
self.root.mainloop()
if __name__=='__main__':a=abc()
if dj==1:#无窗口部分(窗口部分完成后后执行)
def cz(sj):
global tmp
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()#获取实时时间
tmp=[int(time1[3]),int(time1[4]),int(time1[5])]
sj.append(tmp)
sj=sorted(sj,key=lambda x:x[2])
sj=sorted(sj,key=lambda x:x[1])
sj=sorted(sj,key=lambda x:x[0])
try:
return sj[sj.index(tmp)+1]
except Exception:
return sj[0]
class sendMsg():#封装发送消息
def __init__(self,receiver,msg):
self.receiver=receiver
self.msg=msg
self.setText()
def setText(self):#设置剪切板
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, self.msg)
w.CloseClipboard()
def sendmsg(self):#发送消息
qq=win32gui.FindWindow(None,self.receiver)
win32gui.SendMessage(qq,win32con.WM_PASTE , 0, 0)
win32gui.SendMessage(qq, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
#print(msg)#如需查看发出的信息是什么,可去掉前方注释符
k=0 #发送了信息数-1
while True:#关键运行部分
sr=cz(sj)#获取实时需要执行的任务信息
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
minnute =int(time1[4])
while minnute!=sr[1]:
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
minnute =int(time1[4])
while True:
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
second =int(time1[5])
if (abs(second-sr[2])<0.6) or (abs(second-sr[2])>59.4):
msg = xx[k]
qq = sendMsg(receiver, msg)
qq.sendmsg()
time.sleep(1)
break
sj.remove(sr)
sj.remove(tmp)
if len(sj)==0:
root=tk.Tk()
root.withdraw()#不显示窗口(否则会额外出现一个空白弹窗)
mes.showinfo('-END-','发送任务完成')
break
cs-=1
k+=1
以上是代码部分
此代码打包的exe在百度网盘里可自行下载。(不是很大,大约9M)
链接: https://pan.baidu.com/s/1cm_6L0hkU5BwfuWBMy3_lA?pwd=9rcq 提取码: 9rcq
结果图:
作者独白:(如果不感兴趣可以跳过)
本人为一名普通的大一学生,平时还是挺喜欢Python的,不过我们专业只能学半年Python,半年下来感觉还不错。想到下学期就不会学了,就有点伤感。总感觉要做点什么来纪念一下。
正好‘儿子‘发了一条信息:
为了叫儿子起床,而自己又懒得起这么早,于是就用Python写了这个程序。
半年学习下来,感觉Python特别是第三方库要学的其实挺多的,我们半年也就只学了其中的冰山一角。在学第三方库之前,我甚至还以为Python不过如此,之后就真香了。
竟然看了这么久,
那再送你一份礼物吧!
链接: https://pan.baidu.com/s/1ynPlyXt7YJrtavkmgbtHng?pwd=gw44 提取码: gw44
这里有我学习Python整理的笔记(这是基础的知识,因为第三方库整理得比较乱),另外还有一个低版本的exe(有控制台的)
那个exe的代码:
import win32con
import win32gui
import win32clipboard as w
import time
import datetime
def cz(sj):
global tmp
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
tmp=[int(time1[3]),int(time1[4]),int(time1[5])]
sj.append(tmp)
sj=sorted(sj,key=lambda x:x[2])
sj=sorted(sj,key=lambda x:x[1])
sj=sorted(sj,key=lambda x:x[0])
try:
return sj[sj.index(tmp)+1]
except Exception:
return sj[0]
def f(yy):
print('输入错误')
print('可能原因:%s'%yy)
print('请按规定重新输入')
def kx():
while True:
try:
sr=input('输入时间\n时分秒以空格分隔:').split()
sr=list(map(int,sr))
if (len(sr)==3):
if ((-1<sr[0]<24) and (-1<sr[1]<60) and (-1<sr[2]<60)):
sj.append(sr)
break
else:f('输入数字超出实际范围')
else:f('输入的数字不是三个,或数字间忘记间隔')
except Exception:
f('输入了除数字以外的其他字符')
class sendMsg():
def __init__(self,receiver,msg):
self.receiver=receiver
self.msg=msg
self.setText()
#设置剪贴版内容
def setText(self):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, self.msg)
w.CloseClipboard()
#发送消息
def sendmsg(self):
qq=win32gui.FindWindow(None,self.receiver)
win32gui.SendMessage(qq,win32con.WM_PASTE , 0, 0)
win32gui.SendMessage(qq, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
print('\n{}:{}:{}'.format(time1[3],time1[4],time1[5]),"\nsucessfuly send",self.msg)
receiver=input('接收者的备注名(或群备注名):')#这里填入接收者的备注名
while True:
try:
cs=int(input('输入需要发送信息的条数:'))
if (cs>0): break
else:f('输入数字超出实际范围(应大于0)')
except Exception:
f('输入了除数字以外的其他字符')
if input('是否启用高级模式\n#输入内容与时间有关或需要发多条不同信息\n(1:是,else:否):') =='1':
xxi=[]
print('可变时间请用以下代号表示:年:Y$;月:M$;日:D$;\n时:s$;分:f$;秒:m$;星期几:x$表示')
print('提示:时间输入顺序应与消息顺序一致')
msg2=[];msg=[]
for yu in range(cs):
msg1=input().replace('Y$','{0}').replace('M$','{1}').replace('D$','{2}').replace('s$','{3}').replace('f$','{4}').replace('m$','{5}').replace('x$','{6}')
xxi.append(msg1)
def xx():
msg=[]
for msg1 in xxi:
local_time = time.localtime(time.time())
week_index = local_time.tm_wday
week_list = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
msg.append(msg1.format(time1[0],time1[1],time1[2],time1[3],time1[4],time1[5],week_list[week_index]))
return msg
else:
msg=input('想发送的内容:')
def xx():
return [msg]
hh=input('按1确定,按其他键取消:')
if not (hh=='1'): raise Exception('已取消')
sj=[]
for i in range(cs):kx()
print('-Running-')
k=0
while True:
sr=cz(sj)
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
minnute =int(time1[4])
while minnute!=sr[1]:
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
minnute =int(time1[4])
while True:
time1=datetime.datetime.now().strftime('%Y %m %d %H %M %S').split()
second =int(time1[5])
if (abs(second-sr[2])<1) or (abs(second-sr[2])>59):
msg = xx()[k]
qq = sendMsg(receiver, msg)
qq.sendmsg()
time.sleep(1)
break
sj.remove(sr)
sj.remove(tmp)
if len(sj)==0:
print('-END-')
print('发送任务完成')
break
cs-=1
k+=1