Бот для твіттера на php, vr-online - безкоштовний електронний журнал для всіх

Прочитавши цю невелику статейку, ти пізнаєш священні знання і зможеш створити клон відомого сервісу twitterfeed. Жарт! Сховай слину назад! Ми розглянемо лише макет, найпростіший прототип, який не готовий до реального використання. Скажу відразу, я не збираюся відкривати свій исходник повністю. Я лише покажу тобі, як виробляти аутентифікацію, працювати з rss, парсити твіти, дякувати і фолів піпл, які виконують ретвіт наших повідомлень. Цікаво? Тоді читай далі!

Клонуємо twitterfeed за допомогою php

У нашому сценарії ми спробуємо реалізувати наступні функції:

* Запуск в консолі, без HTTP доступу
* Аутентифікація і твіттінг за допомогою OAuth
* Отримання RSS, парсинг, формування твітти обмежених 140 символами, що включають постфікси (хештег або RT).
* Відправлення подяки користувачам, які зробили ретвіт повідомлення нашого бота
* Фоловінг людей, які зробили ретвіт

Все це ми встановимо і налаштуємо в linux. А потім будемо запускати за допомогою crond кожні 15 хвилин. Ти готовий? Тоді приступимо!

Якщо вирішив використовувати OAuth (а ми точно вирішили), то необхідно виконати реєстрацію свого застосування. Базову аутентифікацію використовувати не варто, тому що твіттер рано чи пізно може закрити з'єднання. До того ж ми створюємо персонального бота, а значить рядок «from» зобов'язана бути присутньою в твітти.

Сам процес реєстрації виглядає досить просто. Перевір тільки, а чи не забув ти при реєстрації в якості прав доступу вибрати Read and Write (читання і запис). Крім того, перевір, що ми повністю виключили http доступ для управління ботом. Ми заюзать PIN, заснований на OAuth, тому переконайся, що в формі реєстрації встановлено Client Appliaction.

Після закінчення реєстрації, тобі буде надано Consumer Key і Consumer. Не в жодному разі не загуби і не передавай ці секретні дані!

Що ще за оточення? Так, про все по порядку. У нинішній час уроці нам доведеться скористатися наступними штуками:

Перевір, що ти все встановив і вірно налаштував - функції magpie і curl'a працюють, а клас Twitter OAuth підключений.

Аутентифікація: Зберігання ключів доступу

Весь наш проект ми розділимо на дві частини. Перша буде автоматично стартувати раз в 15 хвилин, а друга буде запускатися лише раз - для аутентифікації.

Підготовчі дії завершені. Створюй новий файл сценарію і назви його oauth.php (або як твоїй душі завгодно). Поміркуй і визначся з місцем зберігання consumer key і secret. Я вважаю за краще тримати такі речі в файлі config.php, який потім буде підключатися за допомогою банального include / require до auth.php і robot.php.

Бот для твіттера на php, vr-online - безкоштовний електронний журнал для всіх

Сценарій oauth.php буде запускатися самостійно, і приймати параметри командного рядка. Приблизно так:

php oauth.php register

php oauth.php validate 123456

Після того як ти перевірив OAuth сесію, ключі доступу будуть зберігатися десь на диску. Свої файли я назвав access_token і access_token_secret. Якщо вони присутні, тоді yoбот зможе відправляти твіт, в іншому випадку перейде до реєстрації. Сподіваюся, що тут все зрозуміло.

Читаємо твіт-стрічку з RSS

Нам з тобою необхідно навчити нашого бота, розрізняти команди, які ми будемо йому передавати. Не забудь, ми домовилися, що всі команди будуть передаватися у вигляді параметрів командного рядка. Код обробки команд можеш реалізувати будь-яким способом. Мій варіант виглядає так:

[Code = php]
$ Action = $ argv [1];
if ($ action == "feed")
$ Feed_name = $ argv [2];
// Read the feeds, tweet the feeds
>
elseif ($ action == "rthx")
// Read the names, tweet the names!
>
elseif ($ action == "reply")
// Read the names, umm. Say something!
>
[/ Code = php]

Управляти ботом будемо так:

# Php robot.php feed wordpress
Читання статей wordpress
# Php robot.php rthx
Подяка і фоловінг тих людей, які зробили ретвіт нашого повідомлення
# Php robot.php reply
Відправка повідомлення

Добре, тепер уявімо, що ми знаходимося в rss ФІДЕ. Оголосіть асоційований масив, що містить шляху до rss стрічок:

Двох фідів для початку вистачить. Тепер зробимо так, що наш бот твіти #wordpress, читав і твіти останні новини через @mashable. Перевір, що код перевірки для access_token і access_secret вже написаний і не видає повідомлення про помилку. Я припускаю, що ключі збережені в $ access_token і $ access_token_secret відповідно і виконали ініціалізацію об'єкта $ oauth:

[Code = php]
$ Oauth = new TwitterOAuth ($ oauth_consumer_key, $ oauth_consumer_secret,
$ Access_token, $ access_token_secret);
[/ Code = php]

Другий параметр ( «wordpress», в прикладі вище) буде зберігатися у змінній $ feed_name. Тепер перейдемо до розгляду наступного коду:

[Code = php]
// Store the feed settings into $ feed
$ Feed = $ feeds [$ feed_name];

// Fetch the feed and store the prefix
$ Rss = fetch_rss ($ feed [ "url"]);
$ Postfix = $ feed [ "postfix"];

// Loop through the feed items
foreach ($ rss-> items as $ item)
// All simple enough here
$ Title = trim ($ item [ "title"]);
$ Url = $ item [ "link"];

// If everything went okay, go on
if ($ shortened_url-> errorCode ==
// Retrieve the shortened url from the json object
foreach ($ shortened_url-> results as $ key => $ value)
$ Shorturl = $ value-> shortUrl;

// Form a new message from the short URL and the postfix
$ Message = "$ shorturl $ postfix";
$ Length = strlen ($ message);

// We should trim down the title if it's too long
// So that our tweets are 120 characters or less
if (strlen ($ title)> 120- $ length)
$ Shorttitle = substr ($ title, 0, 117- $ length). ".";
else
$ Shorttitle = $ title;

// Add the title to the message
$ Message = $ shorttitle. $ Message;

// Wait a couple of mintes before the next tweet
// Do not try and flood Twitter, remember, you have
// Only 150 API calls per hour, use them wisely.
sleep (rand (60,120));
>
>
>
[/ Code = php]

Фолів і дякуємо

Будь уважним при створенні цієї частини. Ти ж не хочеш дякувати людини за ретвіт кілька разів? Якщо ти зі мною погодився, то тобі доведеться подбати про зберігання ідентифікатора (id) останнього ретвіти, за який вже було відправлено подяку. Ідентифікатор будемо в параметрі $ since_id. Цей алгоритм я залишу на твою совість, але взагалі, у тебе повинно вийти приблизно так:

[Code = php]
// Read the since_id from a file
$ Since_id = @file_get_contents ( "retweets_since_id");
if ($ since_id> <>
else <$since_id = 1;>

// Make the XML an object
$ Mentions = simplexml_load_string ($ mentions);

// Setup an array which will contain users to retweet and follow
$ Users_to_rthx = array ();

// Read the last tweet's id and store it into the retweets_since_id file
$ Last_id = ($ mentions-> status [0] -> id> $ since_id). $ Mentions-> status [0] -> id. $ Since_id;
file_put_contents ( "retweets_since_id", (string) $ last_id);

// Loop through the tweets
foreach ($ mentions-> status as $ status)
// Let's see if somebody retweeted you.
// Err, remember to replace @yourname
if (strpos (strtolower ($ status-> text), "rt @yourname")
|| strpos (strtolower ($ status-> text), "via @yourname"))
// Add the guy to the retweeters array
$ Users_to_rthx [] = $ status-> user-> screen_name;
>
>

// Remove duplicates (we do not thank somebody twice in a tweet)
$ Users_to_rthx = array_unique ($ users_to_rthx);

// Setup the tweet prefix and initialize the mentions variable
// The tweet_prefix is ​​just in case
$ Tweet_prefix = "Thanks for the retweets!";
$ Tweet_mentions = "";
$ Tweet_prefix = "";

// Loop through the retweeters popping variables out of the array
while ($ mention_this_guy = array_pop ($ users_to_rthx))
// If the popped guy fits into our brand new tweet, add him
if (strlen ($ tweet_prefix. $ tweet_mentions.
$ Tweet_postfix. "@". $ Mention_this_guy) <140)
$ Tweet_mentions. = "@". $ Mention_this_guy. "";

// Format the message and output to screen (for debugging)
$ Message = $ tweet_prefix. trim ($ tweet_mentions). $ Tweet_postfix;
echo "Tweeting:". $ Message. "(". Strlen ($ message). ") \ N";

// Wait a few seconds before the next round
sleep (rand (5,30));

// If we've got something left in the mentions, we need to tweet that
if (strlen ($ tweet_mentions)>
$ Message = $ tweet_prefix. trim ($ tweet_mentions). $ Tweet_postfix;
echo "Tweeting:". $ Message. "(". Strlen ($ message). ") \ N";

Генерітся випадкові відповіді

Саме ця кумедна частина частина. Всякий раз, коли хтось згадує наше ім'я (і це не ретвіт), наш бот будемо відправляти йому незвичне повідомлення, не забуваючи при цьому згадати своє ім'я. Код виглядає приблизно так само як і код, яким ми говорили спасибі за ретвіт. Єдиним винятком є ​​пошук «rt @yourname» і «@yourname».

Не забудь зберегти replies_since_id, тому що нам не потрібно, щоб повідомлення відправлялося користувачам кілька разів (нескінченну кількість разів). Ми ж не хочемо, щоб нас забанили? Мій код виглядати так:

[Code = php]
// The loop
while ($ mention_this_guy = array_pop ($ users_to_reply))
// Some random quotes You can add your own
$ Random_quotes = array (
"Wha?", "Interesting.", "Affirmative sir!", "Hmm, makes me think.",
"So you really think I'm not human? Well. Umm. * Sigh *"
);

// Format the message and tweet a random quote
$ Message = "@". $ Mention_this_guy. "".
$ Random_quotes [array_rand ($ random_quotes)];

// Wait a little
sleep (rand (5,30));
>
[/ Code = php]

Тепер налаштуємо cron. Відкрий файл кронтаб і внеси кілька рядків:

# Feed mashable and wordpress tweets once every 15-16 minutes
* / 15 * * * * php /home/youruser/twibots/robot.php feed wordpress
* / 16 * * * * php /home/youruser/twibots/robot.php feed mashable
# Thank and follow the retweeters once every half an hour
* / 30 * * * * php /home/youruser/twibots/robot.php rthx
# Reply to people hourly
01 * * * * php /home/youruser/twibots/robot.php reply

Виконайте перезапуск демона cron і вуаля! Можна насолоджуватися .

Якщо ти використовуєш простий хостинг, то отримати доступ до crontab (або виконання cron-задач) за допомогою CPanel (панелі управління хостингом). Не забувай вказувати php перед потрібної командою. Пам'ятай, в linux .php файли не є виконуваними.

Також хочу звернути твою увагу на наступний момент. Намагайся не зберігати свої сценарії в директоріях, доступ до яких можна отримати через Apache (тобто звернувшись з браузера до файлу). Думаю, не потрібно пояснювати, що через це може статися. Якщо ти все ж вирішиш зберігати їх в публічних директоріях, то подбай про створення файлу .htaccess із записом "deny from all". Ти ж не хочеш, щоб сторонні люди користувалися нашим новонародженим ботом?

Схожі статті