import pyautogui import keyboard from time import sleep C_UPLOAD_BUTTON = [247, 196] C_UPLOAD_FROM_DEVICE = [126, 303] C_FOLDER = [634, 500] C_SEARCH_BAR = [1217, 349] C_SEARCH_ORIGINAL_FOLDER = [908, 394] C_FIRST_FILE = [750, 455] C_SELECT_IMAGE = [110, 442] C_DRAG_TO = [868, 436] C_DOWNLOAD_1 = [1805, 132] C_DOWNLOAD_2 = [1743, 611] H_CREATE_BUTTON = [34, 274] H_NEW_POST = [137, 276] H_SELECT_ACCOUNT = [490, 283] H_ACCOUNT = [548, 383] H_CLICK_OUTSIDE = [425, 447] H_CAPTION_BOX = [457, 624] # [463, 554] H_UPLOAD_IMAGE = [557, 832] H_POST_FOLDER = [615, 530] H_SEARCH_BAR = [1217, 347] H_SEARCH_POST_FOLDER = [890, 393] H_SEARCH_RESULT = [737, 454] H_SCHEDULE_TIME = [1296, 501] H_CLICK_OUTSIDE_DAY = [1280, 511] H_WEEK_Y_POS = 656 H_SCHEDULE_LATER = [1240, 1000] H_SCHEDULE_POST = [1390, 940] H_SELECT_HOUR = [1105, 630] H_SELECT_MIN = [1200, 630] H_SELECT_AMPM = [1297, 630] class Post: # DAY_Y_COORD = 711 SUNDAY = 1184 MONDAY = 1222 TUESDAY = 1260 WEDNESDAY = 1296 THURSDAY = 1334 FRIDAY = 1372 SATURDAY = 1410 def __init__(self, photo_name, extension, caption, day, hour, min, ampm): self.photo_name = photo_name self.extension = extension self.caption = caption self.hour = hour self.min = min self.ampm = ampm if day == "Sunday": self.day_x_coord = self.SUNDAY elif day == "Monday": self.day_x_coord = self.MONDAY elif day == "Tuesday": self.day_x_coord = self.TUESDAY elif day == "Wednesday": self.day_x_coord = self.WEDNESDAY elif day == "Thursday": self.day_x_coord = self.THURSDAY elif day == "Friday": self.day_x_coord = self.FRIDAY elif day == "Saturday": self.day_x_coord = self.SATURDAY def select_date(self): pyautogui.click(self.day_x_coord, self.DAY_Y_COORD) # Select date. def select_time(self): pyautogui.click(H_SELECT_HOUR) sleep(0.7) if self.hour <= 6: pyautogui.click(1078, 693 + ((self.hour - 1) * 40)) else: pyautogui.scroll(-10, x = 1090, y = 817) sleep(0.7) pyautogui.click(1078, 885 - ((12 - self.hour) * 40)) sleep(0.7) pyautogui.click(H_SELECT_MIN) sleep(0.7) if self.min <= 25: pyautogui.click(1178, 693 + ((self.min / 5) * 40)) else: pyautogui.scroll(-10, x = 1185, y = 817) sleep(0.7) pyautogui.click(1178, 885 - ((11 - (self.min / 5)) * 40)) sleep(0.7) pyautogui.click(H_SELECT_AMPM) sleep(0.7) if self.ampm == "am": pyautogui.click(1272, 694) else: pyautogui.click(1272, 734) posts = [] def open_app(app): pyautogui.hotkey("command", "space") sleep(0.3) pyautogui.write(app) sleep(0.3) pyautogui.press("enter") def type_and_enter(text): pyautogui.write(text) sleep(0.3) pyautogui.press("enter") sleep(0.2) def upload(): pyautogui.click(1650, 590) sleep(0.7) pyautogui.click(C_UPLOAD_BUTTON) # Upload button. sleep(0.7) pyautogui.click(C_UPLOAD_FROM_DEVICE) # Upload from device button. sleep(0.7) pyautogui.click(C_FOLDER) # Swim A Mile folder button. def resize_and_download(current_post): pyautogui.click(C_SEARCH_BAR) sleep(0.7) pyautogui.write(current_post.photo_name) sleep(0.7) pyautogui.click(C_SEARCH_ORIGINAL_FOLDER) sleep(2) pyautogui.click(C_FIRST_FILE) sleep(0.3) pyautogui.press("enter") sleep(2) uploaded = pyautogui.locateOnScreen("Uploads.png", confidence = 0.9) while uploaded == None: sleep(0.7) uploaded = pyautogui.locateOnScreen("Uploads.png", confidence = 0.9) pyautogui.moveTo(C_SELECT_IMAGE) pyautogui.dragTo(C_DRAG_TO, button = "left") keyboard.wait("enter") sleep(0.2) pyautogui.click(C_DOWNLOAD_1) # Download button. sleep(2) pyautogui.click(C_DOWNLOAD_2) # Actual download button. downloaded = pyautogui.locateOnScreen("Downloaded.png", confidence = 0.9) while downloaded == None: sleep(0.7) downloaded = pyautogui.locateOnScreen("Downloaded.png", confidence = 0.9) pyautogui.click(button = "left") # Close the download confirmation box. def rename_and_delete(current_post): type_and_enter("cd desktop/'Original Photos'") type_and_enter("rm '" + current_post.photo_name + current_post.extension + "'") type_and_enter("cd ~") type_and_enter("cd downloads") type_and_enter("mv 'SWIM_INSTAGRAM TEMPLATE 2021.png' " + "/Users/chewong/desktop/Post\ Photos/'" + current_post.photo_name + ".png'") def create_post(): pyautogui.moveTo(H_CREATE_BUTTON) # Hover over create button. sleep(0.7) pyautogui.click(H_NEW_POST) # Create new post button. sleep(0.7) pyautogui.click(H_SELECT_ACCOUNT) # Post to account selector. sleep(0.3) pyautogui.write("swimamile4wcrc") sleep(0.7) pyautogui.click(H_ACCOUNT) # Account. sleep(0.7) pyautogui.click(H_CLICK_OUTSIDE) # Hide account selection options. def caption(current_post): pyautogui.click(H_CAPTION_BOX) # Caption text box. sleep(0.7) pyautogui.write(current_post.caption) def upload_image(current_post): pyautogui.scroll(-10, x = 936, y = 642) sleep(0.7) pyautogui.click(pyautogui.locateOnScreen("Upload.png", confidence = 0.9)) # Upload image button. sleep(0.7) pyautogui.click(H_POST_FOLDER) # Post photos sidebar. sleep(0.7) pyautogui.click(H_SEARCH_BAR) sleep(0.7) pyautogui.write(current_post.photo_name) sleep(0.7) pyautogui.click(H_SEARCH_POST_FOLDER) sleep(3) pyautogui.click(H_SEARCH_RESULT) sleep(0.7) pyautogui.press("enter") def schedule(post): pyautogui.click(pyautogui.locateOnScreen("Schedule.png")) # Schedule for later button. sleep(0.7) pyautogui.click(H_SCHEDULE_TIME) sleep(0.7) post.select_date() sleep(0.7) post.select_time() sleep(0.7) keyboard.wait("enter") sleep(0.2) pyautogui.click(H_SCHEDULE_POST) # Schedule button. def prep_images(): global posts sleep(0.7) for i in posts: open_app("chrome") sleep(0.7) upload() sleep(0.7) resize_and_download(i) sleep(1) open_app("terminal") sleep(0.7) pyautogui.hotkey("command", "n") sleep(0.7) rename_and_delete(i) def schedule_posts(): global posts sleep(0.7) open_app("chrome") sleep(0.7) for j in posts: create_post() sleep(0.7) caption(j) sleep(0.7) upload_image(j) sleep(0.7) schedule(j) sleep(0.7) def main(): print("Prep for program by opening a fullscreen Chrome tab with the Canva editor and the 'Uploads' tab selected") prep_images_yn = input("Type '1' when you are ready to prep images. ") while prep_images_yn != "1": prep_images_yn = input("Type '1' when you are ready to prep images. ") prep_images() print("Prep for program by opening a fullscreen Chrome window with a Hootsuite tab") schedule_posts_yn = input("Type '1' when you are ready to schedule posts. ") while schedule_posts_yn != "1": schedule_posts_yn = input("Type '1' when you are ready to schedule posts. ") schedule_posts()