CakePHP si twitter
de Dragoş Stoenică
Acum ceva timp Andrei Gheorghe a lansat Quizoo (@quizoo) un bot de trivia ce activează pe twitter.
În acest post veţi vedea rocket science-ul (sau lipsa acestuia) din spatele unui astfel de bot. În această primă parte vom construi un bot simplu care execută anumite comenzi la intervale de timp, urmând ca într-un viitor post sa il facem să interacţioneze cu userii raspunzând la diferite comenzi.
Pentru că sunt leneş good practices voi folosi CakePHP, datasource-ul twitter pentru CakePHP, CakePHP Custom Shells si crontab. De asemenea ghidul presupune că aveţi acces la linia de comandă, acces la crontab si că plănuiţi sa rulaţi cod-ul pe OS X/Linux/BSD sau ceva in genul.
Să începem, deci
Primul pas este, evident, obţinerea unui working Cake setup. Lucru explicat în Cookbook pe larg. Odată trecut de asta este timpul să vedem cum comunicăm cu twitter.
După înregistrarea unui cont la twitter pentru bot este momentul sa trecem la scris cod.
Vom folosi, după cum spuneam, Datasource-ul twitter scris de Alex Ciobanu (iscandr). Reţeta este simplă:
- Se downloadeaza datasource-ul
- Se pune în app/models/datasources
- Se adaugă urmatoarele in app/config/database.php
var $twitter = array( 'datasource' => 'twitter', 'username' => 'username', 'password' => 'parola', );
Bun asa, să vedem dacă şi merge. O să scriem un mic controller de test.
Întâi modelul
app/models/tweet.php
<?php
class Tweet extends AppModel {
var $useTable = false;
}
?>
Apoi controllerul.
app/controllers/tweets_controller.php
<?php
class TweetsController extends AppController {
function post_hello() {
$this->Twitter = ConnectionManager::getDataSource('twitter');
$response = $this->Twitter->account_verify_credentials();
$result = $this->Twitter->status_update("ohai, i'm a twitter bot!");
debug($response);
debug($result);
}
}
?>
Dacă totul a mers bine botul vostru ar trebui sa posteze primul său tweet si într-adevar se pare că merge.
Codul este destul de banal deci nu cred că mai are nevoie de alte explicaţii.
Până aici e bine, now what?
Acum ajungem la partea mai interesantă. Cum executam cod ca cel de mai sus la un anumit interval de timp?
O soluţie ar fi să folosim HttpSocket din CakePHP sau cURL să accesam controllerul de mai sus prin simularea unui request dar nu este tocmai elegant.
Vom folosi un alt feature al frameworkului CakePHP numit Custom Shells. Custom Shells în CakePHP permit accesul la tot “magic-ul” frameworkului din linia de comandă şi simplifică construirea scripturilor ce urmează să fie rulate din linia de comandă.
Deci să trecem la treabă:
app/vendors/shells/tweet.php
<?php
class TweetShell extends Shell {
function main() {
/* ne conectam la twitter */
App::import('ConnectionManager');
$this->Twitter = ConnectionManager::getDataSource('twitter');
$response = $this->Twitter->account_verify_credentials();
/* trimitem tweetul */
$result = $this->Twitter->status_update("@mindwar ce-ar fi sa scrii si partea a 2-a a tutorialului?!");
/* afisam in consola data pt debug */
$this->out('[' . date("d-M-Y G:i:s", time()) . '] tweet sent');
$this->hr();
}
}
?>
Rulând shell-ul totul ar trebui să arate cam aşa:
twitterbot $ cake/console/cake tweet Welcome to CakePHP v1.2.2.8120 Console --------------------------------------------------------------- App : app Path: demo/twitterbot/app --------------------------------------------------------------- [03-May-2009 18:46:26] tweet sent --------------------------------------------------------------- twitterbot $
Din nou, se pare că totul a funcţionat şi tweet-ul a ajuns.
În final
Mai ramâne decat sa-l facem sa trimita tweet-ul la un anumit interval de timp. Lucru pe care îl facem folosind crontab.
0 22 * * * /calea/pana/la/cake/console/cake tweet >> /dev/null 2>&1
Acum, în fiecare zi la 10 seara, ar trebui să primesc un reply de la bot în care ma îndeamnă să termin tutorialul. Data viitoare sper sa am o idee mai bună…