Добро пожаловать в «Развлечение с Python», часть 3. В этой части мы будем использовать Python и модуль selenium, чтобы повысить свои шансы на выигрыш в розыгрыше.

Теория и основы

Я предполагаю, что все знают, что такое раздача. Даже если вы этого не сделаете, я уверен, что вы видели сообщения с такими описаниями, как:

  1. Подпишитесь на @some_name
  2. Подписывайтесь на @brand_name
  3. Отметить 3 друзей

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

Но хватит теории «раздачи». Есть много конкурсов, где цена - дорогой мобильный телефон или даже машина. Давайте посмотрим, как Python может помочь нам заполучить их.

Первое решение этой проблемы - мгновенное. Согласно определению на их странице github, это:

Инструмент, который автоматизирует ваше взаимодействие в социальных сетях для «фермы» лайков, комментариев и подписчиков в Instagram. Реализован на Python с использованием модуля Selenium.

Это простой в использовании и быстрый код с библиотекой, который я использовал в прошлом, и я остался очень доволен. Дело в том, что, когда я попробовал в этом случае, у меня что-то не работало, и браузер останавливался на странице «Принять файлы cookie».

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

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

Пока я отчаянно просматривал документацию, пытаясь найти решение для своего случая, меня осенило.

«Реализовано на Python с использованием модуля Selenium»

Instapy построен с использованием селена. Selenium - это инструмент, который используется для автоматизации тестирования веб-приложений. Он состоит из нескольких компонентов, одним из которых является Selenium WebDriver.

Selenium WebDriver принимает команды и отправляет их браузеру. Используя его, вы можете перемещаться по страницам, нажимать кнопки и поля, вводить данные, выбирать из раскрывающихся списков и многое другое.

Наконец-то я вижу свет. Я буду использовать селен для создания собственного нестандартного решения.

Реализация

Как указывалось ранее, Selenium WebDriver отправляет команды браузеру. В нашем случае мы будем использовать Firefox. Для того, чтобы управлять браузером Firefox, вам понадобится geckodriver. Следуя этой странице, вы можете установить соответствующую версию geckodriver в зависимости от вашей операционной системы. После того, как вы установите geckodriver, настройте виртуальную среду и установите селен, мы готовы приступить к написанию кода!

Во-первых, нам нужно инициализировать драйвер Firefox. Язык браузера по умолчанию будет вашим предпочтительным языком. Если язык не английский, мы должны установить его. Кроме того, есть возможность управлять браузером без подключения к голове, фактически не видя самого браузера. По умолчанию этот параметр отключен, но вы можете запустить его в автономном режиме. Вы поймете почему позже.

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
# Set headless mode to False
options = Options()
options.headless = False
# Set the browser language
profile = webdriver.FirefoxProfile()        profile.set_preference('intl.accept_languages', 'en-US, en')        
# Initialize the driver
self.driver = webdriver.Firefox(options=options)

Большой! Теперь, когда у нас есть браузер, нам нужно перейти в Instagram.

driver.get('https://instagram.com')

И снова ужасная кнопка Принять куки. На этот раз я собираюсь щелкнуть по нему. Чтобы взаимодействовать с элементом в браузере с помощью Selenium, вам нужно сначала найти элемент. Вы можете найти элемент, используя множество свойств, но вам нужно найти то, что лучше всего подходит для каждого случая. Подробный обзор расположения элементов вы можете найти здесь. В нашем случае мы будем использовать свойство xpath и использовать текст Принять файлы cookie, чтобы найти кнопку. xpath может иметь странный синтаксис, но немного попрактиковавшись, вы сможете его освоить. Если такая кнопка существует, мы по ней нажмем. Кнопки предлагают нам метод click().

# Check if cookies accept popup appeared and click it        accept_button = driver.find_element_by_xpath(
    "//button[contains(text(), 'Accept')]"
)
if accept_button:
    accept_button.click()

Теперь мы должны увидеть форму входа в систему. Иногда (из-за проблем с подключением к Интернету, отставания компьютера и т. Д.) Нам нужно дождаться загрузки элемента, прежде чем мы сможем с ним взаимодействовать. Вот почему Selenium предлагает WebDriverWait. Вы передаете в качестве аргументов драйвер и период ожидания в секундах, используете метод until и определяете ожидаемое условие, при котором период ожидания заканчивается.

Чтобы найти xpath поля имени пользователя, мы сделаем следующие шаги:

  1. Открытые инструменты разработчика
  2. Щелкните значок указателя в левом верхнем углу.
  3. Наведите указатель мыши на поле ввода имени пользователя и обратите внимание на часть html, которая выделена справа.
  4. Щелкните правой кнопкой мыши ›Копировать› Копировать XPath

Дождавшись загрузки и найдя его, мы воспользуемся методом send_keys(), чтобы ввести имя пользователя:

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((
        By.XPATH,
        '//*[@id="loginForm"]/div/div[1]/div/label/input'
    ))
).send_keys("my_cool_username")

Сделав то же самое с полем пароля, мы найдем и нажмем кнопку входа в систему:

driver.find_element_by_xpath(
    '//*[@id="loginForm"]/div/div[3]/button'
).click()

Если вам будет предложено сохранить учетные данные для входа, вы можете либо сохранить их, либо нет. Вы можете найти нужный элемент, используя xpath, как и раньше. Будьте внимательны, подумайте! Если эта страница не появляется, и вы пытаетесь нажать любую кнопку, которая не существует, скрипт прервется и перестанет выполняться. Чтобы справиться с этим, мы добавим предложение try...except:

from selenium.common.exceptions import NoSuchElementException, TimeoutException

try:
    WebDriverWait(driver,20).until(
        EC.presence_of_element_located((
            By.XPATH,
            '/html/body/div[1]/section/main/div/div/div/div/button'
        ))
    ).click()
except NoSuchElementException:
    pass
except TimeoutException:
    pass

Теперь, когда мы приняли файлы cookie, вошли в систему и сохранили наш пароль (или нет!), Мы готовы начать комментировать! Вам нужно перейти к сообщению, которое вы хотите прокомментировать, используя driver.get(), как мы это делали раньше. Теперь вы можете найти текстовое поле, в которое вы можете написать свой комментарий, и щелкнуть по нему. После этого отправьте комментарий, который хотите отправить, и нажмите кнопку «Опубликовать» справа. Обратите внимание на то, как мы используем ActionChains для ввода комментария:

try:
    WebDriverWait(self.driver, 20).until(
        EC.presence_of_element_located((
            By.XPATH,
             '/html/body/div[1]/section/main/div/div[1]/article/div[3]/section[3]/div/form/textarea'))
    ).click()
    actions = ActionChains(self.driver)
    actions.send_keys("My comment will win this giveaway")
    actions.perform()
    self.driver.find_element_by_xpath(
        "//button[contains(text(), 'Post')]"
    ).click()
except NoSuchElementException:
    print('Element not found')
except TimeoutException:
    print('Time out while waiting for the element to appear')

И вот оно! Мы успешно разместили наш первый комментарий с помощью Python и Selenium WebDriver.

Последний шаг - поместить часть, которая получает страницу бесплатного поста, до той части, которая нажимает кнопку «Опубликовать» в цикле. Таким образом, мы добавим больше комментариев к этому посту, увеличивая шансы на победу.

Заключение

Вы видели, как легко было реализовать сценарий и комментировать сообщения, но вот некоторые дополнения, которые вы можете сделать, и некоторые соображения относительно этого сценария.

  1. Выполнение этого сценария на сервере
    Само собой разумеется, но вы не можете держать компьютер работающим весь день только для того, чтобы запустить сценарий. Итак, вы можете поставить его на сервер. Существуют бесплатные варианты, при которых ваш скрипт может выполняться, даже когда вы спите ночью. Но будьте осторожны! Большинство серверов не предлагают графический интерфейс, поэтому вы можете запустить браузер в автономном режиме, чтобы избежать ошибок.
  2. Уведомлять об исключениях
    В приведенных выше статьях try...except мы ничего не сделали. В некоторых случаях мы просто pass и продолжаем выполнение кода, а в других мы выводим что-то значимое. Вы можете сделать еще один шаг и создать для себя уведомление. Вы можете отправить электронное письмо, сообщение в WhatsApp и многое другое.
  3. Аккаунт IG заблокирован
    Да, это вариант. Instagram может заблокировать вашу учетную запись от комментариев. Но не навсегда. В большинстве случаев вас заблокируют на пару дней, а затем вы снова сможете взаимодействовать. В Instagram есть много спам-фильтров (например, постоянные комментарии, комментарии, состоящие только из смайликов или тегов и т. Д.), И существуют пороговые значения того, сколько комментариев учетная запись может делать в день / час. По понятным причинам Instagram постоянно меняет эту политику и не является общедоступным. Но вы можете начать с малого и экспериментировать.
  4. Азартная игра
    . Даже если вам удастся сделать 1 миллион комментариев из своего аккаунта, аккаунта вашего брата или аккаунта вашей собаки, вы можете в конечном итоге проиграть. Победитель выбирается случайным образом, и в игре, когда есть удача, вы всегда можете проиграть. Наш сценарий просто пытается увеличить наши шансы.
  5. Я что-нибудь выиграл?
    Да! Я не очень много тестировал этот скрипт, но выиграл 2 конкурса. Но ни один из них не был блестящей машиной.

На этом статья завершается. Надеюсь, вам понравилось это читать, и попробуйте сами. Сообщите мне свои мысли и идеи по этому поводу! А пока вы можете найти остальную часть серии Развлечения с Python здесь.