Python实现QQ定时回复(附源码&exe)

利用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实现QQ定时回复(附源码&exe)_第1张图片

作者独白:(如果不感兴趣可以跳过)
本人为一名普通的大一学生,平时还是挺喜欢Python的,不过我们专业只能学半年Python,半年下来感觉还不错。想到下学期就不会学了,就有点伤感。总感觉要做点什么来纪念一下。
正好‘儿子‘发了一条信息:
Python实现QQ定时回复(附源码&exe)_第2张图片
为了叫儿子起床,而自己又懒得起这么早,于是就用Python写了这个程序。
半年学习下来,感觉Python特别是第三方库要学的其实挺多的,我们半年也就只学了其中的冰山一角。在学第三方库之前,我甚至还以为Python不过如此,之后就真香了。
Python实现QQ定时回复(附源码&exe)_第3张图片
竟然看了这么久,

那再送你一份礼物吧!
链接: 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

That’s all.
完结撒花
Run了 run了。

你可能感兴趣的:(python,开发语言)