Twitter API sürüm 1.1 ile user_timeline'ı almak için en basit PHP örneği


292

11 Haziran 2013 itibarıyla Twitter API 1.0 kullanımdan kaldırıldığı için aşağıdaki komut dosyası artık çalışmaz.

// Create curl resource 
$ch = curl_init(); 
// Set url 
curl_setopt($ch, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/myscreenname.json?count=10"); 
// Return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
// $output contains the output string 
$output = curl_exec($ch); 
// Close curl resource to free up system resources 
curl_close($ch);

if ($output) 
{
    $tweets = json_decode($output,true);

    foreach ($tweets as $tweet)
    {
        print_r($tweet);
    }
}

Mümkün olan en az koda sahip user_timeline'ı (son durumları) nasıl alabilirim?

Bunu buldum: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline ama aşağıdaki hatayı alıyorum:

"{"errors":[{"message":"Could not authenticate you","code":32}]}"

Orada çok fazla sınıf var ama birkaç denedikten sonra Twitter'da bu güncellemeler nedeniyle hiçbiri işe yaramıyor gibi görünüyor, ayrıca bazıları gerçekten ihtiyacım olmayan çok fazla işlevselliğe sahip oldukça gelişmiş sınıflar.

PHP ile son kullanıcı durumlarını almanın en basit / en kısa yolu nedir?


98
Bunun cevabı için ÖLDÜRÜR. Belgeleri korkunç derecede kötü.
RCNeil

Twitter API'sında yeniyim ve onunla biraz mücadele ediyorum. Kendimi kullanımdan kaldırılmış kod kullanarak buldum.
Anthony


@Mark Teşekkürler Mark !! Kolaydı!! Bu benim için başlangıçta işe yaramadı. WAMP kullanıyorum. Bu konuya göre Apache
dizinimde

1
CURL veya başka herhangi bir ek kitaplık olmadan çözüm yazdım: stackoverflow.com/questions/17049821/…
Rauli Rajande

Yanıtlar:


820

Önemli Not: 2018'in ortalarından itibaren, twitter API jetonlarını alma süreci çok daha bürokratik hale geldi. Bitti beni almıştır hafta çalışıyor birinin API simgesi takımını sağlanacak ve bu aşkın konusunda sizin ve kızlar için bir açık kaynak projesi içindir milyon 1.2 kurulumları teorik yüksek öncelik olmalıdır Github üzerinde Packagist ve 1.6k yıldızlı .

İşiniz için twitter API'sı ile çalışmakla görevli iseniz, bu potansiyel olarak çok uzun bekleme süresini dikkate almanız gerekir. Ayrıca Facebook veya Instagram gibi diğer sosyal medya yollarını da göz önünde bulundurun ve jetonlarını alma işlemi anında olduğundan bu seçenekleri sağlayın.


Twitter v1.1 API'sını mı kullanmak istiyorsunuz?

Not: bunların dosyaları GitHub'dadır .

1.0 sürümü yakında kullanımdan kaldırılacak ve yetkisiz isteklere izin verilmeyecek. İşte hayatınızı kolaylaştırmak için bir PHP sınıfıyla birlikte bunu yapmanıza yardımcı olacak bir yazı.

1. Bir geliştirici hesabı oluşturun: Kendinizi Twitter'da bir geliştirici hesabı oluşturun

Resmi Twitter geliştirici sitesini ziyaret etmeniz ve bir geliştirici hesabına kaydolmanız gerekir. Bu, v1.1 API için istekte bulunmak için ücretsiz ve gerekli bir adımdır.

2. Uygulama oluşturma : Twitter geliştirici sitesinde bir uygulama oluşturun

Ne? Kimliği doğrulanmamış isteklerde bulunabileceğinizi mi düşündünüz? Twitter'ın v1.1 API'sı ile değil. Http://dev.twitter.com/apps adresini ziyaret etmeniz ve "Uygulama Oluştur" düğmesini tıklamanız gerekir .

Resim açıklamasını buraya girin

Bu sayfada, istediğiniz ayrıntıları girin. Benim için önemli değildi, çünkü spam takipçilerinden kurtulmak için bir sürü blok istek yapmak istedim. Mesele şu ki, kendinize uygulamanız için kullanabileceğiniz bir dizi benzersiz anahtar bulacaksınız .

Yani, bir uygulama yaratmanın amacı kendinize (ve Twitter'a) bir dizi anahtar vermektir. Bunlar:

  • Tüketici anahtarı
  • Tüketici sırrı
  • Erişim belirteci
  • Erişim belirteci sırrı

Burada bu tokenlerin ne için olduğu hakkında biraz bilgi var .

3. Erişim belirteçleri oluşturma : Başarılı istekler yapmak için bunlara ihtiyacınız olacak

OAuth birkaç simge istiyor. Bu yüzden onları sizin için üretmelisiniz.

Resim açıklamasını buraya girin

En alttaki "erişim kodumu oluştur" u tıklayın. Sonra tekrar en alta kaydırdığınızda, yeni oluşturulan anahtarlarınız olacaktır. API çağrılarınız için bu sayfadan önceden etiketlenmiş dört anahtarı almanız gerekir, bu yüzden bunları bir yere not edin.

4. Erişim seviyesini değiştirin : Salt okunur istemiyorsunuz, değil mi?

Bu API'yı iyi bir şekilde kullanmak istiyorsanız, GET isteklerini kullanarak standart veri alma dışında bir şey yapıyorsanız ayarlarınızı Okuma ve Yazma olarak değiştirmeniz gerekir .

Resim açıklamasını buraya girin

Sayfanın üst kısmındaki "Ayarlar" sekmesini seçin.

Resim açıklamasını buraya girin

Uygulamanıza okuma / yazma erişimi verin ve alttaki "Güncelle" yi tıklayın.

Sen edebilirsiniz uygulamalar izni modeli hakkında daha fazla bilgi Heyecan burada kullandığı.


5. API'ya erişmek için kod yazın : Çoğunu sizin için yaptım

Yukarıdaki kodu, bazı değişiklikler ve değişiklikler ile bir PHP sınıfına birleştirdim, böylece ihtiyacınız olan istekleri yapmak gerçekten basit.

Bu, OAuth ve Twitter v1.1 API'sini ve aşağıda bulabildiğim oluşturduğum sınıfı kullanır .

require_once('TwitterAPIExchange.php');

/** Set access tokens here - see: https://dev.twitter.com/apps/ **/
$settings = array(
    'oauth_access_token' => "YOUR_OAUTH_ACCESS_TOKEN",
    'oauth_access_token_secret' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET",
    'consumer_key' => "YOUR_CONSUMER_KEY",
    'consumer_secret' => "YOUR_CONSUMER_SECRET"
);

Uygulamanızdan aldığınız anahtarları ilgili alanlarına yerleştirdiğinizden emin olun.

Ardından, istekte bulunmak istediğiniz bir URL seçmeniz gerekir. Twitter, hangi URL'yi ve ayrıca istek türünü (POST veya GET) seçmenize yardımcı olacak API belgelerine sahiptir .

/** URL for REST request, see: https://dev.twitter.com/docs/api/1.1/ **/
$url = 'https://api.twitter.com/1.1/blocks/create.json';
$requestMethod = 'POST';

Dokümantasyonda, her URL neye geçebileceğinizi belirtir. Yukarıdaki gibi "bloklar" URL'sini kullanırsak, aşağıdaki POST parametrelerini iletebilirim:

/** POST fields required by the URL above. See relevant docs as above **/
$postfields = array(
    'screen_name' => 'usernameToBlock', 
    'skip_status' => '1'
);

Artık API ile ne yapmak istediğinizi ayarladığınıza göre, gerçek istekte bulunmanın zamanı geldi.

/** Perform the request and echo the response **/
$twitter = new TwitterAPIExchange($settings);
echo $twitter->buildOauth($url, $requestMethod)
             ->setPostfields($postfields)
             ->performRequest();

Ve bir POST isteği için, hepsi bu!

Bir GET isteği için biraz farklı. İşte bir örnek:

/** Note: Set the GET field BEFORE calling buildOauth(); **/
$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?username=J7mbo';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();     

Son kod örneği : Takipçilerimin listesi için basit bir GET isteği için.

$url = 'https://api.twitter.com/1.1/followers/list.json';
$getfield = '?username=J7mbo&skip_status=1';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();  

Bu dosyaları GitHub'a @ lackovic10 ve @rivers'a kredi ile koydum! Umarım birisi faydalı bulur; Yaptığımı biliyorum (bir döngüde toplu engelleme için kullandım).

Ayrıca, SSL sertifikaları, bakmak ile ilgili sorunlar yaşıyorsanız kim Windows olanlar için bu yazı . Bu kütüphane başlık altında cURL kullanır, bu nedenle muhtemelen cURL sertifikalarınızı ayarladığınızdan emin olmanız gerekir. Google aynı zamanda arkadaşınızdır.


4
@kaffolder Bu sayfadaki bağlantı: profilepicture.co.uk/caching-api-responses-php bunu yapmanın basit bir yolunu önerir. Eğer twitter verileri bir dosyaya veya veritabanına ilk talep üzerine (MySQL veya MongoDB) yazın ve ardından sonraki her isteği (siz olabilir dosya için istediğiniz zaman sınırı karşı geçerli zamanı kontrol isim süre dosyayı) ve dosya varsa ve dosya adı istediğiniz süre içindeyse, API isteği yerine veriyi çekin. Dosya varsa ancak süre sınırı aşılırsa, dosyayı silin ve API isteğini gerçekleştirin.
Jimbo

7
Bir kez döndü json verileri nasıl ele alınacağını anlayamıyorum. Sadece echo $ twitter gibi ekrana yankı istemiyorum -> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest (); APOLOGIES, nasıl yeni satır yapacağımı anlayamıyorum! $ JsonData = json_decode ($ twitter) gibi bir şey yapmak istiyorum; ama işe yaramaz - Ben temel bir şey eksik gibi hissediyorum ama kuruş düşmüyor ...
Ashley

67
Teşekkür ederim, Twitter'ın belgeleri dağınık bir karmaşa, bu çok yardımcı oldu.
joren

7
Bu sınıfın Windows üzerinde çalışmasını sağlamak için birkaç önkoşul vardır. Dosyanızda cURL'nin çalışan bir sürümünün yüklü olması php.inive ayrıca php.inikullanarak CA sertifikalarını yüklemeniz gerekir curl.cainfo = path\to\cacert.pem. CA sertifikalarını buradan alabilirsiniz .
Jake Z

4
@Jimbo Sadece varsayılan cURL uzantılarının bazılarının Windows'ta hatalı olduğunu ve değiştirilmesi gerektiğini (dolayısıyla "sabit" sürümlere bağlantı) ve CA sertifikalarını yüklemeden sınıfınızın curl_error () olarak yanlış döndürdüğünü belirtiyordum. `` SSL sertifikası sorunu, CA sertifikasının uygun olduğunu doğrulayın`. Bu CURLOPT_SSL_VERIFYPEER kapatılarak önlenebilir, ama aslında CA certs kullanmak için temel talimatları içereceğini düşündüm. Sadece birkaç kişiyi aramanın birkaç dakikasını kurtarmak için bunu dahil ettim.
Jake Z

137

Dev.twitter.com adresine gidin ve bir uygulama oluşturun . Bu, ihtiyacınız olan kimlik bilgilerini sağlayacaktır. İşte PHP ve cURL ile yakın zamanda yazdığım bir uygulama .

<?php
    function buildBaseString($baseURI, $method, $params) {
        $r = array();
        ksort($params);
        foreach($params as $key=>$value){
            $r[] = "$key=" . rawurlencode($value);
        }
        return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
    }

    function buildAuthorizationHeader($oauth) {
        $r = 'Authorization: OAuth ';
        $values = array();
        foreach($oauth as $key=>$value)
            $values[] = "$key=\"" . rawurlencode($value) . "\"";
        $r .= implode(', ', $values);
        return $r;
    }

    $url = "https://api.twitter.com/1.1/statuses/user_timeline.json";

    $oauth_access_token = "YOURVALUE";
    $oauth_access_token_secret = "YOURVALUE";
    $consumer_key = "YOURVALUE";
    $consumer_secret = "YOURVALUE";

    $oauth = array( 'oauth_consumer_key' => $consumer_key,
                    'oauth_nonce' => time(),
                    'oauth_signature_method' => 'HMAC-SHA1',
                    'oauth_token' => $oauth_access_token,
                    'oauth_timestamp' => time(),
                    'oauth_version' => '1.0');

    $base_info = buildBaseString($url, 'GET', $oauth);
    $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
    $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oauth['oauth_signature'] = $oauth_signature;

    // Make requests
    $header = array(buildAuthorizationHeader($oauth), 'Expect:');
    $options = array( CURLOPT_HTTPHEADER => $header,
                      //CURLOPT_POSTFIELDS => $postfields,
                      CURLOPT_HEADER => false,
                      CURLOPT_URL => $url,
                      CURLOPT_RETURNTRANSFER => true,
                      CURLOPT_SSL_VERIFYPEER => false);

    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $json = curl_exec($feed);
    curl_close($feed);

    $twitter_data = json_decode($json);

//print it out
print_r ($twitter_data);

?>

Bu komut satırından çalıştırılabilir:

$ php <name of PHP script>.php

2
Kod pasajı için teşekkürler, kusursuz çalışın. Tek sorun sonrası sayım dönüşü ayarlamak için nasıl anlamaya olamaz. Sadece 20 döndürür ve twitter sınırına göre 200 olan tam miktarı istiyorum.
Flatlyn

23
Nasıl belirleyecek screen_nameve countbu yaklaşımla? $urlDeğişkene eklemeyi denedim ama "Kimlik doğrulaması yapılamadı" hatası aldım.
Javier Villanueva

1
Bu kod harika çalışıyor! Arama / tweets.json api kullanmak için değiştirmeye çalışıyorum, ama her zaman 'kimlik doğrulaması olamazdı' yanıtı - herhangi bir fikir?
Chris

1
Bu yayın çok yardımcı oldu. Kodum curl_init()olsa geri dönmek gibi görünmüyor . Bazı örneklere baktım ve çok basit ve anlaşılır görünüyorlar ve tam olarak buradaki kod gibi ... Özel bir şey yüklemem gerekiyor mu?
jessicaraygun

1
Benim için 26 Ekim 2016 çalıştı. Çıktı beklediğimden biraz daha karmaşıktı.
JohnC

61

Rivers tarafından yapıştırılan kod harika. Çok teşekkürler! Burada yeniyim ve yorum yapamıyorum, sadece javiervd'den gelen soruyu cevaplamak istiyorum (Ekran_adını nasıl ayarlayıp bu yaklaşımla sayılırsınız?), Anlamaya çok zaman kaybettim dışarı.

Parametreleri hem URL'ye hem de imza oluşturma işlemine eklemeniz gerekir . İmza oluşturmak bana yardımcı olan makaledir. İşte benim kod:

$oauth = array(
           'screen_name' => 'DwightHoward',
           'count' => 2,
           'oauth_consumer_key' => $consumer_key,
           'oauth_nonce' => time(),
           'oauth_signature_method' => 'HMAC-SHA1',
           'oauth_token' => $oauth_access_token,
           'oauth_timestamp' => time(),
           'oauth_version' => '1.0'
         );

$options = array(
             CURLOPT_HTTPHEADER => $header,
             //CURLOPT_POSTFIELDS => $postfields,
             CURLOPT_HEADER => false,
             CURLOPT_URL => $url . '?screen_name=DwightHoward&count=2',
             CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false
           );

2
Buna yeterince oy veremem. Twitter'ın API belgelerinde, bu size yüzünüze bakıyor, ancak asla süper 'açık' değil. Bu yaklaşım buildAuthorizationHeaderişleve karışıyor mu? Ayrı ayrı uyguladım.
Moe

Uzun zamandır bununla çalışmadım, hatırlamıyorum, eğer sorununuzu henüz çözmediyseniz, takip eden günlerde bu konuya bakabilirim.
lackovic10

Durumunuzu / update.json üzerinde POST'u şanssız gerçekleştirmek için çözümünüzü uyarlamaya çalışıyorum, bunun nasıl başarılabileceğine dair bir fikriniz var mı?
perrohunter

1
@perrohunter hiçbir fikrim yok bu içine daha fazla bakmak zorunda kalacak. Birkaç gün içinde bir yol bulamazsan, bana bir mesaj gönder, sana yardım etmeye çalışacağım.
14:33

18

Diğer cevaplarda belirtildiği gibi, jeton, anahtar ve sırrı almak için bir Twitter uygulaması oluşturun. Aşağıdaki kodu kullanarak, istek parametrelerini bir noktadan değiştirebilir ve yazım hataları ve benzer hatalardan kaçınabilirsiniz ( işlevdeki $requestdiziyi değiştirin returnTweet()).

function buildBaseString($baseURI, $method, $params) {
    $r = array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value);
    }
    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth) {
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach($oauth as $key=>$value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";
    $r .= implode(', ', $values);
    return $r;
}

function returnTweet(){
    $oauth_access_token         = "x";
    $oauth_access_token_secret  = "x";
    $consumer_key               = "x";
    $consumer_secret            = "x";

    $twitter_timeline           = "user_timeline";  //  mentions_timeline / user_timeline / home_timeline / retweets_of_me

    //  create request
        $request = array(
            'screen_name'       => 'budidino',
            'count'             => '3'
        );

    $oauth = array(
        'oauth_consumer_key'        => $consumer_key,
        'oauth_nonce'               => time(),
        'oauth_signature_method'    => 'HMAC-SHA1',
        'oauth_token'               => $oauth_access_token,
        'oauth_timestamp'           => time(),
        'oauth_version'             => '1.0'
    );

    //  merge request and oauth to one array
        $oauth = array_merge($oauth, $request);

    //  do some magic
        $base_info              = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth);
        $composite_key          = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
        $oauth_signature            = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
        $oauth['oauth_signature']   = $oauth_signature;

    //  make request
        $header = array(buildAuthorizationHeader($oauth), 'Expect:');
        $options = array( CURLOPT_HTTPHEADER => $header,
                          CURLOPT_HEADER => false,
                          CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request),
                          CURLOPT_RETURNTRANSFER => true,
                          CURLOPT_SSL_VERIFYPEER => false);

        $feed = curl_init();
        curl_setopt_array($feed, $options);
        $json = curl_exec($feed);
        curl_close($feed);

    return json_decode($json, true);
}

ve sonra sadece ara returnTweet()


1
Müthiş iş @ budidino! Uygulamayı dev.twitter.com/apps adresinde oluşturdu ve x'lerinizi oauth_access_token, oauth_access_token_secret, tüketici_anahtarı, tüketici_secret'i ile doldurdu. * note * "erişim kodumu oluştur" a basmanız gerekir ve bu işlemin oluşturulması birkaç saniye sürer, bu yüzden lütfen bekleyin.
Theo

@budidino dnt herhangi bir kütüphane eklememiz gerekir ??
anam

Anahtarları doldurdum, bunu functions.phpWordPress'teki dosyama ekledim , <?php echo returnTweet(); ?>bir HTML dosyası koydum ve "Dizi" kelimesini çıktı ve başka bir şey çıktı.
J82

@Desi, sonuç tweet dizisidir, her birini nasıl görüntülediğinizi ele almalısınız. İçinde ne olduğunu görmek için print_r (returnTweet ()) öğesini deneyin. Tüm tweets görüntülemek için bu örneğe göz atın: gist.github.com/budidino/9681764#file-stackoverflow-returntweet
budidino

1
En son tweet'i almak istiyorsanız, $ request dizisini değiştirmeli ve sayımı 1 olarak ayarlamalısınız. $ Tweet = returnTweet () kullandığınızı varsayalım. en son tweet'i görüntülemek istiyorsanız (bu örnekte sadece), şöyle bir şey yazabilirsiniz: echo "latest tweet:". $ tweet [0] ["text"]; Tweet'in metninden daha fazlasını çıkarmak istiyorsanız twitter'ın döndürdüğü yapıyı kontrol ettiğinizden emin olun (örnek $ userProfileImageURL = $ tweet [0] ["kullanıcı"] ["profile_image_url"]). dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
budidino

16

Teşekkür ederim Kris!

Sorguya parametre kullanmadan benim için çalıştı, birden fazla parametre kullandığımda bana hata gösterdi: 32 Sizi doğrulayamadı.

Benim için sorun, ve işareti kodlamasındaydı. Kodunuzda şu satırın olduğu yerde

$url .= "?".http_build_query($query);

Aşağıya aşağıdaki satırı ekledim:

$url=str_replace("&amp;","&",$url);

Ve ekran_adı ve sayı gibi iki veya daha fazla parametre kullanarak çalıştı.

Tüm kod şöyle görünür:

$token = 'YOUR TOKEN';
$token_secret = 'TOKEN SECRET';
$consumer_key = 'YOUR KEY';
$consumer_secret = 'KEY SECRET';

$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path

$query = array( // query parameters
    'screen_name' => 'twitterapi',
    'count' => '2'
);

$oauth = array(
    'oauth_consumer_key' => $consumer_key,
    'oauth_token' => $token,
    'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
    'oauth_timestamp' => time(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_version' => '1.0'
);

$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);

$arr = array_merge($oauth, $query); // combine the values THEN sort

asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)

// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));

$url = "https://$host$path";

// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring);

// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);

// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));

// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);
$url=str_replace("&amp;","&",$url); //Patch by @Frewuill

$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it

// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);

// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));

// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
                  //CURLOPT_POSTFIELDS => $postfields,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$twitter_data = json_decode($json);

Umarım aynı problemi olan birine yardımcı olur.


çok teşekkürler, kod geliştirme iyi çalışıyor! Bir soru yeniden: "// daha güçlü bir nonce önerilir". Bu ne olabilir? zaman()?
Sebastian

Bunu işaret ettiğiniz için teşekkürler. Sebastian: Bir nonce, kriptografik olarak güvenli olması gereken tek kullanımlık bir simgedir. mt_rand () hem çok kısa (32 bit) hem de kriptografik bir PRNG değil. Teorik olarak, bu oauth jetonunu zayıflatır, ancak orijinal örnek kodumdaki basitlik uğruna, PHP'de elverişli ve kolayca anlaşılabilir bir şey kullanmak istedim.
Kris Reeves

32 hata alma. Sizi doğrulayamadı .. herhangi bir yardım lütfen ??? Yukarıdaki kodu kullandım
saadk

@frewuill, sen harikasın kardeşim, bana bir cazibe gibi çalışıyor, teşekkürler.
vijay

9

Bu soru bana çok yardımcı oldu ama ne olması gerektiğini anlamamı sağladı. Bu blog yazısı beni geçerek inanılmaz bir iş çıkardı.

İşte önemli bitler tek bir yerde:

  • Yukarıda belirtildiği gibi, 1.1 API isteklerinizi imzalamanız GEREKİR. Genel durumları almak gibi bir şey yapıyorsanız, kullanıcı anahtarı yerine bir uygulama anahtarı istersiniz. İstediğiniz sayfanın tam bağlantısı: https://dev.twitter.com/apps
  • TÜM parametreleri, hem oauth olanları hem de get parametrelerini (veya POST parametrelerini) birlikte toplamalısınız.
  • Parametreleri, karma alınan url kodlu forma indirmeden önce SIRALA gerekir.
  • Bazı şeyleri birden çok kez kodlamanız gerekir - örneğin, parametrelerin url kodlu değerlerinden bir sorgu dizesi oluşturursunuz ve ardından url'yi THT kodlar ve yöntem türü ve url ile birleştirirsiniz.

Tüm baş ağrılarına sempati duyuyorum, bu yüzden hepsini sarmak için bazı kodlar:

$token = 'YOUR TOKEN';
$token_secret = 'TOKEN SECRET';
$consumer_key = 'YOUR KEY';
$consumer_secret = 'KEY SECRET';

$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path

$query = array( // query parameters
    'screen_name' => 'twitterapi',
    'count' => '2'
);

$oauth = array(
    'oauth_consumer_key' => $consumer_key,
    'oauth_token' => $token,
    'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
    'oauth_timestamp' => time(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_version' => '1.0'
);

$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);

$arr = array_merge($oauth, $query); // combine the values THEN sort

asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)

// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));

$url = "https://$host$path";

// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring);

// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);

// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));

// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);

$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it

// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);

// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));

// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
                  //CURLOPT_POSTFIELDS => $postfields,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$twitter_data = json_decode($json);

6

OAuth PHP kitaplığı yüklüyse, isteği kendiniz oluşturma konusunda endişelenmenize gerek yoktur.

$oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($access_token, $access_secret);

$oauth->fetch("https://api.twitter.com/1.1/statuses/user_timeline.json");
$twitter_data = json_decode($oauth->getLastResponse());

print_r($twitter_data);

Daha fazla bilgi için Dokümanlar'a veya örneklerine göz atın . pecl install oauthKütüphaneyi almak için kullanabilirsiniz .


5

Her şeyden önce ben jimbo ve ( onun post / twitter-api-php basit kütüphane) teşekkür etmek istedim .

Kullanmak için kullanacaksanız GET arama / tweetler API "twitter-api-php" PHP kitaplığı (TwitterAPIExchange.php) ile:

Öncelikle, "POST isteği yapın ve yanıtı tekrarlayın" kod alanına yorum yapmanız yeterlidir.

"Bir GET isteği gerçekleştirin ve yanıtı tekrarlayın" kodunu kullanın ve yanıtı tekrarlayın ve şu iki satırı değiştirin:

$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?screen_name=J7mbo';

için

$url = 'https://api.twitter.com/1.1/search/tweets.json';
$getfield = '?q=J7mbo';

(Değiştir screen_nameetmek q, işte bu :)


Hala şansım yok: /
Ricardo

2

Bir gerekir Twitter'da bir "uygulamayı" oluşturmak (ve bunu yapmak için bir Twitter hesabı gerekir).

Ardından, Twitter'a yetkili bir istekte bulunmak için OAuth'u kullanmanız gerekir .

Son tweet'lerin bir listesini almak için GET durumlarını / user_timeline kaynağını kullanabilirsiniz.


4
Lütfen, bizim için aptal insanlar, açıkla. Belgelere göre daha az olmasa da daha fazla fikir veriyorsunuz. HttpRequest()Adım 2 için PHP işlevini kullanıyor musunuz ? Abraham'ın TwitterOAuth PHP - github.com/abraham/twitteroauth - kütüphanesi de bunu yapması gerekiyor, ancak bunun nasıl uygulanacağına dair bir örnek gerçekten sağlanmadı.
RCNeil


2
@MatthewRapati Sayfa eksik.
RN Kushwaha

0

İşte zaman çizelgenizden belirli sayıda tweet almak için kısa bir tane. Temelde diğer örneklerle aynı şeyi yapar, sadece daha az kodla.

Sadece tuşları doldurun ve $countbeğeninize göre ayarlayın :

$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$count = '10';

$oauth = array('count' => $count,
               'oauth_consumer_key' => '[CONSUMER KEY]',
               'oauth_nonce' => md5(mt_rand()),
               'oauth_signature_method' => 'HMAC-SHA1',
               'oauth_timestamp' => time(),
               'oauth_token' => '[ACCESS TOKEN]',
               'oauth_version' => '1.0');

$oauth['oauth_signature'] = base64_encode(hash_hmac('sha1', 'GET&' . rawurlencode($url) . '&' . rawurlencode(implode('&', array_map(function ($v, $k) { return $k . '=' . $v; }, $oauth, array_keys($oauth)))), '[CONSUMER SECRET]&[ACCESS TOKEN SECRET]', true));

$twitterData = json_decode(file_get_contents($url . '?count=' . $count, false, stream_context_create(array('http' => array('method' => 'GET',
                                                                                                                           'header' => 'Authorization: OAuth ' 
                                                                                                                                       . implode(', ', array_map(function ($v, $k) { return $k . '="' . rawurlencode($v) . '"'; }, $oauth, array_keys($oauth))))))));

Bu file_get_contents, cURL kütüphanesi yerine anonim işlevler kullanır . MD5 karma nonce kullanımına dikkat edin. Herkesin time()nonce ile birlikte olduğu görülüyor , ancak OAuth ile ilgili web'deki çoğu örnek bir tür şifreli dize kullanıyor (bunun gibi: http://www.sitepoint.com/understanding-oauth-1/ ). Bu benim için de daha anlamlı.

Ek not: anonim işlevler için PHP 5.3+ sürümüne ihtiyacınız vardır (sunucunuzun / bilgisayarınızın soğuk savaş mağarasında olması ve yükseltememesi durumunda).


-1

Onların itibaren imza jeneratörü , elde edeceğiniz curlform komutları:

curl --get 'https://api.twitter.com/1.1/statuses/user_timeline.json' --data 'count=2&screen_name=twitterapi' --header 'Authorization: OAuth oauth_consumer_key="YOUR_KEY", oauth_nonce="YOUR_NONCE", oauth_signature="YOUR-SIG", oauth_signature_method="HMAC-SHA1", oauth_timestamp="TIMESTAMP", oauth_token="YOUR-TOKEN", oauth_version="1.0"' --verbose

-2
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);

$timelines = $connection->get('statuses/user_timeline', array('screen_name' => 'NSE_NIFTY', 'count' => 100, 'include_rts' => 1));

3
Lütfen bu kodun ne yaptığına dair bir açıklama ekleyin, böylece OP koddan öğrenebilir.
Cerbrus

-2

Bu konu sayesinde ve özellikle budidino çünkü kodu benim için eve sürdü. Sadece bir istekten JSON verilerinin nasıl alınacağına katkıda bulunmak istedim. Farklı istekleri gerçekleştirmek için kodun "// istek oluştur" istek dizisi bölümünde değişiklik yapın. Sonuçta, bu JSON'u tarayıcı ekranına çıkarır

<?php
    function buildBaseString($baseURI, $method, $params) {
    $r = array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value);
    }
    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth) {
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach($oauth as $key=>$value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";
    $r .= implode(', ', $values);
    return $r;
}

function returnTweet(){
    $oauth_access_token         = "2602299919-lP6mgkqAMVwvHM1L0Cplw8idxJzvuZoQRzyMkOx";
    $oauth_access_token_secret  = "wGWny2kz67hGdnLe3Uuy63YZs4nIGs8wQtCU7KnOT5brS";
    $consumer_key               = "zAzJRrPOj5BvOsK5QhscKogVQ";
    $consumer_secret            = "Uag0ujVJomqPbfdoR2UAWbRYhjzgoU9jeo7qfZHCxR6a6ozcu1";

    $twitter_timeline           = "user_timeline";  //  mentions_timeline / user_timeline / home_timeline / retweets_of_me

    //  create request
        $request = array(
            'screen_name'       => 'burownrice',
            'count'             => '3'
        );

    $oauth = array(
        'oauth_consumer_key'        => $consumer_key,
        'oauth_nonce'               => time(),
        'oauth_signature_method'    => 'HMAC-SHA1',
        'oauth_token'               => $oauth_access_token,
        'oauth_timestamp'           => time(),
        'oauth_version'             => '1.0'
    );

    //  merge request and oauth to one array
        $oauth = array_merge($oauth, $request);

    //  do some magic
        $base_info              = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth);
        $composite_key          = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
        $oauth_signature            = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
        $oauth['oauth_signature']   = $oauth_signature;

    //  make request
        $header = array(buildAuthorizationHeader($oauth), 'Expect:');
        $options = array( CURLOPT_HTTPHEADER => $header,
                          CURLOPT_HEADER => false,
                          CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request),
                          CURLOPT_RETURNTRANSFER => true,
                          CURLOPT_SSL_VERIFYPEER => false);

        $feed = curl_init();
        curl_setopt_array($feed, $options);
        $json = curl_exec($feed);
        curl_close($feed);

    return $json;
}

$tweet = returnTweet();
echo $tweet;

?>

-2

Herkes için faydalıysa ... Blogumda, son tweet'leri almak, en alakalı verilerini ayıklamak ve daha sonra bir MySQL veritabanına kaydetmek için aşağıdaki PHP kodunu uyguladım. Çalışıyor çünkü blogumda aldım.

Onları saklayan "tweet" tablosu:

CREATE TABLE IF NOT EXISTS `tweets` (
  `tweet_id` int(11) NOT NULL auto_increment,
  `id_tweet` bigint(20) NOT NULL,
  `text_tweet` char(144) NOT NULL,
  `datetime_tweet` datetime NOT NULL,
  `dayofweek_tweet` char(3) NOT NULL,
  `GMT_tweet` char(5) NOT NULL,
  `shorturl_tweet` char(23) NOT NULL,
  PRIMARY KEY  (`tweet_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=83 ;

get_tweets.php:

<?php
function buildBaseString($baseURI, $method, $params) {
    $r= array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[]= "$key=".rawurlencode($value);
    }
    return $method."&".rawurlencode($baseURI).'&'.rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth) {
    $r= 'Authorization: OAuth ';
    $values= array();
    foreach($oauth as $key=>$value) {
        $values[]= "$key=\"".rawurlencode($value)."\"";
    }
    $r.= implode(', ', $values);
    return $r;
}

function returnTweets($last_id) {
    $oauth_access_token         = "2687912757-vbyfJA483SEyj2HJ2K346aVMxtOIgVbsY4Edrsw";
    $oauth_access_token_secret  = "nIruzmR0bXqC3has4fTf8KAq4pgOceiuKqjklhroENU4W";
    $api_key                    = "ieDSTFH8QHHPafg7H0whQB9GaY";
    $api_secret                 = "mgm8wVS9YP93IJmTQtsmR8ZJADDNdlTca5kCizMkC7O7gFDS1j";
    $twitter_timeline           = "user_timeline";  //[mentions_timeline/user_timeline/home_timeline/retweets_of_me]
    //create request
    $request= array(
        'screen_name'       => 'runs_ES',
        'count'             => '3',
        'exclude_replies'   => 'true'
        );
    if (!is_null($last_id)) { //Add to the request if it exits a last_id
        $request['since_id']= $max_id;
    }
    $oauth = array(
        'oauth_consumer_key'        => $api_key,
        'oauth_nonce'               => time(),
        'oauth_signature_method'    => 'HMAC-SHA1',
        'oauth_token'               => $oauth_access_token,
        'oauth_timestamp'           => time(),
        'oauth_version'             => '1.0'
        );
    //merge request and oauth to one array
    $oauth= array_merge($oauth, $request);
    //do some magic
    $base_info=                 buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth);
    $composite_key=             rawurlencode($api_secret).'&'.rawurlencode($oauth_access_token_secret);
    $oauth_signature=           base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oauth['oauth_signature']=  $oauth_signature;
    //make request
    $header= array(buildAuthorizationHeader($oauth), 'Expect:');
    $options= array(CURLOPT_HTTPHEADER => $header,
                    CURLOPT_HEADER => false,
                    CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request),
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_SSL_VERIFYPEER => false);
    $feed= curl_init();
    curl_setopt_array($feed, $options);
    $json= curl_exec($feed);
    curl_close($feed);
    return $json;
}

function parse_tweettext($tweet_text) {
    $text= substr($tweet_text, 0, -23);
    $short_url= substr($tweet_text, -23, 23);
    return array ('text'=>$text, 'short_url'=> $short_url);
}

function parse_tweetdatetime($tweetdatetime) {
    //Thu Aug 21 21:57:26 +0000 2014 Sun Mon Tue Wed Thu Fri Sat
    $months= array('Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04', 'May'=>'05', 'Jun'=>'06', 
                    'Jul'=>'07', 'Aug'=>'08', 'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12');
    $GMT= substr($tweetdatetime, -10, 5);
    $year= substr($tweetdatetime, -4, 4);
    $month_str= substr($tweetdatetime, 4, 3);
    $month= $months[$month_str];
    $day= substr($tweetdatetime, 8, 2); 
    $dayofweek= substr($tweetdatetime, 0, 3);
    $time= substr($tweetdatetime, 11, 8);
    $date= $year.'-'.$month.'-'.$day;
    $datetime= $date.' '.$time;
    return array('datetime'=>$datetime, 'dayofweek'=>$dayofweek, 'GMT'=>$GMT);
    //datetime: "YYYY-MM-DD HH:MM:SS", dayofweek: Mon, Tue..., GMT: +####
}

//First check in the database the last id tweet:
$query= "SELECT MAX(tweets.id_tweet) AS id_last FROM tweets;";
$result= exec_query($query);
$row= mysql_fetch_object($result);
if ($result!= 0 && mysql_num_rows($result)) { //if error in query or not results
    $last_id= $row->id_last;
}
else {
    $last_id= null;
}

$json= returnTweets($last_id);
$tweets= json_decode($json, TRUE);

foreach ($tweets as $tweet) {
    $tweet_id= $tweet['id'];
    if (!empty($tweet_id)) { //if array is not empty
        $tweet_parsetext= parse_tweettext($tweet['text']);
        $tweet_text= utf8_encode($tweet_parsetext['text']);
        $tweet_shorturl= $tweet_parsetext['short_url'];
        $tweet_parsedt= parse_tweetdatetime($tweet['created_at']);
        $tweet_datetime= $tweet_parsedt['datetime'];
        $tweet_dayofweek= $tweet_parsedt['dayofweek'];
        $tweet_GMT= $tweet_parsedt['GMT'];
        //Insert the tweet into the database:
        $fields = array(
            'id_tweet' => $tweet_id,
            'text_tweet' => $tweet_text,
            'datetime_tweet' => $tweet_datetime,
            'dayofweek_tweet' => $tweet_dayofweek,
            'GMT_tweet' => $tweet_GMT,
            'shorturl_tweet' => $tweet_shorturl
            );
        $new_id= mysql_insert('tweets', $fields);
    }
} //end of foreach
?>

Tweetleri kaydetme fonksiyonu:

function mysql_insert($table, $inserts) {
    $keys = array_keys($inserts);
    exec_query("START TRANSACTION;");
    $query= 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $inserts).'\')';
    exec_query($query);
    $id= mysql_insert_id();
    if (mysql_error()) {
        exec_query("ROLLBACK;");
        die("Error: $query");
    }
    else {
        exec_query("COMMIT;");
    }
    return $id;
}

'Çalışıyor çünkü bloguma aldım' favorilerimden biri. Yayınınız asıl soruya cevap vermiyor. Ayrıca kullandığınız php kodu kalitesiz. Burada biraz phptherightway.com okuyun . Özellikle DB hakkında
Maciej Paprocki

Ayrıca tüm anahtarlarınızı ve jetonlarınızı herkese açık hale getirdiniz, bu yüzden birisi onu alır ve twitter hesabınızı hacklerse şaşırmayın!
garrettlynch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.