Вход на веб-сайт, требующий другого веб-сайта

Я использовал Perl-модуль WWW::Mechanize, чтобы попытаться войти на веб-сайт, требующий аутентификации Steam. До сих пор мне удавалось успешно перейти на страницу входа, но как только я отправляю свою форму, она, похоже, вообще не работает. Когда форма отправлена, содержимое страницы не меняется, как если бы я не смог войти в систему, и он хочет, чтобы я повторил попытку. Я искал несколько часов и пробовал множество различных комбинаций установки полей формы и отправки текста, но ничего не работает. По какой-то причине я мало что нашел о проверке того, может ли Mechanize видеть, сработал ли вход в систему или нет. Возможно, мои условия поиска не очень хороши.

Вот код, который я получил до сих пор. Для этого нужно перейти к форме входа в tf2wh, которая перенаправляет на страницу входа в Steam, заполнить имя пользователя/пароль, нажать кнопку, а затем вернуться в tf2wh с сеансом входа, сохраненным в файлах cookie. Тем не менее, единственная часть, которая работает, — это начальное перенаправление входа в систему.

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;

my $user = "my_username";
my $pass = "my_password";
my $uri = 'http://www.tf2wh.com/?login';
my $cookies = 'cookies.txt';
my $agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';

my $mechanize = WWW::Mechanize->new(
    agent => $agent,
    cookie_jar => {},
    autosave => 1,
    ignore_discard => 1);

$mechanize->add_header(
    "Connection" => "keep-alive",
    "Keep-Alive" => "115");

$mechanize->get( $uri );

$mechanize->success or die "Could not fetch login page.\n";

#One of many different forms I've tried
$mechanize->form_name('login');
$mechanize->set_visible($user, $pass);
$mechanize->click();
$mechanize->follow_link();

$mechanize->success or die 'Could not login.';

print "Logged in successfully! Trying to look at TF2WH now.\n";

#Test to see if we get the "You need to login" message
$mechanize->get('http://www.tf2wh.com/item.php?id=6011;6;78e2c5962db56a60f7c143a12875f3b6');

print "Fetched\n";

if($mechanize->text() =~ m{Handy Hint:})
{
    print "Failed to login.\n";
}
else
{
    print "Up and running!";
}

person ozdrgnaDiies    schedule 18.11.2012    source источник
comment
Я бы предложил использовать Wireshark, чтобы сравнить ваш собственный запрос с запросом, отправленным Steam.   -  person mzedeler    schedule 18.11.2012


Ответы (1)


Возможно, вам потребуется распространить некоторые заголовки Steam.

Все решения единого входа полны причуд.

Возможно, вам повезет найти в Steam руководство для разработчиков, в котором описывается, как использовать их систему аутентификации/аутентификации в «вашей игре».

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

person Len Jaffe    schedule 19.11.2012
comment
Я должен изучить это, но пока это выглядит не очень хорошо. Я бы не хотел придумывать всевозможные хакерские обходные пути для простого парсера страниц. Спасибо за информацию. - person ozdrgnaDiies; 20.11.2012
comment
По моему опыту, хакерские обходные пути являются частью территории, когда вы пишете экранные скребки на основе LWP/Mech. Ваши фундаментальные предположения остаются в силе только до тех пор, пока кто-нибудь не обновит страницу. Раньше страницы обновлялись не так часто, потому что бизнес-менеджеры понятия не имели, что делать с Интернетом. Но вы могли рассчитывать на то, что они изменят его через неделю после того, как вы передали обслуживание программы новому парню, который достаточно хорошо знал Perl, но не провел последние две недели, выясняя каждый нюанс страниц, которые вы очищаете. :-) - person Len Jaffe; 20.11.2012