Contoh PHP paling sederhana untuk mengambil user_timeline dengan Twitter API versi 1.1

292

Karena pensiunnya Twitter API 1.0 pada 11 Juni 2013 , skrip di bawah ini tidak berfungsi lagi.

// 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);
    }
}

Bagaimana saya bisa mendapatkan user_timeline (status terkini) dengan kode seminimal mungkin?

Saya menemukan ini: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline tetapi saya mendapatkan kesalahan berikut:

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

Ada banyak kelas di luar sana tetapi setelah mencoba beberapa dari mereka tampaknya tidak berhasil karena pembaruan ini di Twitter, ditambah beberapa dari mereka adalah kelas yang cukup canggih dengan banyak fungsi yang saya tidak benar-benar butuhkan.

Apa cara paling sederhana / terpendek untuk mendapatkan status pengguna terkini dengan PHP?

sesama warga negara
sumber
97
Saya akan MEMBUNUH untuk jawaban untuk ini. Dokumentasi mereka sangat buruk.
RCNeil
Saya baru di Twitter API dan sedikit kesulitan dengannya. Saya menemukan diri saya menggunakan kode usang.
Anthony
Lihat aamirafridi.com/twitter/…
Aamir Afridi
@ Mark Terima kasih Mark !! Itu mudah!! Awalnya itu tidak berhasil untuk saya. Saya menjalankan WAMP. Saya harus membuat perubahan ke php.ini saya di direktori Apache saya sesuai dengan utas ini: stackoverflow.com/questions/5444249/...
Adlin Ling
1
Saya baru saja menulis solusi tanpa CURL atau perpustakaan tambahan lainnya: stackoverflow.com/questions/17049821/…
Rauli Rajande

Jawaban:

820

Catatan Penting: Pada pertengahan 2018, proses untuk mendapatkan token API Twitter menjadi jauh lebih birokratis. Saya memerlukan waktu lebih dari satu minggu kerja untuk diberikan satu set token API, dan ini untuk proyek sumber terbuka untuk Anda dengan 1,2 juta instalasi di Packagist dan 1,6k bintang di Github, yang secara teoritis seharusnya menjadi prioritas lebih tinggi .

Jika Anda ditugaskan untuk bekerja dengan API twitter untuk pekerjaan Anda, Anda harus memperhitungkan waktu tunggu yang berpotensi sangat lama ini. Pertimbangkan juga jalan media sosial lainnya seperti Facebook atau Instagram dan sediakan pilihan ini, karena proses pengambilan token mereka instan.


Jadi Anda ingin menggunakan Twitter v1.1 API?

Catatan: file-file ini ada di GitHub .

Versi 1.0 akan segera ditinggalkan dan permintaan tidak sah tidak akan diizinkan. Jadi, inilah sebuah pos untuk membantu Anda melakukan hal itu, bersama dengan kelas PHP untuk membuat hidup Anda lebih mudah.

1. Buat akun pengembang: Setel diri Anda akun pengembang di Twitter

Anda perlu mengunjungi situs pengembang Twitter resmi dan mendaftar untuk akun pengembang. Ini adalah langkah gratis dan perlu untuk membuat permintaan untuk API v1.1.

2. Buat aplikasi: Buat aplikasi di situs pengembang Twitter

Apa? Anda pikir Anda bisa membuat permintaan yang tidak diautentikasi? Tidak dengan API v1.1 Twitter. Anda perlu mengunjungi http://dev.twitter.com/apps dan klik tombol "Buat Aplikasi".

Masukkan deskripsi gambar di sini

Di halaman ini, isi detail apa pun yang Anda inginkan. Bagi saya, itu tidak masalah, karena saya hanya ingin membuat banyak permintaan blokir untuk menyingkirkan pengikut spam. Intinya adalah Anda akan mendapatkan satu set kunci unik untuk digunakan untuk aplikasi Anda.

Jadi, tujuan membuat aplikasi adalah memberi diri Anda (dan Twitter) satu set kunci. Ini adalah:

  • Kunci konsumen
  • Rahasia konsumen
  • Token akses
  • Rahasia akses token

Ada sedikit informasi di sini tentang tujuan token ini.

3. Buat token akses : Anda akan memerlukan ini untuk membuat permintaan yang berhasil

OAuth meminta beberapa token. Jadi, Anda harus membuatnya untuk Anda.

Masukkan deskripsi gambar di sini

Klik "buat token akses saya" di bagian bawah. Kemudian setelah Anda gulir ke bawah lagi, Anda akan memiliki beberapa kunci yang baru dibuat. Anda perlu mengambil empat kunci yang sebelumnya berlabel dari halaman ini untuk panggilan API Anda, jadi buat catatan di suatu tempat.

4. Ubah tingkat akses : Anda tidak ingin hanya-baca, bukan?

Jika Anda ingin menggunakan API ini dengan layak, Anda harus mengubah pengaturan menjadi Baca & Tulis jika Anda melakukan hal lain selain pengambilan data standar menggunakan permintaan GET .

Masukkan deskripsi gambar di sini

Pilih tab "Pengaturan" di dekat bagian atas halaman.

Masukkan deskripsi gambar di sini

Berikan akses baca / tulis aplikasi Anda, dan tekan "Perbarui" di bagian bawah.

Anda dapat membaca lebih lanjut tentang model izin aplikasi yang digunakan Twitter di sini.


5. Tulis kode untuk mengakses API : Saya sudah melakukan sebagian besar untuk Anda

Saya menggabungkan kode di atas, dengan beberapa modifikasi dan perubahan, ke dalam kelas PHP sehingga sangat mudah untuk membuat permintaan yang Anda butuhkan.

Ini menggunakan OAuth dan Twitter v1.1 API , dan kelas yang saya buat yang dapat Anda temukan di bawah.

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"
);

Pastikan Anda memasukkan kunci yang Anda dapatkan dari aplikasi di atas di ruang masing-masing.

Selanjutnya Anda harus memilih URL yang ingin Anda minta. Twitter memiliki dokumentasi API mereka untuk membantu Anda memilih URL mana dan juga tipe permintaan (POST atau GET).

/** 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';

Dalam dokumentasi, setiap URL menyatakan apa yang dapat Anda sampaikan. Jika kami menggunakan URL "blokir" seperti yang di atas, saya dapat meneruskan parameter POST berikut:

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

Sekarang setelah Anda mengatur apa yang ingin Anda lakukan dengan API, saatnya untuk membuat permintaan yang sebenarnya.

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

Dan untuk permintaan POST , itu dia!

Untuk permintaan GET , ini sedikit berbeda. Ini sebuah contoh:

/** 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();     

Contoh kode akhir : Untuk permintaan GET sederhana untuk daftar pengikut saya.

$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();  

Saya telah meletakkan file-file ini di GitHub dengan kredit ke @ lackovic10 dan @rivers! Saya harap seseorang menemukan itu berguna; Saya tahu saya lakukan (saya menggunakannya untuk pemblokiran massal dalam satu lingkaran).

Juga, bagi mereka yang di Windows yang mengalami masalah dengan sertifikat SSL, lihat posting ini . Pustaka ini menggunakan cURL di bawah tenda sehingga Anda perlu memastikan bahwa Anda mengatur cURL Anda. Google juga temanmu.

Jimbo
sumber
4
@kaffolder Tautan di halaman itu: profilepicture.co.uk/caching-api-responses-php menyarankan cara sederhana untuk melakukannya. Anda menulis data twitter Anda ke file, atau database (MySQL atau MongoDB) berdasarkan permintaan pertama, maka setiap permintaan berikutnya Anda memeriksa waktu saat ini terhadap batas waktu yang Anda inginkan untuk file (Anda bisa menamai file sebagai batas waktu), dan jika file ada dan nama file berada dalam batas waktu yang Anda inginkan, maka tarik data alih-alih melakukan permintaan API. Jika file ada tetapi batas waktu terlewati, hapus file kemudian lakukan permintaan API.
Jimbo
7
Saya tidak tahu bagaimana cara menangani data json setelah kembali. Saya tidak ingin hanya menggema ke layar seperti di echo $ twitter -> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest (); Maaf, saya tidak tahu bagaimana cara membuat baris baru! Saya ingin melakukan sesuatu seperti $ jsonData = json_decode ($ twitter); tapi itu tidak berhasil - saya merasa seperti kehilangan sesuatu yang mendasar tetapi uang itu tidak jatuh ...
Ashley
67
Terima kasih, dokumentasi Twitter adalah kekacauan yang tidak teratur, ini sangat membantu.
joren
7
Ada beberapa prasyarat untuk membuat kelas ini bekerja di Windows. Anda harus memiliki versi cURL yang dimuat dalam php.inifile Anda dan juga perlu memuat sertifikat CA dalam php.inifile Anda menggunakan curl.cainfo = path\to\cacert.pem. Anda bisa mendapatkan sertifikat CA di sini .
Jake Z
4
@Jimbo Saya baru saja mencatat bahwa beberapa ekstensi CURL default buggy di Windows dan memerlukan penggantian (karenanya tautan ke versi "tetap") dan tanpa memuat sertifikat CA, kelas Anda mengembalikan false, seperti curl_error () melaporkan bahwa `Masalah sertifikat SSL, verifikasi bahwa sertifikat CA adalah OK`. Ini dapat dihindari dengan mematikan CURLOPT_SSL_VERIFYPEER, tapi saya pikir saya akan memasukkan instruksi dasar untuk benar-benar menggunakan sertifikat CA. Hanya sertakan ini untuk berpotensi menyelamatkan beberapa orang selama beberapa menit pencarian.
Jake Z
137

Pergi ke dev.twitter.com dan buat aplikasi . Ini akan memberi Anda kredensial yang Anda butuhkan. Ini adalah implementasi yang baru-baru ini saya tulis dengan PHP dan cURL .

<?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);

?>

Ini dapat dijalankan dari baris perintah:

$ php <name of PHP script>.php
Sungai
sumber
2
Terima kasih untuk cuplikan kode, bekerjalah dengan sempurna. Satu-satunya masalah adalah saya tidak bisa menemukan cara mengatur pengembalian hitungan posting. Ini hanya mengembalikan 20 dan saya ingin jumlah penuh yaitu 200 sesuai batas twitter.
Flatlyn
23
Bagaimana Anda mengatur screen_namedan countdengan pendekatan ini? Saya mencoba menambahkannya ke $urlvariabel tetapi saya mendapat kesalahan "Tidak dapat mengotentikasi Anda".
Javier Villanueva
1
Kode ini sangat bagus! Saya mencoba memodifikasinya untuk menggunakan api pencarian / tweets.json, tapi saya selalu mendapatkan respons 'tidak dapat mengotentikasi Anda' - ada ide?
Chris
1
Posting ini sangat membantu. Kode saya sepertinya tidak kembali lagi curl_init(). Saya telah melihat beberapa contoh dan mereka terlihat sangat sederhana dan langsung dan persis seperti kode ini di sini ... Apakah saya perlu menginstal sesuatu yang istimewa?
jessicaraygun
1
Itu bekerja untuk saya 26 Oktober 2016. Outputnya sedikit lebih kompleks dari yang saya harapkan.
JohnC
61

Kode yang disisipkan oleh Rivers itu hebat. Terima kasih banyak! Saya baru di sini dan tidak dapat berkomentar, saya hanya ingin menjawab pertanyaan dari javiervd (Bagaimana Anda mengatur screen_name dan menghitung dengan pendekatan ini?), Karena saya telah kehilangan banyak waktu untuk memikirkannya di luar.

Anda perlu menambahkan parameter ke URL dan ke proses pembuatan tanda tangan. Membuat tanda tangan adalah artikel yang membantu saya. Ini kode saya:

$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
           );
lackovic10
sumber
2
Saya tidak bisa memilih ini cukup. Pada dokumentasi API Twitter, ini menatap Anda di wajah, tetapi tidak pernah super 'jelas'. Apakah pendekatan ini mengacaukan buildAuthorizationHeaderfungsi? Saya menerapkannya secara terpisah.
Moe
Saya sudah lama tidak melakukan hal ini, jadi saya tidak ingat, jika Anda belum menyelesaikan masalah Anda, saya bisa memeriksanya di hari-hari berikutnya.
lackovic10
Saya sudah mencoba untuk mengadaptasi solusi Anda untuk melakukan POST pada status / update.json tanpa keberuntungan, apakah Anda tahu bagaimana ini bisa dicapai?
perrohunter
1
@perrohunter saya tidak tahu harus melihat lebih dalam ini. Jika Anda tidak menemukan cara dalam beberapa hari, kirim saya pesan. Saya akan mencoba membantu Anda.
lackovic10
18

Seperti yang dinyatakan dalam jawaban lain, buat aplikasi Twitter untuk mendapatkan token, kunci, dan rahasia. Dengan menggunakan kode di bawah ini, Anda dapat memodifikasi parameter permintaan dari satu tempat dan menghindari kesalahan ketik dan kesalahan serupa (ubah fungsi $requestarray 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);
}

dan kemudian panggil saja returnTweet()

budidino
sumber
1
Kerja luar biasa @budidino! Membuat aplikasi di dev.twitter.com/apps dan mengisi x Anda dengan oauth_access_token, oauth_access_token_secret, consumer_key, consumer_secret. * perhatikan * bahwa Anda perlu menekan "buat token akses saya" dan perlu beberapa detik untuk dibuat, jadi harap tunggu.
Theo
@budidino, apakah kita perlu memasukkan perpustakaan?
anam
Saya mengisi kunci, menambahkan ini ke functions.phpfile saya di WordPress, memasukkan <?php echo returnTweet(); ?>file HTML, dan menghasilkan kata "Array" dan tidak ada yang lain.
J82
@ Desi, hasilnya adalah array tweet, Anda harus menangani bagaimana Anda menampilkan masing-masing. coba print_r (returnTweet ()) hanya untuk melihat isinya. Lihat contoh ini untuk menampilkan semua tweet: gist.github.com/budidino/9681764#file-stackoverflow-returntweet
budidino
1
Jika Anda ingin mengambil hanya tweet terbaru, Anda harus memodifikasi array $ request dan menetapkan jumlah menjadi 1. Katakanlah Anda menggunakan $ tweet = returnTweet (); kemudian jika Anda ingin menampilkan tweet terbaru (dalam hal ini satu-satunya), Anda dapat menulis sesuatu seperti ini: echo "tweet terbaru:". $ tweet [0] ["text"]; Pastikan untuk memeriksa struktur kembalinya twitter jika Anda ingin menarik lebih dari sekedar teks tweet (contoh $ userProfileImageURL = $ tweet [0] ["pengguna"] ["profile_image_url"]). dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
budidino
16

Kris terima kasih!

Ini berhasil bagi saya tanpa menggunakan parameter ke kueri, setiap kali saya menggunakan lebih dari satu parameter itu menunjukkan kesalahan: 32 Tidak dapat mengautentikasi Anda.

Masalahnya bagi saya, berada di ampersand encoding. Jadi dalam kode Anda di mana itu adalah baris berikut

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

Saya menambahkan baris berikut di bawah ini:

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

Dan itu berhasil menggunakan dua atau lebih parameter seperti screen_name dan count.

Seluruh kode terlihat seperti ini:

$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);

Semoga ini bisa membantu seseorang dengan masalah yang sama dengan saya.

Frewuill
sumber
terima kasih banyak, peningkatan kode Anda berfungsi dengan baik! Satu pertanyaan kembali: "// lebih baik direkomendasikan." Apa itu? waktu()?
Sebastian
Terima kasih telah menunjukkannya. Sebastian: notce adalah token sekali pakai yang harus aman secara kriptografis. mt_rand () keduanya terlalu pendek (32 bit) dan bukan PRNG kriptografi. Secara teori, ini membuat token yang asli menjadi lemah, tetapi demi kesederhanaan dalam kode contoh asli saya, saya ingin menggunakan sesuatu yang mudah digunakan dalam PHP dan mudah dipahami.
Kris Reeves
menerima kesalahan 32. Tidak dapat mengotentikasi Anda .. tolong bantu ??? Saya telah menggunakan kode Anda di atas
Saadk
@ Frewuill, kau teman yang hebat, ini membuatku seperti daya tarik, terima kasih.
vijay
9

Pertanyaan ini banyak membantu saya tetapi tidak membuat saya mengerti apa yang harus terjadi. Posting blog ini melakukan pekerjaan yang luar biasa untuk memandu saya.

Berikut adalah bit-bit penting di satu tempat:

  • Seperti yang disebutkan di atas, Anda HARUS menandatangani permintaan API 1.1. Jika Anda melakukan sesuatu seperti mendapatkan status publik, Anda akan menginginkan kunci aplikasi daripada kunci pengguna. Tautan lengkap ke halaman yang Anda inginkan adalah: https://dev.twitter.com/apps
  • Anda harus mem-hash SEMUA parameter, baik yang sekaligus DAN parameter dapatkan (atau parameter POST) bersamaan.
  • Anda harus SORT parameter sebelum menguranginya ke bentuk kode url yang di-hash.
  • Anda harus meng-encode beberapa hal berkali-kali - misalnya, Anda membuat string kueri dari nilai-nilai url-encoded parameter, dan kemudian Anda url mengkodekan BAHWA dan menyambung dengan jenis metode dan url.

Saya bersimpati dengan semua sakit kepala, jadi inilah beberapa kode untuk menyelesaikan semuanya:

$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);
Kris Reeves
sumber
6

Jika Anda memiliki perpustakaan PHP OAuth diinstal, Anda tidak perlu khawatir tentang membentuk permintaan sendiri.

$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);

Untuk informasi lebih lanjut, lihat Dokumen atau contohnya . Anda dapat menggunakan pecl install oauthuntuk mendapatkan perpustakaan.

jeffaudio
sumber
5

Pertama-tama saya ingin mengucapkan terima kasih kepada jimbo dan ( postingnya / twitter-api-php perpustakaan sederhana).

Jika Anda akan menggunakan API GET search / tweets dengan perpustakaan PHP "twitter-api-php" (TwitterAPIExchange.php):

Pertama, Anda hanya perlu berkomentar "Lakukan permintaan POST dan gema area respons".

Cukup gunakan kode "Lakukan permintaan GET dan gema respons" dan gema respons dan ubah dua baris ini:

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

untuk

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

(Ubah screen_nameke q, itu saja :)

Chanuka Asanka
sumber
Saya masih belum beruntung: /
Ricardo
2

Anda perlu membuat "aplikasi" di Twitter (dan Anda memerlukan akun Twitter untuk melakukan ini).

Kemudian, Anda perlu menggunakan OAuth untuk membuat permintaan resmi ke Twitter .

Anda dapat menggunakan sumber daya GET status / user_timeline untuk mendapatkan daftar tweet terbaru.

Matthew Rapati
sumber
4
Tolong, bagi kami orang bodoh, jelaskan. Anda memberikan wawasan sebanyak mungkin, jika tidak kurang, dari dokumentasi. Apakah Anda menggunakan HttpRequest()fungsi PHP untuk langkah 2? Ada PHP TwitterOAuth Abraham - github.com/abraham/twitteroauth - perpustakaan yang seharusnya melakukan ini juga, tetapi sebuah contoh bagaimana mengimplementasikannya tidak benar-benar disediakan.
RCNeil
2
github.com/abraham/twitteroauth/blob/master/test.php tampaknya memiliki banyak contoh!
Matius Rapati
2
@MatthewRapati Halaman hilang.
RN Kushwaha
0

Inilah yang singkat untuk mendapatkan sejumlah tweet dari timeline Anda. Ini pada dasarnya melakukan hal yang sama dengan contoh lainnya, hanya dengan kode yang lebih sedikit.

Cukup isi tombol dan sesuaikan $countdengan keinginan Anda:

$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))))))));

Yang ini menggunakan fungsi anonim dan file_get_contentsbukan perpustakaan CURL. Perhatikan penggunaan notce MD5 hashed. Semua orang tampaknya time()setuju dengan nonce, namun, sebagian besar contoh di web tentang OAuth menggunakan semacam string terenkripsi (seperti ini: http://www.sitepoint.com/understanding-oauth-1/ ). Ini juga lebih masuk akal bagi saya.

Catatan lebih lanjut: Anda memerlukan PHP 5.3+ untuk fungsi anonim (seandainya server / komputer Anda ada dalam gua perang dingin dan Anda tidak dapat memutakhirkannya).

kasimir
sumber
-1

Dari generator tanda tangan mereka , Anda dapat membuat curlperintah dari formulir:

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
Geremia
sumber
-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));
Mohd Abdul Baquee
sumber
3
Harap sertakan penjelasan tentang apa yang dilakukan kode ini, sehingga OP dapat belajar darinya.
Cerbrus
-2

Berkat utas ini, dan terutama budidino karena kodenya yang mengantarnya pulang untuk saya. Hanya ingin berkontribusi bagaimana cara mengambil data JSON dari permintaan. Buat perubahan pada bagian "// buat permintaan" larik kode untuk melakukan permintaan yang berbeda. Pada akhirnya, ini akan menampilkan JSON ke layar browser

<?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;

?>
Terry Bu
sumber
-2

Jika ini berguna bagi siapa pun ... Di blog saya, saya telah menerapkan kode PHP berikut untuk mengambil tweet terakhir, mengekstrak data mereka yang paling relevan dan kemudian menyimpannya ke dalam database MySQL. Ini berhasil karena saya mendapatkannya di blog saya.

Tabel "tweet" tempat menyimpannya:

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
?>

Fungsi untuk menyimpan tweet:

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;
}
berjalan
sumber
'Berhasil karena saya mendapatkannya di blog saya' adalah salah satu favorit saya. Posting Anda tidak menjawab pertanyaan sebenarnya. Juga kode php yang Anda gunakan memiliki kualitas buruk. Baca sedikit di sini phptherightway.com . Terutama tentang DB
Maciej Paprocki
Anda juga telah membuat semua kunci dan token Anda menjadi publik, jadi jangan heran jika seseorang mengambilnya dan meretas akun twitter Anda!
garrettlynch