|
Бот для Варваров или IdHTTP не переходим по нужной ссылке - Вопросы и ответы, обсуждения - Ваши вопросы по Pascal/Delphi только в данном разделе |
15.01.2013, 22:23
|
#1
|
|
|
|
Разведчик
|
Регистрация: 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
|
|
|
|
Рыцарь
|
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
А проверьте сниффером что отправляет браузер, а что отправляет ваш бот.
________________
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
|
|
|
18.01.2013, 00:16
|
#3
|
|
|
|
Разведчик
|
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
Да в том то и проблема... Что браузер отправляет тоже самое...
Я грешу на ошибки Indy компонент, особенно в плане кукисов... Но бот и браузер отправляют одни и теже запросы...
Пытаюсь сейчас переделать все под Synapse, только там даже авторизироваться не удается...)
|
|
|
18.01.2013, 00:34
|
#4
|
|
|
|
Старший сержант
|
Регистрация: 25.12.2011
Сообщений: 191
Популярность: 5259
Сказал(а) спасибо: 31
Поблагодарили 235 раз(а) в 135 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
такого быть не может. Смотри заголовки.
|
|
|
18.01.2013, 00:53
|
#5
|
|
|
|
Разведчик
|
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
Ну реально все тоже самое...
Авторизация же происходит... Переход по всем другим ссылкам тоже. А вот именно на эту ссылку не нажимает...
Там ссылка вида "http://barbars.ru/?wicket:interface=:4:actionPanel:joinQueueLink::IL inkListener::&action=1358459294756" получается. Вызываем ее через GET, но страница нужная не приходит... Приходит такая же страница, только с новым id в конце ссылки (т.е. action меняется и все)...
|
|
|
18.01.2013, 11:48
|
#6
|
|
|
|
Рыцарь
|
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
Выкладывайте лог сниффера от браузера и от вашей программы, желательно ХТТПанал.
________________
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
|
|
|
18.01.2013, 14:15
|
#7
|
|
|
|
Пехотинец
|
Регистрация: 02.04.2011
Сообщений: 66
Популярность: 9953
Сказал(а) спасибо: 898
Поблагодарили 412 раз(а) в 209 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
|
|
|
18.01.2013, 14:29
|
#8
|
|
|
|
Разведчик
|
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
Выложил в XML.
Правда там разные персонажи (в опере и в моей программе), но факт остается фактом: по ссылке "Встать в очередь" бот не переходит...
Открыть можно любым сниффером, например у меня HttpAnalyzerStdV6.
|
|
|
18.01.2013, 20:12
|
#9
|
|
|
|
Рыцарь
|
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
=^PaLeTiZaToR^=, это уже показывает кто насколько испорчен)) Не я название этой проги придумал))
DDrim, разница есть, я думаю главная причина в этом
GET /?wicket:interface=:4:actionPanel:joinQueueLink::IL inkListener::&action=1358508176435 HTTP/1.0
GET /?wicket:interface=:2:actionPanel:joinQueueLink::IL inkListener::&action=1358459665622 HTTP/1.1
________________
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
|
|
|
19.01.2013, 01:39
|
#10
|
|
|
|
Разведчик
|
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
Ну разницу тут я вижу только в добавлении приставки "&" в опере...
HTTP 1.0-1.1 в принципе не должно влиять...
Непонятно как-то...
|
|
|
19.01.2013, 17:13
|
#11
|
|
|
|
Рыцарь
|
Регистрация: 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
|
|
|
|
Разведчик
|
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
interface=:4 и interface=:2 не как не влияет, т.к. ссылка генерируется игровым сервером и просто в опере было одно, а у меня в боте другое (т.е. там постоянно меняется числа от 1 до 4 вроде). А вот про amp я не знаю... Но и в нем вряд ли мне кажется...
|
|
|
20.01.2013, 18:54
|
#13
|
|
|
|
Рыцарь
|
Регистрация: 12.04.2009
Сообщений: 394
Популярность: 47903
Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
А мне кажется именно в этом загвоздка. Почему в боте одно, а в опере другое?
________________
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
|
|
|
20.01.2013, 23:53
|
#14
|
|
|
|
Разведчик
|
Регистрация: 30.03.2012
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
Потому что именно игровой сервер генерирует ссылку и она и в опере тоже каждый раз разная...
Посмотрел, например в Хроме и IE параметра amp нету, но по ссылке переходит. Все остальное тоже самое, что и в боте... Никак понять не могу, прикол какой-то.
Единственное, почему может не переходить по ссылке (ИМХО), это глючные Indy компоненты (причем не последней версии). Очень многие жалуются на глючность этих компонент, вот может в этом все и заключается...
Но переделать пока под WinSock тоже не получается...
|
|
|
21.01.2013, 08:45
|
#15
|
|
|
|
Сержант
|
Регистрация: 19.01.2011
Сообщений: 168
Популярность: 485
Сказал(а) спасибо: 123
Поблагодарили 67 раз(а) в 48 сообщениях
|
Re: Бот для Варваров или IdHTTP не переходим по нужной ссылке
|
Цитата: |
|
|
|
|
|
|
|
|
|
Потому что именно игровой сервер генерирует ссылку и она и в опере тоже каждый раз разная...
Посмотрел, например в Хроме и IE параметра amp нету, но по ссылке переходит. Все остальное тоже самое, что и в боте... Никак понять не могу, прикол какой-то.
Единственное, почему может не переходить по ссылке (ИМХО), это глючные Indy компоненты (причем не последней версии). Очень многие жалуются на глючность этих компонент, вот может в этом все и заключается...
Но переделать пока под WinSock тоже не получается...
|
|
|
|
|
|
Инди работает на ура,где-то у вас ошибка. Вы проверьте,может этот интерфейс не рандомен,а задается серыером ,дело в коде,а не инди....
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 02:42.
|
|