diff --git a/Visual Studio Code Projects/instagram-follower-bot.py b/Visual Studio Code Projects/instagram-follower-bot.py new file mode 100644 index 0000000..d7e4518 --- /dev/null +++ b/Visual Studio Code Projects/instagram-follower-bot.py @@ -0,0 +1,88 @@ +from selenium import webdriver +from selenium.common.exceptions import ElementClickInterceptedException +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.common.by import By +import time + +SIMILAR_ACCOUNT = "buzzfeedtasty" # Change this to an account of your choice +USERNAME = "YOUR_USERNAME" +PASSWORD = "YOUR_PASSWORD" + + +class InstaFollower: + + def __init__(self): + # Keep browser open so you can manually log out + chrome_options = webdriver.ChromeOptions() + chrome_options.add_experimental_option("detach", True) + self.driver = webdriver.Chrome(options=chrome_options) + + # Avoid bot-like behaviour and try not to run your script too often. + def login(self): + url = "https://www.instagram.com/accounts/login/" + self.driver.get(url) + time.sleep(4.2) + + # Check if the cookie warning is present on the page + decline_cookies_xpath = "/html/body/div[6]/div[1]/div/div[2]/div/div/div/div/div[2]/div/button[2]" + cookie_warning = self.driver.find_elements(By.XPATH, decline_cookies_xpath) + if cookie_warning: + # Dismiss the cookie warning by clicking an element or button + cookie_warning[0].click() + + username = self.driver.find_element(by=By.NAME, value="username") + password = self.driver.find_element(by=By.NAME, value="password") + + username.send_keys(USERNAME) + password.send_keys(PASSWORD) + + time.sleep(2.1) + password.send_keys(Keys.ENTER) + + time.sleep(4.3) + # Click "Not now" and ignore Save-login info prompt + save_login_prompt = self.driver.find_element(by=By.XPATH, value="//div[contains(text(), 'Not now')]") + if save_login_prompt: + save_login_prompt.click() + + time.sleep(3.7) + # Click "not now" on notifications prompt + notifications_prompt = self.driver.find_element(by=By.XPATH, value="//button[contains(text(), 'Not Now')]") + if notifications_prompt: + notifications_prompt.click() + + def find_followers(self): + time.sleep(5) + # Will bring up the followers of an account + self.driver.get(f"https://www.instagram.com/{SIMILAR_ACCOUNT}/followers") + + time.sleep(8.2) + # The xpath of the modal will change over time. Update yours accordingly. + modal_xpath = "/html/body/div[6]/div[1]/div/div[2]/div/div/div/div/div[2]/div/div/div[2]" + modal = self.driver.find_element(by=By.XPATH, value=modal_xpath) + for i in range(5): + # In this case we're executing some Javascript, that's what the execute_script() method does. + # The method can accept the script as well as an HTML element. + # The modal in this case, becomes the arguments[0] in the script. + # Then we're using Javascript to say: "scroll the top of the modal (popup) element by the height of the modal (popup)" + self.driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", modal) + time.sleep(2) + + def follow(self): + # Check and update the (CSS) Selector for the "Follow" buttons as required. + all_buttons = self.driver.find_elements(By.CSS_SELECTOR, value='._aano button') + + for button in all_buttons: + try: + button.click() + time.sleep(1.1) + # Clicking button for someone who is already being followed will trigger dialog to Unfollow/Cancel + except ElementClickInterceptedException: + cancel_button = self.driver.find_element(by=By.XPATH, value="//button[contains(text(), 'Cancel')]") + cancel_button.click() + + +bot = InstaFollower() +bot.login() +bot.find_followers() +bot.follow() \ No newline at end of file