Перевод статьи How to Make an Instagram Bot With Python and InstaPy.
Что общего у таких компаний как SocialCaptain , Kicksta , Instavast , а также других подобных им? Все они помогают вам привлечь большую аудиторию, получить больше подписчиков и больше лайков в Instagram, в то время как вы для этого едва ли ударили палец о палец. И это они делают применяя принцип автоматизации однотипных задач, и люди платят им за это немалые деньги. Но вы можете сделать то же самое и совершенно бесплатно, используя библиотеку InstaPy!
В этом руководстве вы узнаете, как написать бота на Python, с InstaPy библиотекой, созданной Тимом Гроссманом, который поможет вам автоматизировать свои действия в Instagram, то есть получить больше подписчиков и лайков с минимальным объемом ручного труда. Попутно вы узнаете об автоматизации браузера с помощью Selenium и шаблоне объекта страницы , которые служат основой для функционирования InstaPy.
В этой статье вы узнаете:
- Как работают Instagram боты;
- Как автоматизировать работу браузера с помощью Selenium;
- Как использовать шаблон объекта страницы для повышения читаемости и облегчения тестирования вашего кода;
- Как создать Instagram бота с InstaPy.
И так, прежде чем мы начнем создавать Instagram боты, сначала рассмотрим как они работают.
Важное замечание: Обязательно ознакомьтесь с Условиями использования Instagram, прежде чем применять какие-либо методы автоматизации или скрапинга.
Содержание
Как работают Instagram боты
Как сценарий автоматизации поможет получить нам больше подписчиков и лайков? Прежде чем ответить на этот вопрос, подумайте о том, как реальные люди приобретают большее число своих подписчиков и лайков.
Они делают это, будучи постоянно активными на целевой платформе. Они часто публикуют посты, подписываются на обновления аккаунтов других людей, а также ставят лайки и оставляют комментарии к постам других людей. И боты работают точно так же: они подписываются, ставят лайки и самостоятельно добавляют комментарии в соответствии с установленными вами критериями.
Чем оптимальнее определены эти критерии, тем лучше будут результаты. Вы должны убедиться, что подписаны на нужные группы, так как в этом случае люди, с которыми ваш бот взаимодействует в Instagram, с большей вероятностью будут взаимодействовать с вашим контентом.
Например, если вы продаете женскую одежду на Instagram, то можете указать вашему боту преимущественно ставить лайки комментариям, а также подписываться на группы женщин, чьи профили и посты включают хештеги #beauty
, #fashion
или #clothes
. Это повысит вероятность того, что нужная вам целевая аудитория заметит ваш профиль, начнет подписываться на него, читать и обсуждать вашими публикации.
Как же это работает с технической точки зрения? Для этих целей нам совершенно не подходит Instagram Developer API, так как его возможности весьма ограничены.
И так приступим к непосредственно автоматизации работы браузера. Она будет осуществляться следующим образом:
- Вы предоставите ей все свои полномочия (логин и пароль аккаунта).
- Устанавливаете критерии поведения бота для случаев, на какие паблики подписываться, какие комментарии оставлять и каким типам постов ставить лайки.
- Затем ваш бот открывает браузер, вводит в адресной строке
https://instagram.com
, входит в профиль с вашими учетными данными, и начинает делать то, что вы ему указали.
Далее мы создадим первоначальную версию своего Instagram бота, которая будет автоматически входить в ваш профиль. Обратите внимание, пока мы не будете использовать библиотеку InstaPy.
Автоматизируем работу браузера
Для разработки простейшей версии нашего Instagram бота мы будем использовать Selenium, инструмент для тестирования web интерфейсов, который по факту InstaPy использует «под капотом».
Для начала работы сначала установите Selenium. При его установке убедитесь, что вы также установили Firefox WebDriver, поскольку последняя версия InstaPy перестала поддерживать Chrome. Это также означает, что на вашем компьютере должен быть установлен браузер Firefox.
Теперь создадим файл со следующим Python кодом:
from time import sleep from selenium import webdriver browser = webdriver.Firefox() browser.get('https://www.instagram.com/') sleep(5) browser.close()
Запустим наш код на выполнение, и вы увидим, что открывается окно браузера Firefox, который самостоятельно переходит на страницу входа в Instagram. Вот построчный разбор этого кода:
-
Строка 1 и 2 импортируют
sleep
иwebdriver
. -
Строка 4 инициализирует экземпляр объекта драйвера браузера Firefox и передает ссылку на него переменной
browser
. -
Строка 6 вводит
https://www.instagram.com/
в адресную строку брузера и осуществляет переход по этому адресу путем эмуляции нажатия Enter. - Строка 8 запускает интервал ожидания пять секунд, чтобы мы могли увидеть результат. В противном случае браузер будет мгновенно закрыт.
- Строка 10 закрывает браузер.
Это Selenium версия классического Hello, World. Теперь мы готовы добавить в файл код, который позволит боту входить в ваш Instagram профиль. Но сначала подумаем о том, что необходимо сделать для того, чтобы войти в свой профиль. Для этого вы бы сделали следующее:
- Перейти по адресу
https://www.instagram.com/
. - Кликнуть по ссылки для входа.
- Ввести свои учетные данные.
- Нажать кнопку входа.
Код в нашем файле уже позволяет сделать первый шаг. Теперь изменим его так, чтобы для входа в профиль он эмулирует клик мыши по ссылке на главной странице Instagram:
from time import sleep from selenium import webdriver browser = webdriver.Firefox() browser.implicitly_wait(5) browser.get('https://www.instagram.com/') login_link = browser.find_element_by_xpath("//a[text()='Log in']") login_link.click() sleep(5) browser.close()
Обратите внимание на следующие строки нашего кода:
- Строка 5 устанавливает пятисекундный интервал времени ожидания. Если Selenium не может найти элемент то, он будет ожидать пять секунд, в течение которых будут догружаться элементы страницы, и потом попытается снова сделать это.
-
Строка 9 находит элемент ссылки
, который содержит текст
Log in
. В нашем коде это делается с использованием синктаксиса XPath, но существуют и другие методы как это вы можете сделать. -
Строка 10 эмулирует «клик» на найденном элементе
для входа в наш профиль.
Давайте запустим наш скрипт, и посмотрим на результат его выполнения. Сначала откроется окно браузера, и он перейдет по адресу Instagram, а затем по ссылке на страницу входа в профиль.
На странице входа login page расположены три нужных нам элемента:
- Поле ввода имени пользователя;
- Поле ввода пароля;
- Кнопка входа.
Изменим наш скрипт таким образом, чтобы он находил эти элементы, вводил наши учетные данные, а затем нажал кнопку входа в профиль:
from time import sleep from selenium import webdriver browser = webdriver.Firefox() browser.implicitly_wait(5) browser.get('https://www.instagram.com/') login_link = browser.find_element_by_xpath("//a[text()='Log in']") login_link.click() sleep(2) username_input = browser.find_element_by_css_selector("input[name='username']") password_input = browser.find_element_by_css_selector("input[name='password']") username_input.send_keys("") password_input.send_keys(" ") login_button = browser.find_element_by_xpath("//button[@type='submit']") login_button.click() sleep(5) browser.close()
Посмотрим, что изменилось в нашем коде:
- Строка 12 задерживает выполнение кода в течение двух секунд для того, чтобы страница полностью загрузилась.
- Строки 14 и 15 находят элементы полей ввода имени пользователя и пароля по их CSS селекторам. Для этих целей вы можете использовать любой другой метод, который вам наиболее предпочтителен.
-
Строки 17 и 18 вводят имя пользователя и пароль в соответствующие поля ввода. Не забудьте заполнить
и
вашими данными! - Строка 20 находит кнопку входа, используя синтаксис XPath.
- Строка 21 нажимает на кнопку входа.
Запустите скрипт, и вы автоматически войдете в свой профиль Instagram. Для того, что бы окно браузера не закрылось по истечении 5 секунд уберите или закомментируйте строки 23
и 25
.
И так мы хорошо начали с написания своего бота в Instagram. Если вы продолжите писать этот скрипт, то все остальные манипуляции с вашим профилем будут выглядеть очень похожи. Чтобы найти «понравившиеся» сообщения, прокрутите вниз вашу ленту постов, найдите кнопку «Нравится» по ее селектору CSS, нажмите на нее, найдите элемент раздела комментариев, оставьте комментарий и далее продолжайте в том же направлении.
Хорошей новостью является то, что все эти шаги могут быть выполнены более быстрым и надежным способом с использованием библиотеки InstaPy . Но прежде чем перейти к использованию Instapy, необходимо еще кое-что узнать про нее, чтобы лучше понять, как она работает: шаблон объекта страницы (Page Object Pattern).
Как использовать шаблон объекта страницы
Теперь, когда вы написали код для входа в ваш профиль, то как бы вы могли написать простейший тест для его проверки? И это могло бы выглядеть примерно так:
def test_login_page(browser): browser.get('https://www.instagram.com/accounts/login/') username_input = browser.find_element_by_css_selector("input[name='username']") password_input = browser.find_element_by_css_selector("input[name='password']") username_input.send_keys("") password_input.send_keys(" ") login_button = browser.find_element_by_xpath("//button[@type='submit']") login_button.click() errors = browser.find_elements_by_css_selector('#error_message') assert len(errors) == 0
Посмотрим, что не так с этим кодом? В нем не соблюдается принципу DRY. То есть код дублируется как в приложении, так и в тестовом коде.
Дублирование кода особенно плохо в том контексте, что написание кода с использованием Selenium зависит от элементов пользовательского интерфейса, а их состав и тип имеет тенденцию меняться в зависимости от конкретной загружаемой страницы. И когда они меняются, то есть вы загружаете другую страницу, то вам нужно обновить код только в одном месте, а не в нескольких. Вот для чего используется шаблон объекта Page.
С помощью этого шаблона вы можете создать отдельные классы объектов страниц для наиболее важных страниц или их фрагментов, которые предоставляют интерфейсы для взаимодействия с ними, просты для дальнейшей модификации, а также скрывают особенности их реализации, что в конечном счете повышает читаемость кода. Имея это в виду, перепишем приведенный выше код и создадим классы HomePage
и LoginPage
для соответствующих страниц:
from time import sleep class LoginPage: def __init__(self, browser): self.browser = browser def login(self, username, password): username_input = self.browser.find_element_by_css_selector("input[name='username']") password_input = self.browser.find_element_by_css_selector("input[name='password']") username_input.send_keys(username) password_input.send_keys(password) login_button = browser.find_element_by_xpath("//button[@type='submit']") login_button.click() sleep(5) class HomePage: def __init__(self, browser): self.browser = browser self.browser.get('https://www.instagram.com/') def go_to_login_page(self): self.browser.find_element_by_xpath("//a[text()='Log in']").click() sleep(2) return LoginPage(self.browser)
Этот код выполняет те же функции, что и разработанный нами ранее скрипт, за исключением того, что теперь домашняя страница и страница входа в профиль представлены в виде классов. Классы инкапсулируют всю логику наших действий, необходимую для поиска и манипулирования данными пользовательского web-интерфейса. То есть в них реализованы методы, а так же средства доступ к данным, которые позволяют программному обеспечению, в нашем случае, делать все то, что делает человек находясь в своем профиле.
Обратите внимание на еще одну особенность этого кода — при переходе на другую страницу с помощью go_to_login_page()
метода объекта страницы, он возвращает новый объект страницы входа в пользовательский профиль. И далее, если бы вы самостоятельно приступили к разработке класса FeedPage
(страница с постами), то его экземпляр, в свою очередь, должен возвращаться соответствующим методом класса LoginPage
: return FeedPage()
.
Далее вы можете использовать наш код, написанный с использованием шаблона объекта страницы, следующим образом:
from selenium import webdriver browser = webdriver.Firefox() browser.implicitly_wait(5) home_page = HomePage(browser) login_page = home_page.go_to_login_page() login_page.login("", " ") browser.close()
Это выглядит намного лучше, и тест нашего кода из примера выше можно переписать так:
def test_login_page(browser): home_page = HomePage(browser) login_page = home_page.go_to_login_page() login_page.login("", " ") errors = browser.find_elements_by_css_selector('#error_message') assert len(errors) == 0
С усовершенствованиями нашего бота, изменения в его коде не затронут код тестов, даже если что-то изменится в пользовательском интерфейсе.
Для получения дополнительной информации о шаблоне объекта страницы см. Официальную документацию и статью Мартина Фаулера .
Теперь, когда вы знакомы как с Selenium, так и с шаблоном объекта страницы, то будете уверенно чувствовать себя при работе с InstaPy. В следующем разделе мы наконец-то рассмотрим процесс написания нашего Instagram бота в окончательном виде.
Примечание. Selenium и шаблон Pattern Object Page широко используются для автоматизации работы с другими веб-сайтами, а не только для Instagram.
Как создать Instagram бота с InstaPy
В этом разделе мы будете использовать InstaPy при создания бота для автоматизации рутинных задач в Instagram, который будет автоматически подписываться на других пользователей, отслеживать их посты, а также комментировать их. Для начала нужно установить InstaPy:
$ python3 -m pip install instapy
Эти команды установят instapy
в вашей системе.
Примечание . Рекомендуется использовать отдельные виртуальные среды для каждого проекта, чтобы их зависимости были изолированы.
Особенности использования InstaPy
Теперь мы можем переписать код выше, применив для этого библиотеку InstaPy, и затем сравним его два варианта. Для этого сначала создадим другой файл Python и поместим в него следующий код:
from instapy import InstaPy InstaPy(username="", password=" ").login()
Замените
и
вашими данными: логином и паролем, а затем запустите этот скрипт. Вуаля! Всего одной строкой кода вы достигли того же результата, что и разработанный нами выше бот.
Теперь проанализируем полученный результат. Даже если полученные нами результаты одинаковы, то вы можете заметить, что их поведение не совсем то же самое. Помимо простого входа в ваш профиль, InstaPy выполняет и другие действия, такие как проверка состояния вашего интернет-соединения и состояния серверов Instagram. Это можно непосредственно наблюдать прямо в браузере или в логах:
INFO [2019-12-17 22:03:19] [username] -- Connection Checklist [1/3] (Internet Connection Status) INFO [2019-12-17 22:03:20] [username] - Internet Connection Status: ok INFO [2019-12-17 22:03:20] [username] - Current IP is "17.283.46.379" and it's from "Germany/DE" INFO [2019-12-17 22:03:20] [username] -- Connection Checklist [2/3] (Instagram Server Status) INFO [2019-12-17 22:03:26] [username] - Instagram WebSite Status: Currently Up
Довольно неплохо для всего лишь одной строки кода, не так ли? Теперь пришло время заставить скрипт делать больше интересных и полезных вещей, чем просто вход в систему.
Для следующего примера предположим, что ваш профиль посвящен автомобилям, и ваш бот предназначен для взаимодействия с профилями людей, которые также интересуются автомобилями.
И так, во-первых, вы можете поставить лайки постам других пользователей, которые помечены тегами #bmw
или #mercedes
, используя метод like_by_tags()
:
from instapy import InstaPy session = InstaPy(username="", password=" ") session.login() session.like_by_tags(["bmw", "mercedes"], amount=5)
В строке 5 мы передали методу like_by_tags()
список тегов, а также количество постов для каждого указанного тега, которым мы собираемся поставить лайки. В нашем примере мы указали, что мы должны поставить лайки десяти постам, по пять для каждого из двух тегов. Посмотрим, что произойдет после запуска этого скрипта:
INFO [2019-12-17 22:15:58] [username] Tag [1/2] INFO [2019-12-17 22:15:58] [username] --> b'bmw' INFO [2019-12-17 22:16:07] [username] desired amount: 14 | top posts [disabled]: 9 | possible posts: 43726739 INFO [2019-12-17 22:16:13] [username] Like# [1/14] INFO [2019-12-17 22:16:13] [username] https://www.instagram.com/p/B6MCcGcC3tU/ INFO [2019-12-17 22:16:15] [username] Image from: b'mattyproduction' INFO [2019-12-17 22:16:15] [username] Link: b'https://www.instagram.com/p/B6MCcGcC3tU/' INFO [2019-12-17 22:16:15] [username] Description: b'Mal etwas anderes \xf0\x9f\x91\x80\xe2\x98\xba\xef\xb8\x8f Bald ist das komplette Video auf YouTube zu finden (n\xc3\xa4here Infos werden folgen). Vielen Dank an @patrick_jwki @thehuthlife und @christic_ f\xc3\xbcr das bereitstellen der Autos \xf0\x9f\x94\xa5\xf0\x9f\x98\x8d#carporn#cars#tuning#bagged#bmw#m2#m2competition#focusrs#ford#mk3#e92#m3#panasonic#cinematic#gh5s#dji#roninm#adobe#videography#music#bimmer#fordperformance#night#shooting#' INFO [2019-12-17 22:16:15] [username] Location: b'K\xc3\xb6ln, Germany' INFO [2019-12-17 22:16:51] [username] --> Image Liked! INFO [2019-12-17 22:16:56] [username] --> Not commented INFO [2019-12-17 22:16:57] [username] --> Not following INFO [2019-12-17 22:16:58] [username] Like# [2/14] INFO [2019-12-17 22:16:58] [username] https://www.instagram.com/p/B6MDK1wJ-Kb/ INFO [2019-12-17 22:17:01] [username] Image from: b'davs0' INFO [2019-12-17 22:17:01] [username] Link: b'https://www.instagram.com/p/B6MDK1wJ-Kb/' INFO [2019-12-17 22:17:01] [username] Description: b'Someone said cloud? \xf0\x9f\xa4\x94\xf0\x9f\xa4\xad\xf0\x9f\x98\x88 \xe2\x80\xa2\n\xe2\x80\xa2\n\xe2\x80\xa2\n\xe2\x80\xa2\n#bmw #bmwrepost #bmwm4 #bmwm4gts #f82 #bmwmrepost #bmwmsport #bmwmperformance #bmwmpower #bmwm4cs #austinyellow #davs0 #mpower_official #bmw_world_ua #bimmerworld #bmwfans #bmwfamily #bimmers #bmwpost #ultimatedrivingmachine #bmwgang #m3f80 #m5f90 #m4f82 #bmwmafia #bmwcrew #bmwlifestyle' INFO [2019-12-17 22:17:34] [username] --> Image Liked! INFO [2019-12-17 22:17:37] [username] --> Not commented INFO [2019-12-17 22:17:38] [username] --> Not following
По умолчанию InstaPy понравятся первые девять главных сообщений в дополнение к вашей amount
ценности. В этом случае общее число лайков на тег увеличивается до четырнадцати (девять топ-сообщений плюс пять, указанных вами amount
).
Обратите внимание, InstaPy логирует каждое действие, которое предпринимает, а также результат его выполнения. И как вы можете заметить из примера лога выше, в нем фиксируется, какой публикации был поставлен лайк Like, ссылка на нее Link, описание Description, местоположение Location, а также прокомментировал ли наш бот этот пост или подписался на канал этого автора.
Возможно, вы заметили, что после почти каждого действия скрипт задерживает свое выполнение на определенное время. Все нормально так и было задумано. Этот приём предотвращает блокировку вашего профиля в Instagram, то есть происходит имитация действий человека, который физически, в отличие от нашего бота, не может мгновенно переходить по ссылкам.
В дальнейшем вы, вероятно, не захотите, чтобы ваш бот ставил лайки постам с неподходящей для вас тематикой. Чтобы этого не случилось, вы можете использовать метод set_dont_like()
:
from instapy import InstaPy session = InstaPy(username="", password=" ") session.login() session.like_by_tags(["bmw", "mercedes"], amount=5) session.set_dont_like(["naked", "nsfw"])
В этой редакции нашего скрипта постам, у которых в описании присутствуют слова naked
или nsfw
, не будут ставиться лайки. Вы можете задавать любые другие слова, если захотите, чтобы ваш бот их в дальнейшем избегал.
Далее, вы можете указать нашему боту, чтобы он не только ставил лайки постам, но и подписывался на каналы их авторов. Вы можете сделать это воспользовавшись методом set_do_follow()
:
from instapy import InstaPy session = InstaPy(username="", password=" ") session.login() session.like_by_tags(["bmw", "mercedes"], amount=5) session.set_dont_like(["naked", "nsfw"]) session.set_do_follow(True, percentage=50)
Если мы запустим этот скрипт, то бот будет подписываться на пятьдесят процентов пользователей, чьим постам он уже поставил лайки. И как обычно, информация о каждом его действии будет ведено в лог.
Вы также можете оставить свои комментарии к постам. Для этого необходимо сделать две вещи. Сначала включим опцию комментирования с помощью метода set_do_comment()
:
from instapy import InstaPy session = InstaPy(username="", password=" ") session.login() session.like_by_tags(["bmw", "mercedes"], amount=5) session.set_dont_like(["naked", "nsfw"]) session.set_do_follow(True, percentage=50) session.set_do_comment(True, percentage=50)
Далее укажем нашему боту, какие комментарии оставлять set_comments()
:
from instapy import InstaPy session = InstaPy(username="", password=" ") session.login() session.like_by_tags(["bmw", "mercedes"], amount=5) session.set_dont_like(["naked", "nsfw"]) session.set_do_follow(True, percentage=50) session.set_do_comment(True, percentage=50)
Запустите этот скрипт на выполнение, и бот оставит один из этих трех комментариев на половине постов, которые он просмотрит.
Теперь, когда мы закончили с основными настройками нашего бота, хорошей идеей будет завершить сеанс работы end()
:
from instapy import InstaPy session = InstaPy(username="", password=" ") session.login() session.like_by_tags(["bmw", "mercedes"], amount=5) session.set_dont_like(["naked", "nsfw"]) session.set_do_follow(True, percentage=50) session.set_do_comment(True, percentage=50) session.set_comments(["Nice!", "Sweet!", "Beautiful :heart_eyes:"]) session.end()
Этот код закроет браузер, сохранит логи работы нашего бота и подготовит отчет, который вы увидите в консоли.
Дополнительные функции InstaPy
InstaPy — это достаточно внушительный проект, который включает в себя множество полезных тщательно документированных функций . Хорошей новостью является то, что если вы разобрались с принципом использования тех функций, которые мы рассмотрели выше, то использование остальных не вызовет у вас затруднений. В этом разделе мы рассмотрим другие полезные функции InstaPy.
Управляем квотами бота
Вы не можете работать в Instagram целый день, днями на пролет. Сервис скоро заметит, что вы пользуетесь ботом, и начнет блокировать некоторые из его действий. Вот почему было бы неплохо установить квоты на определенные действия нашего бота. Возьмем, к примеру, следующий пример кода:
session.set_quota_supervisor(enabled=True, peak_comments_daily=240, peak_comments_hourly=21)
Теперь наш бот будет комментировать посты, пока не достигнет своего часового peak_comments_hourly
и дневного peak_comments_daily
лимита. И возобновит комментирование после истечения периода квоты.
Headless браузер
Эта функциональная возможность позволяет запускать наш бот без графического интерфейса браузера. Это очень важно, если вы хотите развернуть его для работы на сервере, где вам совершенно не нужен графический интерфейс. Так же в этом случае он требует меньше ресурсов процессора, поэтому повышается его производительность. Этот режим работы библиотеки включается следующим образом:
session = InstaPy(username='test', password='test', headless_browser=True)
Обратите внимание, что вы устанавливаете флаг headless_browser
при инициализации нового экземпляра объекта InstaPy.
Используем AI для анализа содержания постов
Ранее мы уже рассмотрели, как можно игнорировать посты, в тексте которых содержаться неподходящие слова или словосочетания. Но что если содержимое поста подходящее, а само изображение неуместно или не соответствует смыслу содержимого поста? Вы можете интегрировать нашего, написанного на InstaPy, бота с ClarifAI, сервисом который предлагает услуги по распознаванию изображений и видео:
session.set_use_clarifai(enabled=True, api_key='') session.clarifai_check_img_for(['nsfw'])
Теперь ваш бот не будет ставить лайки или комментировать любые изображения, которые ClarifAI посчитает NSFW. При его использовании вы получаете 5000 бесплатных обращений его API в месяц.
Ограничиваем число контактов
Часто работа с профилями, а также обработка постов людей, у которых слишком много подписчиков, является пустой тратой времени. В таких случаях рекомендуется установить некоторые граничное число контактов пользователя, чтобы наш бот не тратил свои драгоценные вычислительные ресурсы для работы с ними:
session.set_relationship_bounds(enabled=True, max_followers=8500)
Теперь наш бот не будет взаимодействовать с постами пользователей, у которых более 8500 подписчиков.
Для ознакомления с другими полезными и интересными функциями InstaPy и настройками ботов, ознакомьтесь с документацией.
Заключение
InstaPy позволяет автоматизировать ваши действия в Instagram с минимальными затратами и усилиями. Это очень гибкий инструмент с множеством полезных функций.
Из этой статье вы узнали:
- Как работают Instagram боты;
- Как автоматизировать браузер с помощью Selenium;
- Как использовать шаблон объекта страницы, чтобы сделать ваш код более удобным и тестируемым;
- Как использовать InstaPy для создания простого Instagram бота.
Почитайте документацию InstaPy и поэкспериментируйте с нашим ботом. Вскоре вы начнете приобретете больше новых подписчиков и лайков с минимальными усилиями. Я и сам приобрел несколько новых подписчиков, пока писал эту статью:)