Skip to content

Commit

Permalink
Merge pull request #74 from xandao6/master
Browse files Browse the repository at this point in the history
Refactored and improved
  • Loading branch information
rpotter12 authored Jan 7, 2020
2 parents 39f0079 + 37e21c9 commit d735efe
Show file tree
Hide file tree
Showing 14 changed files with 316 additions and 233 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
wplay.egg-info/
__pycache__/
*.pyc
tests
.vscode
tracking_data
Binary file added images/error.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 2 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setup(
name="wplay",
version="2.2.0",
version="3.0.0",
install_requires=["selenium >= 3.141.0",
"python-telegram-bot >= 11.1.0",
"datetime >= 4.3",
Expand All @@ -20,7 +20,7 @@
author="Rohit Potter",
author_email="[email protected]",
license="MIT",
python_requires=">=3.4",
python_requires=">=3.6",
url="https://github.com/rpotter12/whatsapp-play/",
download_url="https://pypi.org/project/wplay/",
keywords=[
Expand All @@ -36,8 +36,6 @@
classifiers=[
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3 :: Only",
Expand Down
16 changes: 8 additions & 8 deletions wplay/locationfinder.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

def locationfinder(name):

"""
# to find location by ip address
print('Get you ipinfo token from https://ipinfo.io/account')
ip_address = '*'
token = str(input("Enter your ipinfo token: "))
ip_string = 'curl ipinfo.io/'+ip_address+'?token='+token+''
os.system(ip_string)
"""
"""
# to find location by ip address
print('Get you ipinfo token from https://ipinfo.io/account')
ip_address = '*'
token = str(input("Enter your ipinfo token: "))
ip_string = 'curl ipinfo.io/'+ip_address+'?token='+token+''
os.system(ip_string)
"""

38 changes: 11 additions & 27 deletions wplay/messageblast.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,18 @@
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from wplay import seleniumUtils as sel


def blast(name):
#name = str(input("Enter the name of target: "))

# enter the number of the person by the user
target = str(name) #str(input("Enter the name of target: "))
message = str(input("Enter your message: "))
n = int(input("Enter the number of messages to blast: "))
message = str(input("Enter your message: "))
number_of_messages = int(input("Enter the number of messages to blast: "))

# chrome driver
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://web.whatsapp.com/")
wait = WebDriverWait(driver, 600)
_, driver_wait, chosen_website = sel.initialize_chrome_driver(
sel.websites['whatsapp'])

# finds the target and navigate to it
x_arg = '//span[contains(@title, '+ '"' +target + '"'+ ')]'
person_title = wait.until(EC.presence_of_element_located((By.XPATH, x_arg)))
print(target)
person_title.click()
sel.find_and_navigate_to_target(driver_wait, chosen_website, name)

# navigate to text part
xpath = '//div[@class="_3u328 copyable-text selectable-text"]'
message_area = wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
message_area = sel.navigate_to_message_area(driver_wait, chosen_website)

# sends message multiple times
i=0
while i<=n:
message_area.send_keys(message + Keys.ENTER)
i=i+1
for _ in range(number_of_messages):
sel.send_message(message_area, message)
49 changes: 15 additions & 34 deletions wplay/messagetimer.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,19 @@
import time
import random
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from wplay import seleniumUtils as sel


def msgTimer(name):
#name = str(input("Enter the name of target: "))

target = str(name)
message_type_numbers = int(
input("How many types of messages will you send? "))

# enter message type number
nMessages = int(input("How many types of messages will you send? "))

# type your messages
messages = list()
for i in range(0, nMessages):
for _ in range(message_type_numbers):
messages.append(str(input("Enter your message: ")))
n = int(input("Enter the number of messages to send: "))

number_of_messages = int(input("Enter the number of messages to send: "))

# Enter the time interval of the messages, it will be sent using a random
# interval. For fixed interval, type the same number.
Expand All @@ -28,35 +22,22 @@ def msgTimer(name):
maximumTimeInterval = int(
input("Enter maximum interval number in seconds: "))

# chrome driver
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://web.whatsapp.com/")
wait = WebDriverWait(driver, 600)
_, driver_wait, chosen_website = sel.initialize_chrome_driver(
sel.websites['whatsapp'])

# finds the target and navigate to it
x_arg = '//span[contains(@title, ' + '"' + target + '"' + ')]'
person_title = wait.until(
EC.presence_of_element_located((By.XPATH, x_arg)))
print(target)
person_title.click()
sel.find_and_navigate_to_target(driver_wait, chosen_website, name)

# navigate to text part
xpath = '//div[@class="_3u328 copyable-text selectable-text"]'
message_area = wait.until(
EC.presence_of_element_located((By.XPATH, xpath)))
message_area = sel.navigate_to_message_area(driver_wait, chosen_website)

# sends random messages multiple times
random.seed()
i = 0
while i < n:
for _ in range(number_of_messages):
if not messages:
break
else:
message_area.send_keys(
messages[random.randrange(0, nMessages)] + Keys.ENTER)
sel.send_message(
message_area, messages[random.randrange(0, message_type_numbers)])
if minimumTimeInterval != maximumTimeInterval:
time.sleep(random.randrange(minimumTimeInterval,
maximumTimeInterval))
else:
time.sleep(minimumTimeInterval)
i = i+1
time.sleep(minimumTimeInterval)
135 changes: 66 additions & 69 deletions wplay/onlinetracker.py
Original file line number Diff line number Diff line change
@@ -1,77 +1,74 @@
# for bot web browser
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException

# to check and install web browser
from webdriver_manager.chrome import ChromeDriverManager

# to play sound
from playsound import playsound

# for system control
import time
import os
import datetime
from datetime import datetime
from playsound import playsound
from wplay import seleniumUtils as sel


def tracker(name):
#name = str(input("Enter the name of target: "))

driver, driver_wait, chosen_website = sel.initialize_chrome_driver(
sel.websites['whatsapp'])

sel.find_and_navigate_to_target(driver_wait, chosen_website, name)

# finds if online_status directory is present
if 'tracking_data' not in os.listdir(os.getcwd()):
os.mkdir('tracking_data')

# create status.txt file and overwrite if exists
status_file = open(
os.path.join('tracking_data', f'status_{name}.txt'), 'w'
)
status_file.close()

# open status.txt in memory with append mode
status_file = open(
os.path.join('tracking_data', f'status_{name}.txt'), 'a'
)

# check status
is_sound_enabled = True
last_status = 'offline'
try:
while True:
try:
status = driver.find_element_by_class_name('_315-i').text
if status == 'online':
is_online = True
else:
# status is last seen
is_online = False
status = 'offline'
except:
status = 'offline'
is_online = False

# the name of the person by the user
target = str(name) #str(input("Enter the name of target: "))
if last_status != is_online:
# play sound when the person is online
if is_online:
try:
if is_sound_enabled:
playsound('plucky.wav')
except:
print("Error: Couldn't play the sound.")
is_sound_enabled = False

# chrome driver
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://web.whatsapp.com/")
wait = WebDriverWait(driver, 600)
# print date, time and status to console
print(
f'{datetime.now().strftime("%d/%m/%Y, %H:%M:%S")}' +
f' - Status: {status}'
)

# finds the target and navigate to it
x_arg = '//span[contains(@title, '+ '"' +target + '"'+ ')]'
person_title = wait.until(EC.presence_of_element_located((By.XPATH, x_arg)))
print(target)
person_title.click()
# writes date, time and status in status.txt
status_file.write(
f'{datetime.now().strftime("%d/%m/%Y, %H:%M:%S")}' +
f' - Status: {status}\n')

# finds if online_status directory is present
if 'online_status_data' not in os.listdir(os.getcwd()):
os.mkdir('online_status_data')
f=open(os.path.join('online_status_data' , 'status.txt'),'w')
f.close()
# check status
while True:
i=0
try:
status = driver.find_element_by_class_name('_315-i').text
i=1
except (NoSuchElementException, StaleElementReferenceException):
status = 'offline'
i=0
# to play sound when the person is online
if i==1:
playsound('plucky.mp3')
# prints date, time and status
print(datetime.datetime.now())
print(status)
# writes date, time and status in status.txt
f=open(os.path.join('online_status_data' , 'status.txt'),'a')
f.write(str(datetime.datetime.now()))
f.write(status)
f.close()
# Loop to check the online status until the offline status appear and vice-versa
# this loop will help to stop print status until the other status appears
while True:
if i == 1:
try:
re_status = driver.find_element_by_class_name('_315-i').text
re_status = 'online'
continue
except (NoSuchElementException, StaleElementReferenceException):
break
else:
try:
re_status = driver.find_element_by_class_name('_315-i').text
re_status = 'online'
break
except (NoSuchElementException, StaleElementReferenceException):
continue
time.sleep(1)
last_status = is_online
time.sleep(0.5)
finally:
status_file.close()
print(f'\nStatus file saved in: ' +
f'{os.path.join(os.getcwd(),"tracking_data")}')
Binary file removed wplay/plucky.mp3
Binary file not shown.
Binary file added wplay/plucky.wav
Binary file not shown.
Loading

0 comments on commit d735efe

Please sign in to comment.