手把手教你开发“消息连续发送器”

简介: 手把手教你开发“消息连续发送器”

声明:仅供学习使用,严禁商业用途,违者后果自负!

 

原理


要实现消息的连续发送发送功能,可以借助pyauto模块来实现操作键盘,借助pyperclip库来完成剪切板的操作。主要实现逻辑为:先读取一个文件夹中的所有文本词条,将它展示出来用于词库的选择,当用户选择某个词条库时,将遍历该词条文本的每一行词条进行消息发送。

 

代码实现


定义类,并在类初始化方法中进行UI界面的初始化操作。


class MsgeBomb:
    frequency_ = 0.01  # 轰炸频率
    _flag = 0  # 轰炸控制变量
    # 初始函数,创建窗体
    def __init__(self):
        self.win = Tk()
        self.win.title('消息轰炸机')
        self.win.geometry('400x320')
        self.win.resizable(width=False, height=False)
        self.win.iconbitmap(default='./lib/icon/logo.png')
        self.file = os.listdir('./lib')
        self.value = [v.replace('.txt', '') for v in self.file if v.endswith('.txt')]
        self.value = tuple(self.value)
        # 设置默认值,即默认下拉框中的内容,索引从0开始
        mebubar1 = Menu(self.win, tearoff=0)
        about = lambda: showinfo('关于', message)
        ks_dy = lambda: webbrowser.open(_ks_dy)
        mebubar1.add_command(label="关于", command=about)
        mebubar1.add_command(label="退出", command=self.win.quit)
        mebubar = Menu(self.win, tearoff=0)
        mebubar.add_cascade(label="功能", menu=mebubar1)
        self.win.config(menu=mebubar)
        self.ddb_default_L = Label(self.win, text='词库选择:', font=('Arial', 13), fg='blue')
        self.ddb_default = ttk.Combobox(self.win)
        self.ddb_default['value'] = self.value
        self.ddb_default['state'] = 'readonly'
        self.ddb_default.current(0)
        # 获得选中的文本
        self.text = self.ddb_default.get()
        self.btn_start = Button(self.win, text='开始轰炸', width=16, bd=5, font=('黑体', 10, 'bold'),
                                command=lambda: self.thread_start(self.start_On))
        self.btn_stop = Button(self.win, text='停止轰炸', width=16, bd=5, font=('黑体', 10, 'bold'), command=self.stop_Off)
        self.textvar = tkinter.StringVar()
        # 统计轰炸次数控件
        self.count = Label(self.win, font=('黑体', 13, 'bold'), fg='red', textvariable=self.textvar)
        # 下拉框颜色
        combostyle = ttk.Style()
        combostyle.theme_create('combostyle', parent='alt',
                                settings={'TCombobox':
                                    {'configure':
                                        {
                                            'foreground': 'blue',  # 前景色
                                            # 'selectbackground': 'blue',  # 选择后的背景颜色
                                            'fieldbackground': 'pink',  # 下拉框颜色
                                            'background': 'pink',  # 下拉按钮颜色
                                        }}}
                                )
        combostyle.theme_use('combostyle')
        '''grid布局'''
        self.ddb_default_L.grid(row=1, column=1, sticky='E', padx=1, pady=50)
        self.ddb_default.grid(row=1, column=2, sticky='NW', padx=2, pady=50)
        self.btn_start.grid(row=2, column=1, sticky='E', padx=5, pady=10)
        self.btn_stop.grid(row=2, column=2, sticky='NW', padx=3, pady=10)
        self.count.grid(row=3, column=1, sticky='NW', padx=3, pady=4)
        self.win.mainloop()


 

编写功能函数

发送消息函数

功能:将传过来数据粘贴在输入框中,并按下键盘的Enter键实现消息的发送。

# 发送消息函数
    def sendMessage(self, content):
        pyperclip.copy(content)
        pyautogui.hotkey('ctrl', 'v')
        pyautogui.press('enter')


二、停止消息发送函数

功能:当按下停止发送消息按钮后,将状态改为1(即停止发送消息)


# 停止发送消息函数
    def stop_Off(self):
        self._flag = 1  # 将状态改为1,停止轰炸
        self.textvar.set(f'已停止消息发送')


三、开始发送消息函数

功能:当点击开始发送按钮,将开始发送消息

# 开始发送消息函数
    def start_On(self):
        self._flag = 0
        self.textvar.set(f'2秒后将开始发送消息')
        time.sleep(2)
        text = f'./lib/{self.ddb_default.get()}.txt'
        file = open(text, 'r', encoding='utf-8')
        content = file.read().split('\n')
        for i in range(len(content)):
            if self._flag == 1:
                break
            else:
                self.textvar.set(f'已发送{i + 1}次')
                self.sendMessage(content[i])
                time.sleep(self.frequency_)
        self.textvar.set(f'消息发送完毕!')


四、线程函数

功能:防止UI阻塞

def thread_start(self, func, *args):
        t = threading.Thread(target=func, args=args)
        t.setDaemon(True)
        t.start()



 

软件效果


 

 

运行效果


 

相关文章
|
消息中间件 NoSQL 关系型数据库
6年高级开发就因这道题少了5K,Kafka如何避免消息重复消费?
一个6年工作经验的小伙伴,被问到这样一个问题,说Kafka是如何避免消息重复消费的?面试完之后,这位小伙伴来找到我,希望我能给一个思路。今天,我给大家分享一下我的思路。
166 1
|
1月前
|
消息中间件 存储 监控
深度写作:深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(Message Queue, MQ)扮演着至关重要的角色。MQ不仅实现了应用间的解耦,还提供了异步消息处理、流量削峰等功能。而在MQ的众多特性中,长轮询(Long Polling)机制因其能有效提升消息处理的实时性和效率,备受关注。
68 12
|
7月前
|
存储 SQL 前端开发
🚀经常发文章的你是否想过定时发布是咋实现的?🚀
🚀经常发文章的你是否想过定时发布是咋实现的?🚀
|
7月前
|
存储 算法 Java
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)(一)
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
135 1
|
7月前
|
算法 Java 索引
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)(二)
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
76 1
|
7月前
|
消息中间件 算法 Java
金石推荐 |【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)
金石推荐 |【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)
118 1
|
存储 算法 Java
【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
承接上一篇文章【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)】我们基本上对层级时间轮算法的基本原理有了一定的认识,本章节就从落地的角度进行分析和介绍如何通过Java进行实现一个属于我们自己的时间轮服务组件,最后,在告诉大家一下,其实时间轮的技术是来源于生活中的时钟。
145 1
【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
|
计算机视觉
队列的概念及结构(内有成型代码可供CV工程师参考)
队列的概念及结构(内有成型代码可供CV工程师参考)
77 0
|
前端开发 NoSQL Redis
项目实战典型案例5——发送调查问卷流程图例子(将不必要的逻辑放入前端)
项目实战典型案例5——发送调查问卷流程图例子(将不必要的逻辑放入前端)
126 0
【项目实战典型案例】14.课程推送页面整理-增加定时功能
【项目实战典型案例】14.课程推送页面整理-增加定时功能