Первое сентября 2017 - очередной день знаний, в котором знаний нет. Позалипать на линейке, посетить организационное дерьмо, получить учебники и пролистав картинки забить на них. Сам себе "день знаний" не устроишь - никто не устроит.
Никогда никому не говори, что ты умеешь переустанавливать Windows - задолбают просьбами! :hihi: А теперь о том,
как написать бота.
Все началось в браузере - плагинами, которые я уже умею писать. Запилил браузерный плагин, который каждые X минут делает пару кликов (собирает мне бонусы). Ну как такое не написать - ведь у раздающего нет капчи.
"Вкусно но мало" - подумал я, да запустил в работу сразу несколько вкладок (распараллеливание умножает профит). Но вот беда - браузерное безобразие дофига памяти занимает. Несколько приватных вкладок с разными OperaVPN'ами запустить не получилось, поэтому пришлось разворачивать виртуалки с линуксами.
Обычный аккаунт, работающий без проксей, крутился в Chrome (пошаманил вырубая лишнее):
[✓] процесс GPU, ускоряющий видосики дискретной видеокартой
[✓] утилита прокси-сервер V8, непонятно зачем вообще нужная
[✓] блокировщик рекламы, ибо роботу пофиг на рекламу
[✓] посредник Shockwave Flash, ибо это вообще не нужно
На момент написания статьи обычный аккаунт уже вертится на основе wGet, при этом Chrom вообще не запущен.
Развернул три виртуалки (линуксы в контейнерах Virtual Box) и все... считай, что вся память забита.
Когда виртуалки уходили в подкачку - они дружно рушились.
Ночью, когда я сплю и ничего кроме ботов не запущено - памяти хватало. Днем, когда я пользуюсь, приходилось счищать кэш в памяти перед запуском софта.
Как вы наверное догадались, я получил комп зарабатывающий деньги, на котором не желательно было делать что-то еще... И был этим опечален. :(
Но нашлось очень крутое решение - не пользоваться кучей вкладок, а общаться со скриптами на прямую (отправляя Post и Get запросы).
Может показаться, что мне пришлось чуть ли не написать свой браузер, но - нет. Оказалось, что для решения задачи подходит wGet или cUrl.
Сначала я собрался изобрести велосипед с консольным браузером Links2...
Регался так
Логинился так
А вот с автоматизацией - вообще никак.
Запросы напрямую к скриптам оказалось даже проще, чем написание браузерного плагина:
1.) пощупал форму (узнал какие данные, каким методом и куда с нее отправляются)
2.) написал команду отправляющую данные правильным методом в правильное место
3.) сохранил куки в файл, не забыв ключик для сохранения куков сессии
И заработало! И рега, и сбор, и выплаты - все автоматически. Памяти много не требует, данных передает жалкие килобайты. Ну просто красноглазый праздник какой-то.
Местами, конечно, придется порыться в чужом мерзком коде и понять логику "что куда велосипедит". Зато когда все заработает - пойдет профит.
В отличие от браузерного плагина, такую шарманку можно вертеть и на домашнем компе и на сервере, а памяти она занимает жалкие килобайты. :friends:
Если прикрутить быстрые и надежные прокси - будет ваще огонь. Но, с этим пока проблема -
Быстрые и надежные прокси бесплатноwGet или cUrl
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="hidden" name="timestamp" value="1504270860906"
type="hidden" name="timestamp_secret" value="c7e3837f35f6511a1bdc4173a65c33ac74588fa38afe3fa9e65f495136ef368e"
type="hidden" name="source" value="form-home"
Шаг 2 - составить командуЗапрос без параметров до безобразия прост (можно без кавычек, но я предпочел с ними).
wget "https://github.com/join"
Значения скрытых полей в отправляемые методом post переменные. Перечисление знаком "&" делается. (внутри post-data пробелы добавлены для визуальной читаемости строки, в рабочем варианте пробелов до и после знака "&" быть не должно).
wget "https://github.com/join" --post-data="timestamp=1504270860906 & timestamp_secret=c7e3837f35f6511a1bdc4173a65c33ac74588fa38afe3fa9e65f495136ef368
e & 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=c7e3837f35f6511a1bdc4173a65c33ac74588fa38afe3fa9e65f495136ef368
e & source=form-home"
Чтобы закосить под браузер, нужно добавить юзер агент
wget "https://github.com/join" -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" --post-data="user{'login':'123','email':'123@123.12','password':'123'} & timestamp=1504270860906 & timestamp_secret=c7e3837f35f6511a1bdc4173a65c33ac74588fa38afe3fa9e65f495136ef368
e & source=form-home"
И еще надо бы принять кукисы (их примем в файл cookies.txt)
wget "https://github.com/join" --save-cookies=cookies.txt -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" --post-data="user{'login':'123','email':'123@123.12','password':'123'} & timestamp=1504270860906 & timestamp_secret=c7e3837f35f6511a1bdc4173a65c33ac74588fa38afe3fa9e65f495136ef368
e & source=form-home"
А если куки уже получали и хотим их применить, это делается парой ключей (первый читает из файла, второй поддерживает сессионные куки).
--load-cookies=cookies.txt --keep-session-cookies
Возможные проблемы: кроме отправки данных методом на адрес, нужно добавить юзер-агент и предусмотреть обмен кукисами.
Шаг 3 - поставить на рельсыТеперь осталось написать "обертку" для циклического выполения, ну или повесить задачу на планировщик Cron.
Возможные проблемы: чтобы повесить задачу на Cron следует использовать или абсолютные пути в скрипте или в начале скрипта перейти в нужное место, иначе работа пойдет не в той директории и создаст груду файлов.
Чтобы не мусорить, можно назначить вывод вникуда (обратите внимание что "o" заглавная)
-O=/dev/null
ИтогСложный сайт я выбрал для примера. Я так и не понял откуда брать данные для одного скрытого поля, а возиться с ним мне не интересно.
Самая большая проблема
Самая большая проблема это не капча. На вопрос "как написать бота" у меня возникает встречный вопрос "для чего его писать". Самое главное - найти места, где можно собирать бонусы или накручивать профит.
Если капча есть только на входе - можно залогиниться вручную (через браузер), затем взять из браузера куки и подставить такой же как у браузера юзер-агент.