编写qq刷屏软件

时间:2024-03-12 17:02:00

使用pywin32制作qq刷屏软件

思路:

  1. 使用pywin32,来访问windows系统的剪贴板,把要发送的内容加入剪贴板中
  2. 使用pywin32,模仿按键操作“control+v”把内容复制到QQ的聊天窗口上,然后“enter”发送消息。
  3. 文件读取,把要刷屏的语言保存在本地的shuaping.txt中,一次性读取到列表中。然后一条一条的发送完成刷屏。
    参考:
    如何用python模拟键盘输入
    python访问剪贴板

代码:

  1. python操作剪贴板:如何把文件内容复制进入剪贴板
 #-*- coding: utf-8 -*-
import win32clipboard as cb
import win32con
date = "Hello,World"
cb.OpenClipboard()#打开剪贴板
cb.SetClipboardData(win32con.CF_TEXT, date)#把数剧复制到剪贴板
cb.CloseClipboard()#用完后关闭剪贴板

试一试粘贴,看内容是否变成了“Hello World”

  1. 模仿按键操作“control+v”和“enter”
import win32clipboard as cb
import win32con
import win32api
date = "Hello,World"
cb.OpenClipboard()#打开剪贴板
cb.SetClipboardData(win32con.CF_TEXT, date)#把数剧复制到剪贴板
cb.CloseClipboard()#用完后关闭剪贴板
win32api.keybd_event(17,0,0,0)  #ctrl键位码是17
win32api.keybd_event(86,0,0,0)  #v键位码是86
win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)

这里发现了一些问题,如果有数据中包含中文字符,粘贴出来是乱码,搜索后发现复制是默认使用的是ANCI,那么解决方法是指定使用unicode格式
cb.SetClipboardData(win32con.CF_UNICODETEXT, date)就是把这个函数的第一个参数改为CF_UNICODETEXT

  1. 读取文件
def open_file(filename):
    f = open(filename, "r")
    content = f.readlines() #考虑到这个文件内容一般不会很大,就一次性读取到列表了。
    f.close()
    return content
  1. 使用wxpython 编写图像界面:
import wx
class Screen(wx.Frame):
    def __init__(self):
        self.explain = u\'       使用说明\'
        wx.Frame.__init__(self, parent=None, id=1, title=u"QQ刷屏器", size=(600,400))
        self.panel = wx.Panel(self, -1)
        self.Centre() #居中显示窗口
        self.dateText = wx.TextCtrl(self.panel, -1, self.explain, style=wx.TE_MULTILINE, size=(300,330), pos=(1, 10))
        version = wx.StaticText(self.panel, -1, u"版本1.0\n作者:即刻", pos=(520,320))
        self.open_file = wx.Button(self.panel, label=u\'打开刷屏文件            \', pos=(310,40))
        self.start = wx.Button(self.panel, label=u\'开始刷屏\', pos=(450,40))
        self.SleepTxet = wx.StaticText(self.panel, -1, u"刷屏的时间间隔(s):", pos=(310,10))
        self.Sleep = wx.TextCtrl(self.panel, -1, "0.5", pos=(450,10))
        self.SaveDate = wx.Button(self.panel, -1, u"保存对刷屏文件的修改", pos=(310,70))
        self.stop = wx.Button(self.panel, -1,label=u"停止刷屏", pos=(450,70))
if __name__ == "__main__":
    app = wx.App()
    screen = Screen()
    screen.Show()
    app.MainLoop()

参考wxpython入门

  1. 完整代码(整体功能已完成,基本可以使用,但缺陷太坑,根本停不下来!QaQ)
# -*- coding: utf-8 -*-
import win32clipboard as cb
import win32con
import win32api
import time
import os
import wx
class Screen(wx.Frame):
    def __init__(self):
        self.interval = 2  #默认刷屏的间隔时间
        self.condition = False  #刷屏的状态,默认关闭
        self.explain = u\'                使用说明\n1.你可以在本框内自定义刷屏文本,或者打开刷屏的txt文件\n2.点击开始后 3s开始刷屏,请立即点击qq聊天窗口\n3.停止按钮无效,暂时没有解决方法 QaQ \'
        wx.Frame.__init__(self, parent=None, id=1, title=u"QQ刷屏器", size=(600,400))
        self.panel = wx.Panel(self, -1)
        self.Centre() #居中显示窗口
        self.dateText = wx.TextCtrl(self.panel, -1, self.explain, style=wx.TE_MULTILINE, size=(300,330), pos=(1, 10))
        wx.StaticText(self.panel, -1, u"版本1.0\n作者:即刻", pos=(520,320))
        open_file = wx.Button(self.panel, label=u\'打开刷屏文件            \', pos=(310,40))
        start = wx.Button(self.panel, label=u\'开始刷屏\', pos=(450,40))
        wx.StaticText(self.panel, -1, u"刷屏的时间间隔(s):", pos=(310,10))
        self.Sleep = wx.TextCtrl(self.panel, -1, str(self.interval), pos=(450,10))
        SaveDate = wx.Button(self.panel, -1, u"保存对刷屏文件的修改", pos=(310,70))
        stop = wx.Button(self.panel, -1,label=u"停止刷屏", pos=(450,70))
        self.Bind(wx.EVT_BUTTON, self.open_file, open_file)
        self.Bind(wx.EVT_BUTTON, self.start, start)
        self.Bind(wx.EVT_BUTTON, self.stop, stop)
        self.Bind(wx.EVT_BUTTON, self.SaveDate, SaveDate)
    def stop(self,event):
        self.condition = False
    def open_file(self, event):
        """open a file"""
        self.dirname = \'\'
        dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", wx.OPEN)  # 调用一个函数打开对话框
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            self.address = os.path.join(self.dirname, self.filename)
            f = open(self.address, "r")
            file = (f.read()).decode(encoding=\'utf-8\')  # 解码,使文件可以读取中文
            f.close()
            self.dateText.Clear()
            self.dateText.AppendText(file)  # 把打开的文件内容显示在多行文本框内
        dlg.Destroy()
    def SaveDate(self, event):
        date = (self.dateText.GetValue()).encode(encoding="utf-8")  # 编码,使中文可以正确存储
        f = open(self.address, \'w\')
        f.write(date)
        f.close()  # 把文本框内的数据写入并关闭文件
        dlg = wx.MessageDialog(self, u"文件已经成功保存", u"消息提示", wx.OK)
        dlg.ShowModal()
        dlg.Destroy()
    def start(self,event):
        self.interval = float(self.Sleep.GetValue())  #因为sleep函数的参数必须为小数,而GetValue()如果数字不带小数点会得到整数。
        file = (self.dateText.GetValue())
        date = file.split("\n")
        time.sleep(3)
        self.condition =True
        while self.condition:
            for dateline in date:
                time.sleep(self.interval)
                cb.OpenClipboard()  # 打开剪贴板
                cb.SetClipboardData(win32con.CF_UNICODETEXT, dateline)  # 把数剧复制到剪贴板
                cb.CloseClipboard()  # 用完后关闭剪贴板
                win32api.keybd_event(17, 0, 0, 0)  # ctrl键位码是17
                win32api.keybd_event(86, 0, 0, 0)  # v键位码是86
                win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
                win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
                win32api.keybd_event(13, 0, 0, 0)  # 回车键码是13
                win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放回车键
if __name__ == "__main__":
    app = wx.App()
    screen = Screen()
    screen.Show()
    app.MainLoop()

ps在这几天查找到了直接给窗口发送消息的办法,即取得窗口的句柄,利用win32api直接发送消息给窗口,这样省却很多中间环节,不过需要了解的知识很多,暂时无精力看它了。

参考:
pyQT指定窗口截图
利用python和win32定制一个按键精灵

  1. 如何获得窗口的句柄:使用spy++或者使用win32的FindWindow和FindWindEx函数
import win32gui
label = u"风的 Android手机"  #这里是窗口的名字
hld = win32gui.FindWindow(None,label)
print "%x" % hld  #注意此处应该以十六进制输入,因为python默认十进制输出。

获取窗口的句柄:70622 这和我用spy++获取到的一样。

这里再次遇到问题:qq的聊天窗口 查找不到子窗口,于是也没有查找到Edit控件,于是无法把内容传递到输入框内
·搜查资料后得知qq使用的是DirectUI控件和父窗口在一起,无法抓取到控件。

待续。。。

可以完善的地方:

  1. 使用wxpython来完善使用界面,然后方便的使用cx_freeze或py2exe打包为exe分享给朋友使用
  2. 使用wxpython的多行文本框来显示刷屏的语句,并且可以修改,并保存这些语句。
  3. 可以自己设置发送的间隔时间,设置一次性发送语句的条数。
  4. 检测刷屏语句的字数,如果字数超过qq聊天窗口的限制,把一条语句拆分发送。
  5. 加入图片刷屏的功能。

这是我想到的最简单实现qq聊天刷屏的方法,但缺点很明显,消息刷屏的时候就不能做其他操作了。

问题:
1.是否有其他不用模拟按键的方法来发送qq消息。

如果有建议希望您可以详细告诉我,不胜感激。如果有问题,请评论,我会尽心解答。