├── requirements.txt ├── .gitignore ├── README.md └── main.py /requirements.txt: -------------------------------------------------------------------------------- 1 | selenium==3.141.0 2 | urllib3==1.25.7 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | secrets.py 2 | __pycache__/ 3 | venv/ 4 | .vscode/ 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## see who unfollowed you 🙎‍♂️ 2 | 3 | Instagram scaled back its API dramatically so we use a bot 🤖 4 | 5 | you must create a file: `secrets.py` with variables for 6 | `username` and `password` for this to work 7 | 8 | https://www.youtube.com/watch?v=d2GBO_QjRlo 9 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from time import sleep 3 | from secrets import pw 4 | 5 | 6 | class InstaBot: 7 | def __init__(self, username, pw): 8 | self.driver = webdriver.Chrome() 9 | self.username = username 10 | self.driver.get("https://instagram.com") 11 | sleep(2) 12 | self.driver.find_element_by_xpath("//a[contains(text(), 'Log in')]")\ 13 | .click() 14 | sleep(2) 15 | self.driver.find_element_by_xpath("//input[@name=\"username\"]")\ 16 | .send_keys(username) 17 | self.driver.find_element_by_xpath("//input[@name=\"password\"]")\ 18 | .send_keys(pw) 19 | self.driver.find_element_by_xpath('//button[@type="submit"]')\ 20 | .click() 21 | sleep(4) 22 | self.driver.find_element_by_xpath("//button[contains(text(), 'Not Now')]")\ 23 | .click() 24 | sleep(2) 25 | 26 | def get_unfollowers(self): 27 | self.driver.find_element_by_xpath("//a[contains(@href,'/{}')]".format(self.username))\ 28 | .click() 29 | sleep(2) 30 | self.driver.find_element_by_xpath("//a[contains(@href,'/following')]")\ 31 | .click() 32 | following = self._get_names() 33 | self.driver.find_element_by_xpath("//a[contains(@href,'/followers')]")\ 34 | .click() 35 | followers = self._get_names() 36 | not_following_back = [user for user in following if user not in followers] 37 | print(not_following_back) 38 | 39 | def _get_names(self): 40 | sleep(2) 41 | sugs = self.driver.find_element_by_xpath('//h4[contains(text(), Suggestions)]') 42 | self.driver.execute_script('arguments[0].scrollIntoView()', sugs) 43 | sleep(2) 44 | scroll_box = self.driver.find_element_by_xpath("/html/body/div[3]/div/div[2]") 45 | last_ht, ht = 0, 1 46 | while last_ht != ht: 47 | last_ht = ht 48 | sleep(1) 49 | ht = self.driver.execute_script(""" 50 | arguments[0].scrollTo(0, arguments[0].scrollHeight); 51 | return arguments[0].scrollHeight; 52 | """, scroll_box) 53 | links = scroll_box.find_elements_by_tag_name('a') 54 | names = [name.text for name in links if name.text != ''] 55 | # close button 56 | self.driver.find_element_by_xpath("/html/body/div[3]/div/div[1]/div/div[2]/button")\ 57 | .click() 58 | return names 59 | 60 | 61 | my_bot = InstaBot('_aaronjack', pw) 62 | my_bot.get_unfollowers() 63 | --------------------------------------------------------------------------------