Новый логин Вконтакте — Perl, Curl

Собственно, уже не мудрствуя лукаво — кто хоть немного знает перл — разберётся.

Вконтакте добавили редиректики, что не помешает доблестному Curl через них пройти и получить куку в файл.

#!/usr/bin/perl -w
use strict;
use WWW::Curl::Easy;
use Carp;

sub getURL {
  my $params = shift;

  croak q[HASH needed as param] if ref ($params) ne 'HASH';
  croak q[HREF needed in HASH] if (!exists ($params->{href}));

  $params->{href} = q[http://].$params->{href} if $params->{href} !~ /^http (s)?:\/\//;
  
  my $result = 'false';
  open my $oldout, «>&STDOUT» or die «Can't dup STDOUT: $!»;

  close STDOUT;
  open STDOUT, «> /dev/null»;
  my $retcode;

  my $curl;
  {
    $curl = new WWW::Curl::Easy;
    $curl->setopt (CURLOPT_URL, $params->{href});
    $curl->setopt (CURLOPT_USERAGENT,q[q[Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6]]);
    $curl->setopt (CURLOPT_POST,1) if $params->{post};
    $curl->setopt (CURLOPT_POSTFIELDS,$params->{post}) if $params->{post};
    $curl->setopt (CURLOPT_COOKIEJAR, $params->{cookie_file}) if $params->{cookie_file};
    $curl->setopt (CURLOPT_COOKIEFILE, $params->{cookie_file}) if $params->{cookie_file};
    $curl->setopt (CURLOPT_FOLLOWLOCATION,1);
    open (my $tmp_for_curl, ">", \$result);
    $curl->setopt (CURLOPT_FILE,$tmp_for_curl);
    $retcode = $curl->perform;
  }

  close STDOUT;
  open STDOUT, «>&», $oldout or die «Can't dup \$oldout: $!»;

  return {
        content         => $result,
        retcode         => $retcode,
        http_code        => $curl->getinfo (CURLINFO_HTTP_CODE),
        effective_url      => $curl->getinfo (CURLINFO_EFFECTIVE_URL),
        content_type      => $curl->getinfo (CURLINFO_CONTENT_TYPE)
      };
}

my $login     =  q[your@email];
my $password    =  q[password];
my $cookie_file  =  q[./cookie_file]
$login       =~  s/@/%40/;
my $result     =  getURL ({
                href => q[http://vkontakte.ru/login.php],
                post => qq[op=>a_login_attempt&email=$login&pass=$password&expire=0],
                cookie_file => $cookie_file
            });

13 комментариев

  1. frezer:

    Спасибо. Попозже гляну и протестирую.

    //

    В старой версии имеет смысл в самом посте написать, что не работает больше и сюда поставить ссылку, так как я пришёл сюда через Яндекс, а там та тема на втором месте в выдаче по такому запросу «логин вконтакте Perl», а если добавить ещё слово «скрипт», то вообще на первом.

  2. ClanMax:

    Ругается на open my $oldout, «>&STDOUT» or die «Can't dup STDOUT: $!»;

    Unrecognized character \xC2 at ./cookies.pl line 15.

    В чем проблема?

  3. ewindt:

    скачал с cpan.org модуль curl

    копирнул каталог WWW со всем содержимым в perl\lib

    в скрипт пишу:

    use WWW::Curl::Easy;

    но компиляция вываливается на 9-й строке в www\curl\easy.pm:

    use WWW::Curl ();

    можете помочь?

  4. justnoxx:

    Да вы, я посмотрю, психи=)

    Пример логина вконтакта, сваял минут за 15, стало интересно, в чем проблема.

    Собсна код:

    [code]

    #!/usr/bin/perl

    use strict;

    use WWW::Mechanize;

    use Compress::Zlib;

    use Text::Iconv;

    sub decodeContent{

    my $content=shift;

    my $decodedContent;

    if ($decodedContent=Compress::Zlib::memGunzip ($content)){

    $content=$decodedContent;

    }

    return $content;

    }

    my $url='http://vk.com';

    my $mech=WWW::Mechanize->new ();

    $mech->add_header (agent => 'Mozilla/5.0');

    $mech->get ($url) or die («invalid request\n»);

    my $content=decodeContent ($mech->response->content ());

    #print $content;

    $content=~/charset=([\w\d\-]*)/gis;

    print 'charset:',$1,"\n";

    my $charset=$1;

    $mech->submit_form (

    form_name => 'login',

    fields => {

    email => 'my@e.mail',

    pass=>'pass',

    act=>'login',

    q=>'1',

    al_frame=>'1',

    expire=>'',

    captcha_sid=>'',

    captcha_key=>'', },

    );

    my $current=Compress::Zlib::memGunzip ($mech->response->content ());

    $current=~/onlogindone\('(.*?)'\)/is;

    print «\n»,'login:',$1,"\n";

    my $username=$1;

    my $urlnext=$url.$1;

    $mech->get ($urlnext);

    my $page=$mech->response->content ();

    if (my $decodedPage=Compress::Zlib::memGunzip ($page)){

    print «page was coded\n»;

    $page=$decodedPage;

    }

    else{

    print «page was not coded\n»

    }

    my $conv=Text::Iconv->new ($charset,'utf8');

    $page=$conv->convert ($page);

    my $file=$username;

    $file=~s!\/!!;

    $file.='.html';

    $file='>'.$file;

    open (FILE, $file) or die («cant open file \n»);

    print FILE $page;

    [/code]

    Пишет стартовую ХТМЛ страницу в файл. Логины пароли подставляйте свои.

  5. justnoxx:

    Я сейчас как раз ваяю библиотечку для perl, ориентированную на социальные сети. Уже есть поддержка facebook. На днях допишу вконтакт, как только будет свободное время от работы=) Кстати, механайз таки вещь. Я его научил работать с javascript ссылками, точил под парсинг asp сайтов с __doPostBack. Приятно, что такой замечательный язык, как perl пользуется популярностью, хотя в последнее время все больше и больше замечаю, что меготрувебдевелоперы пишут парсеры на пхп, печааль=)

  6. justnoxx:

    Могу поделиться ссылочкой, как будет готово)

Комментировать

Войдите чтобы оставить комментарий.