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

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

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

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

Думаю, нет необходимости описывать интерфейс этого модуля, при желании с ним можно ознакомиться, сказав «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
98
99
100
#!/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 описанным образом совершенно бессмысленно. Тому есть масса причин.

Потому я настоятельно не рекомендую использовать такой способ раскрутки. Просто из 1000 человек лишь несколько десятков будут переходить по вашим ссылкам. Лучше просто подождать 20-30 естественных follower’ов. Это занимает совсем немного времени, а эффект тот же.

Мой совет – используйте модуль Net::Twitter::Lite для создания каких-нибудь полезных ботов, например вычисляющих рейтинг твиттерян или как-то использующих публикуемые в Twitter’е ссылки. Обратите внимание, что из моих слов вовсе не следует, что боты в Twitter совершенно бесполезны с точки зрения SMO. Домашнее задание – подумайте над тем, как их можно использовать

Источник статьи