Как я могу сделать LWP :: UserAgent похожим на другой браузер? - PullRequest
8 голосов
/ 23 января 2010

Это мой первый пост на ТАК, так что будьте осторожны. Я даже не уверен, принадлежит ли это здесь, но здесь идет.

Я хочу получить доступ к некоторой информации в одной из моих личных учетных записей. Сайт плохо написан и требует, чтобы я вручную вводил дату, для которой я хочу получить информацию. Это действительно боль. Я искал предлог, чтобы узнать больше Perl, поэтому я подумал, что это будет отличная возможность. Я планировал написать Perl-скрипт, который будет входить в мою учетную запись и запрашивать информацию для меня. Тем не менее, я застрял довольно быстро.

my $ua = LWP::UserAgent->new;
my $url = url 'https://account.web.site';
my $res = $ua->request(GET $url);

Полученная веб-страница в основном говорит, что мой веб-браузер не поддерживается. Я пробовал несколько различных значений для

$ua->agent("");

но ничто, похоже, не работает. Google-тур предлагает этот метод, но он также говорит, что Perl используется по злонамеренным причинам на веб-сайтах. Блокируют ли веб-сайты этот метод? Возможно ли то, что я пытаюсь сделать? Есть ли другой язык, который был бы более подходящим? То, что я пытаюсь сделать, даже легально или даже хорошая идея? Может быть, я должен просто отказаться от своих усилий.

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

РЕДАКТИРОВАТЬ: В FireFox я отключил JavaScript и CSS. Я только что вошел в систему без ошибки «Несовместимый браузер». Кажется, это не проблема JavaScript.

Ответы [ 8 ]

7 голосов
/ 24 января 2010

Получение другой веб-страницы со соскобом

Мы должны сделать одно предположение, что веб-сервер вернет тот же вывод, если будет дан тот же ввод. С этим предположением мы неизбежно приходим к выводу, что мы не даем ему тот же вклад. В этом сценарии есть два браузера или http-клиентов: тот, который дает желаемый результат (например, Firefox, IE, Chrome или Safari), и тот, который не дает вам желаемый результат (напр., LWP, wget или cURL).

Сначала убей легкие возможности

Прежде, прежде чем продолжить, прежде всего убедитесь, что простые UserAgents совпадают, вы можете сделать это, перейдя по адресу whatsmyuseragent.com и установив строку UserAgent в заголовке другого браузера, чтобы все, что возвращает этот сайт. Вы также можете использовать Firefox Панель инструментов веб-разработчика , чтобы отключить CSS, JavaScript, Java и мета-перенаправления: это поможет вам отследить проблему, убив действительно простые вещи.

Теперь попытайтесь продублировать работающий браузер

Теперь с Firefox вы можете использовать FireBug для анализа REQUEST, который отправляется. Вы можете сделать это на вкладке NET в FireBug, в разных браузерах должны быть инструменты, которые могут делать то же, что FireBug с FireFox; однако, если вы не знаете, о каком инструменте идет речь, вы все равно можете использовать tshark или wireshark , как описано ниже. Важно отметить, что tshark и wireshark всегда будут более точными, поскольку они работают на более низком уровне, что, по крайней мере в моем опыте, оставляет меньше места для ошибок. Например, вы увидите такие вещи, как мета-перенаправления, которые выполняет браузер, которые иногда FireBug может потерять.

После того, как вы поймете, что первый веб-запрос работает, сделайте все возможное, чтобы установить второй веб-запрос на первый. Под этим я подразумеваю правильную настройку заголовков запроса и других элементов запроса. Если это все еще не работает, вы должны знать, что делает второй браузер, чтобы увидеть, что не так.

Устранение неполадок

Чтобы устранить эту проблему, мы должны иметь полное представление о запросах от обоих браузеров. Второй браузер обычно обманщик, это часто библиотеки и неинтерактивные браузеры командной строки, у которых нет возможности проверить запрос. Если у них есть возможность отклонить запрос, вы все равно можете просто проверить их. Для этого я предлагаю wireshark и tshark suite . Сразу же вы должны быть предупреждены, потому что они работают ниже браузера. По умолчанию вы увидите фактические сетевые (IP) пакеты и кадры канала передачи данных. Вы можете отфильтровать то, что вам нужно, с помощью такой команды.

sudo tshark -i <interface> -f tcp -R "http.request" -V |
perl -ne'print if /^Hypertext/../^Frame/'

Это будет захватывать все TCP-пакеты, отображать-фильтровать только http.requests, затем Perl-фильтровать только для HTTP уровня 4. Возможно, вы захотите добавить фильтр отображения, чтобы захватить только один веб-сервер тоже -R "http.request and http.host == ''"

Вы захотите проверить все, чтобы убедиться, что два запроса совпадают: куки, GET URL, пользовательский агент и т. Д. Убедитесь, что сайт не делает глупостей.

Обновлено 23 января 2010 г. : Исходя из новой информации, я бы предложил установить Accept и Accept-Language, Accept-Charset и Accept-Encoding. Вы можете сделать это с помощью $ua->default_headers(). Если то, что вам требуется, намного больше функциональности из вашего пользовательского агента, вы всегда можете создать его подкласс. Я использовал этот подход для своего API GData, вы можете найти мой пример подкласса UserAgent на github .

4 голосов
/ 23 января 2010

Вам, вероятно, следует взглянуть на WWW :: Mechanize , который является подклассом LWP :: UserAgent , ориентированным на такого рода автоматизацию веб-сайтов. В частности, см. Метод agent_alias .

Некоторые веб-сайты блокируют соединения на основе User-Agent, но вы можете установить для него любое значение, используя Perl. Возможно, что веб-сайт может также искать другие заголовки запросов, обычно генерируемые определенным браузером (например, заголовок Accept), и отклонять соединения, которые их не включают, но вы также можете добавить эти заголовки, если выясните, что он ищет .

Как правило, веб-сайт не может запретить другому клиенту выдавать себя за поддерживаемый браузер. Независимо от того, что он ищет, вы можете в конечном итоге скопировать его.

Также возможно, что он ищет поддержку JavaScript. В этом случае вы можете взглянуть на WWW :: Scripter , который является подклассом WWW :: Mechanize, который добавляет поддержку JavaScript. Это довольно новое, и я еще не пробовал.

2 голосов
/ 17 января 2012

Эта тема почти наверняка не касается простого изменения пользовательского агента.

Я вижу два пути. Либо мы можем поэкспериментировать с отключением javascript и css в браузере и узнать больше о том, как попасть в объекты HTTP :: Request и HTTP :: Response, полагаясь на LWP :: UserAgent, либо перейти к WWW :: Scripter и использовать javascript.

Просто в неформатированных текстовых объявлениях Craigslist есть три страницы плотно упакованного, почти свободного от места javascript и css, а затем они загружают больше и специализированный код, так что если я приду по comcast, то найду специальный javascript, просто нацеленный Пользователи Comcast, был загружен в последнюю страницу. Они пытаются это сделать, пытаясь взломать роботов, поместив код в HEAD, который анализирует различия между HTML 1.0 и 1.1 и говорит: «О, что-то немного не так, вам нужно обновить http, а затем убрать вас» с дополнительным кодом для отслеживания isp и кто что знает, информация о cookie-файлах (вы можете распечатывать cookie-файлы на каждом шагу, когда узнаете, как замедлить LWP, и вставить код обратного вызова для отслеживания, например * shark, но внутри perl, также посмотрите, как сервер продолжает пытаться изменить «ваши» заголовки и «ваш» запрос - пересмотреть «ваш» запрос - о, вы не хотите покупать дешевый автомобиль, вы хотите купить Maserati и заложить свой дом, чтобы сделать это, то есть подглядывать ваш провайдер и почему не ваши контакты и вся ваша история гугл !!! кто знает?!).

CL помещает случайный идентификационный номер в ГОЛОВУ Алисы, затем шепчет, что вам нужен http-запрос, чтобы проглотить красную таблетку, и перестаньте прятать ее под языком. Таким образом, большинство роботов душат и принимают поддельную продезинфицированную страницу, то есть усеченную «домашнюю страницу». Кроме того, если я соскребаю URL-адреса со страницы, я не могу «щелкнуть» по ним с помощью LWP, потому что я никогда не узнал свой идентификатор, и при этом я не научился javascript для повторного создания идентификатора в javascript до того, как $ ua-> get ($ url & ID = 9dd887f8f89d9 "); или, может быть, простой get будет работать с & ID. Это намного больше, чем User Agent, но вы можете сделать это, и вы получаете всю необходимую помощь от

Как видите, первый путь - это отключить все это и посмотреть, сможете ли вы узнать URI вашего запроса с пересмотренным соглашением, а не исходный URL, а URI. Тогда получите это, ни JavaScript, ни WWW :: Scripter. Похоже, LWP будет работать для вас. Я хотел бы услышать больше об изменении ACCEPT в default_header изначально и о том, говорит ли сервер, о, вы имеете в виду ПРИНЯТЬ то и это, и это, проглотить красную таблетку в объекте запроса повторного согласования. Вы можете отследить это, вставив обратные вызовы в диалоге запроса и ответа.

Второй путь, WWW :: Scripter, возможен только в том случае, если мы решили проглотить красную таблетку и спуститься по Матрице Кроличьей норы Алисы. Философия Perl требует исчерпания других возможностей, прежде чем работать усерднее. В противном случае, мы бы не узнали наши предварительные требования к 101 http, так что переход к большему молоту был бы именно этим, или сбросить кислоту для аспирина, или нет?

0 голосов
/ 06 апреля 2014

добавление части реферера сделало так, чтобы она работала у меня:

$req = HTTP::Request->new(GET => $url);
$req->header(Accept => "text/html, */*;q=0.1", referer => 'http://google.com');
$res = $ua->request($req);
print $res->status_line;
0 голосов
/ 28 сентября 2013

Я только что заметил что-то. Эта строка:

my $res = $ua->request(GET $url);

Это не работает на моей машине вообще. Но я заставил его работать, изменив его на:

my $res = $ua->get($url);
0 голосов
/ 02 августа 2011

Ваш Perl-скрипт работает на той же машине, что и браузер Firefox, на который вы ссылаетесь? Это может быть фильтрация на основе подсети или входящего IP-адреса. Ваш URL-адрес https, поэтому в вашем браузере также может быть загружен PSK (предварительный общий ключ) или сертификат, ожидаемый сервером. Чрезвычайно маловероятно, что за пределами внутреннего корпоративного сайта компании.

0 голосов
/ 03 февраля 2010

Инструменты: Firefox с TamperData и LiveHTTPHeaders, Devel :: REPL, LWP.

Анализ: в браузере отключите Javascript и Java, удалите все файлы cookie с целевого веб-сайта, запустите ведение журнала TamperData, войдите на веб-сайт. Остановите ведение журнала TamperData и просмотрите множество запросов, которые вы, вероятно, сделали во время входа в систему. Найдите первый запрос (тот, который вы сделали специально) и посмотрите его детали.

Экспериментирование: Запустите re.pl и начните заново создавать взаимодействие браузера.

use LWP::UserAgent;

my $ua = LWP::UserAgent->new(
  agent      => $the_UA_of_the_browser,
  cookie_jar => HTTP::Cookies->new(hide_cookie2 => 1),
);
$ua->default_headers(HTTP::Headers->new(
  %the_headers_sent_by_the_browser,
));

my $r = $ua->get($the_URL);
$r->content($r->decoded_content); print $r->as_string;

Итак, это первый шаг. Если вы получили несоответствующие ответы в любой момент, вы сделали что-то не так. Обычно вы можете [1] выяснить, что, посмотрев на $r->request и сравнив с запросом, отправленным Firefox. Важно помнить, что магии нет, и вы знаете все, что знает сервер. Если вы не можете получить один и тот же ответ на один и тот же запрос, вы что-то пропустили.

Добраться до первой страницы обычно недостаточно. Скорее всего, вам нужно будет проанализировать формы (с помощью HTML::Form), выполнить перенаправления (как настроено выше, UA делает это автоматически, но иногда это платит, чтобы отключить это и сделать это вручную), и попытаться перепроектировать странный Взломанный логин из самых простых подсказок. Удачи.

[1]: За исключением некоторых ошибок в реализации файлов cookie LWP, которые я не буду здесь подробно описывать. И даже тогда вы можете заметить это, если знаете, что ищете.

0 голосов
/ 24 января 2010

Я пробовал несколько различных значений для

$ ua-> агент ( "");

но ничего не работает.

Ну, не могли бы вы рассказать нам, что это были за вещи, которые вы пробовали?

Что я обычно делаю, это типа

javascript:prompt('your agent string is',navigator.userAgent)

в адресной строке моего обычного браузера нажмите ввод, вырежьте и вставьте то, что он мне говорит. Конечно, использование wireshark и мониторинг реальных пакетов - это излишне? Веб-сайт, на который вы пытаетесь попасть, не может знать, что вы используете Perl. Просто скажите ему все, что он ожидает услышать.

...