读取列表后群发无限循环

我在写一个pyautogui自动群发的代码,遇到一个问题,无限循环,发完之后同样的内容倒回去给客户发第二遍。
先读取用户名。然后用户名复制粘贴到微信。发送营销视频。
1.有什么函数解决循环的问题,发一次就好了。
2.而且感觉自动发的时候,有的客户还没有发,有的客户发了两遍三遍。
3.如果出错,停不下来,怎么及时停止程序

img


import pyautogui
import pyperclip
import os
import time
import xlrd
import pandas as pd
import numpy as np

pyautogui.FAILSAFE = False
pyautogui.PAUSE = 0.5

df = pd.read_excel('E:\\公司资料1B客户资料\1客户资料\1 WeChat.xls')
names = df['姓名']

# 用一个集合来记录已发送消息的客户
messaged_customers = set()

for name in names:
    if name not in messaged_customers:
        try:
            # 将姓名粘贴到消息框并发送消息
            pyperclip.copy(name)
            pyautogui.hotkey('ctrl', 'v')
            pyautogui.press('enter')

            # 将客户添加到已发送消息的集合中
            messaged_customers.add(name)

            # 发送下一条消息前等待一段时间
            time.sleep(5)

        except Exception as e:
            print(f"出现错误:{e}")
            break

应该是你代码循环问题,将代码完全粘贴出来才能帮你查找问题

每一次解答都是一次用心理解的过程,期望对你有所帮助。
参考结合AI智能库,如有帮助,恭请采纳。

1、你可以在循环体内添加一个变量来标记是否已经发送过消息,当已经发送过时,使用break语句跳出循环。
以下是一个简单示例

has_sent = False  
  
while True:  
    username = input("请输入用户名:")  
    if username == "exit":  
        break  
  
    # 复制粘贴到微信  
    pyautogui.copy(username)  
    pyautogui.sleep(1)  
    pyautogui.hotkey('winleft', 'c')  
    pyautogui.sleep(1)  
    pyautogui.hotkey('winleft', 'v')  
    pyautogui.sleep(1)  
  
    # 发送营销视频  
    pyautogui.hotkey('ctrl', 'v')  
    pyautogui.sleep(1)  
    pyautogui.hotkey('enter')  
    pyautogui.sleep(3)  
  
    #标记已经发送过消息  
    has_sent = True  
  
# 退出循环  
if has_sent:  
    print("发送成功!")

2、还可以这样:要避免重复发送消息,可以在发送之前检查是否已经发送过该用户的消息。可以使用一个字典来存储已经发送过的用户名,每次发送前检查该用户名是否已经存在字典中。

sent_users = set()  
  
while True:  
    username = input("请输入用户名:")  
    if username == "exit":  
         break  
  
    # 检查是否已经发送过该用户的消息  
    if username in sent_users:  
        print("该用户已经发送过消息")  
        continue  
  
    # 复制粘贴到微信  
    pyautogui.copy(username)  
    pyautogui.sleep(1)  
    pyautogui.hotkey('winleft', 'c')  
    pyautogui.sleep(1)  
    pyautogui.hotkey('winleft', 'v')  
    pyautogui.sleep(1)  
  
    # 发送营销视频  
    pyautogui.hotkey('ctrl', 'v')  
    pyautogui.sleep(1)  
    pyautogui.hotkey('enter')  
    pyautogui.sleep(3)  
  
    # 标记已经发送过该用户的消息  
    sent_users.add(username)  
  
    # 打印已发送用户列表  
    print("已发送用户:", list(sent_users))

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7460665
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    1. 要解决循环问题,可以使用一个标志来控制循环的次数。比如在发送消息之前,使用一个变量来记录已经发送的次数,然后在每次循环时都检查这个变量是否达到了指定次数,如果达到了就跳出循环。 以下是一个示例代码:
    import pyautogui
    
    # 读取用户名列表
    usernames = ['user1', 'user2', 'user3']
    
    # 设置发送次数的上限
    max_send_count = 1
    
    # 初始化发送次数的计数器
    send_count = 0
    
    for username in usernames:
        # 将用户名复制粘贴到微信中
        pyautogui.typewrite(username)
        pyautogui.press('enter')
    
        # 发送营销视频
        pyautoui.typewrite('营销视频')
        pyautogui.press('enter')
    
        # 更新发送次数的计数器
        send_count += 1
    
        # 检查是否达到发送次数上限
        if send_count >= max_send_count:
            break
    
    1. 如果不同客户收到了不同次数的消息,可能是因为发送消息的速度过快导致的。可以尝试加入适当的等待时间,保证每个客户都有足够的时间接收消息。可以使用time.sleep()函数来添加等待时间。以下是一个示例代码:
    import pyautogui
    import time
    
    # 读取用户名列表
    usernames = ['user1', 'user2', 'user3']
    
    for username in usernames:
        # 将用户名复制粘贴到微信中
        pyautogui.typewrite(username)
        pyautogui.press('enter')
    
        # 发送营销视频
        pyautogui.typewrite('营销视频')
        pyautogui.press('enter')
    
        # 添加适当的等待时间
        time.sleep(5)  # 等待5秒后再继续发送下一条消息
    
    1. 如果程序出现错误导致无法停止,可以使用异常处理来捕获错误并停止程序的执行。可以使用try-except语句来捕获异常,并在发生异常时使用break关键字跳出循环。以下是一个示例代码:
    import pyautogui
    
    # 读取用户名列表
    usernames = ['user1', 'user2', 'user3']
    
    for username in usernames:
        try:
            # 将用户名复制粘贴到微信中
            pyautogui.typewrite(username)
            pyautogui.press('enter')
    
            # 发送营销视频
            pyautogui.typewrite('营销视频')
            pyautogui.press('enter')
        except Exception as e:
            print(f"发生错误: {str(e)}")
            break
    

    以上是关于如何解决pyautogui自动群发代码读取列表后发生无限循环的问题的建议和示例代码。希望对你有帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
  • 为啥要把for循环套在while中?😭😭

  • for 循环就是遍历一次列表,从列表起到列表止,仅仅循环一次。

  • while一般是不能确实循环次数用。要先确定好结束循环的条件,达成条件结束循环。一旦结束循环条件设定不合理,达不成结束循环条件,就是“死”循环。用while,很容易“死循环”,用时需谨慎。


问题点:
1.有什么函数解决循环的问题,发一次就好了。
2.而且感觉自动发的时候,有的客户还没有发,有的客户发了两遍三遍。
3.如果出错,停不下来,怎么及时停止程序

解答:
设计上,
1.创建一个列表 send_user = [] 用来记录已发送的;
2.移除while 避免程序一直循环,for rang来代替重试;

    def send_msg(name):
        ...
        print(f"发送给{name}")
        return True


    names = []
    send_names = []
    # 默认重试3次
    max_times = 3
    for name in names:
        # 已发送过, 跳过执行
        if name in send_names:
            continue

        # todo 发送
        for try_time in range(max_times + 1):
            is_success = send_msg(name)
            # 发送成功, 更新send_names 列表
            if is_success:
                send_names.append(name)
                # 发送成功就结束当前这轮的发送
                break

看下用户名是不是有重复的,或者是发送消息太快了,可以在发送消息的时候,暂停一段时间,再继续发送试试。

参考gpt:
结合自己分析给你如下建议:
1.for循环没有设置终止条件,所以会无限循环。您可以使用break语句来跳出循环,或者使用一个计数器变量来限制循环次数。
2.代码没有检查是否成功发送了视频,也没有处理可能出现的异常或错误。您可以使用try-except语句来捕获和处理异常,或者使用pyautogui.confirm()函数来确认是否发送成功。
3.代码设置了pyautogui.FAIL_SAFE为False,这意味着您不能通过移动鼠标到屏幕角落来停止程序。您可以将其设置为True,或者使用pyautogui.hotkey()函数来定义一个快捷键来停止程序。

debug一步一步看看他怎么走的

py实现自动发送仅发送一次
引用c知道,如果有帮助,望采纳

import time

def send_message(username, message):
    # 这里写发送消息的逻辑
    print(f"给用户 {username} 发送消息: {message}")
    # 模拟发送消息的延迟
    time.sleep(1)

def main():
    # 从文件或数据库中读取用户名列表
    usernames = ['user1', 'user2', 'user3']
    message = '这是一条群发消息'

    sent_users = set()  # 记录已经发送消息的用户

    for username in usernames:
        if username not in sent_users:
            send_message(username, message)
            sent_users.add(username)

if __name__ == '__main__':
    main()