Как может я делать LWP:: UserAgent похожи на другой браузер?

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

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

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

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

$ua->agent("");

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

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

Править: В FireFox я отключил JavaScript и CSS. Я вошел в систему очень хорошо без "Несовместимого браузера" ошибка. Это, кажется, не проблема JavaScript.

8
задан xenoterracide 19 August 2010 в 06:40
поделиться

4 ответа

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

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

Убить легкие возможности сначала

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

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

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

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

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

Для того, чтобы это исправить, мы должны иметь полное понимание запросов от обоих браузеров. Второй браузер обычно является триккером, это часто библиотеки и неинтерактивные браузеры командной строки, в которых отсутствует возможность проверить запрос. Если у них есть возможность сбросить запрос, вы все равно можете просто проверить их в любом случае. Для этого я предлагаю набор wireshark и tshark. Немедленно предупредите об этом, так как они работают под браузером. По умолчанию вы увидите действительные сетевые (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 и http.host == ''"

Вы захотите проверить все, чтобы убедиться, что эти два запроса стоят в очереди, cookies, GET url, user-agent и т.д. Убедитесь, что сайт не делает ничего глупого.

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

7
ответ дан 5 December 2019 в 12:58
поделиться

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

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

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

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

4
ответ дан 5 December 2019 в 12:58
поделиться

См. «Обозначенный инициализатор» в справочном документе.

-121--3207983-

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

$ ua-> Agent («»);

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

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

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

JavaScript: Подскажите («Строка вашего агента», Navigator.UserAgent)

в мой Регулярное брусьте браузера URL, нажмите Enter, и вырезать и вставить то, что он говорит мне. Несомненно, используя прослушивание и мониторинг фактических пакетов - это сверхугольника? Сайт, который вы пытаетесь добраться до того, чтобы знать, что вы используете Perl. Просто скажи ему, что он ожидает услышать.

0
ответ дан 5 December 2019 в 12:58
поделиться

Инструменты: 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
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: