Как сделать бота для Instagram

В этом уроке:

Что делают и имеют общего SocialCaptain, Kicksta, Instavast и многие другие компании? Все они добиваются для своих клиентов большей аудитории, больше подписчиков и больше лайков в Instagram, в то время как вы ещё палец о палец не ударили. Они делают все это с помощью автоматизации и люди платят им за это немалые деньги. Но то же самое вы можете сделать абсолютно бесплатно, используя InstaPy!

В этом уроке вы узнаете, как создать бота с помощью Python и InstaPy, библиотеки Тима Гросманна, которая автоматизирует ваши действия в Instagram, чтобы вы получили больше подписчиков и лайков.

Попутно вы узнаете об автоматизации браузера с помощью Selenium и Шаблонов объектов страницы, который служит основой InstaPy.

В этом уроке вы узнаете:

  • Как работают боты в Instagram;
  • Как автоматизировать браузер с помощью Selenium;
  • Как использовать Шаблон объекта страницы, чтобы сделать ваш код более удобным и тестируемым;
  • Как использовать InstaPy для создания базового бота в Instagram.

Прежде чем создавать бота, начнём с изучения того, как они работают в Instagram.

Это важно: Прежде чем внедрять какие-либо средства автоматизации обязательно ознакомьтесь с Условиями использования Instagram

Как работают боты в Instagram

Каким образом скрипт автоматизации может принести вам больше лайков и фалловеров? Прежде чем ответить на этот вопрос, подумайте о том, как реальный человек получает увеличивает количество лайков и фалловеров.

Человек постоянно активен на платформе. Он часто публикуют сообщения, подписываются на других людей, а также любит оставлять комментарии к постам других людей. Боты работают точно так же: они подписываются, постоянно комментируют в соответствии с установленными вами правилами.

Чем ваши правила лучше, тем лучше будут результаты. Вы хотите убедиться, что нацелены на нужные группы, потому что люди, с которыми ваш бот взаимодействует в Instagram, с большей вероятностью будут взаимодействовать с вашим контентом.

Например, если вы продаете женскую одежду в Instagram, то можете указать своему боту, что он должен ставить лайки, комментировать и следить в основном за женщинами или профилями, посты которых содержат хэштеги #beauty, #fashion или #одежда. Это повышает вероятность того, что ваша целевая аудитория заметит вас, последует за вами и начнет читать и отвечать на ваши публикациями.

Как это работает с технической стороны? Вы не можете использовать API разработчика Instagram, поскольку он довольно ограничен для этой цели. Обратите внимание на автоматизацию браузера. Это работает лучше:

  1. Вы отдаёте ему свои полномочия.
  2. Вы опрееляее по каким критериям становиться фалловером, какие комментарии оставлять и какой тип постов нравиться.
  3. Ваш бот открывает браузер, в адресной строке запиывает https://instagram.com, входит в систему со вашими учетными данными и начинает выполнять действия, которые ему поручили.

Давайте создадим первую версию своего бота в Instagram, которая автоматически войдет в ваш профиль. Обратите внимание, InstaPy ещё не будете использоваться.

Как автоматизировать браузер

Для этой версии вашего бота в Instagram вы будете использовать Selenium, инструмент, который 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 в браузере.
  • Строка 6 записывает в адресной строке https://www.instagram.com/ и нажиает клавишу Enter.
  • В строке 8 пяти секундное ожидание для просмотра результата. Иначе браузер мгоновенно закроется.
  • Строка 10 закрывает браузер.

Это Hello, World в версии Selenium. Теперь вы готовы добавить код для входа в свой профиль Instagram. Но сначала задумайтесь, как вы заходите в свой профиль вручную. Вы бы сделали следующее:

  1. Переход по адресу https://www.instagram.com/.
  2. Нажимаем на ссылку login.
  3. Вводим учётные данные.
  4. Нажимаем кнопку login.

Первый шаг уже сделан в коде выше. Теперь измените его так, чтобы он нажимал на ссылку для входа на главной странице 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 находит элемент <a>, текст которого соответствует Login. Он делает это с помощью XPath, но есть и несколько других методов, которые можно использовать.
  • строка 10 щелкает на найденной ссылке <a> для входа в систему.

Запустите скрипт, и вы увидите свой скрипт в действии. Откроется браузер, зайдите в Instagram и нажмите на ссылку для входа, чтобы перейти на страницу входа.

На странице входа в систему есть три важных элемента:

  1. Ввод имени пользователя;
  2. Ввод пароля;
  3. Нажатие кнопки подключения.

Затем измените сценарий так, чтобы он находил эти элементы, вводил ваши учетные данные и нажимал кнопку входа в систему:

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("<your username>")
password_input.send_keys("<your password>")

login_button = browser.find_element_by_xpath("//button[@type='submit']")
login_button.click()

sleep(5)

browser.close()

Вот комментарий для изменений:

  1. строка 12 ожидает две секунды для загрузки страницы.
  2. строки 14 и 15 находит поля ввода имени пользователя и пароля с помощью CSS. Вы могли бы использовать любой другой метод, который нравится.
  3. строки 17 и 18 записывают ваше имя пользователя и пароль в соответствующие профилю. Не забудьте заполнить <your username> и <your password>!
  4. строка 20 находит кнопку входа по XPath.
  5. строка 21 нажимает на кнопку входа в систему.

Запустите скрипт, и вы автоматически войдете в свой профиль Instagram.

Вы хорошо начали со своим ботом Instagram. Если вы продолжите писать этот сценарий, то все остальное будет выглядеть очень похоже. Чтобы найти понравившиеся сообщения, прокрутите вниз свой канал, найдите кнопку «Нравится» с помощью CSS, нажмите на нее, найдите раздел комментариев, оставьте комментарий и продолжайте.

Хорошей новостью является то, что все эти шаги могут быть выполнены InstaPy. Но прежде чем перейти к использованию Instapy, следует еще кое-что узнать, чтобы лучше понять, как работает InstaPy: Шаблон объекта страницы.

Как использовать шаблон объекта страницы

Теперь, когда вы написали код входа в систему, как бы вы написали тест для него? А будет это выглядеть примерно так:

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("<your username>")
    password_input.send_keys("<your password>")
    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 principle. То есть код дублируется как в приложении, так и в тесте.

В этом контексте дублирование кода особенно плохо, потому что код Selenium зависит от элементов пользовательского интерфейса, а элементы пользовательского интерфейса имеют тенденцию изменяться. При их изменении желательно обновлять свой код в одном месте. Вот тут и приходит Шаблон объектов страницы.

С помощью этого шаблона для наиболее важных страниц или фрагментов вы создаете классы объектов страницы, которые предоставляют интерфейсы, которые просты в программировании и которые скрывают основной виджет в окне. Имея это в виду, вы можете переписать приведенный выше код и создать класс 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)

Код такой же, за исключением того, что домашняя страница и страница входа представлены в виде классов. Классы инкапсулируют механику, необходимую для поиска и управления данными в пользовательском интерфейсе. То есть существуют методы и методы доступа, которые позволяют программному обеспечению делать все, что может делать человек.

Еще одна вещь, на которую следует обратить внимание, это то, что при переходе на другую страницу с помощью объекта страницы он возвращает объект страницы для новой страницы. Обратите внимание на возвращаемое значение go_to_log_in_page(). Если у вас есть другой класс с именем FeedPage, то login() класса LoginPage вернет экземпляр этого: return FeedPage().

Вот как вы можете использовать шаблон объекта Page:

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("<your username>", "<your password>")

browser.close()

Это выглядит намного лучше, и тест выше можно переписать так:

def test_login_page(browser):
    home_page = HomePage(browser)
    login_page = home_page.go_to_login_page()
    login_page.login("<your username>", "<your password>")

    errors = browser.find_elements_by_css_selector('#error_message')
    assert len(errors) == 0

С этими изменениями вам не придется трогать свои тесты, если что-то изменится в пользовательском интерфейсе.

Для получения дополнительной информации о шаблоне объектов страницы см. официальную документацию и в Статье Мартина Фаулера.

Теперь, когда вы знакомы как с Selenium, так и с шаблоном объектов страницы, вы будете чувствовать себя как дома с InstaPy. Далее вы сделаем базового бота.

Примечание:

Как Selenium, так и Pattern Object Page широко используются не только для Instagram, но и для других веб-сайтов.

Как создать Instagram-бот с помощью InstaPy

В этом разделе вы будете использовать InstaPy для создания бота в Instagram, который будет автоматически добавлять, отслеживать и комментировать различные сообщения. Во-первых, вам нужно установить InstaPy:

$ python3 -m pip install instapy

Таким образом вы установите instapy в своей системе.

Примечание:

Рекомендуется использовать виртуальные среды для каждого проекта, чтобы изолировать зависимости.

Основные функции

Теперь, чтобы вы могли сравнить два варианта, можно переписать код выше с InstaPy. Сначала создайте другой файл Python и поместите в него следующий код:

from instapy import InstaPy

InstaPy(username="<your_username>", password="<your_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="<your_username>", password="<your_password>")
session.login()
session.like_by_tags(["bmw", "mercedes"], amount=5)

Здесь вы передали методу список понравившихся тегов и количество понравившихся сообщений для каждого тега. В этом случае вы указали, что ему должно понравиться десять постов, по пять для каждого из двух тегов. Но посмотрите, что происходит после запуска скрипта:

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 регистрирует каждое действие, которое он предпринимает. Как вы можете видеть выше, в нем упоминается, какая публикация ему понравилась, а также ссылка наа неё, описание, местоположение и то, прокомментировал ли бот публикацию или подписался на автора.

Возможно, вы заметили, что почти после каждого действия есть задержки. Так задумано, что-бы предотвратить блокировку вашего профиля в Instagram.

Теперь вы, вероятно, не хотите, чтобы ваш бот обращал внимание на неподходящие посты. Чтобы этого не произошло, вы можете использовать set_dont_like ():

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_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="<your_username>", password="<your_password>")
session.login()
session.like_by_tags(["bmw", "mercedes"], amount=5)
session.set_dont_like(["naked", "nsfw"])
session.set_do_follow(True, percentage=50)

Если вы запустите скрипт сейчас, то бот будет следить за 50% пользователей, чьи посты ему понравились. Как обычно, каждое действие будет зарегистрировано.

Вы также можете оставить некоторые комментарии к сообщениям. Есть две вещи, которые нужно сделать. Сначала включите комментирование с помощью set_do_comment():

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_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="<your_username>", password="<your_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:"])

Запустите скрипт, и бот оставит один из трех комментариев на половине сообщений, с которыми он взаимодействует.

Теперь, когда вы закончили с основными настройками, рекомендуется завершить сеанс с помощью end():

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_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 — крупный проект, который имеет множество тщательно документированных функций. Хорошей новостью является то, что если вы чувствуете себя комфортно с функциями, которые использовали выше, то c остальные должны чувствовать себя примерно так же. В этом разделе будут описаны некоторые из наиболее полезных функций InstaPy.

Контролер ограничений

Вы не можете чистить Instagram весь день и каждый день. Служба быстро заметит, что работает бот и запретит некоторые из его действий. Вот почему было бы неплохо устанавливать граничения на некоторые действия. Возьмем, к примеру, следующее:

session.set_quota_supervisor(enabled=True, peak_comments_daily=240, peak_comments_hourly=21)

Бот будет выпонять комментирование до тех пор, пока не достигнет часового и дневного лимита. Он возобновит комментирование после истечения периода ограничения.

Headless Browser

Эта функция позволяет запускать вашего бота без графического интерфейса браузера, что очень полезно, если вы хотите развернуть своего бота на сервере, где вам нужен графический интерфейс или его просто нет. Кроме того, при этом требуется меньше ресурсов процессора, что повышает производительность. Для этого можно записать:

session = InstaPy(username='test', password='test', headless_browser=True)

Обратите внимание, что этот флаг устанавливается при инициализации объекта InstaPy.

Использование искусственного интеллека при анализе постов

Ранее вы видели, как игнорировать посты, содержащие неуместные слова в своих описаниях. Что если описание хорошее, а само изображение неуместное? Вы можете интегрировать своего бота InstaPy с ClarifAI, который предлагает услуги по распознаванию изображений и видео:

session.set_use_clarifai(enabled=True, api_key='<your_api_key>')
session.clarifai_check_img_for(['nsfw'])

Теперь ваш бот не будет обращать внимание или комментировать изображения, которые ClarifAI считает NSFW. Вы получаете 5 000 бесплатных API-вызовов в месяц.

Границы отношений

Зачастую общение с сообщениями людей, у которых много подписчиков, является пустой тратой времени. В таких случаях рекомендуется установить некоторые границы отношений, чтобы ваш бот не тратил свои драгоценные вычислительные ресурсы:

session.set_relationship_bounds(enabled=True, max_followers=8500)

В этом случае ваш бот не будет взаимодействовать с сообщениями пользователей, у которых более 8 500 подписчиков.

Чтобы узнать о многих других функциях и конфигурациях в InstaPy, ознакомьтесь с документацией.

Заключение

С минимальными усилиями автоматизировать свои действия в Instagram позволяет InstaPy. Это очень гибкий инструмент с множеством полезных функций.

В этом уроке вы узнали:

  • Как работают боты в Instagram
  • Как автоматизировать браузер с помощью Selenium
  • Как использовать Шаблон объекта страницы, чтобы сделать ваш код более удобным и тестируемым
  • Как использовать InstaPy для создания базового бота в Instagram

Read the InstaPy documentation and experiment with your bot a little bit. Soon you’ll start getting new followers and likes with a minimal amount of effort. I gained a few new followers myself while writing this tutorial. If you prefer video tutorials, there is also a Udemy course by the creator of InstaPy Tim Großmann.

Если есть что-то, что вы хотели бы спросить или поделиться, пожалуйста, свяжитесь с нами в комментариях.

По мотивам How to Make an Instagram Bot With Python and InstaPy

CC BY-NC 4.0 Как сделать бота для Instagram, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.


Респект и уважуха

Добавить комментарий