суббота, 20 ноября 2010 г.

yBlogList 0.1

Cкрипт собирающий комментарии по заданной теме в заданном блоге

Нижеприведённый ма-а-ленький скриптик на perl делает одну простую и подлую вещь, а именно: позволяет вытаскивать из Яндекс.Блоги ссылки на все комментарии по заданной теме в заданном блоге. Разбираются блоги: livejournal.com, liveinternet.ru, mail.ru, ya.ru, diary.ru, blogger.com, blog.ru, mypage.ru, free-lance.ru, rambler.ru, ну т.е. все популярные. При желании список можно увеличить.

Результатом работы скрипта является файл со ссылками и именем "bloglist_имя_сервиса.txt". Для чего это может понадобится? Ну конечно, для последующего спама комментариев своими супер-ботами! Мишени же - вот они! =) Конечно и безусловно, автор надеется, что Вы не пойдёте таким путём и поэтому исходники "супер-бота" не публикует. Данный скрипт предназначен исключительно для целей изучения блогосферы и удобного чтения комментариев по заданным темам. На его основе легко можно написать например виджет для KDE4 и мне будет очень приятно если это кто-нибудь сделает т.к. у меня самого не дошли руки дальше интерфейса такого виджета. Можно критиковать. :D



#!/usr/bin/perl -w
use Encode;
use LWP::UserAgent;
use HTML::LinkExtor;
use Getopt::Long;
use Switch;

$BLOG = 0;
$THEME = 0;
$PAGES = 1;
$HELP = 0;
$VERSION = 0;

GetOptions (
'blogs=i' => \$BLOG,
'blog=i' => \$BLOG,
'b=i' => \$BLOG,
'themes=i' => \$THEME,
'theme=i' => \$THEME,
't=i' => \$THEME,
'pages=i' => \$PAGES,
'page=i' => \$PAGES,
'p=i' => \$PAGES,
'version' => \$VERSION,
'ver' => \$VERSION,
'v' => \$VERSION,
'help' => \$HELP,
'h' => \$HELP
) or die "\nError: Invalid CLI options\n\n";

if($VERSION) { die "\n yBlogList 0.1 (c) aGGreSSor; 2010\n\n"; }
if($HELP) { die "\n yBlogList - link extractor from Yandex.Blogs\n\n USAGE:\n
--blog=  0 - LJ (default), 1 - LIVEINTERNET.RU,
2 - MAIL.RU, 3 - YA.RU, 4 - DIARY.RU
5 - BLOGGER.COM, 6 - BLOG.RU,
7 - MYPAGE.RU, 8 - FREE-LANCE.RU
9 - PLANETA RAMBLER.RU
--theme= theme id from Yandex.Blogs
--pages= amount pages from theme (default - 1)\n\n"; } 
if($THEME==0) { die "\n Error: Isn't specified theme id for extraction\n\n"; }

switch($BLOG) {
case 0 { $BLOG="livejournal.com"; $blog_e="lj"; $ext=".html"; }
case 1 { $BLOG="liveinternet.ru"; $blog_e="liru"; $ext="/post"; }
case 2 { $BLOG="blogs.mail.ru"; $blog_e="mailru"; $ext=".html"; }
case 3 { $BLOG="ya.ru"; $blog_e="yaru"; $ext=".xml"; }
case 4 { $BLOG="diary.ru"; $blog_e="diary"; $ext=".htm"; } 
case 5 { $BLOG="blogspot.com"; $blog_e="bspot"; $ext=".html"; } 
case 6 { $BLOG="blog.ru"; $blog_e="blogru"; $ext=".html"; }
case 7 { $BLOG="mypage.ru"; $blog_e="mypage"; $ext=".html"; }
case 8 { $BLOG="free-lance.ru"; $blog_e="freelnc"; $ext=".php"; } 
case 9 { $BLOG="rambler.ru"; $blog_e="rambler"; $ext=".html"; } else { die "\nError: Invalid CLI options\n\n"; }
}

$url_left = 'http://blogs.yandex.ru/search?cat=theme&id=';
$pg = '&p=';
my @all_links = ();

my $lwp = LWP::UserAgent->new;

$i=0; $j=0;

while($i<$PAGES) 
{
$url = $url_left.$THEME.$pg.$i;
$response = $lwp->get($url);

if ($response->is_success)
{
$content = $response->content();     # получаем содержимое страницы
$data = decode_utf8($content);

my $anal = HTML::LinkExtor->new(\&callback);
$anal->parse($data);

sub callback {
my($tag,%attr) = @_;
my $one_link = "$attr{href}\n" if $tag eq 'a';
if (defined($one_link)) {
if (index($one_link,$BLOG) ne -1 && index($one_link,'yandex') eq -1) 
{
$all_links[$j] = $one_link;
$j++;
}
}
}    
}
else
{
print $response->error_as_HTML;
}

# удаляем повторяющиеся элементы
for($el=-1;$el<$#all_links;$el++){
    for($b=$el+1;$b<$#all_links+1;$b++)
      {
        if($all_links[$el] eq $all_links[$b]) { $all_links[$b]=""; }
      }
  } 
  
  # удаляем элементы не содержащие полезных ссылок
  for($el=-1;$el<$#all_links;$el++) {
    if (index($all_links[$el],$ext) eq -1) { $all_links[$el]=""; }
  }
 
$i++;  
}

open($fh,"> bloglist_".$blog_e.".txt");
print($fh sort(@all_links));
close($fh);

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

Отправить комментарий