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

12

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

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

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

Бот, написанный самостоятельно лишен перечисленных недостатков. Конечно, для его написания и поддержки нужно иметь кое-какие знания и умения, но для нас, юниксоидов и программистов, это ведь не проблема, верно? :) Тем более, что изучать работу OAuth нам не придется, достаточно воспользоваться модулем Net::Twitter::Lite, доступным в CPAN. Update: см также мои уроки 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 для создания каких-нибудь полезных ботов, например вычисляющих рейтинг твиттерян или как-то использующих публикуемые в Twitter’е ссылки. Обратите внимание, что из моих слов вовсе не следует, что боты в Twitter совершенно бесполезны с точки зрения SMO. Домашнее задание – подумайте над тем, как их можно использовать :)

Похожие посты:


Comments posted (12)

Создаем собственного Twitter-бота на Perl | Записки программиста…

Thank you for submitting this cool story – Trackback from progg.ru…

[...] This post was mentioned on Twitter by Denis, Александр and DelicioBot, Alexander Maximenya. Alexander Maximenya said: Создаем собственного Twitter-бота на Perl http://eax.me/perl-twitter-bot/ [...]

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

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

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

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

[...] Пишем собственного twitter бота на Perl – пост написан в записках программиста. [...]

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

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

Интересно)

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

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

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

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

blog comments powered by Disqus