找回密码
 立即注册
首页 业界区 业界 Python微信群发消息

Python微信群发消息

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

调研的包

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编程社区
代码
  1. import time
  2. import uiautomation as auto
  3. def selectSessionFromName(name, wait_time=0.1):
  4.     search.Click()
  5.     auto.SetClipboardText(name)
  6.     search.SendKeys('{Ctrl}v')
  7.     # 等待微信索引搜索跟上
  8.     time.sleep(wait_time)
  9.     search.SendKeys("{Enter}")
  10. def send_msg_test(content):
  11.     edit = wechatWindow.EditControl(Name='小号')
  12.     edit.SendKeys(content)
  13.     sendButton = wechatWindow.ButtonControl(Name='发送(S)')
  14.     sendButton.Click()
  15. wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
  16. wechatWindow.SetActive()
  17. search = wechatWindow.EditControl(Name='搜索')
  18. selectSessionFromName("小号") #点击小号
  19. send_msg_test(content="测试文字")
  20. # messages = wechatWindow.ListControl(Name='消息')
  21. # for message in messages.GetChildren():
  22. #     content = message.Name
  23. #     print(content)
复制代码
单人信息发送
  1. import time
  2. import uiautomation as auto
  3. def selectSessionFromName(name, wait_time=0.1):
  4.     search.Click()
  5.     auto.SetClipboardText(name)
  6.     search.SendKeys('{Ctrl}v')
  7.     # 等待微信索引搜索跟上
  8.     time.sleep(wait_time)
  9.     search.SendKeys("{Enter}")
  10. def send_msg_test(content):
  11.     edit = wechatWindow.EditControl(Name='小号')
  12.     edit.SendKeys(content)
  13.     sendButton = wechatWindow.ButtonControl(Name='发送(S)')
  14.     sendButton.Click()
  15. wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
  16. wechatWindow.SetActive()
  17. search = wechatWindow.EditControl(Name='搜索')
  18. selectSessionFromName("小号") #点击小号
  19. send_msg_test(content="测试文字")
  20. # messages = wechatWindow.ListControl(Name='消息')
  21. # for message in messages.GetChildren():
  22. #     content = message.Name
  23. #     print(content)
复制代码
获取好友昵称列表
  1. import uiautomation as auto
  2. import time
  3. wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
  4. wechatWindow.SetActive() #打开微信界面
  5. # 点击通讯录
  6. button = wechatWindow.ButtonControl(Name='通讯录')
  7. button.Click()
  8. # 点击通讯录管理
  9. administration = wechatWindow.ButtonControl(Name="通讯录管理")
  10. administration.Click()
  11. communication_administration = auto.WindowControl(Name="通讯录管理", ClassName="ContactManagerWindow")
  12. # 将鼠标放至内容的中心,滚轮对联系人列表才能生效
  13. communication_administration.MoveCursorToMyCenter()
  14. list1 = communication_administration.ListControl(Name="")
  15. # a表示存储列表,b表示计数器,flag控制代码是否退出
  16. # 这里也定义了初始时间,方便代码运行结束查看代码运行时间。
  17. a = []
  18. b = 1
  19. flag = True
  20. start_time = time.time()
  21. print("""开始时间:{}""".format(start_time))
  22. # 这里我采用的是类似的一直执行的代码,只不过我这里用,flag控制代码是否继续运行,而flag由我们在滚轮滚到底部时,按空格键改变flag值,最终停止运行代码
  23. while flag:
  24.     list1 = communication_administration.ListControl(Name="")
  25.     #communication_administration.MoveCursorToMyCenter() 表示将鼠标放至内容的中心,
  26.     #由于这里将其放到通讯录管理页面的中心,由于这样,鼠标在联系人列表这边,因此滚轮对联系人列表才能生效。
  27.     nickname = list1.GetChildren()[0].TextControl()
  28.     '''判断是不是在列表a中,如果列表中没有,则添加'''
  29.     if nickname.Name not in a:
  30.         print(b, '', nickname.Name)
  31.         b += 1
  32.         a.append(nickname.Name)
  33.         with open('name.txt', 'a', encoding='utf-8') as f: #②首先我们定位到每次显示的第一个联系人,判断其是否在列表a中,如果不在,就添加,并且保存到name.txt文件中;
  34.             f.write(nickname.Name)
  35.             f.write('\n')
  36.     # 滚轮下滚
  37.     auto.WheelDown(waitTime=0.01) #不管该判断成不成立,都执行鼠标滚轮下滚的操作;
  38.     # 手动实现滚轮滚动到底操作
  39.     # 空格
  40.     if auto.IsKeyPressed(auto.Keys.VK_SPACE):
  41.         print("到底了") #④滚到最底端的时候,由于笔者目前没有较好的方法判断其是否在最底端,
  42.         # 因此采用人工按空格的方式来让代码知道滚轮到最底端了,然后在该页面遍历所有联系人元素,判断其是否存在列表中,不在则添加,并添加到name.txt文件中;
  43.         for j in list1.GetChildren()[1:]:
  44.             last_nickname = j.TextControl()
  45.             if last_nickname not in a:
  46.                 print(b, '', last_nickname.Name)
  47.                 b += 1
  48.                 a.append(last_nickname)
  49.                 with open('name.txt', 'a', encoding='utf-8') as f:
  50.                     f.write(last_nickname.Name)
  51.                     f.write('\n')
  52.         print(a) #最后打印列表a,更改flag,打印代码运行时间。
  53.         flag = False
  54.         end_time = time.time()
  55.         sum_time = end_time - start_time
  56.         print("""运行时间:{}s""".format(sum_time))
复制代码
获取好友所有信息代码
  1. # -*- coding: utf-8-*-
  2. import uiautomation as auto
  3. import time
  4. import pandas as pd
  5. df = []
  6. columns = ['序号', '昵称', '备注', '标签']  # excel的标题栏
  7. # ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
  8. wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
  9. wechatWindow.SetActive() #打开微信界面
  10. # 点击通讯录
  11. button = wechatWindow.ButtonControl(Name='通讯录')
  12. button.Click()
  13. # 点击通讯录管理
  14. administration = wechatWindow.ButtonControl(Name="通讯录管理")
  15. administration.Click()
  16. communication_administration = auto.WindowControl(Name="通讯录管理", ClassName="ContactManagerWindow")
  17. # 将鼠标放至内容的中心,滚轮对联系人列表才能生效
  18. communication_administration.MoveCursorToMyCenter()
  19. list1 = communication_administration.ListControl(Name="")
  20. # a表示存储列表,b表示计数器
  21. a = []
  22. b = 1
  23. flag = True
  24. start_time = time.time()
  25. print("""开始时间:{}""".format(start_time))
  26. while flag:
  27.     list1 = communication_administration.ListControl(Name="")
  28.     # nickname = list1.GetChildren()[0].TextControl()
  29.     nickname = list1.GetChildren()[0].GetFirstChildControl().GetFirstChildControl().GetChildren()[1].GetChildren()[1]
  30.     beizhu = list1.GetChildren()[0].GetFirstChildControl().GetFirstChildControl().GetChildren()[2].ButtonControl()
  31.     biaoqian = list1.GetChildren()[0].GetFirstChildControl().GetFirstChildControl().GetChildren()[3].ButtonControl()
  32.     # print(nickname.Name)
  33.     # print(beizhu.Name)
  34.     # print(biaoqian.Name)
  35.     '''判断是不是在列表a中,如果'''
  36.     if len(a) == 0 or nickname.Name != a[-1]:
  37.         # print(nickname.Name)
  38.         # print(beizhu.Name)
  39.         # print(biaoqian.Name)
  40.         # print("="*50)
  41.         print(b, '', nickname.Name)
  42.         df.append([b, nickname.Name, beizhu.Name, biaoqian.Name])
  43.         d = pd.DataFrame(df, columns=columns)
  44.         d.to_excel("微信朋友信息.xlsx", index=False)
  45.         b += 1
  46.         a.append(nickname.Name)
  47.     end_time = time.time()
  48.     sum_time = end_time - start_time
  49.     # 滚轮下滚
  50.     if sum_time%10==0:
  51.         auto.WheelDown(waitTime=0.01)
  52.     # 手动实现滚轮滚动到底操作
  53.     # 空格
  54.     if auto.IsKeyPressed(auto.Keys.VK_SPACE):
  55.         print("到底了")
  56.         for j in list1.GetChildren()[1:]:
  57.             last_nickname = j.TextControl()
  58.             if last_nickname != a[-1]:
  59.                 print(b, '', last_nickname.Name)
  60.                 last_beizhu = j.GetFirstChildControl().GetFirstChildControl().GetChildren()[2].ButtonControl()
  61.                 last_biaoqian = j.GetFirstChildControl().GetFirstChildControl().GetChildren()[3].ButtonControl()
  62.                 df.append([b, last_nickname.Name, last_beizhu.Name, last_biaoqian.Name])
  63.                 d = pd.DataFrame(df, columns=columns)
  64.                 d.to_excel("微信朋友信息.xlsx", index=False)
  65.                 b += 1
  66.                 a.append(last_nickname)
  67.         print(a)
  68.         flag = False
  69.         end_time = time.time()
  70.         sum_time = end_time - start_time
  71.         print("""运行时间:{}s""".format(sum_time))
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册