Создаем собственного Twitter-бота на Perl

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/perl

# twibot.pl - SMO Twitter Bot
# (c) Alexandr Alexeev 2010 | http://eax.me/

# на хостинге у меня нет привилегий суперпользователя,
# потому пришлось поставить модуль из 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"; # пароль
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,
  source => "" # источник "via web"
  ) 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 для создания полезных ботов!

Подпишитесь на блог с помощью RSS, E-Mail, Google+ или Twitter!
Также, пользуясь случаем, приглашаю вас посетить мой форум.

  • Денис

    Поздравляю, вы перевели на русский язык man по Net::Twitter::Lite
    ОЛОЛО.

  • http://www.lab108.ru/ Mariner

    Транслировал я свой блог в Twitter одно время, потом почему то решил, что сия затея не сильно эффективна. Может обратно трансляцию восстановить?

  • http://eax.me/ Безумный Программист

    Если Вы не ведете микроблог в Twitter, я бы не советовал настраивать трансляцию. Смысл трансляции в том, чтобы не писать анонс своих постов руками. Я лично использую трансляцию только для этого.

    ИМХО каждый твиттерянин пользуется RSS, так что использовать Twitter просто как средство подписки (без самого ведения микроблога) смысла большого не имеет.

    Не ведя микроблога, Вы все равно не получите достаточное число подписчиков, чтобы затея с трансляцией была эффективна.

  • aronsky

    На самом деле автор не прав. При правильном подходе MassFollow приносит отличный результат.
    Я провёл уже много экспериментов, собрал кучу статистики и готовлюсь к написанию глобального поста про massfollow, как получать хороший трафик с него.

  • http://eax.me/ Безумный Программист

    Будет интересно ознакомиться. Вы не могли бы оставить ссылку на сайт, где будет опубликован этот пост?

  • http://twitter.com/Joker_itl Joker-itl

    Интересно)

  • aronsky

    Я его опубликую через несколько дней на http://www.muzhiks.com

  • http://stillfinder.thruhere.net stillfinder

    Возможно, Вас заинтересует еще эта информация : http://stillfinder.thruhere.net/content/bot-dly… Там описывается как использовать питон для раскрутки в твиттере.

  • http://eax.me/ Безумный Программист

    По-моему, там больше на баше :)

  • Dunmcl

    Полностю согласен. Но суть то вся на pythone, исходники ведь есть.