Dans le cadre de tests à mon travail, j’ai eu l’occasion de gouter à l’API de streaming twitter (enfin qu’à sa version de démonstration, samplée à uniquement 5% du traffic total). Le but de la maneouvre ici est de récupérer et de stocker le flux et d’opérer des requêtes ponctuelles sur la base (récupération de tweets d’un user donné, requêtes par localités, etc.).
Je vous livre ici les scripts
$sampleUrl = 'http://stream.twitter.com/1/statuses/sample.json';
$user = '** votre login twitter **';
$pass = '** votre password twitter **';
// Connexion sur la base Mongo
$mongo_cnx = new Mongo();
$db = $mongo_cnx->twitter;
$fp = fopen("http://" . $user . ":" . $pass . "@stream.twitter.com/1/statuses/sample.json", "r");
while($data = fgets($fp))
{
// Récupération du tweet complet fourni par Twitter
$tweet = json_decode(trim($data));
// Si le tweet n'a pas d'auteur, on le drop. C'est le cas sur les effacements de tweets.
if( ! isset($tweet->user) )
continue;
// On découpe le tweet et son user (qui seront tous deux stockés dans les deux tables suivantes):
$tweet_user = get_object_vars($tweet->user);
$tweet_mesg = get_object_vars($tweet);
unset($tweet_mesg['user']);
$tweet_mesg['user_id'] = $tweet_user['id'];
// Stockage du tweet et de son auteur:
$db->user->insert($tweet_user);
$db->tweet->insert($tweet_mesg);
echo "Tweet " . $tweet_mesg['id'] . " done.\n";
}
fclose($fp);
Et on le lance:
...
Tweet 16774425803 done.
Tweet 16774426103 done.
Tweet 16774426201 done.
Tweet 16774426202 done.
Tweet 16774426200 done.
...
Pendant le runtime, on peut regarder évoluer la base:
MongoDB shell version: 1.4.3
url: test
connecting to: test
type "help" for help
> use twitter
switched to db twitter
> db.tweet.find().count()
457811
> db.user.find().count()
457811
...
Les applications sont multiples, en voici une simple qui prend les dix derniers tweets, et remonte leurs auteurs:
$mongo_cnx = new Mongo();
$db = $mongo_cnx->twitter;
$count = $db->tweet->count();
echo "There is $count tweets.\n";
$cur = $db->tweet->find()->skip( $count - 10 );
function getUser($db, $user_id)
{
$user = $db->user->findOne( array( 'id' => $user_id ) );
return $user;
}
foreach($cur as $tweet)
{
$user = getUser($db, $tweet['user_id']);
echo "From " . $user['name'] . ": " . $tweet['text'] . "\n";
}
En voici une seconde rapide qui va remonter les tweets des utilisateurs ayant définie une langue « fr »:
$mongo_cnx = new Mongo();
$db = $mongo_cnx->twitter;
$cur = $db->user->find(array("lang" => "fr"));
foreach($cur as $user)
{
$tweet_cur = $db->tweet->find(array("user_id" => $user['id']));
foreach($tweet_cur as $tweet)
{
echo $tweet['text'] . "\n";
}
}