# AUTOGENERATED! DO NOT EDIT! File to edit: Appointlet2GS.ipynb. # %% auto 0 __all__ = ['iface', 'Appointlet', 'GoogleSheets', 'run'] # %% Appointlet2GS.ipynb 0 from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By import time import os import gspread import pandas as pd from pathlib import Path import gradio as gr # %% Appointlet2GS.ipynb 1 class Appointlet(): def __init__(self, url = 'https://app.appointlet.com/unified_login'): self.url = url def setup(self): options = Options() options.add_argument('--incognito') # options.add_argument("--headless") service = ChromeService(ChromeDriverManager().install()) driver = webdriver.Chrome(options=options, service=service) driver.maximize_window() return driver def download(self, account): email, password = open(account, 'r').read().splitlines() driver = self.setup() driver.get(url=self.url) driver.implicitly_wait(30) # input email driver.find_element(By.CSS_SELECTOR, "input[name='email']").send_keys(email) driver.find_element(By.CSS_SELECTOR, 'button.mt-16').click() # input password driver.find_element(By.CSS_SELECTOR, "input[name='password']").send_keys(password) driver.find_element(By.CSS_SELECTOR, 'button.mt-16').click() # remove welcome message try: driver.find_element(By.CSS_SELECTOR, 'button.btn-block').click() except: pass # remove introduction try: driver.find_element(By.CSS_SELECTOR, 'button.shepherd-cancel-icon').click() except: pass # Meeting filter # Launch meeting filter driver.find_element(By.ID, 'MeetingFilters').click() # # Filter by meeting types # driver.find_element(By.CSS_SELECTOR, 'svg.css-8mmkcg').click() # driver.find_element(By.XPATH, '//div[contains(text(), "Example Meeting")]').click() # Filter by status driver.find_element(By.CSS_SELECTOR, "input[name='isPending']").click() # Apply filters driver.find_element(By.XPATH, '//span[contains(text(), "Apply Filters")]').click() # Download csv file driver.find_element(By.CSS_SELECTOR, "div.MoreButton.dropdown > button[class='dropdown-toggle btn btn-outline-secondary']").click() driver.find_element(By.XPATH, '//span[contains(text(), "Export Attendees (CSV)")]').click() # Close the browser windows and ends the WebDriver session time.sleep(5) driver.quit() # %% Appointlet2GS.ipynb 3 class GoogleSheets(): # def __init__(self, creds_file = 'credentials.json', sh_file = 'googlesheet_info.txt'): def __init__(self, creds_file, sh_file): self.creds = creds_file self.sh = sh_file self.folder = '.' def get_sheet_info(self): sh_id, wk_name = open(self.sh, 'r').read().splitlines() return sh_id, wk_name def read_csv(self): # read the downoaded csv file into dataframe and remove the file for fn in os.listdir(self.folder): if fn.find('Meeting Attendees') != -1: file = os.path.join(self.folder, fn) df = pd.read_csv(file, low_memory=False) df = df.fillna('') os.remove(file) return df def update_worksheet(self): # Setup service account sh_id, wk_name = self.get_sheet_info() gc = gspread.service_account(filename=self.creds) # Open a sheet from a spreadsheet wk = gc.open_by_key(sh_id).worksheet(wk_name) # Clear the worksheet wk.clear() # Get the new data df = self.read_csv() # Writing the new data to Google Sheets wk.update([df.columns.values.tolist()] + df.values.tolist()) # %% Appointlet2GS.ipynb 4 def run(account, creds_file, sh_file): if not account: return 'Please upload an account file' else: Appointlet().download(account.name) # Appointlet().download(account) # GoogleSheets(creds_file.name, sh_file.name).update_worksheet() return 'Update Google Sheets completed!' # %% Appointlet2GS.ipynb 7 iface = gr.Interface(fn=run, inputs=[gr.File(label='Account File'), gr.File(label='Credentials Json File'), gr.File(label='Googlesheet Info')], outputs=gr.Text(), allow_flagging='never', title='Appointlet2GS Application', description='Download Meeting Attendees file From Appointlet and upload it to Google Sheets') iface.launch(height=450, width=500, debug=True, enable_queue=True)