本程序能做什么:

在PC版的微信界面,模拟鼠标键盘动作,随机对好友列表里的某些好友发送文本消息和图片

(因为本人以前没有WINDOW UI的编程经验,所以这几天对WIN32UI接口基本是边学边搜边用,导致程序里面导入的UI包资源有功能上的冗余,比如WIN32API和pyautogui代码都有混合重叠,目的只是实现自己需要的功能,也就不要太计较了)

# 第一步需要手动登录PC版微信

# 因为显示器分辨率的不同,程序文件的各个常量需要手工设置一下,否则鼠标可能无法准确点击微信功能界面

# 开始运行本Python程序,会自动把微信最大化并最靠前,然后依次对好友列表内的好友发送预置的文本信息和图片

#在INI文件里可以设置需要发送的好友列表的页数,需要发送的文本信息,以及图片所在文件夹的路径(图片文件夹下面的所有图片随机发送)

INI文件内容:

[DataLoading]
friendListPages = 1
imageDir =
sendMsg = 您好,请关注一下!
import win32gui, win32api, win32con
import win32clipboard as clipboard
import pyperclip
import pyautogui
import time
import random
import configparser
from PIL import Image
from io import BytesIO
import os# 要定位的窗口信息常量
WINDOW_NAME = '微信'
WINDOW_CLASS = 'WeChatMainWndForPC'# 联系人按钮入口鼠标位置
FRIENDS_IN_XPOS = 30
FREENDS_IN_YPOS = 140# 联系人详细列表鼠标X坐标位置
PEOPLE_XPOS = 200# 好友详细列表居中X坐标位置
PEOPLE_LIST_MID_XPOS = 180
# 联系人详细列表鼠标Y坐标起始位置
PEOPLE_LIST_START_YPOS = 70
# 每个联系人列表的高度
PEOPLE_ONE_HEIGHT = 60# 微信在屏幕中最低位置标记
SCREEN_LOWEST_POS = 730
# 右键向上弹出菜单的最低屏幕位置
RMENU_UPDOWN_POS= 653# 点击好友详细列表右侧滚动条向下的位置
FRIENDS_LIST_SCROLL_XPOS = 308
FRIENDS_LIST_SCROLL_YPOS = SCREEN_LOWEST_POS - 2# 点击当前的位置
current_friend_y_pos = 0# 好友列表页面计数
FRIEND_LIST_MAXPAGES = 70
friend_list_pageCount = 1# 发送好友消息计数
friend_sendMsgCount = 0# 图片目录
IMAGE_DIR = 'D:\\PythonProjects\\Hello\\GoodsPics\\'
# 自定图片目录下的所有图片的名称列表
ALL_IMAGES_LIST = []
# 发送给好友的文本信息
SEND_MSG = ''
# 每次发送给好友的图片数量
SEND_IMAGE_TIMES = 1
# 发送文本消息的分隔符
MSG_SPLIT_FLAG = '%%'
send_msg_list = []def _ini():global FRIEND_LIST_MAXPAGESglobal IMAGE_DIRglobal ALL_IMAGES_LISTglobal SEND_MSGglobal SEND_IMAGE_TIMESglobal MSG_SPLIT_FLAGglobal send_msg_list# 从配置文件里读取初始值configure = configparser.ConfigParser()configure.read('configure.ini')section = configure['DataLoading']if int(section['friendListPages']) > 0:FRIEND_LIST_MAXPAGES = int(section['friendListPages'])if len(section['imageDir']) > 0:IMAGE_DIR = section['imageDir']if len(section['sendMsg']) > 0:SEND_MSG = section['sendMsg']if int(section['sendImageTimes']) > 0:SEND_IMAGE_TIMES = int(section['sendImageTimes'])if len(section['msgSplitFlag']) > 0:MSG_SPLIT_FLAG = section['msgSplitFlag']# 将要发送的文本消息列表,随机挑选消息send_msg_list = SEND_MSG.split(MSG_SPLIT_FLAG)ALL_IMAGES_LIST = _getAllImagesPathList()# def getLocalImageData(path):img = Image.open(path)output = BytesIO()  # BytesIO实现了在内存中读写bytes# output = StringIO()  # StringsIO实现了在内存中读写bytesimg.convert("RGB").save(output, "BMP") #以RGB模式保存图像data = output.getvalue()[14:]output.close()img.close()return data# 把图片数据内容塞入剪贴板
def setImageDataToClipboard(data):clipboard.OpenClipboard()clipboard.EmptyClipboard()clipboard.SetClipboardData(win32con.CF_DIB, data)clipboard.CloseClipboard()# 清空剪贴板
def clearClipboard():clipboard.OpenClipboard()clipboard.EmptyClipboard()clipboard.CloseClipboard()# 按照提供的图片路径装载图片到剪切板
def loadImageToclipboard(path):setImageDataToClipboard(getLocalImageData(path))# 复制文字到剪贴板
def _loadTextToClipboard():pyperclip.copy(send_msg_list[random.randint(0, len(send_msg_list) - 1)])# 得到指定图片目录下面的所有图片列表
def _getAllImagesPathList():return os.listdir(IMAGE_DIR)def _loadSendMsg():# 首先清空剪贴板clearClipboard()# 装载将要发送的文本信息到剪贴板_loadTextToClipboard()_clipboardSendMsg()for i in range(1, SEND_IMAGE_TIMES + 1):# 随机装载图片到剪贴板loadImageToclipboard(IMAGE_DIR + ALL_IMAGES_LIST[random.randint(0, len(ALL_IMAGES_LIST) - 1)])_clipboardSendMsg()_sleepLongTime()i += 1# 把粘贴板里的内容,粘帖到微信里,然后发送出去
def _clipboardSendMsg():# 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)# 粘帖到微信pyautogui.hotkey('ctrl', 'v')_sleepLongTime()# 发送消息动作
def _sendMsgAction():win32api.keybd_event(13, 0, 0, 0)                           # Enter的键位码是13  win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)_sleepLongTime()# 为了给界面切换足够的时间,需要适当的间隔时间
def _sleepShortTime():time.sleep(0.5)
def _sleepLongTime():time.sleep(1)# 找到窗口,让窗口位置靠最前,并最大化
def _controlWindow():# 获取窗口句柄hw = win32gui.FindWindow(None, WINDOW_NAME)hw = win32gui.FindWindow(WINDOW_CLASS, None)if hw <= 0:return -1# 让窗口在最前面win32gui.SetForegroundWindow(hw)# 让窗口最大化win32gui.ShowWindow(hw, win32con.SW_MAXIMIZE)return 1# 点击联系人按钮
def _clickFriendsList():# 将鼠标移动到坐标处pyautogui.moveTo(FRIENDS_IN_XPOS, FREENDS_IN_YPOS, duration = 0)# 左点击,准备进入联系人列表界面pyautogui.click()_sleepLongTime()# 在好友列表滚动鼠标,换下一批好友
def _scrollNextFriendList():# 将鼠标移动到坐标处pyautogui.moveTo(PEOPLE_LIST_MID_XPOS, PEOPLE_LIST_START_YPOS, duration = 0)# 鼠标滚轮滚动好友列表pyautogui.scroll(-2200)_sleepLongTime()return 1# 右键点击联系人,然后发送粘贴板里的消息
def _rbClickSendMessage(xPos, yPos):global friend_sendMsgCount# 将鼠标移动到坐标处pyautogui.moveTo(xPos, yPos, duration = 0)_sleepShortTime()# 右键点击出弹出菜单,点击发消息选项pyautogui.rightClick()_sleepShortTime()if yPos <= RMENU_UPDOWN_POS:pyautogui.moveTo(xPos + 15, yPos + 15, duration = 0)_sleepShortTime()# 左键点击菜单,准备进入联系人列表界面pyautogui.click()else:pyautogui.moveTo(xPos + 15,  yPos - 100, duration = 0)_sleepShortTime()# 左键点击菜单,准备进入联系人列表界面pyautogui.click()_sleepShortTime()# 装载要发送的消息到剪切板,然后复制到微信里_loadSendMsg()friend_sendMsgCount += 1# 发送消息出去_sendMsgAction()def _random_friend_yPos():return random.randint(1, int((SCREEN_LOWEST_POS - PEOPLE_LIST_START_YPOS) / PEOPLE_ONE_HEIGHT)) * PEOPLE_ONE_HEIGHT# 判断是不是好友列表是不是最后一页,为程序结束最准备
def _isLastPage():return Falseif __name__ =='__main__':# 首先找到窗口if _controlWindow() == -1:exit()_sleepLongTime()# 初始化_ini()while 1:# 点击联系人按钮,准备进入联系人列表_clickFriendsList()# 判断当前点击位置如果不在有效范围内,设置初始值。if current_friend_y_pos == 0:current_friend_y_pos = PEOPLE_LIST_START_YPOS - PEOPLE_ONE_HEIGHTcurrent_friend_y_pos += _random_friend_yPos()if current_friend_y_pos > SCREEN_LOWEST_POS:current_friend_y_pos = 0# 在好友列表滚动鼠标,换下一批好友_scrollNextFriendList()print('已完成' + str(friend_list_pageCount) + '页')# 如果是最后一页,结束程序if _isLastPage():exit()friend_list_pageCount += 1if friend_list_pageCount > FRIEND_LIST_MAXPAGES:print('共发送给' + str(friend_sendMsgCount) + '个好友')print('执行完毕!')exit()continue# 右键点击好友,然后发送粘贴板里的消息_rbClickSendMessage(PEOPLE_XPOS, current_friend_y_pos)

初学Python第三天写的一个PC版模拟微信自动给好友发送消息相关推荐

  1. 基于python,控制微信自动登录并发送消息给指定联系人

    给出微信联系人.微信启动路径.消息内容,实现自动登录并并发送消息,如果需要定时发送可以开一个线程或者用while True实现.上代码,报错的话可能是缺少对应的库,自行百度安装即可. 下面代码 复制后 ...

  2. easy-mock写的一个简单的模拟二页的反馈

    用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...

  3. C语言时间管理小程序,写了一个时间管理的微信小程序

    原标题:写了一个时间管理的微信小程序 前言 以前看过<把时间当作朋友>这本书,里面有个管理时间的观点个人觉得很有用,就是养成记录自己每天的时间消耗的一个习惯,这样有助于更有效地管理自己的时 ...

  4. Python+appium+GUI界面pyside2微信自动加好友(改问候语、备注、标签)

    目录 一.项目背景 二.实现功能 三.具体实现代码 四.支持与合作 一.项目背景 首先,这是我的第一篇文章,写作功底有待提高,后续有时间我会对代码细节的讲解进行完善. 闲暇中,帮助朋友的初创公司开发了 ...

  5. Python实现QQ PC端给好友发送消息

    上一篇说了发现有交易机会时可以发邮件,如果不想下载邮箱app的话,也可以通过qq来提醒自己. 具体的方法就是先查找qq的句柄,然后用SendMessage给qq窗口发送消息.这样的前提就是跟好友的聊天 ...

  6. (小白)python如何微信自动加好友

    小白一枚在研究python,希望获得一点小成就感. 希望可以实现微信自动加好友的功能 希望大神解答,详细一点最好(您是大佬,我是小白!!!)

  7. 编写一个函数,模拟微信发红包的红包分配过程。函数有两个参数:一个参数表示红包总金额,默认值为100,另一个参数表示红包数量,默认为10。程序输入:红包总金额和红包数量;程序输出:每个红包的金额。要求:

    题目 ‬‬编写一个函数,模拟微信发红包的红包分配过程.函数有两个参数:一个参数表示红包总金额,默认值为100,另一个参数表示红包数量,默认为10.程序输入:红包总金额和红包数量:程序输出:每个红包的金 ...

  8. python网络监控程序_python写的一个监控系统进程网络流量的程序

    python写的一个监控系统进程网络流量的程序,python2.7版本. 代码如下: import socket import struct import thread import threadin ...

  9. Python 写了一个网页版的「P图软件」,惊呆了!

    作者 | 小欣 来源 | Python爱好者集中营 今天是开工第一天,这篇文章可以算作是虎年的第一篇干货技术类文章了,今天小编用Python做了一个网页版的"P图软件",大致的流程 ...

最新文章

  1. 开源wkhtmltopdf使用心得 (二)
  2. linux 权限模式,Linux权限模式
  3. gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_ARP协议在同网段及跨网段下的工作原理...
  4. android存到手机内存,android保存文件到手机内存
  5. 【操作系统】进程与线程
  6. 关于IKAnalyzer自定义分词的切换主词典的方法
  7. python 多继承与super使用详解_Python super()方法、多继承以及MRO顺序
  8. 海龟绘图两小时上手C语言 - 1 绘制直线
  9. ACM弱校ACMer A HDU1045Fire Net有感
  10. 数据分析与数据挖掘的区别
  11. DataSet如何处理海量数据
  12. 国内外低代码平台一览
  13. 爬虫python代码网易云_用python爬取网易云音乐歌曲的歌词
  14. ctf镜子里面的世界_在秋天遇见“冰雪世界”,好像老天给我变了个魔法
  15. sql未保存文档找回
  16. Axure中移动的绝对位置
  17. 排序算法之python实现(上)
  18. smartSVN 新建仓库
  19. 基于C#(Visual Studio 2013)的AutoCAD2016二次开发(二)创建直线
  20. 华硕服务器安装系统安装教程,Asus华硕笔记本重装系统教程

热门文章

  1. 链路聚合的原理及其配置
  2. Google colab中常用操作
  3. 原生js实现上拉加载和下拉刷新功能
  4. java--BigInteger神器的开启姿势
  5. golang坑之 ‘godoc‘ 不是内部或外部命令
  6. 职场新人完全转型七大要素
  7. Bipartite Graph
  8. Go1.18 新特性:多模块(Multi-Module)工作区模式
  9. Android 计时器,定时功能
  10. wiremock最基本的使用