OK, Here is the entire code (Sanitized):
import win32gui as win32
import win32api
import win32con
import re
import win32process
from win32gui import GetWindowText,GetForegroundWindow
import pyperclip as CB
from datetime import datetime
import tkinter as tk
from tkinter import ttk
import time
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
def getPhoneTray():
windows = []
win32.EnumWindows(lambda hwnd, resultList: resultList.append(hwnd),
windows)
for window in windows:
a=win32.GetWindowText(window)
if (a.__contains__('PhoneTray')):
win32.ShowWindow(window,9)
win32.SetForegroundWindow(window)
break
wnd=win32.GetForegroundWindow()
CB.copy('')
clip=CB.waitForNewPaste()
data=clip.split()
number=data[len(data)-4]
date=data[len(data)-3]
time=data[len(data)-2]
ampm=data[len(data)-1]
name=data[1]
if (data[2]!=data[len(data)-4]):
name+=' '+data[2]
return(name,number,date,time,ampm)
def center(win):
"""
centers a tkinter window
:param win: the main window or Toplevel window to center
"""
win.update_idletasks()
width = win.winfo_width()
frm_width = win.winfo_rootx() - win.winfo_x()
win_width = width + 2 * frm_width
height = win.winfo_height()
titlebar_height = win.winfo_rooty() - win.winfo_y()
win_height = height + titlebar_height + frm_width
x = win.winfo_screenwidth() // 2 - win_width // 2
y = win.winfo_screenheight() // 2 - win_height // 2
win.geometry('{}x{}+{}+{}'.format(width, height, x, y))
win.deiconify()
def getSelect(page):
select=page.html.find(id='ddlSubjectMatter')
result=BeautifulSoup(str(select),'html.parser')
selection={}
for option in result.find_all('option'):
if (len(option.attrs['value'])>0):
selection[option.attrs['value']]=option.get_text()
return(selection)
def cancel(top,browser):
top.quit()
browser.quit()
exit(0)
def validatePhone(top):
num=phone.get()
pattern=re.compile('\d{3}-\d{3}-\d{4}')
if (pattern.search(num)):
top.withdraw()
top.quit()
else:
phone.configure(background='Red')
return(pattern.search(num))
def msgPanel(msg):
panel=tk.Toplevel()
panel.title('Do Not Call Interface')
panel.geometry('200x100')
tk.Label(panel,text='').grid(row=0,column=0)
tk.Label(panel,text=msg).grid(row=1,column=1,columnspan=3)
panel.update()
return(panel)
top=tk.Tk()
top.withdraw()
intro=msgPanel('Copy line from Phonetray panel')
if (tk.Toplevel.winfo_exists(intro)==1):
nme,num,dte,tim,pmam=getPhoneTray()
if (nme.find('Spam')>=0 or nme.find('Telemarketer')>=0):
nme='Unavaliable'
intro.destroy()
else:
nme='Unknown'
num=''
contact=msgPanel('Contacting Do Not Call Web Site')
url='https://www.donotcall.gov/report.html'
options=Options()
options.add_argument("--headless")
#options.binary=FirefoxBinary(r'C:\Program Files\Mozilla Firefox\firefox.exe')
ser=Service(r'C:\Program Files\Python310\Scripts\geckodriver.exe')
browser=webdriver.Firefox(service=ser,options=options)
browser.get(url)
button_continue=browser.find_elements_by_css_selector('#MainContinueButton')
button_continue[0].click()
try:
wait=WebDriverWait(browser,10)
wait.until(EC.visibility_of_all_elements_located((By.ID,'ddlSubjectMatter')))
except (TimeoutException):
contact.destroy()
err=msgPanel('Do not call server too slow - try later')
browser.quit()
time.sleep(15)
err.destroy()
exit(-1)
contact.destroy()
gui=msgPanel('Setting up user input')
topWidth=600
topHeight=200
top.title("Do Not Call Interface")
top.geometry(str(topWidth)+'x'+str(topHeight))
top.resizable(False,False)
rw=0
myPhone=tk.StringVar()
tk.Radiobutton(top,text='xxx-xxx-7932',variable=myPhone,value='xxx-xxx-7932').grid(row=rw,column=0,pady=5,columnspan=2)
tk.Radiobutton(top,text='yyy-yyy-6305',variable=myPhone,value='yyy-yyy-6305').grid(row=rw,column=2,pady=5,columnspan=2)
tk.Radiobutton(top,text='zzz-zzz-7477',variable=myPhone,value='zzz-zzz-7477').grid(row=rw,column=4,pady=5,columnspan=2)
myPhone.set(xxx-xxx-7932')
rw+=1
tk.Label(top,text='Phone',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
phone=tk.Entry(top,width=12,justify=tk.LEFT)
phone.grid(row=rw,column=1,pady=5,sticky=tk.W)
phone.insert(0,num)
phone.focus_set()
rw+=1
tk.Label(top,text='Caller Name',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
name=tk.StringVar()
nameEntry=tk.Entry(top,textvariable=name,width=48,justify=tk.LEFT)
nameEntry.grid(row=rw,column=1,pady=5,columnspan=4)
name.set(nme)
rw+=1
tk.Label(top,text='Date',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
dateTime=datetime.now()
today=tk.Entry(top,width=10,justify=tk.LEFT)
today.grid(row=rw,column=1,pady=5,sticky=tk.W)
today.insert(0,dte)
tk.Label(top,text='Time',justify=tk.LEFT).grid(row=rw,column=2,pady=5,sticky=tk.W)
now=tk.Entry(top,width=6,justify=tk.LEFT)
now.grid(row=rw,column=3,pady=5,sticky=tk.W)
ampm=tk.IntVar()
now.insert(0,tim)
if (pmam=='AM'):
ampm.set(1)
else:
ampm.set(2)
tk.Radiobutton(top,text='AM',variable=ampm,value=1).grid(row=rw,column=4,pady=5,sticky=tk.W)
tk.Radiobutton(top,text='PM',variable=ampm,value=2).grid(row=rw,column=5,pady=5,sticky=tk.W)
rw+=1
subjectList=Select(browser.find_element_by_css_selector('#ddlSubjectMatter'))
selections={}
for opt in subjectList.options:
if (opt.text!=''):
selections[opt.get_attribute('value')]=opt.text
subject=tk.StringVar()
subjectMatter=ttk.Combobox(top,textvariable=subject,width=53,justify=tk.LEFT)
subjectMatter['state']='readonly'
subjectMatter['values']=list(selections.values())
tk.Label(top,text='Subject',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
subjectMatter.grid(row=rw,column=1,columnspan=5)
subject.set('Unknown')
rw+=1
submitButton=tk.Button(top,text='Submit',command=lambda: validatePhone(top))
submitButton.grid(row=rw,column=2,pady=5,sticky=tk.W)
cancelButton=tk.Button(top,text='Cancel',command=lambda: cancel(top,browser)).grid(row=rw,column=4,pady=5,sticky=tk.W)
center(top)
gui.destroy()
top.mainloop()
sbmt=msgPanel('Submitting Report')
day=today.get()
phoneEntry=browser.find_element_by_css_selector('#PhoneTextBox')
phoneEntry.send_keys(myPhone.get())
dateEntry=browser.find_element_by_css_selector('#DateOfCallTextBox')
dateEntry.send_keys(day)
hour=Select(browser.find_element_by_css_selector('#TimeOfCallDropDownList'))
hh24=tim[0:2]
if (hh24[1:]==':'):
hh24=tim[0:1]
if (pmam=='PM'):
hh42=str(int(hh24)+12)
if (len(str(hh24))<2):
hour.select_by_value('0'+str(hh24))
else:
hour.select_by_value(str(hh24))
minute=Select(browser.find_element_by_css_selector('#ddlMinutes'))
mm=tim[3:]
if (len(mm)<2):
mm='0'+mm
minute.select_by_value(mm)
subjectList.select_by_visible_text(subject.get())
preRecorded=browser.find_element_by_css_selector('#PrerecordMessageYESRadioButton')
preRecorded.click()
notText=browser.find_element_by_css_selector('#PhoneCallRadioButton')
preRecorded.click()
notText=browser.find_element_by_css_selector('#PhoneCallRadioButton')
notText.click()
nextStep=browser.find_element_by_css_selector('#StepOneContinueButton')
nextStep.click()
callerPhone=browser.find_element_by_css_selector('#CallerPhoneNumberTextBox')
callerPhone.send_keys(phone.get())
callerName=browser.find_element_by_css_selector('#CallerNameTextBox')
callerName.send_keys(name.get())
business=browser.find_element_by_css_selector('#HaveBusinessNoRadioButton')
business.click()
stopCalling=browser.find_element_by_css_selector('#StopCallingYesRadioButton')
stopCalling.click()
firstName=browser.find_element_by_css_selector('#FirstNameTextBox')
firstName.send_keys('Dennis')
LastName=browser.find_element_by_css_selector('#LastNameTextBox')
LastName.send_keys('nnnnnnnnn')
street=browser.find_element_by_css_selector('#StreetAddressTextBox')
street.send_keys('nnn sssss sssss Rd.')
city=browser.find_element_by_css_selector('#CityTextBox')
city.send_keys('ccccccccc')
state=Select(browser.find_element_by_css_selector('#StateDropDownList'))
state.select_by_visible_text('GA')
zipcode=browser.find_element_by_css_selector('#ZipCodeTextBox')
zipcode.send_keys('nnnnnn')
step2Submit=browser.find_element_by_css_selector('#StepTwoSubmitButton')
step2Submit.click()
try:
wait=WebDriverWait(browser,5)
wait.until(EC.presence_of_element_located((By.ID,'StepTwoAcceptedPanel')))
msg='Report accepted'
except (TimeoutException):
msg='Submission failed'
sbmt.destroy()
success=msgPanel(msg)
browser.quit()
time.sleep(3)
success.destroy()
top.destroy()