#!/usr/bin/perl #=============================================================================== # FILE: yaextlink.pl # USAGE: perl ./yaextlink.pl # или добавить в cron для запуска по расписанию. # # DESCRIPTION: Скрипт для получения количества ссылающихся сайтов и количества # внешних ссылок на целевой сайт, определенных сервисом # Яндекс.Вебмастер. # # OPTIONS: Все настройки указываются в теле скрипта # REQUIREMENTS: perl v. 5.8.8 или выше # AUTHOR: Dimio (dimio.org), dimio@dimio.org # VERSION: 0.1 #=============================================================================== require 5.008_008; use warnings; use strict; use utf8; use LWP::UserAgent; use HTTP::Cookies; local $| = 1; # список сайтов из Яндекс.Вебмастер, который нужно обработать # (название произвольное, цифры - id сайта (скопир. из я.вебмастер)) my $hosts = { 'dimio.org' => '0000001', 'dimio-blog.lj' => '0000002', }; # настройки скрипта - логин и пароль от яндекса, # путь к директории, в которой будут храниться файлы с кол-вом ссылок my $options = { ya_login => 'my_login', ya_pass => 'my_password', savedir => '/path/to/save/', ya_count_url => 'http://webmaster.yandex.ru/site/indexed/links.xml?path=*&host=', ya_login_url => 'https://passport.yandex.ru/passport?mode=auth', ya_logout_url => 'https://passport.yandex.ru/passport?mode=logout', }; # конструктор "браузера" через libwww my $ua = ua_init(); # логинимся на сервисы яндекса, при невозможности будет выход ya_login($ua, $options); # формируется строка с текущей датой # (будет напечатана в файлах перед кол-вом вход. ссылок) my $localdate = get_localdate(); foreach my $host (keys %$hosts) { # получить кол-во ссылающихся сайтов и кол-во внешних ссылок # для каждого сайта из списка hosts my ($sites, $links) = ya_get_links_cnt( $hosts->{$host}, $ua, $options ); #print "$host \t $sites $links \n"; # сохранить в файле кол-во ссыл-ся сайтов и кол-во внешних ссылок print_to_file( $host, $options, $localdate, $sites, $links ); } ya_logout($ua, $options); exit; # конец работы # сохранение результатов работы скрипта в файл .csv в директории savedir, # имя файла = названию текущего сайта sub print_to_file { my $host = shift; my $opt = shift; my ($localdate, $sites, $links) = @_; my $output_file = $opt->{savedir} . $host . '.csv'; open( my $output_file_fh, '>>:encoding(UTF-8)', $output_file ) or die "Can't open output file $output_file : $!\n"; print {$output_file_fh} join( q{;}, $localdate, $sites, $links ), "\n"; close($output_file_fh) or warn "Unable to close $output_file : $!\n"; } # создание текущей даты в виде ГГГГ-ММ-ДД # (libreoffice-calc понимает такой формат "на лету") sub get_localdate { my ($DAY, $MONTH, $YEAR) = (localtime)[3..5]; # привести дату к обычному формату $MONTH += 1; $YEAR += 1900; return join('-', $YEAR, $MONTH, $DAY); } # получение кол-ва ссылающихся сайтов и кол-ва внешних ссылок # на текщий целевой сайт со страницы Яндекс.Вебмастер sub ya_get_links_cnt { my $host_id = shift; my ($ua, $opt) = @_; my $response = $ua->get( $opt->{ya_count_url} . $host_id ); #warn "$response->status_line\n" unless $response->is_success; my @links_cnt = $response->decoded_content =~ m{Ссылающихся \s сайтов: \s+ (\d+), \s+ внешних \s ссылок \s \(приблизительно\): \s+ (\d+) \s}msx; return ($links_cnt[0], $links_cnt[1]); } # вход в сервисы Яндекса для работы с я.вебмастер. # idkey получается со страницы логина, # timestamp - "время с начала эпохи" в мс (ф-я java getTime) # from - от какого сервиса перешли на страницу логина sub ya_login { my ($ua, $opt) = @_; my $response = $ua->post( $opt->{ya_login_url}, [ 'from' => 'passport', 'idkey' => ya_get_idkey($ua, $options), 'display' => 'page', 'login' => $opt->{ya_login}, 'passwd' => $opt->{ya_pass}, 'timestamp' => time * 1000, ]); die "$response->status_line\n" unless $response->is_success; } # получение значения idkey (скрытое поле формы для входа в Яндекс), # берется из кода страницы логина sub ya_get_idkey { my ($ua, $opt) = @_; my $response = $ua->get( $opt->{ya_login_url} ); die "$response->status_line\n" unless $response->is_success; #my $idkey = $1 if my @idkey = $response->decoded_content =~ m{ name="idkey" \s value="([\d\w]{22})" \s /> }msx; return $idkey[0]; #return $idkey; } # отлогиниваемся от яндекса sub ya_logout { my ($ua, $opt) = @_; my $response = $ua->get( $opt->{ya_logout_url} ); warn "$response->status_line\n" unless $response->is_success; } # создает "браузер" с указанными настройками (принимать куки, # следовать по автопереходам страниц, имитировать firefox) sub ua_init { my $cookies = HTTP::Cookies->new('file'=>'./cookies.lwp','autosave'=>0); my $browser = LWP::UserAgent->new('agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11)', 'cookie_jar' => $cookies, 'requests_redirectable' => ['GET', 'POST']); $browser->default_header('Accept' => 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1', 'Accept-Charset' => 'utf-8; *;q=0.1', 'Accept-Language' => 'ru,en-us;q=0.7,en;q=0.3', 'Accept-Encoding' => 'deflate, gzip, x-gzip, identity, *;q=0', ); $browser->timeout(120); # при таймауте свыше 2 минут - закрывать соединение return $browser; }