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自动发送消息脚本相关推荐

  1. Python自动发送消息小脚本,可用于各种聊天框~

    作者主页:爱笑的男孩.的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩.擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩.关注算法,python,计算机视觉,图像处理,深度学习, ...

  2. 使用python自动发送消息到微信或者聊天对话框

    使用python自动发送消息到微信或者聊天对话框 环境准备 环境:python3.8 系统:win下 环境准备(默认win下已安装python3.8以上版本):以下环境准备只需要配置一次 1.wino ...

  3. Python之给微信好友自动发送消息

    由于itchat运行时,老是报KeyError: 'pass_ticket',故itchat暂不能使用.而wxpy在使用时需要登录网页版微信,且动不动报KeyError: 'pass_ticket,所 ...

  4. 微软考虑将 Python 作为 Excel 官方脚本语言

    微软正考虑将 Python 作为 Excel 官方脚本语言之一,在 Excel 用户反馈平台中,「Python 作为 Excel 的脚本语言」成为了最热议的话题,是排名第二的提议的两倍多 目前为止,超 ...

  5. Python发送微信消息(文字、图片、文件)给指定好友和微信群,零基础可看懂(附源码和教程)

    前言 本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于 ...

  6. python自动回复微信群的消息_程序员用python实现微信消息群发和微信自动回复

    程序员用python实现微信消息群发和微信自动回复 每当逢年过节的时候, 你是否会遇到要给亲朋好友发祝福而不得不重复复制.改名.发送的麻烦, 还有收到许多好友祝福又来不及回复的情况.如果有,这篇文章正 ...

  7. Python发送微信消息(文字、图片、文件)给指定好友和微信群(调用Win32 API模拟人的手动操作来发送消息)

    本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于程序找 ...

  8. android 消息管理器,腾讯TIM消息管理器在哪 腾讯TIM打开消息管理器的教程

    腾讯TIM最新简介 tim最新版主要是在"日程"方面进行了改进,比如在聊天界面点击日程时,可以新建日程和分享我的日程.日程界面支持周视图展示等.另外,更新还精简代码,缩减安装包大小 ...

  9. 【kafka连载四】window系统python环境发送消息和消费消息

    前提 1.已安装kafka-python模块 2.已启动zookeeper服务 3.已启动kafka服务 一.编辑发送消息code #coding=utf-8from kafka import Kaf ...

最新文章

  1. 利用openbabel2.4.1进行小分子构象搜索
  2. LoadRunner学习笔记(一)
  3. 检测线程是否存活代码!
  4. go语言核心编程_Go核心编程 - 语言特性(1)
  5. OGRE 1.7.2 [Cthugha] 编译配置全过程方法
  6. 485通信原理_上位机开发之单片机通信实践
  7. 什么样的程序员会让人讨厌?大家注意,千万不要成为这种程序员!
  8. 宾大最新《图神经网络》课程,附视频与课件
  9. Mac上添加自己/公司的网络服务器盘
  10. mysql每组排序后取前2条,并修改数据
  11. iOS 极光推送没有声音怎么办?
  12. java极光短信的集成
  13. c语言输入学号查找成绩,C语言程序设计按学号查询成绩
  14. Aurora 8b/10b AXI4-ST回环测试
  15. 文人和书生 摘自《明朝那些事儿》
  16. 2012系统架构设计师考试大纲
  17. 【电源专题】LDO基础——压降
  18. rTotalCMD | TC替换资源管理器 For Win7
  19. java 分割窗格_分隔窗格JSplitPane
  20. Docker 安装配置Crowd

热门文章

  1. cmd关机计算机名称,CMD远程关机 -电脑资料
  2. js定义全局变量 vue页面_vue项目中定义全局变量、函数的几种方法
  3. 用 Python 加密文件,技能满满,赶紧get起来
  4. goldengate mysql_Goldengate异构 mysql——oracl
  5. java 生成带网络头像的二维码
  6. jQuery超酷苹果3D音乐专辑封面CoverFlow特效
  7. 2016美国计算机科学硕士,干货│给申请美国计算机科学硕士的战士们
  8. php 催单功能,配置和使用工单催单功能
  9. 2008年8月18号,星期一,晴。天行健,君子以自强不息。 ——《周易•乾•象》
  10. 查看服务器内存条的详细信息