Ik ben liefhebber van mooie auto's, waarbij ik een voorkeur voor Audi's heb. Dus als ik een mooie foto op Twitter voorbij zie komen, dan klik ik op "like". Maar goed, dan bouw je uiteindelijk een (lange) lijst met favorieten in Twitter op en je doet er niets mee. Dat kan beter.
Wat heb ik gedaan? Ik heb een nieuwe map aangemaakt en daarin een .PHP bestand geplaatst welke ik in mijn browser kan aanroepen.
In een submap daarvan heb ik de code geplaatst uit de Github van Jaisen Mathai: https://github.com/jmathai/twitter-async
Jaren geleden heb ik op https://apps.twitter.com/ een eigen applicatie aangemaakt. Hier kun je voor je eigen account dus ook de tokens en andere gegevens die je nodig hebt terugvinden. In mijn losse PHP-bestand begin ik met deze code:
// fetch favorite AUDI tweets, add to CopperMine Gallery and remove "Favorite"chdir("../"); /* move to root to make includes work */
define('IN_COPPERMINE', true);
include dirname(__FILE__).'/../include/init.inc.php';
include dirname(__FILE__).'/library/oauth/EpiCurl.php';
include dirname(__FILE__).'/library/oauth/EpiOAuth.php';
include dirname(__FILE__).'/library/oauth/EpiTwitter.php';
Het terug gaan naar de root zorgt dat je de normale init.inc.php van Copppermine Photo Gallery kunt gebruiken. Daardoor heb je in jouw code dan weer de beschikking over het database-object cpg_db_query
Ik sla de afbeeldingen lokaal op, maar om het dataverbruik te beperken toon ik op de overzichtspagina de foto's uit de externe bron. Daarom sla ik de "normale plaats" wel op in de velden filepath en filename, maar sla ik de volledige URL naar de afbeelding op in het veld user1 in de picture-tabel. In het veld title sla ik de URL op, de directe verwijzing naar de tweet. Zo kun je op het overzicht meteen doorklikken naar de originele tweet.
Eerst een snippet van hoe je de gegevens kunt opvragen:
$twitterObj = new EpiTwitter($consumerKey, $consumerSecret, $oauth_Token, $oauth_Token_Secret);$twitterObj->useAsynchronous(false);
$twitterObj->setDebug(false);$timeline = $twitterObj->get("/favorites/list.json", array("count" => 100));
$tweets = json_decode($timeline->__get("responseText"));for ($k=0; $k < count($tweets); $k++){
$createDate = $tweets[$k]->created_at;
$tweep = $tweets[$k]->user->screen_name;
$tweetText = addslashes($tweets[$k]->text);
$tweetID = $tweets[$k]->id_str;...
Een tweet kan zelf media-bestanden bevatten, maar de tweet kan ook een citaat zijn van een andere tweet. Dus als de tweet die ik vind geen mediabestanden heeft en de tweet citeert een andere tweet, dan gaan we kijken of die wel media-bestanden heeft:
$mediafiles = array();if (isset($tweets[$k]->entities->media)) {
if (is_array($tweets[$k]->entities->media)) {
for ($m=0; $m < count($tweets[$k]->entities->media); $m++) {
$imageUrl = $tweets[$k]->entities->media[$m]->media_url;
array_push($mediafiles, $imageUrl);
}
}
}if (count($mediafiles) == 0) {
if (isset($tweets[$k]->quoted_status)){
$quotedTweet = $tweets[$k]->quoted_status;
if (isset($quotedTweet->entities->media)) {
if (is_array($quotedTweet->entities->media)) {
for ($m=0; $m < count($quotedTweet->entities->media); $m++) {
$imageUrl = $quotedTweet->entities->media[$m]->media_url;
array_push($mediafiles, $imageUrl);
}
}
}
}
}
Ik zag dat de lijst met opgeslagen tweets steeds kleiner werd. Dat kwam omdat er ook tweets zonder afbeeldingen of citaten waren. Deze bevatten meestal een link naar een artikel. Ook die "tekst-tweets" sla ik nu op en "unfavorite" ik, anders blijft je lijst daar namelijk op hangen:
// unfavorite
global $superCage;
if ($superCage->server->keyExists("HTTP_HOST")) {
if ( $superCage->server->getRaw("HTTP_HOST") != "audi.local" ) {
$twitterObj->post("/favorites/destroy.json", array("id" => $tweetID ));
}
}
Hierboven zie je hun je een tweet kunt "unfavoriten/unliken". Ik heb daarin een extra check toegevoegd. Deze code heb ik namelijk eerst op een eigen laptop getest met "XAMPP". Dus die zou dan al mijn favorieten gaan verwijderen, terwijl ik ze op mijn "echte" site nog niet verwerkt had, dat is niet de bedoeling. Dus pas op het moment dat je op de live-omgeving zit, verwijder dan maar die like.
Het opvragen van je favorieten, daar zit wel een limiet op. Je mag/kunt dat maximaal 75x per kwartier doen, zie ook hier in de documentatie.
Hierna kwam ik nog een naar punt / bug van Twitter tegen. In mijn lijst kreeg ik geen favorieten meer terug, dus ik dacht dat ik klaar was. Ik vond dat al vreemd, omdat er volgens mij veel meer "likes" waren. En dat bleek ook zo te zijn. Log ik in bij Twitter en ga ik naar mijn favorieten/likes dan staat bovenin het tabblad dat ik 260 tweets like. Maar in de lijst daaronder staat "you haven't liked any tweets yet". Een Google-zoektocht levert me op dat meer mensen dit euvel tegen kwamen. Bij de since_id parameter bij het opvragen van de lijst (zie hierboven op de hier-link) staat ook: There are limits to the number of Tweets which can be accessed through the API.
Moraal van dit verhaal? Wacht niet te lang met het bekijken van de tweets die je gefavorite of geliked hebt, Twitter kan dus op een bepaald moment zorgen dat ze niet meer zichtbaar / op te halen zijn. Je kunt een export aanvragen bij Twitter, maar dat is alleen van je eigen time-line, niet van de tweets die je geliked hebt.