├── .gitignore ├── chromedriver └── chromedriver ├── data.py ├── lesson_1 └── lesson_1.py ├── lesson_2 └── lesson2.py ├── lesson_3 ├── lesson3.py └── test.py ├── lesson_4 ├── lesson4.py └── test.py ├── lesson_5 └── lesson5.py ├── lesson_6 ├── img1.jpg └── lesson6.py ├── lesson_7 └── lesson_7.py ├── lesson_8 ├── lesson_8.py └── test.py ├── req.txt └── test.py /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | venvInstagam_bot/ 3 | venvInstBot/ 4 | *.pyc 5 | dataaaa.py 6 | 7 | # Project exclude paths 8 | /venvInstagram_bot/ -------------------------------------------------------------------------------- /chromedriver/chromedriver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythontoday/instagram_bot/d1fbe9518c7d37d0baec368c72c915a705ff0c3d/chromedriver/chromedriver -------------------------------------------------------------------------------- /data.py: -------------------------------------------------------------------------------- 1 | username = "username" 2 | password = "password" 3 | 4 | direct_users_list = ['user1'] 5 | 6 | users_settings_dict = { 7 | 'user1': { 8 | 'login': 'bot_login', 9 | 'password': 'bot_password' 10 | }, 11 | # 'user2': { 12 | # 'login': 'bot_login', 13 | # 'password': 'bot_password' 14 | # } 15 | } -------------------------------------------------------------------------------- /lesson_1/lesson_1.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import username, password 4 | import time 5 | import random 6 | 7 | 8 | def login(username, password): 9 | browser = webdriver.Chrome('../chromedriver/chromedriver') 10 | 11 | try: 12 | browser.get('https://www.instagram.com') 13 | time.sleep(random.randrange(3, 5)) 14 | 15 | username_input = browser.find_element_by_name('username') 16 | username_input.clear() 17 | username_input.send_keys(username) 18 | 19 | time.sleep(2) 20 | 21 | password_input = browser.find_element_by_name('password') 22 | password_input.clear() 23 | password_input.send_keys(password) 24 | 25 | password_input.send_keys(Keys.ENTER) 26 | time.sleep(10) 27 | 28 | browser.close() 29 | browser.quit() 30 | except Exception as ex: 31 | print(ex) 32 | browser.close() 33 | browser.quit() 34 | 35 | 36 | login(username, password) -------------------------------------------------------------------------------- /lesson_2/lesson2.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import username, password 4 | import time 5 | import random 6 | 7 | 8 | # def login(username, password): 9 | # browser = webdriver.Chrome('../chromedriver/chromedriver') 10 | # 11 | # try: 12 | # browser.get('https://www.instagram.com') 13 | # time.sleep(random.randrange(3, 5)) 14 | # 15 | # username_input = browser.find_element_by_name('username') 16 | # username_input.clear() 17 | # username_input.send_keys(username) 18 | # 19 | # time.sleep(2) 20 | # 21 | # password_input = browser.find_element_by_name('password') 22 | # password_input.clear() 23 | # password_input.send_keys(password) 24 | # 25 | # password_input.send_keys(Keys.ENTER) 26 | # time.sleep(10) 27 | # 28 | # browser.close() 29 | # browser.quit() 30 | # except Exception as ex: 31 | # print(ex) 32 | # browser.close() 33 | # browser.quit() 34 | # 35 | # 36 | # login(username, password) 37 | 38 | 39 | def hashtag_search(username, password, hashtag): 40 | 41 | browser = webdriver.Chrome('../chromedriver/chromedriver') 42 | 43 | try: 44 | browser.get('https://www.instagram.com') 45 | time.sleep(random.randrange(3, 5)) 46 | 47 | username_input = browser.find_element_by_name('username') 48 | username_input.clear() 49 | username_input.send_keys(username) 50 | 51 | time.sleep(2) 52 | 53 | password_input = browser.find_element_by_name('password') 54 | password_input.clear() 55 | password_input.send_keys(password) 56 | 57 | password_input.send_keys(Keys.ENTER) 58 | time.sleep(5) 59 | 60 | try: 61 | browser.get(f'https://www.instagram.com/explore/tags/{hashtag}/') 62 | time.sleep(5) 63 | 64 | for i in range(1, 4): 65 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 66 | time.sleep(random.randrange(3, 5)) 67 | 68 | hrefs = browser.find_elements_by_tag_name('a') 69 | posts_urls = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 70 | 71 | # posts_urls = [] 72 | # for item in hrefs: 73 | # href = item.get_attribute('href') 74 | # 75 | # if "/p/" in href: 76 | # posts_urls.append(href) 77 | # print(href) 78 | 79 | for url in posts_urls: 80 | try: 81 | browser.get(url) 82 | time.sleep(3) 83 | like_button = browser.find_element_by_xpath('/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[1]/span[1]/button').click() 84 | time.sleep(random.randrange(80, 100)) 85 | except Exception as ex: 86 | print(ex) 87 | 88 | browser.close() 89 | browser.quit() 90 | 91 | except Exception as ex: 92 | print(ex) 93 | browser.close() 94 | browser.quit() 95 | 96 | except Exception as ex: 97 | print(ex) 98 | browser.close() 99 | browser.quit() 100 | 101 | 102 | hashtag_search(username, password, 'surfing') 103 | 104 | 105 | -------------------------------------------------------------------------------- /lesson_3/lesson3.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import username, password 4 | import time 5 | import random 6 | from selenium.common.exceptions import NoSuchElementException 7 | 8 | 9 | class InstagramBot(): 10 | """Instagram Bot на Python by PythonToday""" 11 | 12 | def __init__(self, username, password): 13 | 14 | self.username = username 15 | self.password = password 16 | self.browser = webdriver.Chrome("../chromedriver/chromedriver") 17 | 18 | # метод для закрытия браузера 19 | def close_browser(self): 20 | 21 | self.browser.close() 22 | self.browser.quit() 23 | 24 | # метод логина 25 | def login(self): 26 | 27 | browser = self.browser 28 | browser.get('https://www.instagram.com') 29 | time.sleep(random.randrange(3, 5)) 30 | 31 | username_input = browser.find_element_by_name('username') 32 | username_input.clear() 33 | username_input.send_keys(username) 34 | 35 | time.sleep(2) 36 | 37 | password_input = browser.find_element_by_name('password') 38 | password_input.clear() 39 | password_input.send_keys(password) 40 | 41 | password_input.send_keys(Keys.ENTER) 42 | time.sleep(10) 43 | 44 | # метод ставит лайки по hashtag 45 | def like_photo_by_hashtag(self, hashtag): 46 | 47 | browser = self.browser 48 | browser.get(f'https://www.instagram.com/explore/tags/{hashtag}/') 49 | time.sleep(5) 50 | 51 | for i in range(1, 4): 52 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 53 | time.sleep(random.randrange(3, 5)) 54 | 55 | hrefs = browser.find_elements_by_tag_name('a') 56 | posts_urls = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 57 | 58 | for url in posts_urls: 59 | try: 60 | browser.get(url) 61 | time.sleep(3) 62 | like_button = browser.find_element_by_xpath( 63 | '/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[1]/span[1]/button').click() 64 | time.sleep(random.randrange(80, 100)) 65 | except Exception as ex: 66 | print(ex) 67 | self.close_browser() 68 | 69 | # метод проверяет по xpath существует ли элемент на странице 70 | def xpath_exists(self, url): 71 | 72 | browser = self.browser 73 | try: 74 | browser.find_element_by_xpath(url) 75 | exist = True 76 | except NoSuchElementException: 77 | exist = False 78 | return exist 79 | 80 | # метод ставит лайк на пост по прямой ссылке 81 | def put_exactly_like(self, userpost): 82 | 83 | browser = self.browser 84 | browser.get(userpost) 85 | time.sleep(4) 86 | 87 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 88 | if self.xpath_exists(wrong_userpage): 89 | print("Такого поста не существует, проверьте URL") 90 | self.close_browser() 91 | else: 92 | print("Пост успешно найден, ставим лайк!") 93 | time.sleep(2) 94 | 95 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 96 | browser.find_element_by_xpath(like_button).click() 97 | time.sleep(2) 98 | 99 | print(f"Лайк на пост: {userpost} поставлен!") 100 | self.close_browser() 101 | 102 | # метод ставит лайки по ссылке на аккаунт пользователя 103 | def put_many_likes(self, userpage): 104 | 105 | browser = self.browser 106 | browser.get(userpage) 107 | time.sleep(4) 108 | 109 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 110 | if self.xpath_exists(wrong_userpage): 111 | print("Такого пользователя не существует, проверьте URL") 112 | self.close_browser() 113 | else: 114 | print("Пользователь успешно найден, ставим лайки!") 115 | time.sleep(2) 116 | 117 | posts_count = int(browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[1]/span/span").text) 118 | loops_count = int(posts_count / 12) 119 | print(loops_count) 120 | 121 | posts_urls = [] 122 | for i in range(0, loops_count): 123 | hrefs = browser.find_elements_by_tag_name('a') 124 | hrefs = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 125 | 126 | for href in hrefs: 127 | posts_urls.append(href) 128 | 129 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 130 | time.sleep(random.randrange(2, 4)) 131 | print(f"Итерация #{i}") 132 | 133 | file_name = userpage.split("/")[-2] 134 | 135 | with open(f'{file_name}.txt', 'a') as file: 136 | for post_url in posts_urls: 137 | file.write(post_url + "\n") 138 | 139 | set_posts_urls = set(posts_urls) 140 | set_posts_urls = list(set_posts_urls) 141 | 142 | with open(f'{file_name}_set.txt', 'a') as file: 143 | for post_url in set_posts_urls: 144 | file.write(post_url + '\n') 145 | 146 | with open(f'{file_name}_set.txt') as file: 147 | urls_list = file.readlines() 148 | 149 | for post_url in urls_list[0:6]: 150 | try: 151 | browser.get(post_url) 152 | time.sleep(2) 153 | 154 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 155 | browser.find_element_by_xpath(like_button).click() 156 | # time.sleep(random.randrange(80, 100)) 157 | time.sleep(2) 158 | 159 | print(f"Лайк на пост: {post_url} успешно поставлен!") 160 | except Exception as ex: 161 | print(ex) 162 | self.close_browser() 163 | 164 | self.close_browser() 165 | 166 | 167 | my_bot = InstagramBot(username, password) 168 | my_bot.login() 169 | my_bot.put_many_likes("https://www.instagram.com/username/") 170 | 171 | -------------------------------------------------------------------------------- /lesson_3/test.py: -------------------------------------------------------------------------------- 1 | name = "https://www.instagram.com/username/" 2 | 3 | file_name = name.split("/")[-2] 4 | print(file_name) -------------------------------------------------------------------------------- /lesson_4/lesson4.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import username, password 4 | import time 5 | import random 6 | from selenium.common.exceptions import NoSuchElementException 7 | import requests 8 | import os 9 | 10 | 11 | class InstagramBot(): 12 | """Instagram Bot на Python by PythonToday""" 13 | 14 | def __init__(self, username, password): 15 | 16 | self.username = username 17 | self.password = password 18 | self.browser = webdriver.Chrome("../chromedriver/chromedriver") 19 | 20 | # метод для закрытия браузера 21 | def close_browser(self): 22 | 23 | self.browser.close() 24 | self.browser.quit() 25 | 26 | # метод логина 27 | def login(self): 28 | 29 | browser = self.browser 30 | browser.get('https://www.instagram.com') 31 | time.sleep(random.randrange(3, 5)) 32 | 33 | username_input = browser.find_element_by_name('username') 34 | username_input.clear() 35 | username_input.send_keys(username) 36 | 37 | time.sleep(2) 38 | 39 | password_input = browser.find_element_by_name('password') 40 | password_input.clear() 41 | password_input.send_keys(password) 42 | 43 | password_input.send_keys(Keys.ENTER) 44 | time.sleep(10) 45 | 46 | # метод ставит лайки по hashtag 47 | def like_photo_by_hashtag(self, hashtag): 48 | 49 | browser = self.browser 50 | browser.get(f'https://www.instagram.com/explore/tags/{hashtag}/') 51 | time.sleep(5) 52 | 53 | for i in range(1, 4): 54 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 55 | time.sleep(random.randrange(3, 5)) 56 | 57 | hrefs = browser.find_elements_by_tag_name('a') 58 | posts_urls = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 59 | 60 | for url in posts_urls: 61 | try: 62 | browser.get(url) 63 | time.sleep(3) 64 | like_button = browser.find_element_by_xpath( 65 | '/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[1]/span[1]/button').click() 66 | time.sleep(random.randrange(80, 100)) 67 | except Exception as ex: 68 | print(ex) 69 | self.close_browser() 70 | 71 | # метод проверяет по xpath существует ли элемент на странице 72 | def xpath_exists(self, url): 73 | 74 | browser = self.browser 75 | try: 76 | browser.find_element_by_xpath(url) 77 | exist = True 78 | except NoSuchElementException: 79 | exist = False 80 | return exist 81 | 82 | # метод ставит лайк на пост по прямой ссылке 83 | def put_exactly_like(self, userpost): 84 | 85 | browser = self.browser 86 | browser.get(userpost) 87 | time.sleep(4) 88 | 89 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 90 | if self.xpath_exists(wrong_userpage): 91 | print("Такого поста не существует, проверьте URL") 92 | self.close_browser() 93 | else: 94 | print("Пост успешно найден, ставим лайк!") 95 | time.sleep(2) 96 | 97 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 98 | browser.find_element_by_xpath(like_button).click() 99 | time.sleep(2) 100 | 101 | print(f"Лайк на пост: {userpost} поставлен!") 102 | self.close_browser() 103 | 104 | # метод собирает ссылки на все посты пользователя 105 | def get_all_posts_urls(self, userpage): 106 | 107 | browser = self.browser 108 | browser.get(userpage) 109 | time.sleep(4) 110 | 111 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 112 | if self.xpath_exists(wrong_userpage): 113 | print("Такого пользователя не существует, проверьте URL") 114 | self.close_browser() 115 | else: 116 | print("Пользователь успешно найден, ставим лайки!") 117 | time.sleep(2) 118 | 119 | posts_count = int(browser.find_element_by_xpath( 120 | "/html/body/div[1]/section/main/div/header/section/ul/li[1]/span/span").text) 121 | loops_count = int(posts_count / 12) 122 | print(loops_count) 123 | 124 | posts_urls = [] 125 | for i in range(0, loops_count): 126 | hrefs = browser.find_elements_by_tag_name('a') 127 | hrefs = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 128 | 129 | for href in hrefs: 130 | posts_urls.append(href) 131 | 132 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 133 | time.sleep(random.randrange(2, 4)) 134 | print(f"Итерация #{i}") 135 | 136 | file_name = userpage.split("/")[-2] 137 | 138 | with open(f'{file_name}.txt', 'a') as file: 139 | for post_url in posts_urls: 140 | file.write(post_url + "\n") 141 | 142 | set_posts_urls = set(posts_urls) 143 | set_posts_urls = list(set_posts_urls) 144 | 145 | with open(f'{file_name}_set.txt', 'a') as file: 146 | for post_url in set_posts_urls: 147 | file.write(post_url + '\n') 148 | 149 | # метод ставит лайки по ссылке на аккаунт пользователя 150 | def put_many_likes(self, userpage): 151 | 152 | browser = self.browser 153 | self.get_all_posts_urls(userpage) 154 | file_name = userpage.split("/")[-2] 155 | time.sleep(4) 156 | browser.get(userpage) 157 | time.sleep(4) 158 | 159 | with open(f'{file_name}_set.txt') as file: 160 | urls_list = file.readlines() 161 | 162 | for post_url in urls_list[0:6]: 163 | try: 164 | browser.get(post_url) 165 | time.sleep(2) 166 | 167 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 168 | browser.find_element_by_xpath(like_button).click() 169 | # time.sleep(random.randrange(80, 100)) 170 | time.sleep(2) 171 | 172 | print(f"Лайк на пост: {post_url} успешно поставлен!") 173 | except Exception as ex: 174 | print(ex) 175 | self.close_browser() 176 | 177 | self.close_browser() 178 | 179 | # метод скачивает контент со страницы пользователя 180 | def download_userpage_content(self, userpage): 181 | 182 | browser = self.browser 183 | self.get_all_posts_urls(userpage) 184 | file_name = userpage.split("/")[-2] 185 | time.sleep(4) 186 | browser.get(userpage) 187 | time.sleep(4) 188 | 189 | # создаём папку с именем пользователя для чистоты проекта 190 | if os.path.exists(f"{file_name}"): 191 | print("Папка уже существует!") 192 | else: 193 | os.mkdir(file_name) 194 | 195 | img_and_video_src_urls = [] 196 | with open(f'{file_name}_set.txt') as file: 197 | urls_list = file.readlines() 198 | 199 | for post_url in urls_list: 200 | try: 201 | browser.get(post_url) 202 | time.sleep(4) 203 | 204 | img_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/img" 205 | video_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/div/div/video" 206 | post_id = post_url.split("/")[-2] 207 | 208 | if self.xpath_exists(img_src): 209 | img_src_url = browser.find_element_by_xpath(img_src).get_attribute("src") 210 | img_and_video_src_urls.append(img_src_url) 211 | 212 | # сохраняем изображение 213 | get_img = requests.get(img_src_url) 214 | with open(f"{file_name}/{file_name}_{post_id}_img.jpg", "wb") as img_file: 215 | img_file.write(get_img.content) 216 | 217 | elif self.xpath_exists(video_src): 218 | video_src_url = browser.find_element_by_xpath(video_src).get_attribute("src") 219 | img_and_video_src_urls.append(video_src_url) 220 | 221 | # сохраняем видео 222 | get_video = requests.get(video_src_url, stream=True) 223 | with open(f"{file_name}/{file_name}_{post_id}_video.mp4", "wb") as video_file: 224 | for chunk in get_video.iter_content(chunk_size=1024 * 1024): 225 | if chunk: 226 | video_file.write(chunk) 227 | else: 228 | # print("Упс! Что-то пошло не так!") 229 | img_and_video_src_urls.append(f"{post_url}, нет ссылки!") 230 | print(f"Контент из поста {post_url} успешно скачан!") 231 | 232 | except Exception as ex: 233 | print(ex) 234 | self.close_browser() 235 | 236 | self.close_browser() 237 | 238 | with open(f'{file_name}/{file_name}_img_and_video_src_urls.txt', 'a') as file: 239 | for i in img_and_video_src_urls: 240 | file.write(i + "\n") 241 | 242 | 243 | my_bot = InstagramBot(username, password) 244 | my_bot.login() 245 | my_bot.download_userpage_content("https://www.instagram.com/username/") 246 | 247 | -------------------------------------------------------------------------------- /lesson_4/test.py: -------------------------------------------------------------------------------- 1 | post_id = "https://www.instagram.com/p/userpost/" 2 | post_id = post_id.split("/")[-2] 3 | print(post_id) -------------------------------------------------------------------------------- /lesson_5/lesson5.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import username, password 4 | import time 5 | import random 6 | from selenium.common.exceptions import NoSuchElementException 7 | import requests 8 | import os 9 | 10 | 11 | class InstagramBot(): 12 | """Instagram Bot на Python by PythonToday""" 13 | 14 | def __init__(self, username, password): 15 | 16 | self.username = username 17 | self.password = password 18 | self.browser = webdriver.Chrome("../chromedriver/chromedriver") 19 | 20 | # метод для закрытия браузера 21 | def close_browser(self): 22 | 23 | self.browser.close() 24 | self.browser.quit() 25 | 26 | # метод логина 27 | def login(self): 28 | 29 | browser = self.browser 30 | browser.get('https://www.instagram.com') 31 | time.sleep(random.randrange(3, 5)) 32 | 33 | username_input = browser.find_element_by_name('username') 34 | username_input.clear() 35 | username_input.send_keys(username) 36 | 37 | time.sleep(2) 38 | 39 | password_input = browser.find_element_by_name('password') 40 | password_input.clear() 41 | password_input.send_keys(password) 42 | 43 | password_input.send_keys(Keys.ENTER) 44 | time.sleep(10) 45 | 46 | # метод ставит лайки по hashtag 47 | def like_photo_by_hashtag(self, hashtag): 48 | 49 | browser = self.browser 50 | browser.get(f'https://www.instagram.com/explore/tags/{hashtag}/') 51 | time.sleep(5) 52 | 53 | for i in range(1, 4): 54 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 55 | time.sleep(random.randrange(3, 5)) 56 | 57 | hrefs = browser.find_elements_by_tag_name('a') 58 | posts_urls = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 59 | 60 | for url in posts_urls: 61 | try: 62 | browser.get(url) 63 | time.sleep(3) 64 | like_button = browser.find_element_by_xpath( 65 | '/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[1]/span[1]/button').click() 66 | time.sleep(random.randrange(80, 100)) 67 | except Exception as ex: 68 | print(ex) 69 | self.close_browser() 70 | 71 | # метод проверяет по xpath существует ли элемент на странице 72 | def xpath_exists(self, url): 73 | 74 | browser = self.browser 75 | try: 76 | browser.find_element_by_xpath(url) 77 | exist = True 78 | except NoSuchElementException: 79 | exist = False 80 | return exist 81 | 82 | # метод ставит лайк на пост по прямой ссылке 83 | def put_exactly_like(self, userpost): 84 | 85 | browser = self.browser 86 | browser.get(userpost) 87 | time.sleep(4) 88 | 89 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 90 | if self.xpath_exists(wrong_userpage): 91 | print("Такого поста не существует, проверьте URL") 92 | self.close_browser() 93 | else: 94 | print("Пост успешно найден, ставим лайк!") 95 | time.sleep(2) 96 | 97 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 98 | browser.find_element_by_xpath(like_button).click() 99 | time.sleep(2) 100 | 101 | print(f"Лайк на пост: {userpost} поставлен!") 102 | self.close_browser() 103 | 104 | # метод собирает ссылки на все посты пользователя 105 | def get_all_posts_urls(self, userpage): 106 | 107 | browser = self.browser 108 | browser.get(userpage) 109 | time.sleep(4) 110 | 111 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 112 | if self.xpath_exists(wrong_userpage): 113 | print("Такого пользователя не существует, проверьте URL") 114 | self.close_browser() 115 | else: 116 | print("Пользователь успешно найден, ставим лайки!") 117 | time.sleep(2) 118 | 119 | posts_count = int(browser.find_element_by_xpath( 120 | "/html/body/div[1]/section/main/div/header/section/ul/li[1]/span/span").text) 121 | loops_count = int(posts_count / 12) 122 | print(loops_count) 123 | 124 | posts_urls = [] 125 | for i in range(0, loops_count): 126 | hrefs = browser.find_elements_by_tag_name('a') 127 | hrefs = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 128 | 129 | for href in hrefs: 130 | posts_urls.append(href) 131 | 132 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 133 | time.sleep(random.randrange(2, 4)) 134 | print(f"Итерация #{i}") 135 | 136 | file_name = userpage.split("/")[-2] 137 | 138 | with open(f'{file_name}.txt', 'a') as file: 139 | for post_url in posts_urls: 140 | file.write(post_url + "\n") 141 | 142 | set_posts_urls = set(posts_urls) 143 | set_posts_urls = list(set_posts_urls) 144 | 145 | with open(f'{file_name}_set.txt', 'a') as file: 146 | for post_url in set_posts_urls: 147 | file.write(post_url + '\n') 148 | 149 | # метод ставит лайки по ссылке на аккаунт пользователя 150 | def put_many_likes(self, userpage): 151 | 152 | browser = self.browser 153 | self.get_all_posts_urls(userpage) 154 | file_name = userpage.split("/")[-2] 155 | time.sleep(4) 156 | browser.get(userpage) 157 | time.sleep(4) 158 | 159 | with open(f'{file_name}_set.txt') as file: 160 | urls_list = file.readlines() 161 | 162 | for post_url in urls_list[0:6]: 163 | try: 164 | browser.get(post_url) 165 | time.sleep(2) 166 | 167 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 168 | browser.find_element_by_xpath(like_button).click() 169 | # time.sleep(random.randrange(80, 100)) 170 | time.sleep(2) 171 | 172 | print(f"Лайк на пост: {post_url} успешно поставлен!") 173 | except Exception as ex: 174 | print(ex) 175 | self.close_browser() 176 | 177 | self.close_browser() 178 | 179 | # метод скачивает контент со страницы пользователя 180 | def download_userpage_content(self, userpage): 181 | 182 | browser = self.browser 183 | self.get_all_posts_urls(userpage) 184 | file_name = userpage.split("/")[-2] 185 | time.sleep(4) 186 | browser.get(userpage) 187 | time.sleep(4) 188 | 189 | # создаём папку с именем пользователя для чистоты проекта 190 | if os.path.exists(f"{file_name}"): 191 | print("Папка уже существует!") 192 | else: 193 | os.mkdir(file_name) 194 | 195 | img_and_video_src_urls = [] 196 | with open(f'{file_name}_set.txt') as file: 197 | urls_list = file.readlines() 198 | 199 | for post_url in urls_list: 200 | try: 201 | browser.get(post_url) 202 | time.sleep(4) 203 | 204 | img_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/img" 205 | video_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/div/div/video" 206 | post_id = post_url.split("/")[-2] 207 | 208 | if self.xpath_exists(img_src): 209 | img_src_url = browser.find_element_by_xpath(img_src).get_attribute("src") 210 | img_and_video_src_urls.append(img_src_url) 211 | 212 | # сохраняем изображение 213 | get_img = requests.get(img_src_url) 214 | with open(f"{file_name}/{file_name}_{post_id}_img.jpg", "wb") as img_file: 215 | img_file.write(get_img.content) 216 | 217 | elif self.xpath_exists(video_src): 218 | video_src_url = browser.find_element_by_xpath(video_src).get_attribute("src") 219 | img_and_video_src_urls.append(video_src_url) 220 | 221 | # сохраняем видео 222 | get_video = requests.get(video_src_url, stream=True) 223 | with open(f"{file_name}/{file_name}_{post_id}_video.mp4", "wb") as video_file: 224 | for chunk in get_video.iter_content(chunk_size=1024 * 1024): 225 | if chunk: 226 | video_file.write(chunk) 227 | else: 228 | # print("Упс! Что-то пошло не так!") 229 | img_and_video_src_urls.append(f"{post_url}, нет ссылки!") 230 | print(f"Контент из поста {post_url} успешно скачан!") 231 | 232 | except Exception as ex: 233 | print(ex) 234 | self.close_browser() 235 | 236 | self.close_browser() 237 | 238 | with open(f'{file_name}/{file_name}_img_and_video_src_urls.txt', 'a') as file: 239 | for i in img_and_video_src_urls: 240 | file.write(i + "\n") 241 | 242 | # метод подписки на всех подписчиков переданного аккаунта 243 | def get_all_followers(self, userpage): 244 | 245 | browser = self.browser 246 | browser.get(userpage) 247 | time.sleep(4) 248 | file_name = userpage.split("/")[-2] 249 | 250 | # создаём папку с именем пользователя для чистоты проекта 251 | if os.path.exists(f"{file_name}"): 252 | print(f"Папка {file_name} уже существует!") 253 | else: 254 | print(f"Создаём папку пользователя {file_name}.") 255 | os.mkdir(file_name) 256 | 257 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 258 | if self.xpath_exists(wrong_userpage): 259 | print(f"Пользователя {file_name} не существует, проверьте URL") 260 | self.close_browser() 261 | else: 262 | print(f"Пользователь {file_name} успешно найден, начинаем скачивать ссылки на подписчиков!") 263 | time.sleep(2) 264 | 265 | followers_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[2]/a") 266 | followers_count = followers_button.text 267 | followers_count = int(followers_count.split(' ')[0]) 268 | print(f"Количество подписчиков: {followers_count}") 269 | time.sleep(2) 270 | 271 | loops_count = int(followers_count / 12) 272 | print(f"Число итераций: {loops_count}") 273 | time.sleep(4) 274 | 275 | followers_button.click() 276 | time.sleep(4) 277 | 278 | followers_ul = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]") 279 | 280 | try: 281 | followers_urls = [] 282 | for i in range(1, loops_count + 1): 283 | browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", followers_ul) 284 | time.sleep(random.randrange(2, 4)) 285 | print(f"Итерация #{i}") 286 | 287 | all_urls_div = followers_ul.find_elements_by_tag_name("li") 288 | 289 | for url in all_urls_div: 290 | url = url.find_element_by_tag_name("a").get_attribute("href") 291 | followers_urls.append(url) 292 | 293 | # сохраняем всех подписчиков пользователя в файл 294 | with open(f"{file_name}/{file_name}.txt", "a") as text_file: 295 | for link in followers_urls: 296 | text_file.write(link + "\n") 297 | 298 | with open(f"{file_name}/{file_name}.txt") as text_file: 299 | users_urls = text_file.readlines() 300 | 301 | for user in users_urls[0:10]: 302 | try: 303 | try: 304 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 305 | 'r') as subscribe_list_file: 306 | lines = subscribe_list_file.readlines() 307 | if user in lines: 308 | print(f'Мы уже подписаны на {user}, переходим к следующему пользователю!') 309 | continue 310 | 311 | except Exception as ex: 312 | print('Файл со ссылками ещё не создан!') 313 | # print(ex) 314 | 315 | browser = self.browser 316 | browser.get(user) 317 | page_owner = user.split("/")[-2] 318 | 319 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div/a"): 320 | 321 | print("Это наш профиль, уже подписан, пропускаем итерацию!") 322 | elif self.xpath_exists( 323 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[2]/div/span/span[1]/button/div/span"): 324 | print(f"Уже подписаны, на {page_owner} пропускаем итерацию!") 325 | else: 326 | time.sleep(random.randrange(4, 8)) 327 | 328 | if self.xpath_exists( 329 | "/html/body/div[1]/section/main/div/div/article/div[1]/div/h2"): 330 | try: 331 | follow_button = browser.find_element_by_xpath( 332 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 333 | print(f'Запросили подписку на пользователя {page_owner}. Закрытый аккаунт!') 334 | except Exception as ex: 335 | print(ex) 336 | else: 337 | try: 338 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button"): 339 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 340 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 341 | else: 342 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/div/span/span[1]/button").click() 343 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 344 | except Exception as ex: 345 | print(ex) 346 | 347 | # записываем данные в файл для ссылок всех подписок, если файла нет, создаём, если есть - дополняем 348 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 349 | 'a') as subscribe_list_file: 350 | subscribe_list_file.write(user) 351 | 352 | time.sleep(random.randrange(7, 15)) 353 | 354 | except Exception as ex: 355 | print(ex) 356 | self.close_browser() 357 | 358 | except Exception as ex: 359 | print(ex) 360 | self.close_browser() 361 | 362 | self.close_browser() 363 | 364 | 365 | my_bot = InstagramBot(username, password) 366 | my_bot.login() 367 | my_bot.get_all_followers('https://www.instagram.com/username/') 368 | # my_bot.download_userpage_content("https://www.instagram.com/username/") 369 | 370 | -------------------------------------------------------------------------------- /lesson_6/img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythontoday/instagram_bot/d1fbe9518c7d37d0baec368c72c915a705ff0c3d/lesson_6/img1.jpg -------------------------------------------------------------------------------- /lesson_6/lesson6.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import username, password 4 | from direct_users_list import direct_users_list 5 | import time 6 | import random 7 | from selenium.common.exceptions import NoSuchElementException 8 | import requests 9 | import os 10 | 11 | 12 | class InstagramBot(): 13 | """Instagram Bot на Python by PythonToday""" 14 | 15 | def __init__(self, username, password): 16 | 17 | self.username = username 18 | self.password = password 19 | self.browser = webdriver.Chrome("../chromedriver/chromedriver") 20 | 21 | # метод для закрытия браузера 22 | def close_browser(self): 23 | 24 | self.browser.close() 25 | self.browser.quit() 26 | 27 | # метод логина 28 | def login(self): 29 | 30 | browser = self.browser 31 | browser.get('https://www.instagram.com') 32 | time.sleep(random.randrange(3, 5)) 33 | 34 | username_input = browser.find_element_by_name('username') 35 | username_input.clear() 36 | username_input.send_keys(username) 37 | 38 | time.sleep(2) 39 | 40 | password_input = browser.find_element_by_name('password') 41 | password_input.clear() 42 | password_input.send_keys(password) 43 | 44 | password_input.send_keys(Keys.ENTER) 45 | time.sleep(10) 46 | 47 | # метод ставит лайки по hashtag 48 | def like_photo_by_hashtag(self, hashtag): 49 | 50 | browser = self.browser 51 | browser.get(f'https://www.instagram.com/explore/tags/{hashtag}/') 52 | time.sleep(5) 53 | 54 | for i in range(1, 4): 55 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 56 | time.sleep(random.randrange(3, 5)) 57 | 58 | hrefs = browser.find_elements_by_tag_name('a') 59 | posts_urls = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 60 | 61 | for url in posts_urls: 62 | try: 63 | browser.get(url) 64 | time.sleep(3) 65 | like_button = browser.find_element_by_xpath( 66 | '/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[1]/span[1]/button').click() 67 | time.sleep(random.randrange(80, 100)) 68 | except Exception as ex: 69 | print(ex) 70 | self.close_browser() 71 | 72 | # метод проверяет по xpath существует ли элемент на странице 73 | def xpath_exists(self, url): 74 | 75 | browser = self.browser 76 | try: 77 | browser.find_element_by_xpath(url) 78 | exist = True 79 | except NoSuchElementException: 80 | exist = False 81 | return exist 82 | 83 | # метод ставит лайк на пост по прямой ссылке 84 | def put_exactly_like(self, userpost): 85 | 86 | browser = self.browser 87 | browser.get(userpost) 88 | time.sleep(4) 89 | 90 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 91 | if self.xpath_exists(wrong_userpage): 92 | print("Такого поста не существует, проверьте URL") 93 | self.close_browser() 94 | else: 95 | print("Пост успешно найден, ставим лайк!") 96 | time.sleep(2) 97 | 98 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 99 | browser.find_element_by_xpath(like_button).click() 100 | time.sleep(2) 101 | 102 | print(f"Лайк на пост: {userpost} поставлен!") 103 | self.close_browser() 104 | 105 | # метод собирает ссылки на все посты пользователя 106 | def get_all_posts_urls(self, userpage): 107 | 108 | browser = self.browser 109 | browser.get(userpage) 110 | time.sleep(4) 111 | 112 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 113 | if self.xpath_exists(wrong_userpage): 114 | print("Такого пользователя не существует, проверьте URL") 115 | self.close_browser() 116 | else: 117 | print("Пользователь успешно найден, ставим лайки!") 118 | time.sleep(2) 119 | 120 | posts_count = int(browser.find_element_by_xpath( 121 | "/html/body/div[1]/section/main/div/header/section/ul/li[1]/span/span").text) 122 | loops_count = int(posts_count / 12) 123 | print(loops_count) 124 | 125 | posts_urls = [] 126 | for i in range(0, loops_count): 127 | hrefs = browser.find_elements_by_tag_name('a') 128 | hrefs = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 129 | 130 | for href in hrefs: 131 | posts_urls.append(href) 132 | 133 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 134 | time.sleep(random.randrange(2, 4)) 135 | print(f"Итерация #{i}") 136 | 137 | file_name = userpage.split("/")[-2] 138 | 139 | with open(f'{file_name}.txt', 'a') as file: 140 | for post_url in posts_urls: 141 | file.write(post_url + "\n") 142 | 143 | set_posts_urls = set(posts_urls) 144 | set_posts_urls = list(set_posts_urls) 145 | 146 | with open(f'{file_name}_set.txt', 'a') as file: 147 | for post_url in set_posts_urls: 148 | file.write(post_url + '\n') 149 | 150 | # метод ставит лайки по ссылке на аккаунт пользователя 151 | def put_many_likes(self, userpage): 152 | 153 | browser = self.browser 154 | self.get_all_posts_urls(userpage) 155 | file_name = userpage.split("/")[-2] 156 | time.sleep(4) 157 | browser.get(userpage) 158 | time.sleep(4) 159 | 160 | with open(f'{file_name}_set.txt') as file: 161 | urls_list = file.readlines() 162 | 163 | for post_url in urls_list[0:6]: 164 | try: 165 | browser.get(post_url) 166 | time.sleep(2) 167 | 168 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 169 | browser.find_element_by_xpath(like_button).click() 170 | # time.sleep(random.randrange(80, 100)) 171 | time.sleep(2) 172 | 173 | print(f"Лайк на пост: {post_url} успешно поставлен!") 174 | except Exception as ex: 175 | print(ex) 176 | self.close_browser() 177 | 178 | self.close_browser() 179 | 180 | # метод скачивает контент со страницы пользователя 181 | def download_userpage_content(self, userpage): 182 | 183 | browser = self.browser 184 | self.get_all_posts_urls(userpage) 185 | file_name = userpage.split("/")[-2] 186 | time.sleep(4) 187 | browser.get(userpage) 188 | time.sleep(4) 189 | 190 | # создаём папку с именем пользователя для чистоты проекта 191 | if os.path.exists(f"{file_name}"): 192 | print("Папка уже существует!") 193 | else: 194 | os.mkdir(file_name) 195 | 196 | img_and_video_src_urls = [] 197 | with open(f'{file_name}_set.txt') as file: 198 | urls_list = file.readlines() 199 | 200 | for post_url in urls_list: 201 | try: 202 | browser.get(post_url) 203 | time.sleep(4) 204 | 205 | img_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/img" 206 | video_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/div/div/video" 207 | post_id = post_url.split("/")[-2] 208 | 209 | if self.xpath_exists(img_src): 210 | img_src_url = browser.find_element_by_xpath(img_src).get_attribute("src") 211 | img_and_video_src_urls.append(img_src_url) 212 | 213 | # сохраняем изображение 214 | get_img = requests.get(img_src_url) 215 | with open(f"{file_name}/{file_name}_{post_id}_img.jpg", "wb") as img_file: 216 | img_file.write(get_img.content) 217 | 218 | elif self.xpath_exists(video_src): 219 | video_src_url = browser.find_element_by_xpath(video_src).get_attribute("src") 220 | img_and_video_src_urls.append(video_src_url) 221 | 222 | # сохраняем видео 223 | get_video = requests.get(video_src_url, stream=True) 224 | with open(f"{file_name}/{file_name}_{post_id}_video.mp4", "wb") as video_file: 225 | for chunk in get_video.iter_content(chunk_size=1024 * 1024): 226 | if chunk: 227 | video_file.write(chunk) 228 | else: 229 | # print("Упс! Что-то пошло не так!") 230 | img_and_video_src_urls.append(f"{post_url}, нет ссылки!") 231 | print(f"Контент из поста {post_url} успешно скачан!") 232 | 233 | except Exception as ex: 234 | print(ex) 235 | self.close_browser() 236 | 237 | self.close_browser() 238 | 239 | with open(f'{file_name}/{file_name}_img_and_video_src_urls.txt', 'a') as file: 240 | for i in img_and_video_src_urls: 241 | file.write(i + "\n") 242 | 243 | # метод подписки на всех подписчиков переданного аккаунта 244 | def get_all_followers(self, userpage): 245 | 246 | browser = self.browser 247 | browser.get(userpage) 248 | time.sleep(4) 249 | file_name = userpage.split("/")[-2] 250 | 251 | # создаём папку с именем пользователя для чистоты проекта 252 | if os.path.exists(f"{file_name}"): 253 | print(f"Папка {file_name} уже существует!") 254 | else: 255 | print(f"Создаём папку пользователя {file_name}.") 256 | os.mkdir(file_name) 257 | 258 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 259 | if self.xpath_exists(wrong_userpage): 260 | print(f"Пользователя {file_name} не существует, проверьте URL") 261 | self.close_browser() 262 | else: 263 | print(f"Пользователь {file_name} успешно найден, начинаем скачивать ссылки на подписчиков!") 264 | time.sleep(2) 265 | 266 | followers_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[2]/a") 267 | followers_count = followers_button.text 268 | followers_count = int(followers_count.split(' ')[0]) 269 | print(f"Количество подписчиков: {followers_count}") 270 | time.sleep(2) 271 | 272 | loops_count = int(followers_count / 12) 273 | print(f"Число итераций: {loops_count}") 274 | time.sleep(4) 275 | 276 | followers_button.click() 277 | time.sleep(4) 278 | 279 | followers_ul = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]") 280 | 281 | try: 282 | followers_urls = [] 283 | for i in range(1, loops_count + 1): 284 | browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", followers_ul) 285 | time.sleep(random.randrange(2, 4)) 286 | print(f"Итерация #{i}") 287 | 288 | all_urls_div = followers_ul.find_elements_by_tag_name("li") 289 | 290 | for url in all_urls_div: 291 | url = url.find_element_by_tag_name("a").get_attribute("href") 292 | followers_urls.append(url) 293 | 294 | # сохраняем всех подписчиков пользователя в файл 295 | with open(f"{file_name}/{file_name}.txt", "a") as text_file: 296 | for link in followers_urls: 297 | text_file.write(link + "\n") 298 | 299 | with open(f"{file_name}/{file_name}.txt") as text_file: 300 | users_urls = text_file.readlines() 301 | 302 | for user in users_urls[0:10]: 303 | try: 304 | try: 305 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 306 | 'r') as subscribe_list_file: 307 | lines = subscribe_list_file.readlines() 308 | if user in lines: 309 | print(f'Мы уже подписаны на {user}, переходим к следующему пользователю!') 310 | continue 311 | 312 | except Exception as ex: 313 | print('Файл со ссылками ещё не создан!') 314 | # print(ex) 315 | 316 | browser = self.browser 317 | browser.get(user) 318 | page_owner = user.split("/")[-2] 319 | 320 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div/a"): 321 | 322 | print("Это наш профиль, уже подписан, пропускаем итерацию!") 323 | elif self.xpath_exists( 324 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[2]/div/span/span[1]/button/div/span"): 325 | print(f"Уже подписаны, на {page_owner} пропускаем итерацию!") 326 | else: 327 | time.sleep(random.randrange(4, 8)) 328 | 329 | if self.xpath_exists( 330 | "/html/body/div[1]/section/main/div/div/article/div[1]/div/h2"): 331 | try: 332 | follow_button = browser.find_element_by_xpath( 333 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 334 | print(f'Запросили подписку на пользователя {page_owner}. Закрытый аккаунт!') 335 | except Exception as ex: 336 | print(ex) 337 | else: 338 | try: 339 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button"): 340 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 341 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 342 | else: 343 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/div/span/span[1]/button").click() 344 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 345 | except Exception as ex: 346 | print(ex) 347 | 348 | # записываем данные в файл для ссылок всех подписок, если файла нет, создаём, если есть - дополняем 349 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 350 | 'a') as subscribe_list_file: 351 | subscribe_list_file.write(user) 352 | 353 | time.sleep(random.randrange(7, 15)) 354 | 355 | except Exception as ex: 356 | print(ex) 357 | self.close_browser() 358 | 359 | except Exception as ex: 360 | print(ex) 361 | self.close_browser() 362 | 363 | self.close_browser() 364 | 365 | # метод для отправки сообщений в директ 366 | def send_direct_message(self, usernames="", message="", img_path=''): 367 | 368 | browser = self.browser 369 | time.sleep(random.randrange(2, 4)) 370 | 371 | direct_message_button = "/html/body/div[1]/section/nav/div[2]/div/div/div[3]/div/div[2]/a" 372 | 373 | if not self.xpath_exists(direct_message_button): 374 | print("Кнопка отправки сообщений не найдена!") 375 | self.close_browser() 376 | else: 377 | print("Отправляем сообщение...") 378 | direct_message = browser.find_element_by_xpath(direct_message_button).click() 379 | time.sleep(random.randrange(2, 4)) 380 | 381 | # отключаем всплывающее окно 382 | if self.xpath_exists("/html/body/div[4]/div/div"): 383 | browser.find_element_by_xpath("/html/body/div[4]/div/div/div/div[3]/button[2]").click() 384 | time.sleep(random.randrange(2, 4)) 385 | 386 | send_message_button = browser.find_element_by_xpath( 387 | "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div/button").click() 388 | time.sleep(random.randrange(2, 4)) 389 | 390 | # отправка сообщения нескольким пользователям 391 | for user in usernames: 392 | # вводим получателя 393 | to_input = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]/div[1]/div/div[2]/input") 394 | to_input.send_keys(user) 395 | time.sleep(random.randrange(2, 4)) 396 | 397 | # выбираем получателя из списка 398 | users_list = browser.find_element_by_xpath( 399 | "/html/body/div[4]/div/div/div[2]/div[2]").find_element_by_tag_name("button").click() 400 | time.sleep(random.randrange(2, 4)) 401 | 402 | next_button = browser.find_element_by_xpath( 403 | "/html/body/div[4]/div/div/div[1]/div/div[2]/div/button").click() 404 | time.sleep(random.randrange(2, 4)) 405 | 406 | # отправка текстового сообщения 407 | if message: 408 | text_message_area = browser.find_element_by_xpath( 409 | "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div[2]/textarea") 410 | text_message_area.clear() 411 | text_message_area.send_keys(message) 412 | time.sleep(random.randrange(2, 4)) 413 | text_message_area.send_keys(Keys.ENTER) 414 | print(f"Сообщение для {usernames} успешно отправлено!") 415 | time.sleep(random.randrange(2, 4)) 416 | 417 | # отправка изображения 418 | if img_path: 419 | send_img_input = browser.find_element_by_xpath("/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/form/input") 420 | send_img_input.send_keys(img_path) 421 | print(f"Изображение для {usernames} успешно отправлено!") 422 | time.sleep(random.randrange(2, 4)) 423 | 424 | self.close_browser() 425 | 426 | 427 | my_bot = InstagramBot(username, password) 428 | my_bot.login() 429 | my_bot.send_direct_message(direct_users_list, "Hey! How's it going?", "/home/cain/PycharmProjects/instagram_bot/lesson_6/img1.jpg") 430 | # my_bot.get_all_followers('https://www.instagram.com/username/') 431 | # my_bot.download_userpage_content("https://www.instagram.com/username/") 432 | 433 | -------------------------------------------------------------------------------- /lesson_7/lesson_7.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import users_settings_dict, direct_users_list 4 | import time 5 | import random 6 | from selenium.common.exceptions import NoSuchElementException 7 | from selenium.webdriver.chrome.options import Options 8 | import requests 9 | import os 10 | 11 | 12 | class InstagramBot(): 13 | """Instagram Bot на Python by PythonToday""" 14 | 15 | def __init__(self, username, password): 16 | 17 | self.username = username 18 | self.password = password 19 | options = Options() 20 | # options.add_argument(f"--window-size={window_size}") 21 | options.add_argument("--headless") 22 | self.browser = webdriver.Chrome("../chromedriver/chromedriver", options=options) 23 | 24 | # метод для закрытия браузера 25 | def close_browser(self): 26 | 27 | self.browser.close() 28 | self.browser.quit() 29 | 30 | # метод логина 31 | def login(self): 32 | 33 | browser = self.browser 34 | browser.get('https://www.instagram.com') 35 | time.sleep(random.randrange(3, 5)) 36 | 37 | username_input = browser.find_element_by_name('username') 38 | username_input.clear() 39 | username_input.send_keys(username) 40 | 41 | time.sleep(2) 42 | 43 | password_input = browser.find_element_by_name('password') 44 | password_input.clear() 45 | password_input.send_keys(password) 46 | 47 | password_input.send_keys(Keys.ENTER) 48 | time.sleep(10) 49 | 50 | # метод ставит лайки по hashtag 51 | def like_photo_by_hashtag(self, hashtag): 52 | 53 | browser = self.browser 54 | browser.get(f'https://www.instagram.com/explore/tags/{hashtag}/') 55 | time.sleep(5) 56 | 57 | for i in range(1, 4): 58 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 59 | time.sleep(random.randrange(3, 5)) 60 | 61 | hrefs = browser.find_elements_by_tag_name('a') 62 | posts_urls = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 63 | 64 | for url in posts_urls: 65 | try: 66 | browser.get(url) 67 | time.sleep(3) 68 | like_button = browser.find_element_by_xpath( 69 | '/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[1]/span[1]/button').click() 70 | time.sleep(random.randrange(80, 100)) 71 | except Exception as ex: 72 | print(ex) 73 | self.close_browser() 74 | 75 | # метод проверяет по xpath существует ли элемент на странице 76 | def xpath_exists(self, url): 77 | 78 | browser = self.browser 79 | try: 80 | browser.find_element_by_xpath(url) 81 | exist = True 82 | except NoSuchElementException: 83 | exist = False 84 | return exist 85 | 86 | # метод ставит лайк на пост по прямой ссылке 87 | def put_exactly_like(self, userpost): 88 | 89 | browser = self.browser 90 | browser.get(userpost) 91 | time.sleep(4) 92 | 93 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 94 | if self.xpath_exists(wrong_userpage): 95 | print("Такого поста не существует, проверьте URL") 96 | self.close_browser() 97 | else: 98 | print("Пост успешно найден, ставим лайк!") 99 | time.sleep(2) 100 | 101 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 102 | browser.find_element_by_xpath(like_button).click() 103 | time.sleep(2) 104 | 105 | print(f"Лайк на пост: {userpost} поставлен!") 106 | self.close_browser() 107 | 108 | # метод собирает ссылки на все посты пользователя 109 | def get_all_posts_urls(self, userpage): 110 | 111 | browser = self.browser 112 | browser.get(userpage) 113 | time.sleep(4) 114 | 115 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 116 | if self.xpath_exists(wrong_userpage): 117 | print("Такого пользователя не существует, проверьте URL") 118 | self.close_browser() 119 | else: 120 | print("Пользователь успешно найден, ставим лайки!") 121 | time.sleep(2) 122 | 123 | posts_count = int(browser.find_element_by_xpath( 124 | "/html/body/div[1]/section/main/div/header/section/ul/li[1]/span/span").text) 125 | loops_count = int(posts_count / 12) 126 | print(loops_count) 127 | 128 | posts_urls = [] 129 | for i in range(0, loops_count): 130 | hrefs = browser.find_elements_by_tag_name('a') 131 | hrefs = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 132 | 133 | for href in hrefs: 134 | posts_urls.append(href) 135 | 136 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 137 | time.sleep(random.randrange(2, 4)) 138 | print(f"Итерация #{i}") 139 | 140 | file_name = userpage.split("/")[-2] 141 | 142 | with open(f'{file_name}.txt', 'a') as file: 143 | for post_url in posts_urls: 144 | file.write(post_url + "\n") 145 | 146 | set_posts_urls = set(posts_urls) 147 | set_posts_urls = list(set_posts_urls) 148 | 149 | with open(f'{file_name}_set.txt', 'a') as file: 150 | for post_url in set_posts_urls: 151 | file.write(post_url + '\n') 152 | 153 | # метод ставит лайки по ссылке на аккаунт пользователя 154 | def put_many_likes(self, userpage): 155 | 156 | browser = self.browser 157 | self.get_all_posts_urls(userpage) 158 | file_name = userpage.split("/")[-2] 159 | time.sleep(4) 160 | browser.get(userpage) 161 | time.sleep(4) 162 | 163 | with open(f'{file_name}_set.txt') as file: 164 | urls_list = file.readlines() 165 | 166 | for post_url in urls_list[0:6]: 167 | try: 168 | browser.get(post_url) 169 | time.sleep(2) 170 | 171 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 172 | browser.find_element_by_xpath(like_button).click() 173 | # time.sleep(random.randrange(80, 100)) 174 | time.sleep(2) 175 | 176 | print(f"Лайк на пост: {post_url} успешно поставлен!") 177 | except Exception as ex: 178 | print(ex) 179 | self.close_browser() 180 | 181 | self.close_browser() 182 | 183 | # метод скачивает контент со страницы пользователя 184 | def download_userpage_content(self, userpage): 185 | 186 | browser = self.browser 187 | self.get_all_posts_urls(userpage) 188 | file_name = userpage.split("/")[-2] 189 | time.sleep(4) 190 | browser.get(userpage) 191 | time.sleep(4) 192 | 193 | # создаём папку с именем пользователя для чистоты проекта 194 | if os.path.exists(f"{file_name}"): 195 | print("Папка уже существует!") 196 | else: 197 | os.mkdir(file_name) 198 | 199 | img_and_video_src_urls = [] 200 | with open(f'{file_name}_set.txt') as file: 201 | urls_list = file.readlines() 202 | 203 | for post_url in urls_list: 204 | try: 205 | browser.get(post_url) 206 | time.sleep(4) 207 | 208 | img_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/img" 209 | video_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/div/div/video" 210 | post_id = post_url.split("/")[-2] 211 | 212 | if self.xpath_exists(img_src): 213 | img_src_url = browser.find_element_by_xpath(img_src).get_attribute("src") 214 | img_and_video_src_urls.append(img_src_url) 215 | 216 | # сохраняем изображение 217 | get_img = requests.get(img_src_url) 218 | with open(f"{file_name}/{file_name}_{post_id}_img.jpg", "wb") as img_file: 219 | img_file.write(get_img.content) 220 | 221 | elif self.xpath_exists(video_src): 222 | video_src_url = browser.find_element_by_xpath(video_src).get_attribute("src") 223 | img_and_video_src_urls.append(video_src_url) 224 | 225 | # сохраняем видео 226 | get_video = requests.get(video_src_url, stream=True) 227 | with open(f"{file_name}/{file_name}_{post_id}_video.mp4", "wb") as video_file: 228 | for chunk in get_video.iter_content(chunk_size=1024 * 1024): 229 | if chunk: 230 | video_file.write(chunk) 231 | else: 232 | # print("Упс! Что-то пошло не так!") 233 | img_and_video_src_urls.append(f"{post_url}, нет ссылки!") 234 | print(f"Контент из поста {post_url} успешно скачан!") 235 | 236 | except Exception as ex: 237 | print(ex) 238 | self.close_browser() 239 | 240 | self.close_browser() 241 | 242 | with open(f'{file_name}/{file_name}_img_and_video_src_urls.txt', 'a') as file: 243 | for i in img_and_video_src_urls: 244 | file.write(i + "\n") 245 | 246 | # метод подписки на всех подписчиков переданного аккаунта 247 | def get_all_followers(self, userpage): 248 | 249 | browser = self.browser 250 | browser.get(userpage) 251 | time.sleep(4) 252 | file_name = userpage.split("/")[-2] 253 | 254 | # создаём папку с именем пользователя для чистоты проекта 255 | if os.path.exists(f"{file_name}"): 256 | print(f"Папка {file_name} уже существует!") 257 | else: 258 | print(f"Создаём папку пользователя {file_name}.") 259 | os.mkdir(file_name) 260 | 261 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 262 | if self.xpath_exists(wrong_userpage): 263 | print(f"Пользователя {file_name} не существует, проверьте URL") 264 | self.close_browser() 265 | else: 266 | print(f"Пользователь {file_name} успешно найден, начинаем скачивать ссылки на подписчиков!") 267 | time.sleep(2) 268 | 269 | followers_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[2]/a/span") 270 | followers_count = followers_button.get_attribute('title') 271 | # followers_count = followers_button.text 272 | # followers_count = int(followers_count.split(' ')[0]) 273 | 274 | # если количество подписчиков больше 999, убираем из числа запятые 275 | if ',' in followers_count: 276 | followers_count = int(''.join(followers_count.split(','))) 277 | else: 278 | followers_count = int(followers_count) 279 | 280 | print(f"Количество подписчиков: {followers_count}") 281 | time.sleep(2) 282 | 283 | loops_count = int(followers_count / 12) 284 | print(f"Число итераций: {loops_count}") 285 | time.sleep(4) 286 | 287 | followers_button.click() 288 | time.sleep(4) 289 | 290 | followers_ul = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]") 291 | 292 | try: 293 | followers_urls = [] 294 | for i in range(1, loops_count + 1): 295 | browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", followers_ul) 296 | time.sleep(random.randrange(2, 4)) 297 | print(f"Итерация #{i}") 298 | 299 | all_urls_div = followers_ul.find_elements_by_tag_name("li") 300 | 301 | for url in all_urls_div: 302 | url = url.find_element_by_tag_name("a").get_attribute("href") 303 | followers_urls.append(url) 304 | 305 | # сохраняем всех подписчиков пользователя в файл 306 | with open(f"{file_name}/{file_name}.txt", "a") as text_file: 307 | for link in followers_urls: 308 | text_file.write(link + "\n") 309 | 310 | with open(f"{file_name}/{file_name}.txt") as text_file: 311 | users_urls = text_file.readlines() 312 | 313 | for user in users_urls[0:10]: 314 | try: 315 | try: 316 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 317 | 'r') as subscribe_list_file: 318 | lines = subscribe_list_file.readlines() 319 | if user in lines: 320 | print(f'Мы уже подписаны на {user}, переходим к следующему пользователю!') 321 | continue 322 | 323 | except Exception as ex: 324 | print('Файл со ссылками ещё не создан!') 325 | # print(ex) 326 | 327 | browser = self.browser 328 | browser.get(user) 329 | page_owner = user.split("/")[-2] 330 | 331 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div/a"): 332 | 333 | print("Это наш профиль, уже подписан, пропускаем итерацию!") 334 | elif self.xpath_exists( 335 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[2]/div/span/span[1]/button/div/span"): 336 | print(f"Уже подписаны, на {page_owner} пропускаем итерацию!") 337 | else: 338 | time.sleep(random.randrange(4, 8)) 339 | 340 | if self.xpath_exists( 341 | "/html/body/div[1]/section/main/div/div/article/div[1]/div/h2"): 342 | try: 343 | follow_button = browser.find_element_by_xpath( 344 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 345 | print(f'Запросили подписку на пользователя {page_owner}. Закрытый аккаунт!') 346 | except Exception as ex: 347 | print(ex) 348 | else: 349 | try: 350 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button"): 351 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 352 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 353 | else: 354 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/div/span/span[1]/button").click() 355 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 356 | except Exception as ex: 357 | print(ex) 358 | 359 | # записываем данные в файл для ссылок всех подписок, если файла нет, создаём, если есть - дополняем 360 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 361 | 'a') as subscribe_list_file: 362 | subscribe_list_file.write(user) 363 | 364 | time.sleep(random.randrange(7, 15)) 365 | 366 | except Exception as ex: 367 | print(ex) 368 | self.close_browser() 369 | 370 | except Exception as ex: 371 | print(ex) 372 | self.close_browser() 373 | 374 | self.close_browser() 375 | 376 | # метод для отправки сообщений в директ 377 | def send_direct_message(self, usernames="", message="", img_path=''): 378 | 379 | browser = self.browser 380 | time.sleep(random.randrange(2, 4)) 381 | 382 | direct_message_button = "/html/body/div[1]/section/nav/div[2]/div/div/div[3]/div/div[2]/a" 383 | 384 | if not self.xpath_exists(direct_message_button): 385 | print("Кнопка отправки сообщений не найдена!") 386 | self.close_browser() 387 | else: 388 | print("Отправляем сообщение...") 389 | direct_message = browser.find_element_by_xpath(direct_message_button).click() 390 | time.sleep(random.randrange(2, 4)) 391 | 392 | # отключаем всплывающее окно 393 | if self.xpath_exists("/html/body/div[4]/div/div"): 394 | browser.find_element_by_xpath("/html/body/div[4]/div/div/div/div[3]/button[2]").click() 395 | time.sleep(random.randrange(2, 4)) 396 | 397 | send_message_button = browser.find_element_by_xpath( 398 | "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div/button").click() 399 | time.sleep(random.randrange(2, 4)) 400 | 401 | # отправка сообщения нескольким пользователям 402 | for user in usernames: 403 | # вводим получателя 404 | to_input = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]/div[1]/div/div[2]/input") 405 | to_input.send_keys(user) 406 | time.sleep(random.randrange(2, 4)) 407 | 408 | # выбираем получателя из списка 409 | users_list = browser.find_element_by_xpath( 410 | "/html/body/div[4]/div/div/div[2]/div[2]").find_element_by_tag_name("button").click() 411 | time.sleep(random.randrange(2, 4)) 412 | 413 | next_button = browser.find_element_by_xpath( 414 | "/html/body/div[4]/div/div/div[1]/div/div[2]/div/button").click() 415 | time.sleep(random.randrange(2, 4)) 416 | 417 | # отправка текстового сообщения 418 | if message: 419 | text_message_area = browser.find_element_by_xpath( 420 | "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div[2]/textarea") 421 | text_message_area.clear() 422 | text_message_area.send_keys(message) 423 | time.sleep(random.randrange(2, 4)) 424 | text_message_area.send_keys(Keys.ENTER) 425 | print(f"Сообщение для {usernames} успешно отправлено!") 426 | time.sleep(random.randrange(2, 4)) 427 | 428 | # отправка изображения 429 | if img_path: 430 | send_img_input = browser.find_element_by_xpath("/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/form/input") 431 | send_img_input.send_keys(img_path) 432 | print(f"Изображение для {usernames} успешно отправлено!") 433 | time.sleep(random.randrange(2, 4)) 434 | 435 | self.close_browser() 436 | 437 | 438 | for user, user_data in users_settings_dict.items(): 439 | username = user_data['login'] 440 | password = user_data['password'] 441 | window_size = user_data['window_size'] 442 | 443 | my_bot = InstagramBot(username, password) 444 | my_bot.login() 445 | # my_bot.close_browser() 446 | # my_bot.send_direct_message(direct_users_list, "Hey! How's it going?", "/home/cain/PycharmProjects/instagram_bot/lesson_6/img1.jpg") 447 | my_bot.get_all_followers('username') 448 | time.sleep(random.randrange(4, 8)) 449 | 450 | # my_bot = InstagramBot(username, password) 451 | # my_bot.login() 452 | # my_bot.send_direct_message(direct_users_list, "Hey! How's it going?", "/home/cain/PycharmProjects/instagram_bot/lesson_6/img1.jpg") 453 | # my_bot.get_all_followers('https://www.instagram.com/username/') 454 | # my_bot.download_userpage_content("https://www.instagram.com/username/") -------------------------------------------------------------------------------- /lesson_8/lesson_8.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.keys import Keys 3 | from data import users_settings_dict, direct_users_list 4 | import time 5 | import random 6 | from selenium.common.exceptions import NoSuchElementException 7 | from selenium.webdriver.chrome.options import Options 8 | import requests 9 | import os 10 | import json 11 | 12 | 13 | class InstagramBot(): 14 | """Instagram Bot на Python by PythonToday""" 15 | 16 | def __init__(self, username, password): 17 | 18 | self.username = username 19 | self.password = password 20 | options = Options() 21 | # options.add_argument(f"--window-size={window_size}") 22 | # options.add_argument("--headless") 23 | # self.browser = webdriver.Chrome("../chromedriver/chromedriver", options=options) 24 | self.browser = webdriver.Chrome("../chromedriver/chromedriver") 25 | 26 | # метод для закрытия браузера 27 | def close_browser(self): 28 | 29 | self.browser.close() 30 | self.browser.quit() 31 | 32 | # метод логина 33 | def login(self): 34 | 35 | browser = self.browser 36 | browser.get('https://www.instagram.com') 37 | time.sleep(random.randrange(5, 7)) 38 | 39 | username_input = browser.find_element_by_name('username') 40 | username_input.clear() 41 | username_input.send_keys(username) 42 | 43 | time.sleep(2) 44 | 45 | password_input = browser.find_element_by_name('password') 46 | password_input.clear() 47 | password_input.send_keys(password) 48 | 49 | password_input.send_keys(Keys.ENTER) 50 | time.sleep(10) 51 | 52 | # метод ставит лайки по hashtag 53 | def like_photo_by_hashtag(self, hashtag): 54 | 55 | browser = self.browser 56 | browser.get(f'https://www.instagram.com/explore/tags/{hashtag}/') 57 | time.sleep(5) 58 | 59 | for i in range(1, 4): 60 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 61 | time.sleep(random.randrange(3, 5)) 62 | 63 | hrefs = browser.find_elements_by_tag_name('a') 64 | posts_urls = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 65 | 66 | for url in posts_urls: 67 | try: 68 | browser.get(url) 69 | time.sleep(3) 70 | like_button = browser.find_element_by_xpath( 71 | '/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[1]/span[1]/button').click() 72 | time.sleep(random.randrange(80, 100)) 73 | except Exception as ex: 74 | print(ex) 75 | self.close_browser() 76 | 77 | # метод проверяет по xpath существует ли элемент на странице 78 | def xpath_exists(self, url): 79 | 80 | browser = self.browser 81 | try: 82 | browser.find_element_by_xpath(url) 83 | exist = True 84 | except NoSuchElementException: 85 | exist = False 86 | return exist 87 | 88 | # метод ставит лайк на пост по прямой ссылке 89 | def put_exactly_like(self, userpost): 90 | 91 | browser = self.browser 92 | browser.get(userpost) 93 | time.sleep(4) 94 | 95 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 96 | if self.xpath_exists(wrong_userpage): 97 | print("Такого поста не существует, проверьте URL") 98 | self.close_browser() 99 | else: 100 | print("Пост успешно найден, ставим лайк!") 101 | time.sleep(2) 102 | 103 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 104 | browser.find_element_by_xpath(like_button).click() 105 | time.sleep(2) 106 | 107 | print(f"Лайк на пост: {userpost} поставлен!") 108 | self.close_browser() 109 | 110 | # метод собирает ссылки на все посты пользователя 111 | def get_all_posts_urls(self, userpage): 112 | 113 | browser = self.browser 114 | browser.get(userpage) 115 | time.sleep(4) 116 | 117 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 118 | if self.xpath_exists(wrong_userpage): 119 | print("Такого пользователя не существует, проверьте URL") 120 | self.close_browser() 121 | else: 122 | print("Пользователь успешно найден, ставим лайки!") 123 | time.sleep(2) 124 | 125 | posts_count = int(browser.find_element_by_xpath( 126 | "/html/body/div[1]/section/main/div/header/section/ul/li[1]/span/span").text) 127 | loops_count = int(posts_count / 12) 128 | print(loops_count) 129 | 130 | posts_urls = [] 131 | for i in range(0, loops_count): 132 | hrefs = browser.find_elements_by_tag_name('a') 133 | hrefs = [item.get_attribute('href') for item in hrefs if "/p/" in item.get_attribute('href')] 134 | 135 | for href in hrefs: 136 | posts_urls.append(href) 137 | 138 | browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 139 | time.sleep(random.randrange(2, 4)) 140 | print(f"Итерация #{i}") 141 | 142 | file_name = userpage.split("/")[-2] 143 | 144 | with open(f'{file_name}.txt', 'a') as file: 145 | for post_url in posts_urls: 146 | file.write(post_url + "\n") 147 | 148 | set_posts_urls = set(posts_urls) 149 | set_posts_urls = list(set_posts_urls) 150 | 151 | with open(f'{file_name}_set.txt', 'a') as file: 152 | for post_url in set_posts_urls: 153 | file.write(post_url + '\n') 154 | 155 | # метод ставит лайки по ссылке на аккаунт пользователя 156 | def put_many_likes(self, userpage): 157 | 158 | browser = self.browser 159 | self.get_all_posts_urls(userpage) 160 | file_name = userpage.split("/")[-2] 161 | time.sleep(4) 162 | browser.get(userpage) 163 | time.sleep(4) 164 | 165 | with open(f'{file_name}_set.txt') as file: 166 | urls_list = file.readlines() 167 | 168 | for post_url in urls_list[0:6]: 169 | try: 170 | browser.get(post_url) 171 | time.sleep(2) 172 | 173 | like_button = "/html/body/div[1]/section/main/div/div/article/div[3]/section[1]/span[1]/button" 174 | browser.find_element_by_xpath(like_button).click() 175 | # time.sleep(random.randrange(80, 100)) 176 | time.sleep(2) 177 | 178 | print(f"Лайк на пост: {post_url} успешно поставлен!") 179 | except Exception as ex: 180 | print(ex) 181 | self.close_browser() 182 | 183 | self.close_browser() 184 | 185 | # метод скачивает контент со страницы пользователя 186 | def download_userpage_content(self, userpage): 187 | 188 | browser = self.browser 189 | self.get_all_posts_urls(userpage) 190 | file_name = userpage.split("/")[-2] 191 | time.sleep(4) 192 | browser.get(userpage) 193 | time.sleep(4) 194 | 195 | # создаём папку с именем пользователя для чистоты проекта 196 | if os.path.exists(f"{file_name}"): 197 | print("Папка уже существует!") 198 | else: 199 | os.mkdir(file_name) 200 | 201 | img_and_video_src_urls = [] 202 | with open(f'{file_name}_set.txt') as file: 203 | urls_list = file.readlines() 204 | 205 | for post_url in urls_list: 206 | try: 207 | browser.get(post_url) 208 | time.sleep(4) 209 | 210 | img_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/img" 211 | video_src = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/div/div/div[1]/div/div/video" 212 | post_id = post_url.split("/")[-2] 213 | 214 | if self.xpath_exists(img_src): 215 | img_src_url = browser.find_element_by_xpath(img_src).get_attribute("src") 216 | img_and_video_src_urls.append(img_src_url) 217 | 218 | # сохраняем изображение 219 | get_img = requests.get(img_src_url) 220 | with open(f"{file_name}/{file_name}_{post_id}_img.jpg", "wb") as img_file: 221 | img_file.write(get_img.content) 222 | 223 | elif self.xpath_exists(video_src): 224 | video_src_url = browser.find_element_by_xpath(video_src).get_attribute("src") 225 | img_and_video_src_urls.append(video_src_url) 226 | 227 | # сохраняем видео 228 | get_video = requests.get(video_src_url, stream=True) 229 | with open(f"{file_name}/{file_name}_{post_id}_video.mp4", "wb") as video_file: 230 | for chunk in get_video.iter_content(chunk_size=1024 * 1024): 231 | if chunk: 232 | video_file.write(chunk) 233 | else: 234 | # print("Упс! Что-то пошло не так!") 235 | img_and_video_src_urls.append(f"{post_url}, нет ссылки!") 236 | print(f"Контент из поста {post_url} успешно скачан!") 237 | 238 | except Exception as ex: 239 | print(ex) 240 | self.close_browser() 241 | 242 | self.close_browser() 243 | 244 | with open(f'{file_name}/{file_name}_img_and_video_src_urls.txt', 'a') as file: 245 | for i in img_and_video_src_urls: 246 | file.write(i + "\n") 247 | 248 | # метод подписки на всех подписчиков переданного аккаунта 249 | def get_all_followers(self, userpage): 250 | 251 | browser = self.browser 252 | browser.get(userpage) 253 | time.sleep(4) 254 | file_name = userpage.split("/")[-2] 255 | 256 | # создаём папку с именем пользователя для чистоты проекта 257 | if os.path.exists(f"{file_name}"): 258 | print(f"Папка {file_name} уже существует!") 259 | else: 260 | print(f"Создаём папку пользователя {file_name}.") 261 | os.mkdir(file_name) 262 | 263 | wrong_userpage = "/html/body/div[1]/section/main/div/h2" 264 | if self.xpath_exists(wrong_userpage): 265 | print(f"Пользователя {file_name} не существует, проверьте URL") 266 | self.close_browser() 267 | else: 268 | print(f"Пользователь {file_name} успешно найден, начинаем скачивать ссылки на подписчиков!") 269 | time.sleep(2) 270 | 271 | followers_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[2]/a/span") 272 | followers_count = followers_button.get_attribute('title') 273 | # followers_count = followers_button.text 274 | # followers_count = int(followers_count.split(' ')[0]) 275 | 276 | # если количество подписчиков больше 999, убираем из числа запятые 277 | if ',' in followers_count: 278 | followers_count = int(''.join(followers_count.split(','))) 279 | else: 280 | followers_count = int(followers_count) 281 | 282 | print(f"Количество подписчиков: {followers_count}") 283 | time.sleep(2) 284 | 285 | loops_count = int(followers_count / 12) 286 | print(f"Число итераций: {loops_count}") 287 | time.sleep(4) 288 | 289 | followers_button.click() 290 | time.sleep(4) 291 | 292 | followers_ul = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]") 293 | 294 | try: 295 | followers_urls = [] 296 | for i in range(1, loops_count + 1): 297 | browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", followers_ul) 298 | time.sleep(random.randrange(2, 4)) 299 | print(f"Итерация #{i}") 300 | 301 | all_urls_div = followers_ul.find_elements_by_tag_name("li") 302 | 303 | for url in all_urls_div: 304 | url = url.find_element_by_tag_name("a").get_attribute("href") 305 | followers_urls.append(url) 306 | 307 | # сохраняем всех подписчиков пользователя в файл 308 | with open(f"{file_name}/{file_name}.txt", "a") as text_file: 309 | for link in followers_urls: 310 | text_file.write(link + "\n") 311 | 312 | with open(f"{file_name}/{file_name}.txt") as text_file: 313 | users_urls = text_file.readlines() 314 | 315 | for user in users_urls[0:10]: 316 | try: 317 | try: 318 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 319 | 'r') as subscribe_list_file: 320 | lines = subscribe_list_file.readlines() 321 | if user in lines: 322 | print(f'Мы уже подписаны на {user}, переходим к следующему пользователю!') 323 | continue 324 | 325 | except Exception as ex: 326 | print('Файл со ссылками ещё не создан!') 327 | # print(ex) 328 | 329 | browser = self.browser 330 | browser.get(user) 331 | page_owner = user.split("/")[-2] 332 | 333 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div/a"): 334 | 335 | print("Это наш профиль, уже подписан, пропускаем итерацию!") 336 | elif self.xpath_exists( 337 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[2]/div/span/span[1]/button/div/span"): 338 | print(f"Уже подписаны, на {page_owner} пропускаем итерацию!") 339 | else: 340 | time.sleep(random.randrange(4, 8)) 341 | 342 | if self.xpath_exists( 343 | "/html/body/div[1]/section/main/div/div/article/div[1]/div/h2"): 344 | try: 345 | follow_button = browser.find_element_by_xpath( 346 | "/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 347 | print(f'Запросили подписку на пользователя {page_owner}. Закрытый аккаунт!') 348 | except Exception as ex: 349 | print(ex) 350 | else: 351 | try: 352 | if self.xpath_exists("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button"): 353 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/button").click() 354 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 355 | else: 356 | follow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/div/span/span[1]/button").click() 357 | print(f'Подписались на пользователя {page_owner}. Открытый аккаунт!') 358 | except Exception as ex: 359 | print(ex) 360 | 361 | # записываем данные в файл для ссылок всех подписок, если файла нет, создаём, если есть - дополняем 362 | with open(f'{file_name}/{file_name}_subscribe_list.txt', 363 | 'a') as subscribe_list_file: 364 | subscribe_list_file.write(user) 365 | 366 | time.sleep(random.randrange(7, 15)) 367 | 368 | except Exception as ex: 369 | print(ex) 370 | self.close_browser() 371 | 372 | except Exception as ex: 373 | print(ex) 374 | self.close_browser() 375 | 376 | self.close_browser() 377 | 378 | # метод для отправки сообщений в директ 379 | def send_direct_message(self, usernames="", message="", img_path=''): 380 | 381 | browser = self.browser 382 | time.sleep(random.randrange(2, 4)) 383 | 384 | direct_message_button = "/html/body/div[1]/section/nav/div[2]/div/div/div[3]/div/div[2]/a" 385 | 386 | if not self.xpath_exists(direct_message_button): 387 | print("Кнопка отправки сообщений не найдена!") 388 | self.close_browser() 389 | else: 390 | print("Отправляем сообщение...") 391 | direct_message = browser.find_element_by_xpath(direct_message_button).click() 392 | time.sleep(random.randrange(2, 4)) 393 | 394 | # отключаем всплывающее окно 395 | if self.xpath_exists("/html/body/div[4]/div/div"): 396 | browser.find_element_by_xpath("/html/body/div[4]/div/div/div/div[3]/button[2]").click() 397 | time.sleep(random.randrange(2, 4)) 398 | 399 | send_message_button = browser.find_element_by_xpath( 400 | "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div/button").click() 401 | time.sleep(random.randrange(2, 4)) 402 | 403 | # отправка сообщения нескольким пользователям 404 | for user in usernames: 405 | # вводим получателя 406 | to_input = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]/div[1]/div/div[2]/input") 407 | to_input.send_keys(user) 408 | time.sleep(random.randrange(2, 4)) 409 | 410 | # выбираем получателя из списка 411 | users_list = browser.find_element_by_xpath( 412 | "/html/body/div[4]/div/div/div[2]/div[2]").find_element_by_tag_name("button").click() 413 | time.sleep(random.randrange(2, 4)) 414 | 415 | next_button = browser.find_element_by_xpath( 416 | "/html/body/div[4]/div/div/div[1]/div/div[2]/div/button").click() 417 | time.sleep(random.randrange(2, 4)) 418 | 419 | # отправка текстового сообщения 420 | if message: 421 | text_message_area = browser.find_element_by_xpath( 422 | "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div[2]/textarea") 423 | text_message_area.clear() 424 | text_message_area.send_keys(message) 425 | time.sleep(random.randrange(2, 4)) 426 | text_message_area.send_keys(Keys.ENTER) 427 | print(f"Сообщение для {usernames} успешно отправлено!") 428 | time.sleep(random.randrange(2, 4)) 429 | 430 | # отправка изображения 431 | if img_path: 432 | send_img_input = browser.find_element_by_xpath("/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/form/input") 433 | send_img_input.send_keys(img_path) 434 | print(f"Изображение для {usernames} успешно отправлено!") 435 | time.sleep(random.randrange(2, 4)) 436 | 437 | self.close_browser() 438 | 439 | # метод отписки от всех пользователей 440 | def unsubscribe_for_all_users(self, userpage): 441 | 442 | browser = self.browser 443 | browser.get(f"https://www.instagram.com/{username}/") 444 | time.sleep(random.randrange(3, 6)) 445 | 446 | following_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[3]/a") 447 | following_count = following_button.find_element_by_tag_name("span").text 448 | 449 | # если количество подписчиков больше 999, убираем из числа запятые 450 | if ',' in following_count: 451 | following_count = int(''.join(following_count.split(','))) 452 | else: 453 | following_count = int(following_count) 454 | 455 | print(f"Количество подписок: {following_count}") 456 | 457 | time.sleep(random.randrange(2, 4)) 458 | 459 | loops_count = int(following_count / 10) + 1 460 | print(f"Количество перезагрузок страницы: {loops_count}") 461 | 462 | following_users_dict = {} 463 | 464 | for loop in range(1, loops_count + 1): 465 | 466 | count = 10 467 | browser.get(f"https://www.instagram.com/{username}/") 468 | time.sleep(random.randrange(3, 6)) 469 | 470 | # кликаем/вызываем меню подписок 471 | following_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[3]/a") 472 | 473 | following_button.click() 474 | time.sleep(random.randrange(3, 6)) 475 | 476 | # забираем все li из ul, в них хранится кнопка отписки и ссылки на подписки 477 | following_div_block = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]/ul/div") 478 | following_users = following_div_block.find_elements_by_tag_name("li") 479 | time.sleep(random.randrange(3, 6)) 480 | 481 | for user in following_users: 482 | 483 | if not count: 484 | break 485 | 486 | user_url = user.find_element_by_tag_name("a").get_attribute("href") 487 | user_name = user_url.split("/")[-2] 488 | 489 | # добавляем в словарь пару имя_пользователя: ссылка на аккаунт, на всякий, просто полезно сохранять информацию 490 | following_users_dict[user_name] = user_url 491 | 492 | following_button = user.find_element_by_tag_name("button").click() 493 | time.sleep(random.randrange(3, 6)) 494 | unfollow_button = browser.find_element_by_xpath("/html/body/div[5]/div/div/div/div[3]/button[1]").click() 495 | 496 | print(f"Итерация #{count} >>> Отписался от пользователя {user_name}") 497 | count -= 1 498 | 499 | # time.sleep(random.randrange(120, 130)) 500 | time.sleep(random.randrange(2, 4)) 501 | 502 | with open("following_users_dict.txt", "w", encoding="utf-8") as file: 503 | json.dump(following_users_dict, file) 504 | 505 | self.close_browser() 506 | 507 | # метод отписки, отписываемся от всех кто не подписан на нас 508 | def smart_unsubscribe(self, username): 509 | 510 | browser = self.browser 511 | browser.get(f"https://www.instagram.com/{username}/") 512 | time.sleep(random.randrange(3, 6)) 513 | 514 | followers_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[2]/a/span") 515 | followers_count = followers_button.get_attribute("title") 516 | 517 | following_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[3]/a") 518 | following_count = following_button.find_element_by_tag_name("span").text 519 | 520 | time.sleep(random.randrange(3, 6)) 521 | 522 | # если количество подписчиков больше 999, убираем из числа запятые 523 | if ',' in followers_count or following_count: 524 | followers_count, following_count = int(''.join(followers_count.split(','))), int(''.join(following_count.split(','))) 525 | else: 526 | followers_count, following_count = int(followers_count), int(following_count) 527 | 528 | print(f"Количество подписчиков: {followers_count}") 529 | followers_loops_count = int(followers_count / 12) + 1 530 | print(f"Число итераций для сбора подписчиков: {followers_loops_count}") 531 | 532 | print(f"Количество подписок: {following_count}") 533 | following_loops_count = int(following_count / 12) + 1 534 | print(f"Число итераций для сбора подписок: {following_loops_count}") 535 | 536 | # собираем список подписчиков 537 | followers_button.click() 538 | time.sleep(4) 539 | 540 | followers_ul = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]") 541 | 542 | try: 543 | followers_urls = [] 544 | print("Запускаем сбор подписчиков...") 545 | for i in range(1, followers_loops_count + 1): 546 | browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", followers_ul) 547 | time.sleep(random.randrange(2, 4)) 548 | print(f"Итерация #{i}") 549 | 550 | all_urls_div = followers_ul.find_elements_by_tag_name("li") 551 | 552 | for url in all_urls_div: 553 | url = url.find_element_by_tag_name("a").get_attribute("href") 554 | followers_urls.append(url) 555 | 556 | # сохраняем всех подписчиков пользователя в файл 557 | with open(f"{username}_followers_list.txt", "a") as followers_file: 558 | for link in followers_urls: 559 | followers_file.write(link + "\n") 560 | except Exception as ex: 561 | print(ex) 562 | self.close_browser() 563 | 564 | time.sleep(random.randrange(4, 6)) 565 | browser.get(f"https://www.instagram.com/{username}/") 566 | time.sleep(random.randrange(3, 6)) 567 | 568 | # собираем список подписок 569 | following_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/ul/li[3]/a") 570 | following_button.click() 571 | time.sleep(random.randrange(3, 5)) 572 | 573 | following_ul = browser.find_element_by_xpath("/html/body/div[4]/div/div/div[2]") 574 | 575 | try: 576 | following_urls = [] 577 | print("Запускаем сбор подписок") 578 | 579 | for i in range(1, following_loops_count + 1): 580 | browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", following_ul) 581 | time.sleep(random.randrange(2, 4)) 582 | print(f"Итерация #{i}") 583 | 584 | all_urls_div = following_ul.find_elements_by_tag_name("li") 585 | 586 | for url in all_urls_div: 587 | url = url.find_element_by_tag_name("a").get_attribute("href") 588 | following_urls.append(url) 589 | 590 | # сохраняем всех подписок пользователя в файл 591 | with open(f"{username}_following_list.txt", "a") as following_file: 592 | for link in following_urls: 593 | following_file.write(link + "\n") 594 | 595 | """Сравниваем два списка, если пользователь есть в подписках, но его нет в подписчиках, 596 | заносим его в отдельный список""" 597 | 598 | count = 0 599 | unfollow_list = [] 600 | for user in following_urls: 601 | if user not in followers_urls: 602 | count += 1 603 | unfollow_list.append(user) 604 | print(f"Нужно отписаться от {count} пользователей") 605 | 606 | # сохраняем всех от кого нужно отписаться в файл 607 | with open(f"{username}_unfollow_list.txt", "a") as unfollow_file: 608 | for user in unfollow_list: 609 | unfollow_file.write(user + "\n") 610 | 611 | print("Запускаем отписку...") 612 | time.sleep(2) 613 | 614 | # заходим к каждому пользователю на страницу и отписываемся 615 | with open(f"{username}_unfollow_list.txt") as unfollow_file: 616 | unfollow_users_list = unfollow_file.readlines() 617 | unfollow_users_list = [row.strip() for row in unfollow_users_list] 618 | 619 | try: 620 | count = len(unfollow_users_list) 621 | for user_url in unfollow_users_list: 622 | browser.get(user_url) 623 | time.sleep(random.randrange(4, 6)) 624 | 625 | # кнопка отписки 626 | unfollow_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/header/section/div[1]/div[1]/div/div[2]/div/span/span[1]/button") 627 | unfollow_button.click() 628 | 629 | time.sleep(random.randrange(4, 6)) 630 | 631 | # подтверждение отписки 632 | unfollow_button_confirm = browser.find_element_by_xpath("/html/body/div[4]/div/div/div/div[3]/button[1]") 633 | unfollow_button_confirm.click() 634 | 635 | print(f"Отписались от {user_url}") 636 | count -= 1 637 | print(f"Осталось отписаться от: {count} пользователей") 638 | 639 | # time.sleep(random.randrange(120, 130)) 640 | time.sleep(random.randrange(4, 6)) 641 | 642 | except Exception as ex: 643 | print(ex) 644 | self.close_browser() 645 | 646 | except Exception as ex: 647 | print(ex) 648 | self.close_browser() 649 | 650 | time.sleep(random.randrange(4, 6)) 651 | self.close_browser() 652 | 653 | 654 | for user, user_data in users_settings_dict.items(): 655 | username = user_data['login'] 656 | password = user_data['password'] 657 | # window_size = user_data['window_size'] 658 | 659 | my_bot = InstagramBot(username, password) 660 | my_bot.login() 661 | # my_bot.close_browser() 662 | # my_bot.send_direct_message(direct_users_list, "Hey! How's it going?", "/home/cain/PycharmProjects/instagram_bot/lesson_6/img1.jpg") 663 | # my_bot.get_all_followers('username') 664 | my_bot.smart_unsubscribe("username") 665 | 666 | # my_bot = InstagramBot(username, password) 667 | # my_bot.login() 668 | # my_bot.send_direct_message(direct_users_list, "Hey! How's it going?", "/home/cain/PycharmProjects/instagram_bot/lesson_6/img1.jpg") 669 | # my_bot.get_all_followers('https://www.instagram.com/username/') 670 | # my_bot.download_userpage_content("https://www.instagram.com/username/") 671 | 672 | -------------------------------------------------------------------------------- /lesson_8/test.py: -------------------------------------------------------------------------------- 1 | count = 1274 2 | 3 | loops_count = int(count / 10) + 1 4 | loops_count = round(count / 10) 5 | print(loops_count) -------------------------------------------------------------------------------- /req.txt: -------------------------------------------------------------------------------- 1 | certifi==2020.6.20 2 | chardet==3.0.4 3 | idna==2.10 4 | pkg-resources==0.0.0 5 | requests==2.24.0 6 | selenium==3.141.0 7 | urllib3==1.25.10 8 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | post_id = "https://www.instagram.com/p/B3sJrr0BX3f/" 2 | post_id = post_id.split("/")[-2] 3 | print(post_id) 4 | --------------------------------------------------------------------------------