Twitter api sürümünü güncellediğinden beri, twitleri access token kullanarak çekmek mecbur hale geldi. Yii framework de 2.0 sürümüyle birlikte oauth protokolünü hazır sınıf olarak sunuyor. Asenkron görüntüleme için de JQuery kullanacağız. Dolayısıyla işimiz kolay.
Öncelikle https://apps.twitter.com/app/new adresinden yeni bir uygulama oluşturuyoruz. Ardından Keys and Access Tokens sekmesine gelip alt bölümde bulunan Create Access Token butonuna tıklıyoruz. Oluşturulan access token kodlarını ve consumer key/secret kodlarını bir kenara not edelim.
Yii 2.0 uygulamamızı oluşturduğumuzu varsayıyorum. (Henüz oluşturmayanlar buradaki adresten yararlanabilirler.) Şimdi komut satırını açarak yii-authclient eklentisini kuralım.
1 2 3 |
composer require --prefer-dist yiisoft/yii2-authclient #veya composer.phar require --prefer-dist yiisoft/yii2-authclient |
Eklenti kurulumunun ardından oluşturduğumuz twitter api bilgilerini config/params.php içine ekleyelim.
1 2 3 4 5 6 7 |
return [ 'twitterScreenName' => 'sercey', 'twitterApiKey' => 'API_KEY', 'twitterApiSecret' => 'API_SECRET', 'twitterAccessToken' => 'ACCESS_TOKEN', 'twitterAccessTokenSecret' => 'ACCESS_TOKEN_SECRET' ] |
Ardından ister gii ile, ister manual olarak bir Controller oluşturalım. İçeriği şu şekilde olmalı;
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 |
use yii\authclient\clients\Twitter; use yii\authclient\OAuthToken; class SosyalController extends \yii\web\Controller { public function actionTwitter() { $token = new OAuthToken([ 'token' => Yii::$app->params['twitterAccessToken'], 'tokenSecret' => Yii::$app->params['twitterAccessTokenSecret'] ]); $twitter = new Twitter([ 'accessToken' => $token, 'consumerKey' => Yii::$app->params['twitterApiKey'], 'consumerSecret' => Yii::$app->params['twitterApiSecret'] ]); $response = $twitter->api('statuses/user_timeline.json', 'GET', ['screen_name'=>'@'.Yii::$app->params['twitterScreenName'], 'count'=>1]); Yii::$app->response->format = 'json'; return $response[0]; } } |
Buradaki count değerini birden fazla yapmak isterseniz, $response[0] yerine direkt $response döndürmeniz gerekir. Ayrıca javascript tarafında da değişkeni döngüye sokmanız gereklidir.
Şimdi gelelim javascript tarafına. Javascript kullanmamızın sebebi, asenkron olarak, yani sayfanın yüklenme hızından bağımsız olarak veriyi çekebilmektir. Aksi taktirde sayfa yüklenme hızı ciddi derecede düşer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$(function(){ function parseTwitterDate(tdate) { var system_date = new Date(Date.parse(tdate)); var user_date = new Date(); var diff = Math.floor((user_date - system_date) / 1000); if (diff <= 1) {return "şuan";} if (diff < 20) {return diff + " saniye önce";} if (diff <= 3540) {return Math.round(diff / 60) + " dakika önce";} if (diff <= 5400) {return "1 saat önce";} if (diff <= 86400) {return Math.round(diff / 3600) + " saat önce";} if (diff <= 129600) {return "1 gün önce";} if (diff < 604800) {return Math.round(diff / 86400) + " gün önce";} if (diff <= 777600) {return "1 hafta önce";} return "on " + system_date; } var $twitter = $('#last_twitter'); $.getJSON('/sosyal/twitter', function(data){ $twitter.html(''); var tweet = data.text; // tweet var date = parseTwitterDate(data.created_at); // tarih var url = 'https://twitter.com/' + data.user.screen_name +'/status/' + data.id_str; $twitter.append('<p>'+ tweet +'</p> ' + data.user.name + ' (' + data.user.screen_name + ') <a href="' + url + '">' + date + '</a>'); }); }); |
Artık sayfa yüklendiğinde last_twitter id’li html tag’ın içinde otomatik olarak tweet gözükecektir.
parseTwitterDate fonksiyonu için Erbilen’e, authClient örneği için Antonio‘ya teşekkürler.
Konu için çok teşekkürler gerçekten çok faydalı oldu benim için takipteyim
Hocam konu için teşekkürler, siz basic template ile yazmışsınız ancak Yii2 de advanced template olarak test ettiniz mi?