Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Бот для Варваров или IdHTTP не переходим по нужной ссылке

-

Вопросы и ответы, обсуждения

- Ваши вопросы по Pascal/Delphi только в данном разделе

Ответ
 
Опции темы
Старый 15.01.2013, 22:23   #1
 Разведчик
Аватар для DDrim
 
DDrim никому не известный тип
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Бот для Варваров или IdHTTP не переходим по нужной ссылке

Здравствуйте! Делаю бота для игра Варвары (на этом форуме есть несколько тем по данной игре).
Бота делаю на компонентах Indy: IdHTTP + TIdCookieManager.
Все вроде бы отлично, бот успешно авторизируется, переходит почти по всем ссылкам.
Но вот проблема: при заходе к конкретному дракону (кто играл, тот поймет), на странице есть ссылка "Встать в очередь". Да к вот эта ссылка почему-то не нажимается (делаю GET-запрос). Т.е. возвращается страница, в которой ссылка "Встать в очередь" просто не нажата. Ответ сервера - 200 ОК.
Никак не могу понять, в чем дело. Ссылка "Встать в очередь" парситься точно правильно...
Вот мини-пример бота, который авторизируется в игре, переходит к дракону и пытается встать в очередь на его убийство.

Код:
const
  Barbars = 'http://barbars.ru/';

var
  Form1: TForm1;

  CurrentURL: AnsiString; // Текущая ссылка (где бот сейчас "находится")
  Code: AnsiString; // Весь html-код игры, который постоянно меняется

implementation

{$R *.dfm}

function Get2LinkTo1(ALink_1, ALink_2: AnsiString): AnsiString;
var
  i: Integer;
begin
  Result := '';

  if(ALink_1 = '') and (ALink_2 = '') then Exit;

  if(ALink_2 = '') then begin
    Result := ALink_1;
    Exit;
  end;

  if(ALink_1 = '') then begin
    Result := ALink_2;
    Exit;
  end;

  if(Copy(ALink_1, Length(ALink_1), 1) = '/') then
    ALink_1 := Copy(ALink_1, 1, Length(ALink_1) - Length('/'));

  While(Copy(ALink_2, 1, Length('../')) = '../') do begin
    for i:=Length(ALink_1) downto 1 do begin
      if(Copy(ALink_1, i, 1) <> '/') then Continue;
      ALink_1 := Copy(ALink_1, 1, i - 1);
      Break;
    end;

    Delete(ALink_2, 1, Length('../'));
  end;

    ALink_1 := ALink_1 + '/';
    
  Result := ALink_1 + ALink_2;
end;

procedure GET_Link(aLink: AnsiString);
var
  MS :TMemoryStream;
  ResHTML: TStringList;
begin
  if(aLink = '') then Exit;

  MS := TMemoryStream.Create;
  ResHTML := TStringList.Create;

  Try
    form1.IdHTTP1.Get(aLink, MS);
    CurrentURL := aLink;
    MS.Seek(0, 0);
    ResHTML.LoadFromStream(MS);
  Except
    on e : EIDHttpProtocolException do Begin
      if form1.IdHTTP1.ResponseCode = 302 then begin
        try
               // получаем новый адрес - адрес перенаправления
          CurrentURL := form1.IdHTTP1.Response.Location;
          form1.IdHTTP1.Get(CurrentURL, MS);

          MS.Seek(0, 0);
          ResHTML.LoadFromStream(MS);

        except
          on e:Exception do
        // предусматриваем, что исключение может возникнуть и тут
            ShowMessage('Ошибка при получении нового адреса.'+e.Message);
        end;
      end
      else
           //http 404, 501 и так далее
         ShowMessage('Ошибка другого вида, не 302:'+e.Message);
    end;

    on e:Exception do
       ShowMessage('Ошибка: ' + e.Message);
  end;

  Code := Utf8ToAnsi(ResHTML.Text);
end;

procedure InitBot(aLogin, aPassword: AnsiString);
var
  Data: TStringList;
begin
  Data := TStringList.Create;

  with form1 do begin
  IdHTTP1.AllowCookies := True;
  IdHTTP1.CookieManager := IdCookieManager1;
  IdHTTP1.HandleRedirects := True;

  IdHTTP1.Request.Host := 'barbars.ru';
  IdHTTP1.Request.UserAgent := 'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.61';
  IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
  IdHTTP1.Request.Accept := 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1';
  IdHTTP1.Request.AcceptLanguage := 'ru-RU,ru;q=0.9,en;q=0.8';
  IdHTTP1.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
  IdHTTP1.Request.Referer := Barbars;
  CurrentURL := Barbars;
  end;

  Data.Add('id1_hf_0');
  Data.Add('login=' + aLogin);
  Data.Add('password=' + aPassword);

  Try // Авторизируюсь:
      // Если логин или пароль не подходят:
    if(AnsiPos('Неверный ник или пароль', Utf8ToAnsi(Form1.IdHTTP1.Post('http://barbars.ru/login/wicket:interface/:1:loginForm::IFormSubmitListener::/', Data))) > 0) then begin
//      raise Exception.Create('Ошибка! Логин или пароль не подходят!' + #10#13 + 'Бот может работать не корректно!');
    end;

    CurrentURL := 'http://barbars.ru/login/wicket:interface/:1:loginForm::IFormSubmitListener::/';
  Except
    on e : EIDHttpProtocolException do Begin
      if e.ReplyErrorCode = 302 then begin
        try
               // получаем новый адрес - адрес перенаправления
          CurrentURL := form1.IdHTTP1.Response.Location;
          form1.IdHTTP1.Get(CurrentURL);
        except
          on e:Exception do
        // предусматриваем, что исключение может возникнуть и тут
            ShowMessage('Ошибка при получении нового адреса.'+e.Message);
        end;
      end
      else
           //http 404, 501 и так далее
         ShowMessage('Ошибка другого вида, не 302:'+e.Message);
    end;

    on e:Exception do
       ShowMessage('Ошибка: ' + e.Message);
  end;

  Data.Free;
end;

function ParsLinks(aNameLink: AnsiString; aHTMLCode: AnsiString): AnsiString;
var
  PosLink: Integer;
  i: Integer;
begin
  Result := '';
  if(aNameLink = '') or (aHTMLCode = '') then Exit;

  if(aNameLink = 'Пещерный стражник') then
    with tstringlist.Create do free;

  PosLink := AnsiPos(aNameLink, aHTMLCode);
  if(PosLink <= 0) then Exit;

  i := PosLink - 1;
  while(Copy(aHTMLCode, i, Length('="')) <> '="') do dec(i); // Нахожу индекс знаков =" перед ссылкой

  Result := Copy(aHTMLCode, i + Length('="'), PosEx('">', aHTMLCode, i + 1) - i - Length('="'));
end;

procedure CheckGame;
var
  BufLinkDragon: AnsiString; // Динамическая ссылка на драконов
begin
  GET_Link(Barbars);

  BufLinkDragon := ParsLinks('Пещеры и драконы', Code); // Вытаскиваем "вторую часть" ссылки
  BufLinkDragon := Get2LinkTo1(CurrentURL, BufLinkDragon); // Получаем полную ссылку на драконов
  GET_Link(BufLinkDragon); // Переходим по ссылке на драконов

  BufLinkDragon := ParsLinks('Пещерный стражник', Code); // Вытаскиваем "вторую часть" ссылки
  BufLinkDragon := Get2LinkTo1(CurrentURL, '../' + BufLinkDragon); // Получаем полную ссылку на нужного дракона
  GET_Link(BufLinkDragon); // Переходим по ссылке дракона

      // Нажимаем на ссылку "Встать в очередь":
  if(AnsiPos('Встать в очередь', Code) <= 0) then begin
    showmessage('дракон мертв!');
    exit;
  end;

      BufLinkDragon := ParsLinks('Встать в очередь', Code);
      BufLinkDragon := Get2LinkTo1(CurrentURL, '../' + BufLinkDragon);
      GET_Link(BufLinkDragon); // ВОТ ТУТ на ссылку бот почему-то не нажимает (ссылка точно правильная!)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  InitBot(Edit1.Text, Edit2.Text); // Авторизируемся...
    // Перехожу на главную страницу:
  GET_Link(Barbars);

  CheckGame; // Делаю проверку на драконов, поля и т.д.
end;
ЗЫ логин-пароль для теста не прилагаю, т.к. у меня только один аккаунт (и он основной).
Просто хотел бы понять причину, почему все ссылки нажимаются правильно, а именно ОДНА нет...

Добавлено через 8 минут
Если кто захотел скомпилировать код:
Код выше для Делфи 7.
Для Indy 9-10 (новые версии компонент) надо изменить ReplyErrorCode на ErrorCode и все отлично скомпилируется.

Последний раз редактировалось DDrim; 15.01.2013 в 23:00. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 17.01.2013, 21:39   #2
NoItemName
 Рыцарь
Аватар для J-Fobos
 
J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

А проверьте сниффером что отправляет браузер, а что отправляет ваш бот.
________________

В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
  Ответить с цитированием
Старый 18.01.2013, 00:16   #3
 Разведчик
Аватар для DDrim
 
DDrim никому не известный тип
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Да в том то и проблема... Что браузер отправляет тоже самое...
Я грешу на ошибки Indy компонент, особенно в плане кукисов... Но бот и браузер отправляют одни и теже запросы...
Пытаюсь сейчас переделать все под Synapse, только там даже авторизироваться не удается...)
  Ответить с цитированием
Старый 18.01.2013, 00:34   #4
 Старший сержант
Аватар для metraz
 
metraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядомmetraz в состоянии испепелить взглядом
Регистрация: 25.12.2011
Сообщений: 191
Популярность: 5259
Сказал(а) спасибо: 31
Поблагодарили 235 раз(а) в 135 сообщениях
Отправить сообщение для metraz с помощью Skype™
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

такого быть не может. Смотри заголовки.
  Ответить с цитированием
Старый 18.01.2013, 00:53   #5
 Разведчик
Аватар для DDrim
 
DDrim никому не известный тип
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Ну реально все тоже самое...
Авторизация же происходит... Переход по всем другим ссылкам тоже. А вот именно на эту ссылку не нажимает...
Там ссылка вида "http://barbars.ru/?wicket:interface=:4:actionPanel:joinQueueLink::IL inkListener::&amp;action=1358459294756" получается. Вызываем ее через GET, но страница нужная не приходит... Приходит такая же страница, только с новым id в конце ссылки (т.е. action меняется и все)...
  Ответить с цитированием
Старый 18.01.2013, 11:48   #6
NoItemName
 Рыцарь
Аватар для J-Fobos
 
J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Выкладывайте лог сниффера от браузера и от вашей программы, желательно ХТТПанал.
________________

В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
  Ответить с цитированием
Старый 18.01.2013, 14:15   #7
Заблокирован
 Пехотинец
Аватар для =PaLeTiZaToR=
 
=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса=PaLeTiZaToR= троюродный дядя Чака Норриса
Регистрация: 02.04.2011
Сообщений: 66
Популярность: 9953
Сказал(а) спасибо: 898
Поблагодарили 412 раз(а) в 209 сообщениях
Отправить сообщение для =PaLeTiZaToR= с помощью Skype™
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Цитата:
Сообщение от J-FobosПосмотреть сообщение
Выкладывайте лог сниффера от браузера и от вашей программы, желательно ХТТПанал.

Не извращайся над моей фантазией
  Ответить с цитированием
Старый 18.01.2013, 14:29   #8
 Разведчик
Аватар для DDrim
 
DDrim никому не известный тип
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Выложил в XML.
Правда там разные персонажи (в опере и в моей программе), но факт остается фактом: по ссылке "Встать в очередь" бот не переходит...
Открыть можно любым сниффером, например у меня HttpAnalyzerStdV6.
Вложения
Тип файла: zip Desktop.zip (25.8 Кб, 4 просмотров)
  Ответить с цитированием
Старый 18.01.2013, 20:12   #9
NoItemName
 Рыцарь
Аватар для J-Fobos
 
J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

=^PaLeTiZaToR^=, это уже показывает кто насколько испорчен)) Не я название этой проги придумал))


DDrim, разница есть, я думаю главная причина в этом

GET /?wicket:interface=:4:actionPanel:joinQueueLink::IL inkListener::&amp;action=1358508176435 HTTP/1.0
GET /?wicket:interface=:2:actionPanel:joinQueueLink::IL inkListener::&action=1358459665622 HTTP/1.1
________________

В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
  Ответить с цитированием
Старый 19.01.2013, 01:39   #10
 Разведчик
Аватар для DDrim
 
DDrim никому не известный тип
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Ну разницу тут я вижу только в добавлении приставки "&amp" в опере...
HTTP 1.0-1.1 в принципе не должно влиять...
Непонятно как-то...
  Ответить с цитированием
Старый 19.01.2013, 17:13   #11
NoItemName
 Рыцарь
Аватар для J-Fobos
 
J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

На что влияет параметр amp? И там еще разница interface=:4 и interface=:2. Да и HTTP 1.0/1.1 также может влиять, на комбатс.ру например была разница.
________________

В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
  Ответить с цитированием
Старый 20.01.2013, 04:16   #12
 Разведчик
Аватар для DDrim
 
DDrim никому не известный тип
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

interface=:4 и interface=:2 не как не влияет, т.к. ссылка генерируется игровым сервером и просто в опере было одно, а у меня в боте другое (т.е. там постоянно меняется числа от 1 до 4 вроде). А вот про amp я не знаю... Но и в нем вряд ли мне кажется...
  Ответить с цитированием
Старый 20.01.2013, 18:54   #13
NoItemName
 Рыцарь
Аватар для J-Fobos
 
J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(J-Fobos сломал счётчик популярности :(
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

А мне кажется именно в этом загвоздка. Почему в боте одно, а в опере другое?
________________

В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
  Ответить с цитированием
Старый 20.01.2013, 23:53   #14
 Разведчик
Аватар для DDrim
 
DDrim никому не известный тип
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Потому что именно игровой сервер генерирует ссылку и она и в опере тоже каждый раз разная...
Посмотрел, например в Хроме и IE параметра amp нету, но по ссылке переходит. Все остальное тоже самое, что и в боте... Никак понять не могу, прикол какой-то.
Единственное, почему может не переходить по ссылке (ИМХО), это глючные Indy компоненты (причем не последней версии). Очень многие жалуются на глючность этих компонент, вот может в этом все и заключается...
Но переделать пока под WinSock тоже не получается...
  Ответить с цитированием
Старый 21.01.2013, 08:45   #15
Заблокирован
 Сержант
Аватар для Relli
 
Relli скоро будет известенRelli скоро будет известенRelli скоро будет известенRelli скоро будет известенRelli скоро будет известен
Регистрация: 19.01.2011
Сообщений: 168
Популярность: 485
Сказал(а) спасибо: 123
Поблагодарили 67 раз(а) в 48 сообщениях
 
По умолчанию Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке

Цитата:
Сообщение от DDrimПосмотреть сообщение
Потому что именно игровой сервер генерирует ссылку и она и в опере тоже каждый раз разная...
Посмотрел, например в Хроме и IE параметра amp нету, но по ссылке переходит. Все остальное тоже самое, что и в боте... Никак понять не могу, прикол какой-то.
Единственное, почему может не переходить по ссылке (ИМХО), это глючные Indy компоненты (причем не последней версии). Очень многие жалуются на глючность этих компонент, вот может в этом все и заключается...
Но переделать пока под WinSock тоже не получается...

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


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Продам] Номера ICQ 6 7 8 9, большой выбор, подбор нужной маски на заказ blattt Товары/услуги в Сети 12 04.01.2015 13:25
[Скрипт] бот для варваров killerishe Общение и обсуждение прочих игр 3 12.11.2013 14:56
[Куплю] приватный брут для варваров zpelmen Товары/услуги в Сети 1 06.10.2012 23:16
Автогео,что он делает? Извините за создание не нужной темы! Sania98 Общение и обсуждение Perfect World 4 04.05.2012 09:11

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 02:42.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net