Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 158 additions & 0 deletions zoom_attendance_taker/attendanceTaker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
from selenium import webdriver
from selenium.webdriver.support import ui
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import PySimpleGUI as sg
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.common.exceptions import NoSuchElementException
from datetime import datetime


class Zoom:
def __init__(
self, selected_driver, meeting_personal_id, username, meeting_password
):

self.meeting_personal_id = meeting_personal_id
self.selected_driver = selected_driver
self.username = username
self.meeting_password = meeting_password
self.driver = None

def setup_driver(self):
if self.selected_driver == "Chrome":
self.driver = webdriver.Chrome(ChromeDriverManager().install())
elif self.selected_driver == "FireFox(Gecko)":
self.driver = webdriver.Firefox(GeckoDriverManager().install())
elif self.selected_driver == "Edge":
self.driver = webdriver.Edge(EdgeChromiumDriverManager().install())

def join(self):

self.wait = ui.WebDriverWait(self.driver, 30)
self.zoom_join_meeting = self.driver.get("https://zoom.us/join")
ui.WebDriverWait(self.driver, 100).until(
EC.presence_of_element_located((By.XPATH,
'//*[@id="join-confno"]'))
)
enter_pid = self.driver.find_element_by_xpath('//*[@id="join-confno"]')
enter_pid.send_keys(self.meeting_personal_id)
join_button = self.driver.find_element_by_xpath('//*[@id="btnSubmit"]')
join_button.click()
self.wait.until(
lambda button: self.driver.find_element_by_xpath(
'//*[@id="zoom-ui-frame"]/div[2]/div/div[1]/div/div'
)
)
launch_meeting = self.driver.find_element_by_xpath(
'//*[@id="zoom-ui-frame"]/div[2]/div/div[1]/div/div'
)
launch_meeting.click()
self.wait.until(
lambda button: self.driver.find_element_by_xpath(
'//*[@id="zoom-ui-frame"]/div[2]/div/div[2]/h3[2]/span/a'
)
)
join_from_browser = self.driver.find_element_by_xpath(
'//*[@id="zoom-ui-frame"]/div[2]/div/div[2]/h3[2]/span/a'
)
join_from_browser.click()
self.wait.until(
lambda field:
self.driver.find_element_by_xpath('//*[@id="inputname"]')
)
name_field = self.driver.find_element_by_xpath('//*[@id="inputname"]')
name_field.send_keys(self.username)
join_button = ui.WebDriverWait(self.driver, 300).until(
EC.element_to_be_clickable((By.XPATH, '//*[@id="joinBtn"]'))
)
join_button.click()
passcode = ui.WebDriverWait(self.driver, 300).until(
EC.presence_of_element_located((By.XPATH,
'//*[@id="inputpasscode"]'))
)
passcode.send_keys(self.meeting_password)
join_button = ui.WebDriverWait(self.driver, 300).until(
EC.element_to_be_clickable((By.XPATH, '//*[@id="joinBtn"]'))
)
join_button.click()
"""participants = ui.WebDriverWait(self.driver, 600).until(
EC.presence_of_element_located(
(By.XPATH, '//*[@id="wc-footer"]/div/div[2]/button[1]')
)
)"""

def get_attendees_list(self):

ui.WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located(
(
By.XPATH,
'//*[@id="wc-container-left"]/div[3]/div/'
'div[2]/div/div/div[1]/div',
)
)
)
elem = self.driver.find_element_by_xpath(
'//*[@id="wc-container-left"]/div[3]/div/div[2]/div/div/div[1]/div'
)
attendees = [elem.text]
try:
i = 2
while True:
elem = self.driver.find_element_by_xpath(
f'//*[@id="wc-container-left"]/div[3]/div/div[2]'
f'/div/div/div[1]/div[{i}]/div'
)
i += 1
attendees.append(elem.text)
except NoSuchElementException:
pass
print(attendees)
with open("attended.csv", "w+") as fp:
fp.write(datetime.now().isoformat(' '))
fp.writelines(",".join(attendees))


class GUI:
def __init__(self):
self.drivers = ["Chrome", "FireFox(Gecko)", "Edge"]
self.layout = [
[sg.Text("Meeting ID: "), sg.Input(key="meetingID")],
[sg.Text("Meeting Password"),
sg.Input(password_char="*", key="password")],
[sg.Text("Name"), sg.Input(key="name")],
[
sg.Listbox(
self.drivers,
auto_size_text=True,
key="Driver",
default_values="Chrome",
enable_events=True,
)
],
[sg.Button("Submit", key="submit")],
]

def create(self):
self.window = sg.Window("Zoom", self.layout, size=(600, 200))
while True:
self.event, self.values = self.window.read()
if self.event == sg.WIN_CLOSED or self.event == "Exit":
break
elif self.event == "submit":
return self.values


if __name__ == "__main__":
gui = GUI()
values = gui.create()
zoom_client = Zoom(
values["Driver"][0], values["meetingID"],
values["name"], values["password"]
)
zoom_client.setup_driver()
zoom_client.join()
zoom_client.get_attendees_list()
10 changes: 10 additions & 0 deletions zoom_attendance_taker/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Zoom Attendance Taker

## After running the scripts it creates a CSV file with the names of all the participants in the meeting along with time and date
## How to run
- Install the sependencies using pip or conda from the requirements.txt file
- Install Chrome, Firefox or edge browser (You can select the one you want to run script on using the GUI)
- Run the script

### Note:
No need to install the webdriver for your version of browser since webdriver manager will automatically do it for you
Binary file added zoom_attendance_taker/requirements.txt
Binary file not shown.