perl-twitter-bot/

В этом посте я хотел бы поделиться своим опытом создания собственного Twitter-бота на языке программирования Perl. Обычно для создания Twitter-бота предлагается использовать различные сторонние веб-сервисы, но такой подход имеет свои недостатки.

Во-первых, функционал таких сервисов очень ограничен. Какие-то сервисы позволяют создавать ботов-агрегаторов новостей (например, twitterfeed.com, а с недавних пор и FeedBurner), другие предназначены для накрутки фолловеров, третьи еще для чего-то. А что, если я хочу, например, получать твиты по ICQ?

Во-вторых, при использовании веб-сервиса, вам придется сообщить пароль от своего Twitter-аккаунта совершенно неизвестным людям. Или дать им доступ к своему аккаунту по OAuth, что в настоящее время фактически то же самое, что назвать пароль.

Бот, написанный самостоятельно лишен перечисленных недостатков. Конечно, для его написания и поддержки нужно иметь кое-какие знания и умения, но для нас, юниксоидов и программистов, это ведь не проблема, верно? Тем более, что изучать работу OAuth нам не придется, достаточно воспользоваться модулем Net::Twitter::Lite, доступным в CPAN. Дополнение: см также мои уроки Perl .

Думаю, нет необходимости описывать интерфейс этого модуля, при желании с ним можно ознакомиться, сказав «perldoc Net::Twitter::Lite». Ниже дан исходный код моего бота с подробными комментариями. Мне всегда нравилось учиться на примерах, а вам?

#!/usr/bin/perl

# twibot.pl — SMO Twitter Bot
# (c) Alexandr Alexeev 2010 | http://remontka.com/

# на хостинге у меня нет привилегий суперпользователя,
# потому пришлось поставить модуль из CPAN в свой домашний каталог
use lib «/home/afiskon/perl-modules/lib/perl5/site_perl/5.8.8/» ;
use Net :: Twitter :: Lite ;
use strict ;

my $login = «afiskon» ; # логин в twitter
my $pass = «password» ; # пароль

# насколько м.б. following > followers, можно пересчитать динамически
my $max_delta = 1000 ;

# 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 ,
source => «» # источник «via web»
) or die «[-] Login failed: $! n » ;

# определяем и выводим текущее время
chomp ( my $time = `date +%s` ) ;
print «time=$time:» ;

my $self = $twi -> show_user ( $login ) -> { id } ;

# Получаем список тех, за кем я слежу
my $following = $twi -> following_ids ( ) ;

# Получаем список тех, кто за мной следит
my $followers = $twi -> followers_ids ( ) ;

# Выводим их количество
print «following=» . ( scalar @$following ) . «:» ;
print «followers=» . ( scalar @$followers ) . «:» ;

# делаем 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 ;
} @$add ;
}

my $tmp = $max_delta 1 @$following + @$followers ;
@new_friends = @new_friends [ 0 .. $tmp ] ;

# тут может произойти ошибка, если во второй раз
# попытаться зафрендить protected-юзера
eval { $twi -> create_friend ( $_ ) } for @new_friends ;

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 для создания полезных ботов!

EnglishRussianUkrainian