Как написать программу которая будет выполнять действия на сайте
Перейти к содержимому

Как написать программу которая будет выполнять действия на сайте

  • автор:

Автоматизированная система входа на сайт с Python и Selenium WebDriver

Автоматизированная система входа на сайт с Python и Selenium WebDriver

В сегодняшней статье мы рассмотрим как с помощью вебдрайвера Selenium и Python, автоматически залогиниться на сайте. Нам понадобится скачать Selenium WebDriver для браузера Chrome c сайта https://chromedriver.chromium.org/downloads, а также модуль selenium для работы с драйвером через Python. Версия драйвера должна соответствовать версии браузера Chrome. Для проверки версии Chrome в адресной строке вводим: chrome://settings/help. Далее скачиваем файл в виде .zip архива. Создаем на диске C папку chromedriver и положим в нее извлеченный файл chromedriver.exe.

# установка модуля для взаимодействия с веб-драйвером
pip install selenium==4.*

Создадим файл main.py:

# импорт модулей time и selenium

from selenium import webdriver
from selenium.webdriver.common.by import By

# инициализация веб-драйвера с полным путем к исполняемому драйверу
driver = webdriver.Chrome('C:\chromedriver\chromedriver.exe')

# засыпание программы на 2 миллисекунды
time.sleep(2)

# открытие драйвером сайта
driver.get(«https://myrusakov.ru/»)
time.sleep(1)

# поиск элементов формы по описанию в html коде
login = driver.find_element(By.NAME, «login»)
password = driver.find_element(By.NAME, «password»)

# отправка данных в найденные формы
login.send_keys(«login»)
password.send_keys(«password»)

# кнопка регистрации ищется драйвером по CSS селектору, указывающему путь в CSS коде к данному элементу
submit_button = driver.find_element(By.CSS_SELECTOR , «#auth input[type=\»submit\»]»).click()

# метод click выполняет нажатие по кнопке формы

# окончание работы драйвера
driver.quit()

В результате, при существующем логине и пароле, сайт аутентифицирует нас. Далее возможно автовыполнение некоторых рутинных действий. Драйвер имеет методы поиска не только по имени но и по другим атрибутам html

Следует иметь в виду, что используемые здесь атрибуты не подойдут на других сайтах.

Таким образом, с помощью веб-драйвера Selenium и Python можно выполнять множество действий на сайте.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 0 ):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Автоматизация однотипных действий, ч.2 ⁠ ⁠

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

А теперь продолжим изучать создание сценариев действий в Clickermann.

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

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

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

Для этого есть следующие комбинации:
Alt + A – Запуск сценария;

Alt + A – Пауза сценария (после его запуска);

Alt + S – Полная остановка;

Alt + R – Начать запись сценария;

Перед созданием сценария, вам необходимо подумать, при каком окне и размерах окна, будет стартовать ваша программа. Например если выработаете в сочетании окон Word, Chrome, Excel и запишите свой сценарий при таком расположении значков:

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

То при таком, она уже работать не будет(если не внедрять проверку с анализом экрана, но об этом позже):

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Тоже самое касается размера окна, поэтому я советую просто открыть все окна в полноэкранный размер и записывать скрипты исходя из этого.

После того как вы определитесь с этим, следует также учесть эти стартовые порядки и размеры при каждом следующем запуске скрипта, например сначала вы открываете все файлы и только потом запускаете скрипт.

Немаловажный момент касается цикличности исполнения. Например если ваш скрипт подразумевает повторы, условно:

1) Открыть браузер
2) Нажать на закладку с адресом сайта
3) Скопировать информацию
4) Занести в таблицу эксель
5) Перейти к п.1

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

1) Открыть браузер

2) Нажать на закладку с адресом сайта

3) Скопировать информацию

3.5) Закрыть браузер

4) Занести в таблицу эксель

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

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

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Тогда у вас будет достаточно времени, чтобы подойти и отключить скрипт.

Теперь о записи действий, у неё есть неоспоримый плюс — скорость и простота, достаточно включить запись действий (Alt + R) и один раз в ручную совершить эти действия, после чего остановить запись. Тут следует учесть, что запись идёт непрерывно по всем движениям мышки, я записал 10-ти секундные движения, у меня получилось следующее:

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Как вы понимаете отредактировать такое будет невозможно, но если вам не нужны просто движения мышкой без кликов и действий, то открываем настройки и в разделе «Интерпретатор» убираем галочку «Записывать движения мыши» и жмём «применить».

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Теперь наш скрипт получился намного короче, но разобраться в нём всё ещё довольно сложно:

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

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

Далее мы начнём углубляться в настоящее программирование своих сценариев.

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

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

Вероятно так (напишем псевдокодом):

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Работает? Да, но выглядит не очень, трудно читать и понимать.

Чтобы внести порядок в наш скрипт, мы будет использовать переменные и циклы.

Переменная — своего рода корзина, куда мы помещаем значение. Это может быть слово, буква, но чаще всего число. С этим числом можно производить арифметические действия, сравнивать его с чем либо и на основе этого, поведение нашего скрипта будет изменяться.

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

Допустим, мы точно знаем, что нам каждый день приходит 5 писем, тогда мы можем сделать так:

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

ВАЖНО: общепринято выделять внутренности цикла отступом для пущей красоты и удобства понимания. для этого выделяем участок кода внутри цикла и нажимаем TAB или пробел. Вуаля, вы восхитительны.

У нас появляются новые команды:

DEFINE — объявление \ создание переменной, в скобочках указываем её название и через запятую значение, название всегда начинается со значка доллара, то есть правильно называть переменные $counter, $x, $letter, неправильно — counter, _z, $переменная.

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

>= «Больше или равно»

<= «Меньше или равно»

пока условие будет выполняться, блок кода внутри цикла будет исполняться, на нашем примере он исполнится 5 раз. Давайте отследим логическую цепочку, в первый раз переменная VAR заходит в проверку цикла со значением 0.

0 меньше 5? Да! — выполняем код
Затем мы встречаем команду:

INC — увеличить значение переменной, в скобочках указываем какую переменную и на сколько увеличивать ($var, 1). Поэтому наша переменная увеличивается на 1 и становится один. Без увеличения переменной мы получим бесконечный цикл и бесконечное повторение действий внутри цикла.

после чего встречаем новую команду:

END_CYC — противоположность команде while — закрывает цикл. таким образом каждый раз при соответствии условий будет исполняться всё что между этими двумя командами.

Вернёмся к нашей переменной var, она увеличилась на 1 и снова отправляется на проверку соответствия условию.

1 меньше 5? Да! — выполняем код. Увеличиваем переменную до 2.

2 меньше 5? Да! — выполняем код. Увеличиваем переменную до 3.

3 меньше 5? Да! — выполняем код. Увеличиваем переменную до 4.

4 меньше 5? Да! — выполняем код. Увеличиваем переменную до 5.

5 меньше 5? Нет! — теперь цикл больше не будет исполняться, действие программы пойдет к первой команде после цикла (ниже чем END_CYC ).

Таким образом наш код стал меньше, красивее и легче в редактировании, ваш босс увидел как быстро вы принимаете задания и стал давать вам 10 заданий, соответственно приходит 10 писем, в прошлом коде вам бы пришлось копировать и вставлять, считать сколько раз вы уже вставили, не лишнего ли теперь? А сейчас достаточно поменять условие на WHILE($var < 10) и вот, всё будет точно работать 10 раз.

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Это вы, сравниваете количество ваших новых задач на столе по высоте пальца

Хорошо, а что на счёт вариативности кода? Если дальнейшие действия зависят от воли случая?
Для этого у нас есть операторы IF и SWITCH

IF — оператор сравнения, такое мы уже с вами видели в скобочках цикла WHILE. Оператор IF проверяет соответствие условию и если оно верно, выполняет действия в своем блоке кода.

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Мы создаем переменную, кладем в неё значение 2. Оператор IF проверяет, равна ли var двойке, если да воспроизведется звуковой файл, если нет, пропустит эту строку. Конец блока кода оператора IF определяется оператором END_IF

Хорошо, мы разобрались с одним вариантом, но как быть если у нас два варианта, разных действий. Для этого применяется конструкция IF — ELSE

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Теперь оператор IF проверяет на соответствие переменной двойке, если она равна 2, воспроизведется файл end.wav, при любом другом значении переменной var будет воспроизведен файл start.wav

Бывают случаи, когда нам мало двух условий, например вы публикуете фотографии в 10 социальных сетях, под каждую социальную сеть, вы подготовили разные фотографии и положили их на 10-ти разных листах в документе excel, как сделать так, чтобы в нужную социальную сеть, попадало нужное фото?

SWITCH — оператор множественного выбора. В данном примере вы проверяем переменную post в зависимости от её значения от 1 до 10 открывается соответствующая страница документа. Данный оператор содержит в себе операторы CASE и END_SWITCH. Оператор Case() содержит в скобках значение переменной, при которой именно его действия будут выполнятся,своего рода это дверь, которая открывается тогда, когда переменная(ключ) подходит к его условию(замку) ну и END_SWITCH заканчивает блок кода выбора действий.

Автоматизация однотипных действий, ч.2 Программирование, Автоматизация, Видео, Длиннопост

Также можно заметить оператор DEFAULT который срабатывает, если переменная $post содержит в себе значение не подходящее ни под один CASE.

Таким образом, применяя IF и SWITCH вы можете создать по настоящему вариативную программу и уже начинать называть себя программистом =)

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

Работать это должно примерно так:

Для этого нам потребуется функция:

KEYSTRING — имитирует ввод с клавиатуры переданного ему значения. Можно вводить числа, например KEYSTRING(«2») или строки KEYSTRING(«Hello World») или переменные KEYSTRING($var) обратите внимание, в случае переменной кавычки внутри скобок не нужны. Ваши решения можете писать тут же в комментариях и подсмотреть решения других, если что-то не получается, но настоятельно рекомендую не делать этого сразу, а попытаться решить самостоятельно.

367 постов 4.8K подписчика

Правила сообщества

-Ставьте наши теги, если Ваш пост о программе, приложении или браузере(в том числе о расширениях, дополнениях в нему), его недоработке, баге, обновлении. Это может быть пост — обзор или отзыв.

-При возникновении споров относитесь с уважением друг к другу, а так же приводите аргументы.

Разрешено всё, что не запрещено правилами Пикабу.

Не нужно никаких задержек добавлять, это поведение настраивается. Достаточно нажать кнопку режим выполнения и выбрать фиксированное количество повторов равное 1.

Иллюстрация к комментарию

Иллюстрация к комментарию

Вообще интересно, но намного интереснее на конкретных примерах.

Скажем, «вот у меня есть данные в эксель, их надо вставить в форму на определенной странице браузера. Также надо вставить дату, её надо взять из той же строки экселя и вот таким образом вставить в форму страницы браузера. Ну а дальше просто — клики на странице, вот скрип, вот так это выглядит». ИМХО.

дайте мне тоже работу, которую можно вот так автоматизировать.

MajorDom v1.0 — От голосового помощника к умному дому⁠ ⁠

В 2019 году я впервые узнал про возможность распознавания и синтеза речи на языке python. Гугл ассистент, сири, кортана и другие ассистенты тогда были еще более ограниченными и беспомощными, чем сейчас. О добавлении своих команд речи не шло от слова совсем. Тогда я и загорелся идеей создать своего голосового помощника, который не будет уступать даже Джарвису Тони Старка.

В процессе работы над ядром, начал задумываться, где этого ассистента хостить. Держать ноут постоянно включенным не вариант, а других компьютеров у меня не было. На помощь пришли одноплатные компьютеры raspberry pi. Я хотел, чтобы мой голосовой ассистент мог включать и выключать свет, управлять светодиодной лентой и шторами. С такими задачами отлично справляется ардуино. Оставалось только найти способ передавать команды с распбери. Использовать wifi и bluetooth не хотел с самого начала. Нашел в интернете информацию про модули nrf24l01, попробовал, понравилось.

Такая система работала довольно неплохо. Но было два ключевых недостатка:

Радиус действия ограничивался чувствительностью микрофона. С хорошим микрофоном все работало идеально в пределах комнаты, но не дальше.

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

Для решения первой задачи, в голосового ассистента я добавил http интерфейс на джанго, который мог принимать аудиофайл или строку. В комбинации с мобильным приложением на котлине, я получил беспроводной микрофон, таким образов расширив зону работы до радиуса действия роутера, то есть с комнаты до всей квартиры и даже чуть больше. Носить телефон по дому не всегда было удобно, так что через пару дней появилось приложение и на часах на wear os, что оказалось невероятно удобным решением.

Но я захотел большего: иметь доступ к своему помощнику всегда, а не только дома. Самым простым вариантом оказалось использование телеграм-бота как интерфейс ввода-вывода. Но меня не покидало ощущение, что бот — это что-то не то. Я решил оставить его только как временное решение, пока занят разработкой чего-то лучше.

Я хотел получить возможность использовать свое мобильное приложение для доступа к ассистенту на расстоянии. Надо было всего лишь придумать способ отправить запрос на локальный джанго сервер, не находясь при этом в локальной сети. Я был готов открывать и пробрасывать порты на роутере, но провайдер не дал мне белый ip. Тогда я попробовал ngrok. В первое время работало хорошо, но в бесплатной версии сервер периодически падал и менял адрес. Вариант с впн-туннелем я отбросил почти сразу. Стоимость vps была равна стоимости подписки на ngrok, но реализация была в разы сложнее.

Тогда я вспомнил, что у меня есть бесплатный хостинг для php сайтов на beget и переизобрел Long Polling и очереди. Реализация была максимально простой: приложение отправляло запрос на хостинг. Там php код добавлял тело (json) запроса в конец массива и записывал в локальный файл. Малина дома каждую секунду отправляла запрос на чтение этого файла, после чтения массив чистился. Таким образом мне удалось отправлять команды домой из любой точки планеты страны! Аналогичным образом я сделал получение ответа от ассистента: продублировал реализацию и поменял роли. Два файла и четыре эндпоинта на бесплатном хостинге на пыхе дали мне стабильную двустороннюю связь с моим домашним помощником. Чуть позже научил ассистента самостоятельно отправлять мне сообщения, например, с номером аудитории следующей пары в начале каждой перемены. Не успел всем похвастаться в колледже, как кто-то стал спамить мне домой. Пришлось добавить авторизацию: логин и пароль задавались хардкодом в приложении, а на сервере была проверка в стиле.

if ($login == ‘markparker’ && $password == ‘MyVeryStrongP@ssw0rd!’) <>;

Репозитории приложения были приватные, а сервер был вообще без репы (зачем репа на один файл до 100 строк?), так что такого уровня безопасности мне более чем хватало.

Чуть позже в системе появился первый автоматический триггер команды. Через небольшой костыль в моем приложении я смог ловить событие, когда на телефоне срабатывает будильник. Этот триггер запускал первый полноценный сценарий: одновременно открывались шторы, ассистент озвучивал время, погоду и расписание пар в колледже. Если в комнате все еще было темно, плавно включалась лампа. В этот момент я чувствовал себя настоящим Тони Старком.

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

Это осознание привело меня к решению отделить голосового ассистента и сделать умный дом самостоятельным проектом, ориентируясь уже на управление устройствами, а не на голосовые команды. И я решил делать это сразу по-взрослому, с полноценным сервером, базами данных, авторизацией и мобильным приложением. Чуть позже преподаватель в колледже подсказал, что вместо моего костыля с записью массива в файл на php, можно использовать вебсокеты. Именно так я и реализую позже управление устройствами через интернет. Спасибо, Александр Анатолиевич!

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

Пишем бота регистрации аккаунта на PHP, эмулируя AJAX-запросы на CURL

Пишем бота регистрации аккаунта на PHP, эмулируя AJAX-запросы на CURL

Пока вышла горячая статейка с основными приёмами при работе с cURL в PHP, я решил написать скрипт простого бота, работающего с AJAX, чтобы закрепить материал на реальном примере. В этой статье будут упускаться многие очевидные вещи, эта статья будет более ориентирована на демонстрацию подхода при написании ботов для любого сайта. Я, для текущего примера решил выбрать сайт webparse.ru, для которого мы напишем скрипт заполнения почты и регистрации нового аккаунта.

Забегу наперёд, и скажу, что для написания бота для этого сайта, необходимо будет эмулировать AJAX запросы из PHP, и обрабатывать JSON ответ от сервера.

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

Шаг 1 — изучаем жертву

Шаг, с которого всё всегда начинается — нужно открыть целевой сайт по ссылке, и изучить его: какие запросы ему нужно отправить, какие данные, заголовки, наличие капчи или подобной защиты.

Потому, для начала, переходим по ссылке webparse.ru, и сразу видим форму с вводом email адреса для регистрации: target_first_visit

Для того, чтобы понять, какие параметры нужно отправлять, и на какой URL-адрес, нужно:

  • включить отладочную панель в браузере (f12)
  • открыть вкладку Network (она же Сеть )
  • включить опцию Preserve log (если не включить её, то вся история запросов будет очищена при перезагрузку страницы, оно вам надо?).
    2s_step_site

После чего, нам нужно провести цикл действий, которые мы собираемся автоматизировать (наблюдая при этом за каждым выполненным запросом и переданными данными). Наш цикл действий состоит только из заполнения почты и клика по кнопке Зарегистрироваться .

И после клика по кнопке регистрации, будет отправлен AJAX-запрос, который мы увидим в открытой панеле. И уже из информации на этой панеле, мы можем изучить все данные, которые нам необходимо будет сэмулировать PHP-скриптом.

В нашем случае, на панеле добавится запрос на ajax_light_register , по которому мы должны кликнуть, для просмотра дополнительной информации. А именно, нас интересует URL-адрес, на который отправляются данные для регистрации, метод, данные, и их формат: defailts_request

Исходя их этой информации, мы понимаем, что нам нужно отправить данные методом POST на URL https://webparse.ru/module_auth/ajax_light_register , передав параметр email как почту для регистрации.

Однако, здесь есть один тонкий момент. Для того, чтобы полностью сэмулировать работу браузера, реального пользователя, нужно передать так же заголовки, которые помогут нам не выдать себя за бота.headers_explai_---n
Я выделил основные заголовки, которые в большей мере котируются сервером, которые желательно отправлять. Сейчас, кратко рассмотрим их назначение:

  • Accept — заголовок, указывающий на то, в каком формате вы хотите получить данные (JSON, HTML, XML и т.д.). Этот параметр необязательный, и, очень часто, игнорируемый сервером. Но, иногда бывает API, которое умеет отдавать данные в разных форматах, и ориентируется на значение этого заголовка.
  • Content-Type — заголовок, указывающий на то, в каком формате мы отправляем данные. В данном случае, указано application/x-www-form-urlencoded , что тоже является необязательным, потому как, по-умолчанию, он и подразумевается. Другой случай — когда передаётся JSON, тогда, Content-type указывается application/json .
  • Referer — URL-адрес, с которого мы отправляем запрос. Тоже необязательный параметр, однако, некоторые бот-детекторы проверяют этот параметр, ожидая, что он будет ссылаться на домен основного сайта (в текущем случае — webparse.ru).
  • X-Requested-With — обязательный параметр в текущем случае, со значением XMLHttpRequest , которое идентифицирует запрос как AJAX. Тоже, одна из примитивных проверок бот-детектора.
  • User-Agent — строка, указывающая на браузер, версию, ОС, и прочую мета-информацию о клиенте, выполняющего запрос. Его желательно передавать всегда, так как обычный браузер всегда передаёт эту информацию. И, если вы его не передаёте, то с вами явно что-то нечисто, и вас будет легко вычислить как бота.

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

Шаг 2 — изучаем ответ, полученный от сервера

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

И вот, что мы имеем при успешном запросе: preview

Посмотрев на него, можно увидеть, что данные приходят в формате JSON, и содержат поля: errors (с массивом ошибок, если они есть), и errors_exists — булев флаг, показывающий, были ли ошибки при выполнении скрипта.
И, теперь, можем приступить к последнему шагу — написанию скрипта на PHP.

Шаг 3 — пишем скрипт и тестируем

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

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

Резюме

В этой статья я продемонстрировал подход, которому следую при написании ботов на PHP. В этой статье были затронуты темы написания ботов, эмулирующих AJAX-запросы на PHP, темы возможных защит и бот-детекторов, которые мы научились обходить. Итого, из
этой статьи на узнали, как написать бота на PHP, как в PHP определяют ботов, как в PHP cURL задать User-Agent, и зачем он нужен, и как при написании собственного бота не попасться на эти детекторы. Дальше — больше: продвинутые темы парсинга, полезные инструменты, написания ботов на PHP, многопоточная работа.

Визуальные скрипты. Sikuli: простая автоматизация через скриншоты и Python

Помнишь, какой фурор произвело появление WYSIWYG-редакторов, которые позволили верстать веб-страницы человеку, вообще не знающему правил HTML-разметки? Создатели Sikuli решили переложить подобный опыт на процесс разработки сценариев, с помощью которых можно автоматизировать все что угодно. Новый подход: «Что ты видишь, то ты и программируешь».

«What You See is What You Script» — так в оригинале звучит принцип, на котором основана Sikuli. Кстати, название программы — не случайно. Само слово «Sikuli» переводится с древнего индейского языка Wixarica из Мексики как «глаз бога», что недвусмысленно намекает на возможность видеть все на экране. Проект появился в 2008 году, став результатом совместной работы китайского студента Шона Тсунг-Хсианга Чана из Массачусетского технологического института (MIT), профессора Роба Миллера из департамента EECS в MIT и Тома Йеха, работающего над докторской в Университете штата Мэрилэнд.

Разработчики считают, что некоторые задачи (например, по автома тизации тестирования пользовательского интерфейса) проще выполнять с помощью визуальных средств. Sikuli использует алгоритмы распознавания текста и индексации изображений с помощью так называемых «визуальных слов». Встроенные функции языка принимают в качестве параметров графические данные и в зависимости от них выполняют определенные действия.

Например, передав функции hover() изображение кнопки «Пуск» в Windows, мы добьемся того, что Sikuli переведет на нее курсор. Это лишь маленький пример того, что предлагает данная визуальная технология.

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

К примеру, запрограммировать любые действия на веб-странице, работу с Windows/Linux/MacOS-приложением или даже с программами на iPhone/Android, используя симулятор устройства или подключение к его экрану по VNC. Для поиска конкретных элементов интерфейса Sikuli использует лишь их изображения-скриншоты и позволяет легко эмулировать нажатия кнопкой мыши в нужных местах и ввод с клавиатуры. Более того, в качестве скриптового языка в Sikuli используется Jython, то есть в сценарии при необходимости можно использовать любые конструкции Python.

Альтернативы?

Вообще говоря, эмуляция действий пользователя — это довольно частая задача. Во врезке я привел несколько распространенных примеров того, когда это может потребоваться. Злоумышленники, к примеру, могут использовать это в своих черных делах. В одном из номеров мы рассказывали про концепт трояна, который способен уводить деньги с кошельков электронных платежных систем. Тогда для эмуляции действий юзера использовались стандартные возможности Windows. Благодаря API-вызовам системы можно эмулировать все что угодно: любые последовательности кликов и движения мыши пользователя, работу с окнами и приложениями.

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

Есть, конечно, решения, которые позволяют обойтись без сложного системного программирования. Это, к примеру, программа AutoIt (autoitscript.com/autoit3), предоставляющая простой скриптовый язык для автоматизации практически любых задач. Весь ряд действий создаваемого макроса задается в виде вполне понятных команд, опирающихся на название окон и элементов интерфейса. К примеру, чтобы запустить оснастку Computer Management и дождаться появления окна с одноименным названием, необходимо написать такой код:

Run (‘cmd /c «compmgmt.msc»‘, @SystemDir, @SW_HIDE)
WinWaitActive(«Computer Management»)

Уже проще, чем код на C++, но все равно выглядит устрашающе. Чтобы не писать макросы вручную, можно воспользоваться дополнительными утилитами (вроде AutoItMacroGenerator), которые в реальном времени преобразуют все твои действия в системе в макрос для AutoIt. Но даже эти ухищрения не позволяют приложению дотянуть до уровня Sikuli по части простоты и доступности написания побочных сценариев. Сейчас ты в этом убедишься.

Работа с Sikuli

Чтобы не быть голословным, приведу пример довольно простого скрипта, который автоматически устанавливает IP-адрес сетевого адаптера в Mac OS X.

Да-да, именно в такой, максимально понятной и наглядной форме, составляются скрипты в Sikuli. Ничего не стоит составить аналогичный скрипт для Linux и Windows. Приложение Sikuli написано на Java, и потому поддерживает все популярные платформы. Если посмотреть на пример более внимательно, то увидишь набор понятных команд (click(), wait(), type() и так далее), с которыми можно работать, даже не заглядывая в документацию. Но самое интересное заключается в том, что в качестве параметров этим функциям часто передаются не текстовые переменные, а изображения. Например, функции для клика по нужному элементу — click() — передается изображение-скриншот этого элемента. Что может быть проще?

Правда, для написания сценариев тут уже не отделаешься обычным текстовым редактором — необходима специальная IDE, которая по умолчанию входит в состав Sikuli. Интерфейс этой среды довольно аскетичен и состоит из двух частей: непосредственно редактора кода и панели, на которой собраны основные функции для быстрого использования. Скажем, если нужно реализовать нажатие какой-то кнопки интерфейса, то мы выбираем функцию click(), после чего среда разработки предложит тебе выбрать область экрана для создания паттерна. Понятно, что обвести здесь нужно элемент, на котором необходимо осуществить клик. Пара секунд — и очередной шаг нашего скрипта готов!

Необходимые функции

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

  • click(img) — производит клик мыши по паттерну, переданному в качестве параметра;
  • doubleClick(scr) — двойной клик мышью;
  • rightClick(scr) — правый клик;
  • hover(scr) — наводит курсор на наиболее схожую с img область экрана;
  • exists(scr) — возвращает значение true, если находит изображение на экране;
  • openApp(app) — запуск приложения app;
  • switchApp(app) — передает фокус приложению app (если окно не найдено, то выполняется команда openApp);
  • type(text) — ввод текста text;
  • type(scr, text) — ввод текста text в элемент с графическим паттерном scr;
  • popup(msg) — выводит пользователю диалоговое окно с сообщением msg.

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

На сайте решения есть несколько наглядных демок (sikuli.org/demo.shtml), которые помогут тебе быстро понять, для чего нужны те или иные функции. С помощью небольших сценариев разными людьми реализованы следующие задачи:

  1. Проверка новых сообщений на Facebook от определенного пользователя и автоматическая отметка их кнопкой Like.
  2. Система фильтрации входящих звонков в Skype.
  3. Видеонаблюдение с помощью веб-камеры, которая отслеживает появление и исчезновение разных объектов.
  4. Бот для игры в пазл-игру Bejeweled.
  5. Тестировщик интерфейса приложения на Android.

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

3 кейса использования Sikuli

  1. Автоматизация работы с любыми сервисами и приложениями. В том числе с теми, которые не предоставляют API. Попробуй посчитать, сколько времени ты мог бы сэкономить, если бы перестал выполнять одни и те же однотипные действия? Максимально быстрое и упрощенное создание макросов — конек Sikuli. Создание примитивного скрипта, который выполняет запуск определенного приложения, осуществляет некоторые действия с интерфейсом и эмуляцию ввода данных — дело на пятнадцать минут.
  2. Создание инструментов для автоматизированного тестирования приложений. Каждый, кто занимается разработкой GUI-программ, знает, насколько утомительным может оказаться кропотливое выполнение проверок по части интерфейса. Один добрый человек разобрался, как скрестить Sikula и фреймворк для тестировщиков ПО Robot Framework, и выложил об этом подробную инструкцию: bit.ly/kUYNwn. В основе решения лежат встроенные возможности Sikuli по созданию юнит-тестов.
  3. Разработка ботов для самых разных игр. Если покопаться, то на Youtube можно найти не один ролик с демонстрацией того, как энтузиасты на коленке ваяют ботов для различных игр в социальных сетях. Автоматически собрать урожай на ферме — это далеко не предел мечтаний. Используя механизмы распознавания изображений и мощь Python, вполне реально собрать бота для того же покера (правда, это чаще всего противоречит правилам подобных сервисов, и они, вполне вероятно, уже добавили Sikuli в список запрещенных приложений).

Аналогичные решения

RoutineBot (routinebot.com)

Известная в кругах тестировщиков интерфейсов утилита, которая быстро развивается. Это неудивительно, поскольку решение изначально рассчитано на то, чтобы быстро создавать текстовые скрипты для проверки работы интерфейса. В качестве синтаксиса можно использовать Pascal, JScrpt и Basic. Приложение при этом так же, как и Sikuli, имеет набор функций, которым в качестве параметра передаются графические сэмплы.

Ranorex (ranorex.com)

Очень дорогой профессиональный инструмент для автоматизации, обладающий большим количеством модулей на все случае жизни. В качестве скриптового языка используется C#, VB.NET и Python. Решение интегрируется с Visual Studio и обладает мощным компонентом для распознавания изображений Ranorex Recorder.

T-Plan Robot (t-plan.com)

Этот проект раньше назывался VNCRobot и, как несложно понять, использует VNC-подключение к системе, на которой необходимо выполнить скрипт. Решение изначально разработано для автоматизации процессов с использованием в том числе анализа изображений.

EggPlant (testplant.com)

Так же, как и T-Plan Robot, это решение основывается на VNCподключении и предоставляет схожий функционал. На данный момент доступны версии для Linux, Windows, Mac.

Как работает Sikuli?

Главной частью системы является Sikuli Script. По сути — это библиотека, которая автоматизирует взаимодействие с GUI при помощи графических паттернов. Скрипт состоит из нескольких слоев на Java и Jython, но основное тут заключается в следующем. Модуль java.awt.Robot эмулирует нажатия клавиатуры и действия мышью. Распознаванием паттернов на экране занимается движок на C++, написанный с использованием известного проекта OpenCV. Любой скрипт на Sikuli (.sikuli) — это директория, которая состоит из исходника на Python (.py) и всех графических файлов (.png). Проект Sikuli можно также сохранить в виде исполняемого файла. В этом случае директория .sikuli сжимается zip’ом в единственный .skl-файл.

Sikuli IDE — это среда разработки, которая позволяет редактировать и выполнять скрипты. Несмотря на то, что библиотеки Sikuli Script есть и для других IDE (например, Eclipse’а), только оригинальная среда предоставляет удобные возможности для создания изображений-паттернов.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *