Как написать бота

Как написать бота

Как написать бота

Как написать бота

k0ttee » 01 сен 2017, 15:57

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

Никогда никому не говори, что ты умеешь переустанавливать Windows — задолбают просьбами!

Как написать бота

А теперь о том, как написать бота.

Все началось в браузере — плагинами, которые я уже умею писать. Запилил браузерный плагин, который каждые X минут делает пару кликов (собирает мне бонусы). Ну как такое не написать — ведь у раздающего нет капчи.

«Вкусно но мало» — подумал я, да запустил в работу сразу несколько вкладок (распараллеливание умножает профит). Но вот беда — браузерное безобразие дофига памяти занимает. Несколько приватных вкладок с разными OperaVPN’ами запустить не получилось, поэтому пришлось разворачивать виртуалки с линуксами.

Обычный аккаунт, работающий без проксей, крутился в Chrome (пошаманил вырубая лишнее):

[✓] процесс GPU, ускоряющий видосики дискретной видеокартой

[✓] утилита прокси-сервер V8, непонятно зачем вообще нужная

[✓] блокировщик рекламы, ибо роботу пофиг на рекламу

[✓] посредник Shockwave Flash, ибо это вообще не нужно

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

Как написать бота

Развернул три виртуалки (линуксы в контейнерах Virtual Box) и все. считай, что вся память забита.

Когда виртуалки уходили в подкачку — они дружно рушились.

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

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

Как написать бота

Но нашлось очень крутое решение — не пользоваться кучей вкладок, а общаться со скриптами на прямую (отправляя Post и Get запросы).

Может показаться, что мне пришлось чуть ли не написать свой браузер, но — нет. Оказалось, что для решения задачи подходит wGet или cUrl.

Сначала я собрался изобрести велосипед с консольным браузером Links2.

А вот с автоматизацией — вообще никак.

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

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

2.) написал команду отправляющую данные правильным методом в правильное место

3.) сохранил куки в файл, не забыв ключик для сохранения куков сессии

И заработало! И рега, и сбор, и выплаты — все автоматически. Памяти много не требует, данных передает жалкие килобайты. Ну просто красноглазый праздник какой-то.

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

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

Как написать бота

Если прикрутить быстрые и надежные прокси — будет ваще огонь. Но, с этим пока проблема — Быстрые и надежные прокси бесплатно

cUrl больше подходит для применения внутри php, поэтому я взял wGet и остальное написал на Bash (во имя проф-развития и на зло виндузятникам).

Какое-то долгое получилось вступление? Зато вы теперь знаете, что браузерные плагины забьют всю память.

Шаг 1 — пощупать поля

Не думаю, что стоит брать для примера форму авторизации/регистрации этого форума. Вдруг читатели тупо выполнят приведенный пример? Мы ведь не хотим мусорить на форуме и заставлять админа счищать после нас? Предлагаю взять для примера регу на гитхабе.

Если вы писали формы на своих сайтах, сможете пощупать и чужие. Ничего особо нового в этом нет.

Нащупываем в исходнике целевую форму, смотрим куда ведет её action и какой method отправляет данные.

В примере данные шлются методом post на адрес /join

Нащупываем все поля формы (логин, пароль, почта и прочее дерьмо). Имя переменной, которая берется из поля определена атрибутом name. Квадратные скобки говорят нам о том, что используется массив.

Переменными

name=»user» отправляет на сервер строку user

name=»password» отправляет на сервер строку password

Массивом

name=»user[login]» отправляет на сервер массив user (в котором есть элемент login)

name=»user[password]» отправляет на сервер массив user (в котором есть элемент password)

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

Соберите hidden поля. Может быть все заработает и без них, но на то поля и скрытые чтобы наводить палево на бота.

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

У меня получились эти текстовые поля (чем заполнять последнее — не понятно):

Код: Выделить всё type=»text» name=»user[login]»

type=»text» name=»user[email]»

type=»text» name=»user[password]»

type=»text» name=»required_field_ceb2″

И эти скрытые:

Код: Выделить всё type=»h

type=»h

type=»h

Шаг 2 — составить команду

Запрос без параметров до безобразия прост (можно без кавычек, но я предпочел с ними).

Код: Выделить всё wget «https://github.com/join»

Значения скрытых полей в отправляемые методом post переменные. Перечисление знаком «&» делается. (внутри post-data пробелы добавлены для визуальной читаемости строки, в рабочем варианте пробелов до и после знака «&» быть не должно).

Код: Выделить всё wget «https://github.com/join» —post-data=»timestamp=1504270860906 & timestamp_secret=c7e3837f35f6511a1bdc4173a65c33ac74588fa38afe3fa9e65f495136ef368e & source=form-home»

Теперь туда же добавляем массив user внутри которого строки login, email, password. (пробелы возле знака «&» добавлены для читаемости)

Код: Выделить всё wget «https://github.com/join» —post-data=»user <'login':'123','email':'123@123.12','password':'123'>& timestamp=1504270860906 & timestamp_secret=c7e3837f35f6511a1bdc4173a65c33ac74588fa38afe3fa9e65f495136ef368e & source=form-home»

А если куки уже получали и хотим их применить, это делается парой ключей (первый читает из файла, второй поддерживает сессионные куки).

Код: Выделить всё —load-cookies=cookies.txt —keep-session-cookies

Возможные проблемы: кроме отправки данных методом на адрес, нужно добавить юзер-агент и предусмотреть обмен кукисами.

Шаг 3 — поставить на рельсы

Теперь осталось написать «обертку» для циклического выполения, ну или повесить задачу на планировщик Cron.

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

Чтобы не мусорить, можно назначить вывод вникуда (обратите внимание что «o» заглавная)

Код: Выделить всё -O=/dev/null

Итог

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

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

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

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

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