寇秀娟 发表于 2026-1-6 22:00:08

Python微信群发消息

微信自带的群发助手不支持为每位收件人自定义消息内容,导致群发过程单调且缺乏个性化。因此,我希望通过编写程序来实现自动发送消息,并允许提前准备文本内容,方便后续直接调用。目前项目已基本完成,但由于担心可能引发微信账号风险,尚未投入实际使用。欢迎有兴趣的朋友在此基础上进一步开发和完善。
前期调研

调研的包

Issues · Frica01/WeChatMassTool
⭐UI自动化工具轻松实现微信消息收发⚡朋友圈爬取⁉️_uiautomation获取微信图片-CSDN博客
2. 获取消息 | wxauto
因为担心被封号,所以了解了一下这两个概念HOOK和RPA,基于hook封号风险很高
UIAutomation识别UI元素 - 特洛伊-Micro - 博客园
最后确定的方案

方案一:采用UIAutomation来自己设计,科研参考一下上述Issues · Frica01/WeChatMassTool
方案二:全模拟,需要确定微信聊天框的位置,然后再进行操作
目前先采用方案二,因为可以自己控制模拟时间,最后来发送
【uiautomation】微信好友列表获取(存储到txt中)_python uiautomation listitemcontrol 微信 某个人-CSDN博客
最后还是敲定方案一,方案一做起来比较方便,如果真封号了,解释一下应该也可以解封。
python实现微信自动发消息功能 - 菩提浪子 - 博客园
python+uiautomation 获取微信好友昵称/备注_uiautomation python 获取微信通讯录的好友信息-CSDN博客
【uiautomation】微信好友昵称及备注获取(存储到excel中)-CFANZ编程社区
代码

import time
import uiautomation as auto

def selectSessionFromName(name, wait_time=0.1):
    search.Click()
    auto.SetClipboardText(name)
    search.SendKeys('{Ctrl}v')
    # 等待微信索引搜索跟上
    time.sleep(wait_time)
    search.SendKeys("{Enter}")

def send_msg_test(content):
    edit = wechatWindow.EditControl(Name='小号')
    edit.SendKeys(content)
    sendButton = wechatWindow.ButtonControl(Name='发送(S)')
    sendButton.Click()


wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')

wechatWindow.SetActive()
search = wechatWindow.EditControl(Name='搜索')
selectSessionFromName("小号") #点击小号
send_msg_test(content="测试文字")

# messages = wechatWindow.ListControl(Name='消息')
# for message in messages.GetChildren():
#   content = message.Name
#   print(content)单人信息发送

import time
import uiautomation as auto

def selectSessionFromName(name, wait_time=0.1):
    search.Click()
    auto.SetClipboardText(name)
    search.SendKeys('{Ctrl}v')
    # 等待微信索引搜索跟上
    time.sleep(wait_time)
    search.SendKeys("{Enter}")

def send_msg_test(content):
    edit = wechatWindow.EditControl(Name='小号')
    edit.SendKeys(content)
    sendButton = wechatWindow.ButtonControl(Name='发送(S)')
    sendButton.Click()


wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')

wechatWindow.SetActive()
search = wechatWindow.EditControl(Name='搜索')
selectSessionFromName("小号") #点击小号
send_msg_test(content="测试文字")

# messages = wechatWindow.ListControl(Name='消息')
# for message in messages.GetChildren():
#   content = message.Name
#   print(content)获取好友昵称列表

import uiautomation as auto
import time

wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
wechatWindow.SetActive() #打开微信界面


# 点击通讯录
button = wechatWindow.ButtonControl(Name='通讯录')
button.Click()
# 点击通讯录管理
administration = wechatWindow.ButtonControl(Name="通讯录管理")
administration.Click()


communication_administration = auto.WindowControl(Name="通讯录管理", ClassName="ContactManagerWindow")
# 将鼠标放至内容的中心,滚轮对联系人列表才能生效
communication_administration.MoveCursorToMyCenter()
list1 = communication_administration.ListControl(Name="")

# a表示存储列表,b表示计数器,flag控制代码是否退出
# 这里也定义了初始时间,方便代码运行结束查看代码运行时间。
a = []
b = 1

flag = True
start_time = time.time()
print("""开始时间:{}""".format(start_time))

# 这里我采用的是类似的一直执行的代码,只不过我这里用,flag控制代码是否继续运行,而flag由我们在滚轮滚到底部时,按空格键改变flag值,最终停止运行代码
while flag:
    list1 = communication_administration.ListControl(Name="")
    #communication_administration.MoveCursorToMyCenter() 表示将鼠标放至内容的中心,
    #由于这里将其放到通讯录管理页面的中心,由于这样,鼠标在联系人列表这边,因此滚轮对联系人列表才能生效。
    nickname = list1.GetChildren().TextControl()
    '''判断是不是在列表a中,如果列表中没有,则添加'''
    if nickname.Name not in a:
      print(b, '', nickname.Name)
      b += 1
      a.append(nickname.Name)
      with open('name.txt', 'a', encoding='utf-8') as f: #②首先我们定位到每次显示的第一个联系人,判断其是否在列表a中,如果不在,就添加,并且保存到name.txt文件中;
            f.write(nickname.Name)
            f.write('\n')
    # 滚轮下滚
    auto.WheelDown(waitTime=0.01) #不管该判断成不成立,都执行鼠标滚轮下滚的操作;

    # 手动实现滚轮滚动到底操作
    # 空格
    if auto.IsKeyPressed(auto.Keys.VK_SPACE):
      print("到底了") #④滚到最底端的时候,由于笔者目前没有较好的方法判断其是否在最底端,
      # 因此采用人工按空格的方式来让代码知道滚轮到最底端了,然后在该页面遍历所有联系人元素,判断其是否存在列表中,不在则添加,并添加到name.txt文件中;
      for j in list1.GetChildren():
            last_nickname = j.TextControl()

            if last_nickname not in a:
                print(b, '', last_nickname.Name)
                b += 1
                a.append(last_nickname)
                with open('name.txt', 'a', encoding='utf-8') as f:
                  f.write(last_nickname.Name)
                  f.write('\n')
      print(a) #最后打印列表a,更改flag,打印代码运行时间。
      flag = False
      end_time = time.time()
      sum_time = end_time - start_time
      print("""运行时间:{}s""".format(sum_time))获取好友所有信息代码

# -*- coding: utf-8-*-
import uiautomation as auto
import time
import pandas as pd

df = []
columns = ['序号', '昵称', '备注', '标签']# excel的标题栏
# ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
wechatWindow.SetActive() #打开微信界面


# 点击通讯录
button = wechatWindow.ButtonControl(Name='通讯录')
button.Click()
# 点击通讯录管理
administration = wechatWindow.ButtonControl(Name="通讯录管理")
administration.Click()

communication_administration = auto.WindowControl(Name="通讯录管理", ClassName="ContactManagerWindow")

# 将鼠标放至内容的中心,滚轮对联系人列表才能生效
communication_administration.MoveCursorToMyCenter()
list1 = communication_administration.ListControl(Name="")
# a表示存储列表,b表示计数器
a = []
b = 1

flag = True
start_time = time.time()
print("""开始时间:{}""".format(start_time))
while flag:
    list1 = communication_administration.ListControl(Name="")
    # nickname = list1.GetChildren().TextControl()
    nickname = list1.GetChildren().GetFirstChildControl().GetFirstChildControl().GetChildren().GetChildren()
    beizhu = list1.GetChildren().GetFirstChildControl().GetFirstChildControl().GetChildren().ButtonControl()
    biaoqian = list1.GetChildren().GetFirstChildControl().GetFirstChildControl().GetChildren().ButtonControl()
    # print(nickname.Name)
    # print(beizhu.Name)
    # print(biaoqian.Name)
    '''判断是不是在列表a中,如果'''
    if len(a) == 0 or nickname.Name != a[-1]:
      # print(nickname.Name)
      # print(beizhu.Name)
      # print(biaoqian.Name)
      # print("="*50)
      print(b, '', nickname.Name)
      df.append()
      d = pd.DataFrame(df, columns=columns)
      d.to_excel("微信朋友信息.xlsx", index=False)
      b += 1
      a.append(nickname.Name)

    end_time = time.time()
    sum_time = end_time - start_time
    # 滚轮下滚
    if sum_time%10==0:
      auto.WheelDown(waitTime=0.01)


    # 手动实现滚轮滚动到底操作
    # 空格
    if auto.IsKeyPressed(auto.Keys.VK_SPACE):
      print("到底了")
      for j in list1.GetChildren():
            last_nickname = j.TextControl()

            if last_nickname != a[-1]:
                print(b, '', last_nickname.Name)
                last_beizhu = j.GetFirstChildControl().GetFirstChildControl().GetChildren().ButtonControl()
                last_biaoqian = j.GetFirstChildControl().GetFirstChildControl().GetChildren().ButtonControl()
                df.append()
                d = pd.DataFrame(df, columns=columns)
                d.to_excel("微信朋友信息.xlsx", index=False)
                b += 1
                a.append(last_nickname)

      print(a)
      flag = False
      end_time = time.time()
      sum_time = end_time - start_time
      print("""运行时间:{}s""".format(sum_time))
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

喳谍 发表于 2026-1-17 21:39:58

这个有用。

官厌 发表于 2026-1-19 00:19:54

新版吗?好像是停更了吧。

磁呃泵 发表于 2026-1-19 04:23:16

感谢分享,学习下。

溶绚 发表于 2026-1-20 13:18:24

这个好,看起来很实用

凶契帽 发表于 2026-1-20 18:51:32

谢谢楼主提供!

左丘纨 发表于 2026-1-21 13:17:12

新版吗?好像是停更了吧。

跑两獗 发表于 2026-1-21 15:01:46

谢谢分享,试用一下

玲液 发表于 2026-1-29 02:04:49

感谢分享

村亢 发表于 2026-1-29 05:12:13

谢谢分享,试用一下

郁兰娜 发表于 2026-2-2 04:39:38

这个有用。

阙忆然 发表于 2026-2-3 08:35:52

喜欢鼓捣这些软件,现在用得少,谢谢分享!

郦珠雨 发表于 2026-2-5 04:56:20

收藏一下   不知道什么时候能用到

赖珊 发表于 2026-2-7 09:29:24

新版吗?好像是停更了吧。

凌彦慧 发表于 2026-2-10 03:53:06

用心讨论,共获提升!

椎蕊 发表于 2026-2-10 04:25:04

感谢分享

许娴广 发表于 2026-2-10 20:11:41

感谢,下载保存了

孜尊 发表于 2026-2-14 02:47:41

感谢发布原创作品,程序园因你更精彩

薯羞 发表于 2026-2-18 06:45:41

这个有用。

啪炽 发表于 2026-2-20 12:15:26

热心回复!
页: [1] 2
查看完整版本: Python微信群发消息