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

Как начать писать на JavaScript с нуля

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

Рассмотрим, из чего состоят веб-странички. HTML (HyperText Markup Language) отвечает за придание странице структуры (показывает, где меню сайта, а где заголовок, логотип или статья) и контента (различные тесты, списки, изображения и т. д.). CSS (Cascading Style Sheets) отвечает за визуальную составляющую страницы: определяет, какого цвета и размера должен быть тот или иной блок, как его оформить и вывести пользователю.

Структура и оформление есть, но где же взаимодействие? Здесь на сцену выходит JavaScript. Виртуальный «диалог» с пользователем — от изменения части содержимого сайта в ответ на действия до современных игр в браузере — реализуется с помощью скриптов JavaScript. Этот язык программирования работает в браузере и позволяет взаимодействовать с веб-страницей в режиме реального времени, оживляя её и предоставляя пользователю обратную связь на все действия.

У JavaScript очень интересная история. Он — реализация стандарта ECMAScript, может работать не только в браузере. Но в статье мы рассмотрим только взаимодействие с браузером.

Создаём самый простой скрипт

В первом задании, которое традиционно выполняет студент при изучении языка программирования, нужно вывести на экран фразу «Hello, world». Это позволяет отработать самый важный аспект — вывод информации пользователю, а также познакомиться с базовой структурой программы. Поступим так же.

Есть множество способов что-то вывести на экран в браузере, но мы выберем самый простой. Откроем «Инструменты разработчика» (Developer Tools) в браузере Chrome. Сделать это можно через сочетание клавиш Ctrl + Shift + I или F12 (Cmd + Opt + I на macOS) или через меню браузера. В Google Chrome нужно нажать на три точки, в других браузерах эта настройка может выглядеть иначе. Далее выбираем пункт «Дополнительные инструменты» и «Инструменты разработчика».

У вас должно появиться примерно такое окно, как ниже. Какой именно сайт выбрать для работы, не важно, можете открыть и GeekBrains.

Нас интересует вкладка Console. В ней могут быть ошибки и предупреждения (красные или жёлтые надписи) — не обращайте на них внимания, они нам не помешают. Выполним задание — выведем «Hello, world» на экран. Для этого нам понадобится команда alert(). Она выводит текст, который передан в круглых скобках.

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

Мы выполнили первое задание — вывели простой текст на экран.

Учимся писать чуть более сложные скрипты

На экране перед нами статичный текст, что не очень интересно. Хотелось бы больше взаимодействия с пользователем. Что, если мы будем спрашивать имя зашедшего на сайт и здороваться с ним?

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

Для создания переменной в JavaScript нужно применить ключевое слово let. Есть и другие, но не будем так глубоко погружаться в детали.

Требования к именованию переменных:

  1. Имя переменной не может начинаться с цифры.
  2. Имя переменной может содержать только буквы, цифры и символы «$» и «_».
  3. Здравый смысл подсказывает нам, что имя переменной должно отражать суть того, что в ней находится.

Создадим простую переменную, поместив в неё имя. Например, Иван.

Обратите внимание: мы объединили слово «привет» и переменную. Здесь имеет значение каждый символ: сначала alert, потом открывающая круглая скобка, которая говорит, что дальнейшие инструкции нужно вывести на экран. Затем кавычки, в которых заключён приветственный текст. Далее знак +, который подсказывает программе, что текст справа от знака нужно объединить с тем, что слева. И завершает это закрывающая круглая скобка.

Мы вывели имя из переменной на экран, но ведь было нужно показать имя, которое сообщит пользователь. Исправим это. Нам понадобится команда prompt(). Она задаст пользователю вопрос — запишем его в круглых скобках. Сохраним в переменную результат выполнения команды prompt().

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

Сохраняем наш первый скрипт

Мы написали программу (скрипт) в консоли браузера. Это было быстро и просто, но не очень практично — такой программой с пользователями не поделишься. Чтобы сделать это, сохраним программу в файл с расширением *.html. Имя можем дать произвольное. Так как HTML подразумевает определённую структуру контента, нужно её отчасти соблюсти, чтобы всё работало. Понадобятся теги <html> и <script>.

Редактировать и сохранять файлы со скриптами можно с помощью любого текстового редактора. Cамый простой и примитивный — «Блокнот», который поставляется вместе с Microsoft Windows. Есть и специальные редакторы кода, например, Visual Studio Code. В блоге даже выходила специальная подборка редакторов кода JavaScript — выбирайте и дерзайте 🙂

А если хотите извлечь из JavaScript максимум — приглашаем на факультет Fullstack JavaScript-разработки GeekBrains!

Написать программу для обращения к веб-странице

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

bash + wget/curl + sed/awk

Такой большой, а не знаешь, как боты работают 🙂

или Mechanize (например, на перле)
или HtmlUnit
или PhantomJS
или Selenium
. тысячи их!

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

А так, любой скриптовый язык который умеет работать с http(s).

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

Капчи там нет! Веб-страница ничем не защищена.

Готовой программы? У меня нет. Несколько лет назад ботоводил и эксплуатировал по этой схеме дырки в eRepublik. Алгоритм простой: формируем и отправляем post запросы, парсим пришедшие страницы.

А что такое post-запросы?

Метод запроса страницы в протоколе HTTP, подразумевающий отправку серверу некой информации (содержимое поля).

Смотри: Пример #1 Извлечь страницу и отправить данные методом POST

Я просто не в курсе. А как ему указать, содержимое какого поля мы хотим отправить?

Это на каком языке? Как эту программу запустить?

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

Для второго вгет более чем подходит, как уже говорили. Для первого, если у тебя мак, лучше всего годится AppleScript, хотя штуки вроде нокогири тоже ок.

По-моему это очень толстый троллинг.

Подсмотреть на содержимое запроса при отправке его из браузера. Либо сниффером либо для удобства к браузерам можно прикручивать всякие плагины вроде Tamper data для Firefox.

А в чем различие? Есть страница, там форма. Если заполнить и отослать — все ок. Надо, чтобы это делалось автоматически.

Запустить в консоли?

Тогда такой файл:

после дать скрипту:

и запускать как обычно

А как потом ответ получить?

Спасибо, попробую разобраться.

Придёт в ответ на запрос.
Чтобы не тупить, рекомендую открыть и прочитать маны по html, bash, wget, sed.
Я не читал, просто поиском находил интересующие вопросы и быдлокодил на ходу.

Капчи там нет! Веб-страница ничем не защищена.

ну и в чём сложность? curl умеет и POST и GET запросы. У меня на форуме вроде валялся пример бота.

Логика такая: есть сайт. На нем 2 страницы — на 1й авторизация, а вторая — та, на которую нужно попасть после авторизации. Сначала проверяем, не существует ли у нас сохраненной куки для этого сайта. Если нет, то получаем куку — идем на страницу авторизации, заполняем форму, сабмитим ее, сохраняем куку на диске и загружаем ее. Затем переходим на требуемую страницу и выводим ее содержимое (print $content).

Если нужно выводить не всю страницу, а только что-то конкретное, тогда нужно парсить HTML — например, с помощью HTML::TreeBuilder::XPath.

Но если нужно только авторизоваться и вывести содержимое, то лучше через curl — намного проще.

Авторизации там тоже нет.

Да без разницы, тогда просто форму заполняешь и жмешь на кнопку.

Если тебе для «домашнего» применения, то можно просто делать скрипт на баше с использованием xdotool.
Поднимаешь систему в виртуалке с браузером.
Далее просто по заранее заданным координатам эмулитуешь свое тыканье.

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

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

Ух ты. Пять звезд )

*facepalm*
Предлагаю прилюдно с позором сорвать звезды.

Здесь что, все — веб-дизайнеры?

Во-первых, это задача не для веб-дезингера; Во-вторых, она просто тривиальная.

1. Нужно открыть в браузере страницу с формой.
2. Открыть firebug (есть из-коробки в хроме и опере, в остальных легко прикручивается).
3. С включенным firebug (выбрать раздел network) отправляйте заполняйте форму и нажимаете кнопочку «отправить» или как она там называется.
4. Далее, в firebug-e появятся информация о всех запросах браузер списком, из этого списка нужно выбрать тот у которого «method: POST». Там будет информация о запросе, вам нужен раздел «Request body».
5. Из этого раздела нужно скопировать всю информацию в такой вот скрипт:

в строчку шесть. Ну и урл отредактировать (строчка 5).
6. нужно еще установить библиотеку python-requests. В suse это не проблема 😉
7. запустить скрипт из пункта 5:

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

может и проще, проблема в том, что там каую-нить точку дизайнер заменит, и бот в нужную кнопку не попадёт. Разве так сложно распарсить <form></form>?

причём тут дизайн? дизайн как раз тебе не нужен, нужно просто распарсить форму запроса, а вот шелуху дизайнера надо как раз выкинуть в /dev/null, боту должно быть наплевать, как кнопка выглядит, и где находится, его цель послать запрос «кнопка ХХХ нажата».

Ну мало ли что ТСу надо.

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

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

ну если посмотреть на посты ТСа, то там случай совсем примитивный, и ему достаточно 30и минутного вкуривания man curl. А с гуглом там случай ействительно сложный.

Да я просто увидел топик с обфусцированным js, и подумалось что моя рекомендация может быть полезна 🙂

Далее, в firebug-e появятся информация о всех запросах браузер списком, из этого списка нужно выбрать тот у которого «method: POST».

Так. Появились, но там только GET.

Похоже, вся инфа передается в имени URL. Как тогда обработать ответ?

так, ТС, сначала внимательно прочитай RFC по протоколу HTTP, потом обзорно про HTML в любой книжке для чайников. Если после этого не будет понятно, как написать сабжевую программу, то тут уже ничем помочь нельзя

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

Если эту страницу не хочется «светить» — то все как я расписал, только в этом списке нужно найти ту страницу куда вас форма переправляет, там будет информация, которую нужно вставить в мой скрипт.

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

Если ответ приходит в формате html — то я недавно как раз об этом написал.

Если в другом формате — то либо соответствующую формату либу использовать, либо же через регулярки.

Управляем интернетом с помощью Python

Python

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

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

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

Далее я расскажу, как написать программу, которая научила браузер отправлять задания за меня. Для этого мы познакомимся с основами использования Python и Selenium для автоматизации работы в сети. Несмотря на то что этот код работает (я пользуюсь ей каждый день!), его нельзя бездумно скопипастить в свое приложение, потому что он заточен под мой проект. Тем не менее, общий подход, описанный здесь, можно применить к любому приложению. Весь код доступен на Github.

Подготовка

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

Структура папок (слева) и выполненное задание (справа)

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

Первая часть кода — цикл, который проходит по папкам и ищет название задания и класса, которые мы храним в кортеже (tuple) Python:

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

Управляем интернетом с помощью Selenium

Перед началом использования selenium необходимо импортировать эту библиотеку и создать Selenium webdriver — браузер, которым мы будем управлять с помощью нашей программы. В моем случае я создаю движок (driver) Chrome и с помощью него открываю страницу, куда нужно отправить задание.

Как только мы открываем страницу Canvas, мы встречаемся с первым препятствием — формой авторизации. Чтобы пройти её, нам нужно ввести id и пароль и нажать на кнопку входа.

Веб драйвер можно сравнить с человеком, который видит указанную страницу первый раз: нам нужно предельно точно указать ему, куда кликнуть, что напечатать и какую кнопку нажать. Есть несколько способов указать веб драйверу, к какому элементу обратиться. Все они основаны на использовании селекторов. Селектор (selector) — это уникальный идентификатор элемента на странице. Чтобы найти селектор определенного элемента, в нашем примере пусть это будет CWRU ID, нужно исследовать веб-страницу. В Chrome это делается с помощью комбинации клавиш “ctrl + shift + i” или нажатием правой кнопкой мыши по элементу, а затем выбором пункта “Inspect” («Исследовать элемент») контекстного меню. В результате чего откроется инструмент разработчика Chrome ( Chrome developer tools) — чрезвычайно полезное средство для просмотра HTML-структуры любого сайта.

Чтобы найти форму с селектором “CWRU ID”, я кликнул по ней правой кнопкой мыши, нажал “Inspect” («Исследовать элемент») и в открывшейся панели инструментов разработчика увидел размещенный ниже код. Строка кода, соответствующая id выбранной нами формы, выделена цветом (это строка называется «HTML тег» (HTML tag).

Приведенный в примере HTML выглядит ужасающе, но мы можем проигнорировать бОльшую часть информации и сосредоточиться на частях id = «username» и name=»username» — их еще называют атрибутами HTML-тега.

Чтобы выбрать блок id с помощью нашего веб-драйвера Selenium, мы можем использовать атрибуты id or name , которые ранее нашли в инструментах разработчика. У веб-драйверов в Selenium есть много разных методов для выбора элементов на веб-странице и часто также несколько способов выбрать один и тот же элемент:

Наша программа теперь имеет доступ к id_box , и мы можем взаимодействовать с этим блоком различными способами, например, набрать на клавиатуре текст или щелкнуть по кнопке (если мы её предварительно показали драйверу).

Мы повторяем тот же процесс для формы с паролем и кнопки входа в систему, выбирая их в зависимости от того, что мы видим в инструментах разработчика Chrome. Затем мы отправляем информацию элементам или нажимаем на них по мере необходимости.

Как только мы вошли в систему, нас приветствует эта слегка неуклюжая панель:

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

Программа находит правильный класс, используя имя папки, которую мы сохранили на первом шаге. В этом случае я использую метод выбора find_element_by_link_text для поиска конкретного класса. «link text» элемента — это всего лишь еще один селектор, который мы можем найти, просмотрев страницу:

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

Мы используем одну и ту же последовательность «исследовать страницу — выбрать элемент — взаимодействовать с элементом», чтобы пройтись еще по паре экранов. Наконец, мы переходим на страницу отправки заданий:

На этом этапе я уже увидел, что близок к финишной черте, но вдруг этот экран озадачил меня. Я легко мог щелкнуть по «Выбрать файл», но как же мне выбрать файл, который нужно загрузить? Ответ оказывается невероятно простым! Мы находим Choose File с помощью селектора и используем метод send_keys для передачи точного пути файла (называемого file_location в коде ниже) в указанную форму:

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

Теперь мы выбираем кнопку «Отправить задание» («Submit Assignment») , кликаем на неё, и наше задание зачтено!

Рефакторим

Управление файлами всегда является критическим шагом, и я хочу убедиться, что я не отправляю повторно и не потеряю старые задания. Я решил, что лучшим решением будет сохранять один файл, который должен быть отправлен, в папку completed_assignments и перемещать файлы в папку submitted_assignments после того, как их засчитали. Последний кусочек кода использует модуль os для перемещения завершенного задания в нужное место и его переименования:

Весь этот код я вызываю с помощью небольшого скрипте, который я могу запустить из командной строки. Чтобы исключить ошибки, я отправляю только одно задание за раз, что не является большой проблемой, учитывая, что для запуска программы требуется всего 5 секунд!

Вот как это выглядит, когда я запускаю программу:

Пока программа выполняется, я могу видеть, как Python работает за меня:

Заключение

Технология автоматизации использования интернета с помощью Python отлично подходит для широкого круга задач, как общих, так и специфичных — таких, как моя область — data science. Например, мы можем использовать Selenium для ежедневной автоматической загрузки новых файлов с данными (при условии, что на сайте нет API). Хотя поначалу может показаться, что написание такого сценария — процесс трудозатратный, но его преимущество в том, что мы можем заставить компьютер повторять эту последовательность неизменным образом столько раз, сколько захотим. Программа никогда не потеряет фокус и не окажется случайно в Twitter. Он будет безукоризненно выполнять ту же последовательность шагов с идеальной точностью (правда это будет работать только до тех пор, пока сайт не изменится).

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

С точки зрения выгоды, эта программа экономит мне около 30 секунд для каждого задания. При этом на её написание я потратил 2 часа. Итак, если я использую её, чтобы отправить 240 заданий, то я существенно выиграю по времени! Тем не менее, главная отдача от этой программы заключается в том, что я разработал крутое решение проблемы и изучил много нового в процессе обучения. Возможно, я мог бы распорядиться своим временем более эффективно, потратив его на то, как выполнять задания, а не на то, как автоматически отправлять их. Несмотря на это, я испытал огромное наслаждение, занимаясь этой задачей. Не так много вещей может доставить удовольствие равное тому, которое мы получаем от успешного решения проблемы. И Python оказался довольно неплохим инструментом для этого.

Время на прочтение
8 мин

Количество просмотров 16K

Путешествие в простую веб-автоматизацию

image

Проблема: Отправка домашних заданий требует навигации по лабиринту веб-страниц, настолько сложной, что несколько раз я отправлял задание в неправильное место. Кроме того, хоть и этот процесс занимает всего 1–2 минуты, иногда он кажется непреодолимым препятствием (например, когда я закончил задание слишком поздно ночью и едва могу вспомнить свой пароль).

Решение: Используйте Python для автоматической отправки выполненных заданий! В идеале я мог бы сохранить задание, набрать несколько клавиш и загрузить свою работу за считанные секунды. Сначала это звучало слишком хорошо, чтобы быть правдой, но потом я обнаружил Selenium, инструмент, который можно использовать с Python для навигации по сети.

image

Каждый раз, когда мы повторяем утомительные действия в Интернете с одинаковой последовательностью шагов, это отличный шанс написать программу для автоматизации процесса. С Selenium и Python нам просто нужно написать сценарий один раз, и затем мы сможем запустить его сколько угодно раз и уберечь себя от повторения однообразных задач (и в моем случае исключается возможность отправки задания в неправильное место)!

Здесь я рассмотрю решение, разработанное мной для автоматической (и правильной) отправки моих заданий. Попутно мы рассмотрим основы использования Python и selenium для программного управления вебом. Хотя эта программа работает (я использую ее каждый день!), она довольно индивидуальна, поэтому вы не сможете скопировать и вставить код для своего приложения. Тем не менее, общие методы здесь могут быть применены к неограниченному числу ситуаций. (Если вы хотите увидеть полный код, он доступен на GitHub).

Подход

Прежде чем мы перейдем к интересной части автоматизации, нам необходимо выяснить общую структуру нашего решения. Начинать программировать без плана — отличный способ потратить много часов и разочароваться. Я хочу написать программу для отправки выполненных заданий по классу в правильное место в Canvas’e («система управления обучением» моего университета). Начнем сначала, мне нужен способ сообщить программе название задания для отправки и класс. Я использовал простой подход и создал папку для хранения выполненных заданий с дочерними папками для каждого класса. В дочерние папки я помещаю готовый документ, названный для конкретного задания. Программа может выяснить имя класса по папке и название задания по названию документа.
Вот пример, где название класса — EECS491, а задание — Задание 3 — Вывод в больших графических моделях».

image

File structure (слева) и Complete Assignment (справа).

Первая часть программы представляет собой цикл, который проходит по папкам, чтобы найти задание и класс, которые мы храним в кортеже Python:

# os for file management
import os
# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'
dir_list = list(os.listdir(submission_dir))
for directory in dir_list:
    file_list = list(os.listdir(os.path.join(submission_dir, 
directory)))
    if len(file_list) != 0:
        file_tup = (directory, file_list[0])
    
print(file_tup)

(‘EECS491’, ‘Assignment 3 — Inference in Larger Graphical Models.txt’)

Это обеспечит управление файлами, и теперь программа знает класс и задание для включения. Следующим шагом является использование Selenium для перехода на правильную веб-страницу и загрузки задания.

Веб-контроль с Selenium

Чтобы начать работу с Selenium, мы импортируем библиотеку и создаем веб-драйвер, который является браузером, управляемым нашей программой. В этом случае я буду использовать Chrome в качестве браузера и отправлять драйвер на веб-сайт Canvas, где я отправляю задания.

import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')

Когда мы открываем веб-страницу Canvas, нас встречает первое препятствие — поле для входа! Чтобы обойти это, нам нужно будет ввести идентификатор и пароль и нажать кнопку входа.

image

Представьте, что веб-драйвер — это человек, который никогда раньше не видел веб-страницу: нам нужно точно сказать, куда нажимать, что печатать и какие кнопки нажимать. Есть несколько способов сообщить нашему веб-драйверу, какие элементы найти, и все они используют селекторы. Селектор — это уникальный идентификатор элемента на веб-странице. Чтобы найти селектор для определенного элемента, скажем, поле “CWRU ID”, нам нужно посмотреть код веб-страницы. В Chrome это можно сделать, нажав «Ctrl + Shift + I» или щелкнув правой кнопкой мыши на любом элементе и выбрав “Посмотреть код”. Это открывает инструменты разработчика Chrome, чрезвычайно полезное приложение, которое показывает HTML, лежащий в основе любой веб-страницы.

Чтобы найти селектор для поля «CWRU ID», я щелкнул правой кнопкой мыши в поле, нажал «Посмотреть код» и увидел следующее в инструментах разработчика. Выделенная строка соответствует элементу id_box (эта строка называется тегом HTML).

image

Этот HTML может выглядеть подавляющим, но мы можем игнорировать большую часть информации и сосредоточиться на частях id = "username" и name = "username". (они известны как атрибуты тега HTML).
Чтобы выбрать поле id с помощью нашего веб-драйвера, мы можем использовать атрибут id или name, который мы нашли в инструментах разработчика. Веб-драйверы в Selenium имеют много разных способов выбора элементов на веб-странице, и часто есть несколько способов выбрать один и тот же элемент:

# Select the id box
id_box = driver.find_element_by_name('username')
# Equivalent Outcome! 
id_box = driver.find_element_by_id('username')

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

# Send id information
id_box.send_keys('my_username')

Мы выполняем один и тот же процесс для поля ввода пароля и кнопки входа, выбирая каждый из них в зависимости от того, что мы видим в инструментах разработчика Chrome. Затем мы отправляем информацию элементам или нажимаем на них по мере необходимости.

# Find password box
pass_box = driver.find_element_by_name('password')
# Send password
pass_box.send_keys('my_password')
# Find login button
login_button = driver.find_element_by_name('submit')
# Click login
login_button.click()

Как только мы вошли в систему, нас приветствует эта слегка пугающая панель инструментов:

image

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

# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')
courses_button.click()
# Get the name of the folder
folder = file_tup[0]
    
# Class to select depends on folder
if folder == 'EECS491':
    class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')
elif folder == 'EECS531':
    class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')
# Click on the specific class
class_select.click()

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

image

Этот рабочий процесс может показаться немного утомительным, но помните, что мы должны сделать это только один раз, когда пишем нашу программу! После этого мы можем нажать «Выполнить» столько раз, сколько захотим, и программа зайдет за нас на все эти страницы.
Мы используем один и тот же процесс проверки страницы — выбора элемента — взаимодействия с элементом, чтобы пройти еще пару экранов. Наконец, мы достигаем страницы отправки задания:

image

В этот момент я мог видеть финишную черту, но изначально этот экран меня озадачил. Я мог бы довольно легко нажать на поле «Выбрать файл», но как я должен был выбрать нужный файл для загрузки? Ответ оказывается невероятно простым! Мы находим поле Choose File с помощью селектора и используем метод send_keys для передачи точного пути к файлу (называемого file_location в приведенном ниже коде) к блоку:

# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')
# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)
# Send the file location to the button
choose_file.send_keys(file_location)

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

image

Теперь мы выбираем кнопку “Отправить задание”, нажимаем, и наше задание отправлено!

# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()

image

Уборка

Управление файлами — это всегда критический шаг, и я хочу быть уверенным, что не отправлю повторно или не потеряю старые задания. Я решил, что лучшим решением будет сохранить файл, который будет помещен в папку completed_assignments, и переместить файлы в папку submitted_assignments, как только они будут загружены. Последний бит кода использует модуль os для перемещения завершенного задания в нужное место.

# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)
# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)

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

Вот как это выглядит, когда я запускаю программу:

image

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

image

Пока программа работает, я могу наблюдать, как Python работает на меня:

image

Выводы

Техника автоматизации с помощью Python отлично подходит для многих задач, как общих, так и в моей области науки о данных. Например, мы могли бы использовать Selenium для автоматической загрузки новых файлов данных каждый день (при условии, что у веб-сайта нет API). Хотя на первый взгляд создание сценария может показаться трудоемким, преимущество заключается в том, что мы можем заставить компьютер повторять эту последовательность столько раз, сколько захотим, точно таким же образом. Программа никогда не потеряет фокус и зайдет в Twitter. Она будет точно выполнять шаги с идеальной последовательностью (алгоритм будет прекрасно работать, пока сайт не изменится).

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

В плане окупаемости эта программа экономит мне около 30 секунд на каждое задание, а на ее написание уходит 2 часа. Так что, если я использую ее для сдачи 240 заданий, я выйду в плюс по времени! Тем не менее, отдача от этой программы заключается в разработке классного решения проблемы и многому учит в процессе. Хотя мое время могло бы быть более эффективно потрачено на выполнение заданий, а не на выяснение того, как автоматически сдавать их, я полностью наслаждался этой задачей.Есть несколько вещей, приносящих такое удовлетворение, как решение проблем, и Python оказывается довольно хорошим инструментом для этого.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:

  • Курс по Machine Learning (12 недель)
  • Обучение профессии Data Science с нуля (12 месяцев)
  • Профессия аналитика с любым стартовым уровнем (9 месяцев)
  • Курс «Python для веб-разработки» (9 месяцев)

Читать еще

  • Тренды в Data Scienсe 2020
  • Data Science умерла. Да здравствует Business Science
  • Крутые Data Scientist не тратят время на статистику
  • Как стать Data Scientist без онлайн-курсов
  • Шпаргалка по сортировке для Data Science
  • Data Science для гуманитариев: что такое «data»
  • Data Scienсe на стероидах: знакомство с Decision Intelligence

Предисловие.

Веб-бот — это программа, которая автоматизирует ваши действия в интернете.

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

  • Получает актуальную информацию о стоимости товара.
  • Автоматически участвует в раздачах.
  • Пишет сообщения от вашего имени (ссылка на урок).
  • Скачивает картинки с сайта (ссылка на урок).

Приступим.

Создаем первого бота на Selenium.

Selenium — это библиотека для автоматизации действий в браузере.

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

Первым делом нужно установить библиотеку, для этого введите в консоли:

pip install selenium

Далее, установите веб-драйвер под браузер Firefox отсюда. Также, необходимо установить браузер Mozilla Firefox, если еще не установлен.

Теперь напишем простейшего бота. Для этого, напишите следующий python скрипт.

from selenium import webdriver #Ипортируем библиотеку
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe') #Прописываем путь до firefox.exe
browser = webdriver.Firefox(firefox_binary=binary) #создаем объект Firefox браузера
browser.get('https://under-prog.ru') #посредством метода get, переходим по указаному URL

Код скрипта описан в комментариях.

Далее, переместите файл скрипта, в одну папку с веб-драйвером geckodriver.exe

И запустите python скрипт. У вас должен открыться браузер.

В адресной строке видна иконка робота, это значит, что браузером управляет программа.

Хорошо, бот создан, но он бесполезен. Единственное на что он способен, это заходить на сайт. Давайте добавим ему новых функций. Например, сделаем так, чтобы бот лайкал посты на сайте.

Бот лайкающий посты на сайте.

Последовательность действий у нас следующая.

  1. Зайти на сайт under-prog.ru (открыть браузер)
  2. Пройтись по каждому из постов.
  3. Нажать кнопку лайк, если она не нажата.
  4. Закрыть браузер.

Первый пункт мы уже сделали, перейдем ко второму.

Пройтись по каждому из постов.

На этом этапе, нужно понимать разметку HTML.

Зайдите на сайт, и нажмите кнопку F12.

У вас откроются инструменты разработчика. Изучив разметку, мы понимаем, что все посты находятся в теге article.

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

article div div.blog-entry-content header.entry-header h2.entry-title a

Данный селектор указывает:

  • На элемент с тегом a
  • который находится находится внутри тега h2 с классом entry-title
  • тот, в свою очередь, находится внутри тега header с классом entry-header
  • тег header находится внутри тега div с классом blog-entry-content
  • тот, находится в теге div
  • тег div находится внутри тега article

Теперь, дополним бота.

link = browser.find_elements(By.CSS_SELECTOR, 'article div div.blog-entry-content header.entry-header h2.entry-title a')[0].get_attribute('href')
print(link)

Разберем новую функцию.

browser.find_elements(By.CSS_SELECTOR, css_селектор)

Данная функция ищет элементы по css селектору. В результате своей работы, она возвращает массив элементов.

link = browser.find_elements(By.CSS_SELECTOR, 'article div div.blog-entry-content header.entry-header h2.entry-title a')[0].get_attribute('href')

В-общем, мы из этого массива, достали первый элемент, и при помощи функции get_attribute(), получили значение атрибута href (ссылка на пост).

print(link)

И вывели его на экран.

Запустите скрипт, в консоли должна появится ссылка на первый пост.

Если закинуть массив элементов в цикл, то получится извлечь ссылки на все посты.

from selenium import webdriver #Ипортируем библиотеку
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe') #Прописываем путь до firefox.exe
browser = webdriver.Firefox(firefox_binary=binary) #создаем объект Firefox браузера
browser.get('https://under-prog.ru') #посредством метода get, переходим по указаному URL

elements = browser.find_elements(By.CSS_SELECTOR, 'article div div.blog-entry-content header.entry-header h2.entry-title a')
for elem in elements:
    print(elem.get_attribute('href'))

Отлично, ссылки на все посты получены, осталось всем этим постам, поставить лайк.

Нажать кнопку лайк, если она не нажата

Сначала перекопируем наши ссылки в отдельный массив. Замените это:

elements = browser.find_elements(By.CSS_SELECTOR, 'article div div.blog-entry-content header.entry-header h2.entry-title a')
for elem in elements:
    print(elem.get_attribute('href'))

На это:

elements = browser.find_elements(By.CSS_SELECTOR, 'article div div.blog-entry-content header.entry-header h2.entry-title a')
links_arr = []
for elem in elements:
    links_arr.append(elem.get_attribute('href'))

Далее напишем код, отвечающий за нажатие кнопки лайк.

for link in links_arr: #Проходим по каждому элементу массива ссылок
    browser.get(link) #Переходим по ссылке
    if browser.find_element(By.CSS_SELECTOR, 'button.wp_ulike_btn').get_attribute('class').find('wp_ulike_btn_is_active') == -1: #Если кнопка 'лайк' не нажата, тогда
        browser.find_element(By.CSS_SELECTOR, 'button.wp_ulike_btn').click() #кликаем по кнопке 'лайк'

Разберем данные строки.

if browser.find_elements(By.CSS_SELECTOR, 'button.wp_ulike_btn').get_attribute('class').find('wp_ulike_btn_is_active') == -1:

Данная строка ищет кнопку с помощью css_селектора, и получает строку с названиями классов нашей кнопки.

Далее, при помощи функции find (стандартная функция python), мы получаем индекс подстроки ‘wp_ulike_btn_is_active‘, если не удалось найти подстроку, функция find возвращает -1, этим мы и воспользовались в нашем условии. Т.е. если атрибут ‘class‘ не содержит подстроку ‘wp_ulike_btn_is_active‘, то.

browser.find_elements(By.CSS_SELECTOR, 'button.wp_ulike_btn').click()

Кликаем по кнопке лайк.

Осталось закрыть браузер, делается это с помощью функции quit().

browser.quit()

Бот завершен, запустите скрипт, и наслаждайтесь автоматизацией.

Делаем браузер невидимым

Бот работает и все-бы ничего, но своим окном бразуера, он перекрывает все остальные окна. К счастью, у Firefox есть headless режим, позволяющий пользоваться функциями бразура, не открывая окно браузера.

Добавьте следующий код перед инициализацией браузера:

option = webdriver.FirefoxOptions()
option.headless = True

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

browser = webdriver.Firefox(options=option)

Теперь, порядок.

Полный код бота:

from selenium import webdriver #Ипортируем библиотеку
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe') #Прописываем путь до firefox.exe
browser = webdriver.Firefox(firefox_binary=binary) #создаем объект Firefox браузера
browser.get('https://under-prog.ru') #посредством метода get, переходим по указаному URL

elements = browser.find_elements(By.CSS_SELECTOR, 'article div div.blog-entry-content header.entry-header h2.entry-title a')
links_arr = []
for elem in elements:
    links_arr.append(elem.get_attribute('href'))
    
for link in links_arr:
    browser.get(link)
    if browser.find_element(By.CSS_SELECTOR, 'button.wp_ulike_btn').get_attribute('class').find('wp_ulike_btn_is_active') == -1:
        browser.find_element(By.CSS_SELECTOR, 'button.wp_ulike_btn').click()
    
browser.quit()

Итоговый результат.

avatar

Пишем своего бота для любого сайта на C#

DarkD Сливы

Всем привет. По просьюам трудящихся, решил показать как сделать своего бота практически для любого сайта на C# и библиотеки для управления браузером Selenium Web Driver.

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

В чем плюсы написания бота именно на C#

[*] С# (далее шарп) даёт очень понятный для понимания код, даже тем, кто в программировании полный ноль

[*] На выходе бот будет именно приложением EXE, а не каким-то скриптом

[*] Да и этого думаю хватит, а то больше голова не варит)

В качестве среды разработки я использую бесплатную официальную версию Visual Studio Community 2015

https://www.microsoft.com/ru-ru/SoftMicrosoft/vs2015Community.aspx

Так же понадобится сама библиотека Selenium Web Driver + Chrome Driver т.к. я буду показывать пример именно для браузера хром

В Visual Studio нажимаем «Проект — Управление пакетами NuGet»

На вкладке «Обзор» пишем Selenium и устанавливаем его

Чуть ниже качаем Selenium.Chrome.WebDriver

Теперь можно приступить к написанию самого бота, запускаем нашу Vusual Studio и нажимаем «Файл — создать — проект»

Язык выбираем C#, затем «Приложение Windows Forms (.NET Framework)», внизу пишем как будет называться наш проект и выбираем место сохранения проекта, затем жмём ОК

Теперь стоит вопрос, какой бот для примера написать? Так как в голову после вчерашней синьки ничего толкового не пришло, я решил показать пример написания бота для VLMI.su (реклама хули, а то всёравно копипастом разойдется статейка)

Теперь нужно подумать головой, что должен делать бот и составить ТЗ (техническое задание).

Так как мы только учимся, то нагружать бот большим функционалом мы не будем.

ТЗ будет выглядеть примерно так:

1. Зайти на сайт
2. Авторизоваться на форуме используя свой логин и пароль
3. Зайти в раздел "Флудилка"
4. Нажать там кнопку "Создать тему"
5. Ввести заголовок темы
6. Ввести текст темы
7. Нажать кнопку "Создать тему"

Думаю для понимания принципа работы бота этого будет достаточно.

Дальше будет на время написания статьи стоять большой хайд, т.к. время у меня не резиновое.

После написания всей статьи хайд будет снят.

Для того, чтобы окно нашей программы нельзя было растягивать по высоте и ширине, нужно кликнуть по окну программы и в свойствах установить Form Border Style в Fixed Dialog. Там же можно и изменить текст, который будет писаться в окне нашей программы

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

Какие элементы нужно добавить на форму я буду писать в процессе написания.

Сейчас нам нужно добавить

Два Label (Это обычный текст, чтобы было понятно куда писать логин, а куда пароль для авторизации)

Делаем это

Теперь нажимаем на каждый label и пишем ему нормальное имя всё в тех же свойствах, про которые я писал выше

Тепрь на форму нужно кинуть 2 текстбокса и всё это говницо более менее нормально выровнять, чтобы кровь из глаз не пошла

Теперь нужно нажать на каждом текстбоксе и изменить его имя, чтобы потом было легче писать код, я сделал текстбоксам имена LOGINBOX и PASSBOX

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

Добавленным текстбоксам я дал имена THREADBOX и TEXTBOX

Так же я поменял цвет фона приложения (BackColor), чтобы было лучше всё видно

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

Дабавляем ниже еще label и Textbox, Textbox я назову LOG.

Кстати забыл сказать, текстбоксу с текстом темы и текстбоксу с логом, ножно добавить мультистрочность, чтобы всё в одну строку не писалось, для этого просто нажимаем по текстбоксу, потом нажимаем по стрелочке в правом верхнем углу и ставим галочку MultiLine

Получилось вот так:

Один хрен чего-то не хватает… Бля точно, нужно же сделать кнопку, которая всё это будет запускать

Перекидываем с панели элементов элемент Button на нашу форму и растягиваем кнопку как нам хочется, называем кнопку как угодно, а в свойствах Разработка — Name пишем START

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

Побухали, поматерили меня — приступим.

Клакаем 2 раза по кнопке СТАРТ и начинаем «кодить»…

Если вы попали сюда, то уже всё заебись)

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

using System;
using System.Windows.Forms;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.PhantomJS;
using OpenQA.Selenium;
using System.Threading;

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

private void START_Click(object sender, EventArgs e)
        {
            IWebDriver web; //Это мы... Как бы проще сказать... Короче инициализируем наш веб драйвер

            string LOGIN = LOGINBOX.Text;   //Читаем в переменную LOGIN введенный логин
            string PASS = PASSBOX.Text;     //Читаем в переменную PASS введенный логин
            string THREAD = THREADBOX.Text; //Читаем в переменную THREAD введенное название темы
            string TEXT = TEXTBOX.Text;     //Читаем в переменную TEXT введенный текст для темы

        }

Selenium Web Driver выполняет следующее действие, только когда страница загрузится на 100% иногда загрузка может занять очень долгое время из-за плохого интернета или просто из-за глюка, а например нужная вам кнопка уже давно появилась.

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

  web.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20);

Эта команда ждет в течении 20 секунд, пока не появится нужный вам элемент (кнопка на сайте, поле для ввода или что-то другое) и выполняет указанное действие.

Как только нужный вам элемент появляется на странице, программа сразу приступит к следующему действию и не будет ждать пока страница загрузится на 100%

Осталось совсем не много, всё основное мы сделали.

Обернём весь код в try, чтобы не вылетали исключения

private void START_Click(object sender, EventArgs e)
        {
            IWebDriver web; //Это мы... Как бы проще сказать... Короче инициализируем наш веб драйвер

            string LOGIN = LOGINBOX.Text;   //Читаем в переменную LOGIN введенный логин
            string PASS = PASSBOX.Text;     //Читаем в переменную PASS введенный логин
            string THREAD = THREADBOX.Text; //Читаем в переменную THREAD введенное название темы
            string TEXT = TEXTBOX.Text;     //Читаем в переменную TEXT введенный текст для темы

            web = new ChromeDriver();       //В каком браузере будет работать наш бот, если лиса,
                                            //то нужно будет в NuGet скачать FireFox.WebDriver
                                            //и заменить эту строку на web = new FireFoxDriver();

            web.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20);

            try
            {
                //Теперь весь код пишем только тут



            }
            catch (Exception)
            {

  
            }

        }

Вспомним своё ТЗ, первым делом нам нужно зайти на сайт

web.Navigate().GoToUrl("https://vlmi.su");  //Переходим по URL

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

Топаем сюда

https://chrome.google.com/webstore/category/extensions?hl=ru

В поиске вбиваем XPath и устанавливаем первое приложение XPath Helper.

Когда установилось расщирение, пора узнать какой «код» соответствует кнопке «Войти» на сайте VLMI.su

Переходим на VLMI.su -> Нажимаем кнопки CTRL + SHIFT + X и откроется откно хелпера. Теперь зажимаем правый шифт и мышкой наводим на нашу кнопку «Войти»

Нам хелпер даёт такой код:

/html[@id='XenForo']/body/div[@class='xbOffCanvasContainer']/div[@class='xbBoxed']/div[@id='headerMover']/header/fieldset[@id='moderatorBar']/div[@class='pageWidth']/div[@class='pageContent']/div/div[@id='right_nav']/ul[@class='publicTabs loginBar']/li[@class='login Popup PopupControl PopupClosed PopupContainerControl']/a[@class='logbt']

Но это что-то дохуя длинный, давайте сократим его методом тыка:

Я оставлю только самую последнюю часть кода и напишу её в хелпер через двойной слеш

//a[@class='logbt']

Как видим мне повезло и найден только один элемент с этим кодом

Это и есть код кнопки войти, вот по этому коду и нужно нажать, делается в Selenium это так

web.FindElement(By.XPath("//a[@class='logbt']")).Click();   //Нажать по кнопке ВОЙТИ

Давайте немного разберем этот код:

FindElement — это командой мы говорим программе, что нужно найти элемент

ByXpath — это по какому локатору мы ищем элемент, в данном случаем мы ищем по XPath. Существует 10 разных локаторов. Например локатор By.LinkText ищет ссылку, в которой есть указанный текст. Еще очень популярен CssSelector, тут в помощь идёт гугл.

.Click() указывает на то, что по найденому элементу нужно нажать

Дальше всё делаем по логике. Нажали кнопку, смотри что появилось. Ага, появились поля для ввода логина и пароля. Нужно значит ввести логин и пароль. Делается это точно так же как предыдущая команда:

находим XPath поля логина

//input[@id='ctrl_pageLogin_login']

и XPath поля пароля

//input[@id='ctrl_pageLogin_password']

Вводим логин:

web.FindElement(By.XPath("//input[@id='ctrl_pageLogin_login']")).SendKeys(LOGIN);   //Вводим логин из переменной LOGIN, а переменная LOGIN считывает то, что мы вручную ввели в программе

Так же вводим пароль:

web.FindElement(By.XPath("//input[@id='ctrl_pageLogin_password']")).SendKeys(PASS); //По такому же принципу вводим пароль

А теперь немного пиздец, я забыл про то, что мы еще собирались вести логи, но ничего страшного, это всё исправляется очень быстро. Нужно каждую команду обернуть в try и если будет ошибка, то писать это в лог. В итоге должно получиться вот так:

private void START_Click(object sender, EventArgs e)
        {
            IWebDriver web; //Это мы... Как бы проще сказать... Короче инициализируем наш веб драйвер

            string LOGIN = LOGINBOX.Text;   //Читаем в переменную LOGIN введенный логин
            string PASS = PASSBOX.Text;     //Читаем в переменную PASS введенный логин
            string THREAD = THREADBOX.Text; //Читаем в переменную THREAD введенное название темы
            string TEXT = TEXTBOX.Text;     //Читаем в переменную TEXT введенный текст для темы

            web = new ChromeDriver();       //В каком браузере будет работать наш бот, если лиса,
                                            //то нужно будет в NuGet скачать FireFox.WebDriver
                                            //и заменить эту строку на web = new FireFoxDriver();

            web.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20);

            try
            {
                //Теперь весь код пишем только тут
                // + Environment.NewLine это означает перевести строку,
                //чтобы не писать всё в одну строчку

                try
                {
                    web.Navigate().GoToUrl("https://vlmi.su");  //Переходим по URL
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не удалось перейти по URL" + Environment.NewLine);
                }

                try
                {
                    web.FindElement(By.XPath("//a[@class='logbt']")).Click();   //Нажать по кнопке ВОЙТИ
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не удалось нажать на кнопку ВОЙТИ" + Environment.NewLine);
                }

                try
                {
                    web.FindElement(By.XPath("//input[@id='ctrl_pageLogin_login']")).SendKeys(LOGIN);   //Вводим логин из переменной LOGIN, а переменная LOGIN считывает то, что мы вручную ввели в программе
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не удалось ввести логин" + Environment.NewLine);
                }

                try
                {
                    web.FindElement(By.XPath("//input[@id='ctrl_pageLogin_password']")).SendKeys(PASS); //По такому же принципу вводим пароль
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не удалось ввести пароль" + Environment.NewLine);
                }



  
            }
            catch (Exception)
            {

  
            }

Теперь ошибок постараемся не делать и будем каждую команду обёртывать в try.

После ввода логина и пароля, хорошо бы нажать кнопку ВХОД, как это сделать вы уже должны уметь

try
                {
                    web.FindElement(By.XPath("//input[@class='button primary']")).Click();
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не удалось нажать кнопку ВОЙТИ" + Environment.NewLine);
                }
                }

После попадания на форум видим что XPath мягко говоря хуёво справляется со своей задачей и при помощи него нам вываливает аж 40 вариантов…

Хуйня вопрос, вместо XPath будем использовать By.LinkText (Текст ссылки) в этом случает это годится лучше всего

try
                {
                    web.FindElement(By.LinkText("Флудилка"));
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не нашли ФЛУДИЛКУ" + Environment.NewLine);

Теперь «охотимся» за кнопкой СОЗДАТЬ ТЕМУ. Как видим XPath и LinkText находят несколько вариантов. Тут можно пробовать использовать другие селекторы или как я ленивая жопа просто удлинить XPath

try
                {
                    web.FindElement(By.XPath("//div[@class='nodeListNewDiscussionButton']/a[@class='callToAction']")).Click();
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не нашли кнопку СОЗДАТЬ ТЕМУ" + Environment.NewLine);
                }

Вводим название темы:

try
                {
                    web.FindElement(By.XPath("//iframe[@class='redactor_textCtrl redactor_MessageEditor redactor_BbCodeWysiwygEditor redactor_']")).SendKeys(TEXT);
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не удалось ввести текст темы" + Environment.NewLine);
                }

Нажимаем кнопку СОЗДАТЬ ТЕМУ:

try
                {
                    web.FindElement(By.XPath("//dl[@class='ctrlUnit submitUnit'][1]/dd/input[@class='button primary']")).Click();
                }
                catch (Exception)
                {
                    //Эта команда сработает только в том случае, если будет ошибка в блоке try
                    //и запишет текст ошибки в окно программы
                    LOG.AppendText("Ошибка. Не удалось нажать кнопку создания темы" + Environment.NewLine);
                }

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

Бот работает немного криво, видимо пивко дало о себе знать.

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

=====================

Подписывайтесь на канал DarkD Сливы : https://telete.in/private_manual

Базы данных ФСБ/МВД (Сливы) : https://telete.in/joinchat/AAAAAFGLZjknYfJKHJRewA

Наш проект по накрутке в соц. сетях : https://telete.in/fastnakrutkaru

Подписывайте на канал DarkD-Shop : https://telete.in/dark_shop39

0 Пользователей и 1 Гость просматривают эту тему.

  • 3 Ответов
  • 912 Просмотров

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

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

Вам нужен iMacros для Firefox, это просто офигенная вещь. В свое время меня очень выручила, когда надо было опубликовать одинаковый пост в более, чем 100 группах ВК. Заказал у программиста макрос, который все за меня и сделал. Позже научился сам макросы писать, ничуть не жалею, навыки не раз пригодились.

Люди в интернете предлагают привести трафик на сайт(так сказать накрутить)… что это за трафик и как к нему отнесется Яндекс не известно. Интересно каким способом они приводят… Что у них за программы. Ну и конечно лучше свою написать, чтобы точно понимать как программ работает и какие действия выполняет…

аймакрос сейчас погуглю

« Последнее редактирование: 04.05.2018, 12:51:15 от oskokos »

Записан

0 / 0 / 0

Регистрация: 07.08.2021

Сообщений: 19

1

Создание бота, делающий автоматические действия на сайте

07.08.2021, 16:08. Показов 7783. Ответов 3


Всем добра. Есть намерение сделать бота, который будет на определенном сайте делать http запросы, к примеру авторизации, скачивания нужных данных в мою БД, короче все что можно вручную в обычном браузере. (Это же реализуемо, я не ошибаюсь?) Я вполной мере понимаю, что при моей неосторжности я могу на каком либо сайте улететь в бан. Но единственная на этот момент проблема — отсутствие любых источников знаний, искал вот так. Свободно владею C++ с Qt, а также «веб-кодингом» — JS с JQuery, HTML и CSS. Есть два пути, как я буду реализовывать бота — как скрипт к браузеру (как по мне он имеет большой плюс — беспаливность), либо в Qt (это такая оболочка для создания GUI интерфейса программе) через HTTP запросы (метод как я понимаю паливный из за отсутствия куков, и т.д.).
В любом из двух случаев не могу понять, как найти Ajax (скорее всего он будет использоваться, вместо стандартных PHP средств) скрипт.

Создание бота, делающий автоматические действия на сайте

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

Создание бота, делающий автоматические действия на сайте

Я короче запутался, я только делаю сайты, а не копаюсь в чужих. Прошу любые руководства / советы / средства / хоть что то.
P.S. Лучшего раздела не нашёл, свободное общение у меня почему то закрыт

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



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

  • нужно зайти туда
  • выбрать это
  • потом перейти сюда
  • нажать это

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

insolor's user avatar

insolor

44.4k15 золотых знаков52 серебряных знака92 бронзовых знака

задан 14 мая 2020 в 21:29

Prohorenko007's user avatar

1

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

import pyautogui as pg

# Получение позиции мыши и вывод в консоль
print(pg.position())

# Передвижение мыши
pg.move(50, 50, duration=0.5)
pg.moveTo('координаты') # Передвигаем к точке относительно экрана

# Нажатие мышкой по определенной точке
pg.click('координаты')
pg.doubleclick(769, 101) # двойное нажатие
pg.rightclick(769, 101) # нажатие правой кнопкой мыши
pg.leftclick(769, 101) # нажатие левой кнопкой мыши
# Ввод текста
pg.typewrite("ваш текст")
# Выполнения нажатия на клавишу
pg.typewrite(["enter"])

если помогло то сделайте этот ответ правильным

ответ дан 15 мая 2020 в 8:31

Ваш вопрос очень общий и не описывает конкретную проблему, поэтому и ответ Вам можно дать только общий.
Есть разные модули которые решают разные задачи, например, посмотрите https://pypi.org/project/requests/ или https://pypi.org/project/selenium/
Не забывайте, что Вы можете не только, воспроизводить действия пользователя, например: открыть сайт, нажать на окно ввода логин, ввести логин и т.д., но и в коде уже передавать нужные значения, например с помощью того же https://pypi.org/project/requests/

ответ дан 15 мая 2020 в 7:04

Nik-MnemoNik's user avatar

Понравилась статья? Поделить с друзьями:
  • Как написать программу для видеонаблюдения
  • Как написать программу для взлома вайфая
  • Как написать программу для взлоmа
  • Как написать программу для андроид на java
  • Как написать программу для автомойки