Отправка сообщения WhatsApp на номер от нескольких {user: cellphone} до python - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь отправить сообщение WhatsApp, извлекая некоторую информацию (имя пользователя, мобильный телефон) из созданной мною базы данных.

Когда я извлекаю фрейм данных и создаю список, содержащий только мобильные телефоны, и перебираю его, все сообщения отправлены. Но когда я преобразую фрейм данных в dict и перебираю ключ и значение (чтобы я мог отправлять str.format и отправлять больше личных сообщений), WhatsApp просто отправляет сообщение для первого пользователя.

Кто-нибудь знает, как я могу отправить текст сообщения всем пользователям, повторяя диктовку?

from time import sleep
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
import socket

# here I import from other file my begginers dataframe
from users_pg_to_csv import beg_users, beginers_query, dbname, host, port, user, pwd
users = beg_users(beginers_query, dbname, host, port, user, pwd)

no_of_message = 1 # no. of time 

# create dict and list of phone numbers
dict_users = users.set_index('username')['cellphone'].to_dict() # {user: cellphone}
moblie_no_list = users['cellphone'].tolist()  # list of phone numbers


def element_presence(by,xpath,time):
    element_present = EC.presence_of_element_located((By.XPATH, xpath))
    WebDriverWait(driver, time).until(element_present)


def is_connected():
    try:
        socket.create_connection(("www.google.com", 80))
        return True
    except :
        is_connected()


driver = webdriver.Chrome('/usr/local/bin/chromedriver')
driver.get("http://web.whatsapp.com")
sleep(10) #wait time to scan the code in second


def send_whatsapp_msg(phone_number, text):
    driver.get("https://web.whatsapp.com/send?phone={}&source=&data=#".format(phone_number))
    try:
        driver.switch_to.alert().accept()
    except Exception as e:
        pass

    try:
        element_presence(By.XPATH, '//*[@id="main"]/footer/div[1]/div[2]/div/div[2]', 30)
        txt_box = driver.find_element(By.XPATH, '//*[@id="main"]/footer/div[1]/div[2]/div/div[2]')
        global no_of_message
        for x in range(no_of_message):
            txt_box.send_keys(text)
            txt_box.send_keys("\n")

    except Exception as e:
        pass


# This snippet works for all numbers, but i cant personalize the message...
# for phone_number in moblie_no_list:  # ['cellphone']:
#     message_text = 'amanhã tem aula de luta! Levar ...'
#     try:
#         send_whatsapp_msg(int('55'+str(phone_number)), message_text)  # (number)), message_text)
#         sleep(2)
#
#     except Exception as e:
#         sleep(2)
#         is_connected()



# this only send the message for the first user, sometimes the second too (???) :
def run():
    for key, value in dict_users.items():
        message_text = '{}, amanhã tem aula de luta! Levar equipamento completo '

        #this prints the right info
        print("message text: ", message_text.format(key), "\n", "cellphone: ", value)

        try:
            send_whatsapp_msg(int('55'+str(value)), message_text.format(key))

        except Exception as e:
            sleep(2)
            is_connected()

run()
...