Python TIM自动发送消息脚本
0x01 思路
思路是这样的
从message.txt里获取消息内容,从people.txt里获取发送对象的列表
通过win32gui库的函数来获得窗口句柄,使窗口最大化,以便确定搜索框的位置,然后模拟键鼠操作打开与目标的会话,通过剪贴板粘贴消息内容,模拟键鼠操作再发送出去
0x02 获取消息内容
# 从message.txt里获取消息内容
def message_get():with open('./message.txt', encoding='UTF-8') as f1:message = f1.readlines()for msg in message:return msg# 从people.txt里获取发送对象列表
def people_get():with open('./people.txt', encoding='UTF-8') as f2:people = f2.readlines()return people
0x03 剪贴板操作
其实用模拟键鼠操作慢慢复制也可以,但效率非常低,看了几篇文章感觉还是放进剪贴板后发消息模拟键盘Ctrl+V效率高一点
def copy(text):# 打开剪贴板clip.OpenClipboard()# 清空剪贴板clip.EmptyClipboard()# 设置剪贴板内容clip.SetClipboardData(win32con.CF_UNICODETEXT, text)# 关闭剪贴板clip.CloseClipboard()
0x04 发送消息
这里是通过窗口标题获取窗口句柄,然后激活打开窗口以及让窗口最大化
窗口最大化后好友的搜索框位置是固定的,消息内容框也大致在那个区域
def TIM_send(title, p, num):try:# 通过窗口标题获取窗口句柄handle = win32gui.FindWindow(None, title.strip('\n'))# print("窗口句柄是:{}".format(handle))# 激活打开窗口win32gui.SetForegroundWindow(handle)# 窗口最大化win32gui.ShowWindow(handle, win32con.SW_MAXIMIZE)except Exception as e:print("窗口句柄获取失败:{}".format(e))
接下来是打开与好友的会话
鼠标移到搜索框->点击一下->Ctrl+V->enter->成功打开与好友的会话
记得中间需要time.sleep(),秒数看心情(事实上看网速,等整个窗口打开在进行操作,不然消息发到别的地方容易社死)
def TIM_send(title, p, num):try:# 通过窗口标题获取窗口句柄handle = win32gui.FindWindow(None, title.strip('\n'))# print("窗口句柄是:{}".format(handle))# 激活打开窗口win32gui.SetForegroundWindow(handle)# 窗口最大化win32gui.ShowWindow(handle, win32con.SW_MAXIMIZE)time.sleep(1.5)# 鼠标位置设定win32api.SetCursorPos((130, 60))# 点击一次鼠标win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)# ctrl+Vtime.sleep(1)win32api.keybd_event(0x11, 0, 0, 0)win32api.keybd_event(0x56, 0, 0, 0)win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)# entertime.sleep(1)win32api.keybd_event(0x0D, 0, 0, 0)win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)except Exception as e:print("窗口句柄获取失败:{}".format(e))
接下来就是发消息了
鼠标移到消息内容框->点击一下->Ctrl+V->enter->成功发送
同样中间需要time.sleep()来让网速放你一马
def TIM_send(title, p, num):try:# 通过窗口标题获取窗口句柄handle = win32gui.FindWindow(None, title.strip('\n'))# print("窗口句柄是:{}".format(handle))# 激活打开窗口win32gui.SetForegroundWindow(handle)# 窗口最大化win32gui.ShowWindow(handle, win32con.SW_MAXIMIZE)time.sleep(1.5)# 鼠标位置设定win32api.SetCursorPos((130, 60))# 点击一次鼠标win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)# ctrl+Vtime.sleep(1)win32api.keybd_event(0x11, 0, 0, 0)win32api.keybd_event(0x56, 0, 0, 0)win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)# entertime.sleep(1)win32api.keybd_event(0x0D, 0, 0, 0)win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)# 文案p = p.strip('\n')msg = f"状态: 脚本运行中\n内容: {message_get()}\n对象: {p}\n时间: {datetime.datetime.now()}"# 将消息文本复制到剪贴板copy(msg)# num设置发送次数for i in range(num):# 鼠标位置设定win32api.SetCursorPos((1000, 940))# 点击一次鼠标win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)# ctrl+Vwin32api.keybd_event(0x11, 0, 0, 0)win32api.keybd_event(0x56, 0, 0, 0)win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)# entertime.sleep(1.5)win32api.keybd_event(0x0D, 0, 0, 0)win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)time.sleep(1)except Exception as e:print("窗口句柄获取失败:{}".format(e))
0x05 main()
由于寻找窗口标题的问题,这里需要TIM的窗口标题是前一个人的名字,这里设置的默认标题是第一个人的名字,所以在运行脚本前需要把TIM点开与第一个人的会话
所有消息发完后把TIM的窗口最小化并弹窗表明脚本结束
def main():# title是窗口标题title = people_get()[0]for p in people_get():print("当前发送目标", p.strip('\n'))copy(p)TIM_send(title, p, 1)title = p# 最小化窗口handle = win32gui.FindWindow(None, p.strip('\n'))win32gui.SetForegroundWindow(handle)win32gui.ShowWindow(handle, win32con.SW_MINIMIZE)# 提示完成win32api.MessageBox(0, "脚本结束", "提示", win32con.MB_OK)pass
0x06 完整代码
完整代码如下
# -*- coding:UTF-8 -*-
import win32clipboard as clip
import win32con
import win32gui
import win32api
import datetime
import timedef message_get():# 在当前目录message.txt里获取信息内容with open('./message.txt', encoding='UTF-8') as f1:message = f1.readlines()for msg in message:return msgdef people_get():# 在当前目录people.txt里获取发送目标列表with open('./people.txt', encoding='UTF-8') as f2:people = f2.readlines()return peopledef copy(text):clip.OpenClipboard()clip.EmptyClipboard()clip.SetClipboardData(win32con.CF_UNICODETEXT, text)clip.CloseClipboard()def TIM_send(title,p,num=1):try:# 通过窗口标题获取窗口句柄handle = win32gui.FindWindow(None, title.strip('\n')) # 通过窗口标题获取窗口句柄# print("窗口句柄是:{}".format(handle))# 打开窗口win32gui.SetForegroundWindow(handle)# 窗口最大化win32gui.ShowWindow(handle, win32con.SW_MAXIMIZE)time.sleep(1.5)# 鼠标位置设定win32api.SetCursorPos((130,60))# 点击一次鼠标win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)# ctrl+Vtime.sleep(1)win32api.keybd_event(0x11, 0, 0, 0)win32api.keybd_event(0x56, 0, 0, 0)win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)# entertime.sleep(1)win32api.keybd_event(0x0D, 0, 0, 0)win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)# 文案p = p.strip('\n')msg = f"状态: 脚本运行中\n内容: {message_get()}\n对象: {p}\n时间: {datetime.datetime.now()}"# 将消息文本复制到剪贴板copy(msg)for i in range(num):# 鼠标位置设定win32api.SetCursorPos((1000,940))# 点击一次鼠标win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)# ctrl+Vwin32api.keybd_event(0x11, 0, 0, 0)win32api.keybd_event(0x56, 0, 0, 0)win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)# entertime.sleep(1)win32api.keybd_event(0x0D, 0, 0, 0)win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)time.sleep(0.5)except Exception as e:print("窗口句柄获取失败:{}".format(e))def main():# title是窗口标题title = people_get()[0]for p in people_get():print("当前发送目标", p.strip('\n'))copy(p)TIM_send(title, p, 1)title = p# 最小化窗口handle = win32gui.FindWindow(None, p.strip('\n'))win32gui.SetForegroundWindow(handle)win32gui.ShowWindow(handle, win32con.SW_MINIMIZE)# 提示完成win32api.MessageBox(0, "脚本结束", "提示", win32con.MB_OK)passif __name__ == '__main__':main()
0x07 注意点/缺陷
1.由于寻找窗口标题的问题,这里需要TIM的窗口标题是前一个人的名字,这里设置的默认标题是第一个人的名字,所以在运行脚本前需要把TIM点开与第一个人的会话
2.由于窗口标题匹配的问题,需要好友的名字和people.txt里是一样的,这里建议要么把好友备注都改成名字,不要加什么前缀后缀,或者窗口标题匹配改成正则表达式
3.QQ同理,就是需要改一下鼠标位置什么的
Python TIM自动发送消息脚本相关推荐
- Python自动发送消息小脚本,可用于各种聊天框~
作者主页:爱笑的男孩.的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩.擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩.关注算法,python,计算机视觉,图像处理,深度学习, ...
- 使用python自动发送消息到微信或者聊天对话框
使用python自动发送消息到微信或者聊天对话框 环境准备 环境:python3.8 系统:win下 环境准备(默认win下已安装python3.8以上版本):以下环境准备只需要配置一次 1.wino ...
- Python之给微信好友自动发送消息
由于itchat运行时,老是报KeyError: 'pass_ticket',故itchat暂不能使用.而wxpy在使用时需要登录网页版微信,且动不动报KeyError: 'pass_ticket,所 ...
- 微软考虑将 Python 作为 Excel 官方脚本语言
微软正考虑将 Python 作为 Excel 官方脚本语言之一,在 Excel 用户反馈平台中,「Python 作为 Excel 的脚本语言」成为了最热议的话题,是排名第二的提议的两倍多 目前为止,超 ...
- Python发送微信消息(文字、图片、文件)给指定好友和微信群,零基础可看懂(附源码和教程)
前言 本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于 ...
- python自动回复微信群的消息_程序员用python实现微信消息群发和微信自动回复
程序员用python实现微信消息群发和微信自动回复 每当逢年过节的时候, 你是否会遇到要给亲朋好友发祝福而不得不重复复制.改名.发送的麻烦, 还有收到许多好友祝福又来不及回复的情况.如果有,这篇文章正 ...
- Python发送微信消息(文字、图片、文件)给指定好友和微信群(调用Win32 API模拟人的手动操作来发送消息)
本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于程序找 ...
- android 消息管理器,腾讯TIM消息管理器在哪 腾讯TIM打开消息管理器的教程
腾讯TIM最新简介 tim最新版主要是在"日程"方面进行了改进,比如在聊天界面点击日程时,可以新建日程和分享我的日程.日程界面支持周视图展示等.另外,更新还精简代码,缩减安装包大小 ...
- 【kafka连载四】window系统python环境发送消息和消费消息
前提 1.已安装kafka-python模块 2.已启动zookeeper服务 3.已启动kafka服务 一.编辑发送消息code #coding=utf-8from kafka import Kaf ...
最新文章
- 利用openbabel2.4.1进行小分子构象搜索
- LoadRunner学习笔记(一)
- 检测线程是否存活代码!
- go语言核心编程_Go核心编程 - 语言特性(1)
- OGRE 1.7.2 [Cthugha] 编译配置全过程方法
- 485通信原理_上位机开发之单片机通信实践
- 什么样的程序员会让人讨厌?大家注意,千万不要成为这种程序员!
- 宾大最新《图神经网络》课程,附视频与课件
- Mac上添加自己/公司的网络服务器盘
- mysql每组排序后取前2条,并修改数据
- iOS 极光推送没有声音怎么办?
- java极光短信的集成
- c语言输入学号查找成绩,C语言程序设计按学号查询成绩
- Aurora 8b/10b AXI4-ST回环测试
- 文人和书生 摘自《明朝那些事儿》
- 2012系统架构设计师考试大纲
- 【电源专题】LDO基础——压降
- rTotalCMD | TC替换资源管理器 For Win7
- java 分割窗格_分隔窗格JSplitPane
- Docker 安装配置Crowd
热门文章
- cmd关机计算机名称,CMD远程关机 -电脑资料
- js定义全局变量 vue页面_vue项目中定义全局变量、函数的几种方法
- 用 Python 加密文件,技能满满,赶紧get起来
- goldengate mysql_Goldengate异构 mysql——oracl
- java 生成带网络头像的二维码
- jQuery超酷苹果3D音乐专辑封面CoverFlow特效
- 2016美国计算机科学硕士,干货│给申请美国计算机科学硕士的战士们
- php 催单功能,配置和使用工单催单功能
- 2008年8月18号,星期一,晴。天行健,君子以自强不息。 ——《周易•乾•象》
- 查看服务器内存条的详细信息