Я хотел бы поделиться своим опытом создания собственного Twitter-бота на языке программирования Perl. Обычно для создания Twitter-бота предлагается использовать различные сторонние веб-сервисы, но такой подход имеет свои недостатки. Во-первых, функционал таких сервисов очень ограничен. Какие-то сервисы позволяют создавать ботов-агрегаторов новостей (например, twitterfeed.com, а с недавних пор и FeedBurner), другие предназначены для накрутки фолловеров, третьи еще для чего-то. А что, если я хочу, например, получать твиты по ICQ? Во-вторых, при использовании веб-сервиса, вам придется сообщить пароль от своего Twitter-аккаунта совершенно неизвестным людям. Или дать им доступ к своему аккаунту по OAuth, что в настоящее время фактически то же самое, что назвать пароль. Бот, написанный самостоятельно лишен перечисленных недостатков. Конечно, для его написания и поддержки нужно иметь кое-какие знания и умения, но для нас, юниксоидов и программистов, это ведь не проблема, верно? Тем более, что изучать работу OAuth нам не придется, достаточно воспользоваться модулем Net::Twitter::Lite, доступным в CPAN. Думаю, нет необходимости описывать интерфейс этого модуля, при желании с ним можно ознакомиться, сказав 'perldoc Net::Twitter::Lite'. Ниже дан исходный код моего бота с подробными комментариями.
#!/usr/bin/perl # twibot.pl script # (c) eax 2010 | http://eax.me/ # на хостинге у меня нет привилегий суперпользователя, # потому пришлось поставить модуль из CPAN в свой домашний каталог use lib "/home/afiskon/perl-modules/lib/perl5/site_perl/5.8.8/"; use Net::Twitter::Lite; use Encode 'decode'; use strict; my $login = "afiskon"; # логин в twitter my $pass = "password"; # пароль my $cp = "koi8-r"; # в какой кодировке текст скрипта? my $max_delta = 1000; # насколько м.б. following > followers, можно пересчитать динамически # TODO - Файлы: # follow.txt - ники тех, за кем постоянно следим # waiting.txt - date:id, ожидаем follow-back # ignore.txt - id и ники тех, за кем не следим ни в коем случае # block.txt - id и ники тех, кого блочим (и следовательно не следим) # Логинимся my $twi = Net::Twitter::Lite->new( traits => [qw / API::REST / ], username => $login, password => $pass, clientname => "TwitterFox", clientver => "1.8.2", clienturl => "http://twitterfox.net/") or die "[-] Login failed: $!\n"; ## print "[+] Logged in!\n"; # на самом деле - еще нет ;) # определяем и выводим текущее время chomp(my $time = 'date +%s'); print "time=$time:"; # осталось после отладки - получение полной информации о пользователе #my $info = $twi->show_user("somebody"); #for my $k(keys %$info) { # print "$k => ".$info->{$k}."\n"; #} #exit 0; my $self = $twi->show_user($login)->{id}; ## print "self=$self:"; # Получаем список тех, за кем я слежу my $following = $twi->following_ids(); # Получаем список тех, кто за мной следит my $followers = $twi->followers_ids(); # Выводим их количество print "following=".(scalar @$following).":"; print "followers=".(scalar @$followers).":"; ## print "follow-back ...\n"; # делаем follow-back my @fb = grep { # "вычитаем" из тех, кто за мной следит, my $t = $_; # тех, за кем мы уже следим ! grep { $_ == $t } @$following; } @$followers; # ошибки игнорируем push @$following, $_ and eval { $twi->create_friend($_) } for (@fb); # print "Error (1): $@" if($@); # выводим число новых following-людей print "new-following=".@$following.":"; # удаляем из друзей тех, кто отказался дружить с нами в теченее N дней # UNDER CONSTRUCTION # объявляем массив наших новых друзей my @new_friends; for (@$followers) { # кто следит за теми, кто следит за нами и при этом не под нашим наблюдением? last unless(@$following - @$followers + @new_friends < $max_delta); my $add = $twi->followers_ids($_); # удаляем из списка тех, за кем мы следим + самих себя + protected-юзеров, от греха подальше # после follow-back @$following включает @$followers push @new_friends, grep { my $t = $_; $t != $self and !grep { $_ == $t } @$following; # and !$twi->show_user($t)->{protected}; } @$add; } @new_friends = @new_friends[0 .. $max_delta - 1 - @$following + @$followers]; # тут может произойти ошибка, если во второй раз попытаться зафрендить protected-юзера eval { $twi->create_friend($_) } for @new_friends; # print "Error (2): $@" and exit 2 if($@); print "new-friends=".@new_friends."\n"; exit 0; Если вкратце, бот предназначен для раскрутки Twitter-аккаунта и SMO-оптимизации сайта (или сайтов) способом, получившем название метод отжима. Вот в чем он заключается: В первую очередь определяются наши фолловеры и делается follow-back тех, за кем мы еще не следим. Затем разыскиваются 'друзья наших друзей', которые еще не следят за нами и делается их follow. Тут идет расчет на то, что часть из них сделает follow-back, тем самым подняв авторитетность нашего аккаунта. Кроме того, если люди будут следить за нашими твитами, то будут и переходить по нашим ссылкам, поднимая тем самым посещаемость сайта. Бот периодически запускается с помощью crond. В теории, бот должен отслеживать, за кем и когда он начал следить. Если в течение определенного времени пользователь не сделал follow-back, мы должны сделать unfollow и занести его в черный список. Соответствующую часть скрипта я не дописал по следующей причине. Просто в какой-то момент оказалось, что пытаться получать трафик из Twitter описанным образом совершенно бессмысленно. Тому есть масса причин. Во-первых, не мы одни такие умные - в Twitter уже имеется куча ботов, ведущих себя аналогично приведенному. Получается, что боты следят друг за другом, а трафик у всех нулевой. Во-вторых, даже когда кто-то из живых людей делает follow-back, это вовсе не значит, что ему интересна тематика ваших твитов. Может быть он даже не говорит по-русски. В-третьих, бот может спалиться на том, что число following и followers у него примерно одинаковое (и на уровне нескольких тысяч человек), потеряв 'естественных' читателей. Редкий твитеррянин следит более, чем за сотней человек. И наконец, в Twitter предусмотрена защита от 'накрутки' аккаунтов - сделав follow 2000 человек, в силу вступят серьезные ограничения на разность между followers и following - бот просто не сможет следить за новыми людьми. Потому я настоятельно не рекомендую использовать такой способ раскрутки. Просто из 1000 человек лишь несколько десятков будут переходить по вашим ссылкам. Лучше просто подождать 20-30 естественных follower'ов. Это занимает совсем немного времени, а эффект тот же.
Мой совет - используйте модуль Net::Twitter::Lite для создания каких-нибудь полезных ботов, например вычисляющих рейтинг твиттерян или как-то использующих публикуемые в Twitter'е ссылки. Обратите внимание, что из моих слов вовсе не следует, что боты в Twitter совершенно бесполезны с точки зрения SMO.
8 8 8
| |