效果图:

主要使用了pyautogui和pyperclip两个第三方库实现,如多使用了图像匹配功能会使pyautogui引入了Pillow等库,如果代码涉及到了关键参数还需要OpenCV库等等。

特意写了很多注释,供学习使用。

完整代码:

import os
import threading
import time
from tkinter import Tk, StringVar, Entry, Label, Button, DISABLEDimport pyautogui
import pyperclipdef read(file):f = open(file, 'r')str_list = f.read().split('\n')return str_listdef input_pw(password):  # 输入密码pyautogui.keyDown('backspace')time.sleep(2)pyautogui.keyUp('backspace')pyautogui.write(password, interval=0.1)def login(qq_msg, qq_path):# 获取登录qq账号密码qq_msg = qq_msg.split('#')qq = qq_msg[0]password = qq_msg[1]# 打开QQos.startfile(qq_path)time.sleep(8)# 获取运行时的屏幕分辨率(因为我的指定坐标是基于1920*1080的,要适应不同分辨率变化)width, height = pyautogui.size().width, pyautogui.size().height# 输入账号pyautogui.click(int(1060*width/1920), int(560*height/1080))   # 点击账号输入框pyperclip.copy(qq)pyautogui.hotkey('ctrl', 'v')time.sleep(0.5)# 输入密码pyautogui.click(int(1060*width/1920), int(610*height/1080))  # 点击密码输入框input_pw(password)time.sleep(0.5)pyautogui.press('enter')class QqOnHook:def __init__(self):"""初始化一个界面"""self.window = Tk()self.window.title('QQ挂机')window_width, window_height = 500, 250screenwidth, screenheight = pyautogui.size().width, pyautogui.size().height# 设置窗口居中显示self.window.geometry("%dx%d+%d+%d" % (       # 前两个参数是窗口的大小,后面两个参数是窗口的位置window_width, window_height, (screenwidth - window_width) / 2, (screenheight - window_height) / 2))self.window.resizable(False, False)  # 规定窗口不可缩放self.day_num = 0self.txt1 = StringVar()self.statr_time = StringVar()onhook_time = StringVar()onhook_time.set("125")entry1 = Entry(self.window, width=30, textvariable=self.txt1,state="readonly", font=('宋体', 20), fg='blue', justify='center')entry2 = Entry(self.window, width=34, textvariable=self.statr_time,state="readonly", font=('宋体', 18))label1 = Label(self.window, text="每日启动时间: ", font=('宋体', 15))label2 = Label(self.window, text="时", font=('宋体', 15))label3 = Label(self.window, text="分", font=('宋体', 15))self.entry3 = Entry(self.window, width=4, font=('宋体', 20))self.entry4 = Entry(self.window, width=4, font=('宋体', 20))label4 = Label(self.window, text="单Q挂机时长: ", font=('宋体', 15))self.entry5 = Entry(self.window, width=4, textvariable=onhook_time, font=('宋体', 20))label5 = Label(self.window, text="分", font=('宋体', 15))self.button = Button(self.window, width=9, height=2, text='开始', font=('黑体', 20), command=self.run)# 设置界面布局entry1.grid(row=0, column=0, columnspan=6)entry2.grid(row=1, column=0, columnspan=6)label1.grid(row=3, column=0, columnspan=2)self.entry3.grid(row=3, column=2)label2.grid(row=3, column=3)self.entry4.grid(row=3, column=4)label3.grid(row=3, column=5)label4.grid(row=4, column=0, columnspan=2)self.entry5.grid(row=4, column=2)label5.grid(row=4, column=3)self.button.grid(row=5, column=2, rowspan=2, columnspan=2)self.window.mainloop()def run(self):  # 启动一个线程执行挂机任务hour = self.entry3.get()  # 获取每日启动时间minute = self.entry4.get()run_time = self.entry5.get()  # 获取单Q挂机时间if hour.isdigit() and 0 <= int(hour) <= 24 and minute.isdigit() and 0 <= int(minute) < 60 \and run_time.isdigit() and int(run_time) > 0:  # 输入检测self.readonly_state()t = threading.Thread(target=self.count_down, args=(int(hour), int(minute), int(run_time),))t.setDaemon(True)  # 守护线程,退出界面后回收线程t.start()def count_down(self, hour, minute, run_time):  # 定时函数still_time = 0while True:t = time.localtime()last_hour = hour - 1    # 指定小时的上一个小时if hour == 0:   # 排除特殊的小时last_hour = 23if t.tm_hour == last_hour or (t.tm_hour == hour and t.tm_min < minute):  # 逼近 指定小时# 计算离 指定时间 还有多久if t.tm_hour == last_hour:still_time = (59 - t.tm_min) * 60 + (59 - t.tm_sec) + minute * 60elif t.tm_hour == hour:still_time = (minute - 1 - t.tm_min) * 60 + (59 - t.tm_sec)time.sleep(still_time)self.start(run_time)else:time.sleep(3000)  # 每50分钟判断一次当前小时def start(self, n):  # 启动QQ并定时关闭self.window.after(0, self.update)content = read('登录qq.txt')qq_path = content[0]    # 获取qq路径login_qq_list = content[1:]     # 获取登录qqfor login_qq in login_qq_list:if login_qq:    # 避免空值login(login_qq, qq_path)time.sleep(n * 60)  # 单Q运行时间os.system("taskkill /F /IM QQ.exe")  # 关闭QQtime.sleep(5)def update(self):  # 记录挂机行为self.day_num += 1self.txt1.set("已挂机 " + str(self.day_num) + " 天")self.statr_time.set("上次启动时间:" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))def readonly_state(self):self.txt1.set("关闭软件可取消")self.button["text"] = "挂机中"self.button['state'] = DISABLEDself.entry3.configure(state="readonly")self.entry4.configure(state="readonly")self.entry5.configure(state="readonly")if __name__ == '__main__':QqOnHook()

然后在同一目录下创建一个登录qq.txt文件,并在首行填写QQ路径,后面的行填写账号密码,账号密码以“#”号分隔,登录qq.txt文件格式如下:

最后附上打包好的exe文件,下载即可直接使用【求赞!】

QQ挂机exe文件下载

放在服务器持久运行需要保持鼠标、键盘、剪切板正常运行,所以要配合我写的另一个软件使用:

关闭远程桌面连接后,鼠标、键盘、剪切板等失效解决方法

QQ批量挂机(python实现)相关推荐

  1. python实现qq登录_python实现QQ批量登录功能

    本文实例为大家分享了python实现QQ批量登录功能的具体代码,供大家参考,具体内容如下 小编收集整理的第一份代码:python3.6批量登陆QQ import os import time impo ...

  2. python打开qq并登录_使用Python进行QQ批量登录的实例代码

    具体代码如下所示: #coding=utf-8 __author__ = 'Eagle' import os import time import win32gui import win32api i ...

  3. python批量添加qq好友_python实现QQ批量登录功能

    本文实例为大家分享了python实现QQ批量登录功能的具体代码,供大家参考,具体内容如下 小编收集整理的第一份代码:python3.6批量登陆QQ import os import time impo ...

  4. python实现qq登录注册_python实现QQ批量登录功能

    本文实例为大家分享了python实现QQ批量登录功能的具体代码,供大家参考,具体内容如下 小编收集整理的第一份代码: python3.6批量登陆QQ import os import time imp ...

  5. pyQt5+pyInstaller实现QQ批量登录

    直接pip install pyQt5安装 pip install pyQt5-tools python:3.5.4版本 在pycharm下面配置QtDesigner 在pycharm中选择项目右键选 ...

  6. windows环境下python怎么安装mlxtend-python连接QQ实现自动回复python 机器学习库

    擅长:神经网络 网址:http://deeplearning.net/software/pylearn2/ Github:http://github.com/lisa-lab/pylearn2 Pye ...

  7. QQ批量自动登录程序的设计

    因为自己的QQ号码有好几个,每次重启机子的时候一个一个的登录超级麻烦,而且腾讯老是在偶尔的时候,再把以前已经记住密码的QQ密码给置空,还要重新输入,太麻烦,因此尝试着自己搞一个批量自动登录的程序 以T ...

  8. 基于QQ云输入法,用python实现的输入法(demo 版)

    #!/bin/env python # -*- coding:utf-8 -*- # 基于QQ云输入法,用python实现的输入法 (demo版) # by jinxing 2011-12-25 &q ...

  9. 搜狗词库的批量下载#Python

    在制作电子病历全文索引时,需要建立索引,索引是根据索引词建立的,现有索引词匮乏,不能满足需求,搜寻之后,发现搜狗输入法的医学词库很庞大,所以,想着自学写一个Python脚本,完成词库的自动下载工作. ...

  10. 详细注释版的ABAQUS COH2D4单元批量添加Python脚本

    详细注释版的ABAQUS COH2D4单元批量添加Python脚本 ABAQUS Cohesive单元批量添加脚本程序-附详细注释版: #本程序只适用于二维问题,对于三维COH3D8的批量嵌入只需要转 ...

最新文章

  1. Python使用sklearn构建广义线性模型:Tweedie回归(Tweedie regression)实战
  2. iOS 中导航控制器全屏向右滑动返回上一界面
  3. Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
  4. SLAM: Orb_SLAM的使用小综述
  5. linux运维笔试题目,linux运维相关的笔试题目_笔试题目
  6. c++中怎么数组内有用元素的个数_前端面试(算法篇) - 数组乱序
  7. linux的基础知识——shell基础
  8. OpenInfra 十一年:OpenStack 部署规模超 2500 万计算核心
  9. WIn7虚拟机下运行H3CCloud出错问题
  10. 特斯拉、华为等竞争升级,国产芯片实现突破,自动驾驶过去这一年
  11. nfs 端口_Linux挂载NFS,偶发执行df命令卡顿
  12. C# 组成结构、数据类型、运算符 以及 基本语法练习
  13. shell三种 for循环方式
  14. 炫龙dd2——黑苹果10.14 Clover EFI文件共享
  15. zotero文献管理高级操作|解决文献条目题录元数据一键更新问题
  16. 硬盘根目录里的Msdia80.dll文件
  17. android wifi认证,android 怎么检测连接的wlan wifi需要portal认证
  18. java导出excel设置行高列宽_POI精确设置Excel的行高和列宽
  19. Windows Server 2012 R2 安装补丁
  20. Java单身狗,java 的23种设计模式 之单身狗和隔壁老王的故事

热门文章

  1. 使用 npm shrinkwrap 来管理项目依赖
  2. 我的中国“芯”——资深后端工程师成长分享——“胡”说IC工程师完美进阶
  3. 被野性消费的黄桃罐头,还能火多久!
  4. Nginx配置多个域名指向不同的端口
  5. python模拟鼠标操作_python 捕捉和模拟鼠标键盘操作
  6. C/C++, STM32,KEIL warning: #175-D: subscript out of range
  7. etc 文件夹下放什么内容
  8. DEDE源码分析与学习之三: member/archives_*.php文件解读
  9. DTOJ#5208. 蓝buff一吃就起飞
  10. 【Python PIL】用PIL绘制中国象棋棋盘