Whatsapp自动机器人无法在WhatsApp联系人列表中搜索

时间:2018-08-16 07:32:44

标签: python python-3.x selenium selenium-chromedriver whatsapp

我正在尝试实现WhatsApp机器人,该机器人使用chromedriver并打开whatsapp网站,并将消息发送给联系人。这些是程序的步骤:

  • 从Excel文件中读取联系人
  • 设置要发送消息和发送消息的时间
  • 搜索该名称并发送消息

这是我无法解决的问题:

  1. 如果最近的聊天中没有该名称,则无法从WhatsApp联系人列表中搜索该名称并发送
  2. 我还想知道如何发送图像和视频

由于代码很长,因此链接如下: https://github.com/harshitsidhwa/WhatsApp-bot-selenium

2 个答案:

答案 0 :(得分:1)

Python将消息发送给联系人:

def send_message(target):
global message,wait, browser
try:
    x_arg = '//span[contains(@title,' + target + ')]'
    group_title = wait.until(EC.presence_of_element_located((By.XPATH, x_arg)))
    group_title.click()
    input_box = browser.find_element_by_xpath('//*[@id="main"]/footer/div[1]/div[2]/div/div[2]')
    input_box.send_keys(message + Keys.ENTER)
    time.sleep(1)
except NoSuchElementException:
    return

此处,变量 target 是您要发送消息的联系人姓名。 变量 message 包含您要发送给该联系人的短信。变量浏览器是Web驱动程序变量。

我已经在WhatsApp Automation上工作,如果有任何帮助,请参考链接:https://github.com/shauryauppal/PyWhatsapp

您已经提出了两个问题:

  1. 您无法通过联系人列表或已存档的联系人列表访问联系人姓名。唯一的方法是最近的聊天联系人。对于其他联系人,您必须访问所有联系人列表,选择目标人员然后发送消息。 (将很快实施)。

  2. 可以通过PyAutoIt实现图像,文件和视频的发送。 请参阅我的仓库,我已经实现了。

第一步: AutoIt.exe Installation Link

第二步:

  

pip安装PyAutoIt

请参阅我的代码或this link以获得指导。

答案 1 :(得分:0)

搜索联系人,发送消息和/或文件的基本示例Java代码。您可以根据需要实施显式等待。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

List<String> targets = new ArrayList<>();

for (String target:targets) {
    driver.findElement(By.xpath("//button[.//span[@data-icon='search']]/..//input")).clear();
    driver.findElement(By.xpath("//button[.//span[@data-icon='search']]/..//input")).sendKeys(target);
    try {
        driver.findElement(By.cssSelector("span[title='"+target+"']")).click();
    } catch (WebDriverException e) {
        System.out.println("Not found");
        continue;
    }
    driver.findElement(By.cssSelector("div[contenteditable='true']")).sendKeys("MassageToSend");
    driver.findElement(By.cssSelector("span[data-icon='send']")).click();

    //To send attachments
    //click to add
    driver.findElement(By.cssSelector("span[data-icon='clip']")).click();
    //add file to send by file path
    driver.findElement(By.cssSelector("input[type='file']")).sendKeys("FilePath");
    //click to send
    driver.findElement(By.cssSelector("span[data-icon='send-light']")).click();
}

在python中(可能包含语法错误):

if msgToSend[count][0]==curHour and msgToSend[count][1]==curMin and msgToSend[count][2]==curSec:
    # utility variables to tract count of success and fails
    success = 0
    sNo = 1
    failList = []

    # Iterate over selected contacts
    for target in targets:
        print(sNo, ". Target is: " + target)
        sNo+=1

        inputSearchBox = driver.find_element_by_id('//button[.//span[@data-icon="search"]]/..//input')
        inputSearchBox.clear()
        inputSearchBox.send_keys(target[1:len(target) - 1])

        try:
            wait5.until(EC.presence_of_element_located((By.CSSSELECTOR, 'span[title="'+ target +'"]')))
        except:
            print("Cannot find Target: " + target)
            failList.append(target)
            continue

        driver.find_element_by_css_selector('div[contenteditable="true"]').sendKeys("Hello, " + target + "."+ Keys.SHIFT + Keys.ENTER + msgToSend[count][3] + Keys.SPACE)
        driver.find_element_by_css_selector('span[data-icon="send"]').click()

        # To send attachments
        # click to add
        driver.find_element_by_css_selector('span[data-icon="clip"]').click()
        # add file to send by file path
        driver.find_element_by_css_selector('input[type="file"]').sendKeys("FilePath")
        # click to send
        driver.find_element_by_css_selector('span[data-icon="send-light"]').click()