Ví dụ PHP đơn giản nhất để truy xuất user_timeline với Twitter API phiên bản 1.1


292

Do nghỉ hưu API API 1.0 kể từ ngày 11 tháng 6 năm 2013 , tập lệnh bên dưới không hoạt động nữa.

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

Làm cách nào tôi có thể lấy user_timeline (trạng thái gần đây) với ít mã nhất có thể?

Tôi đã tìm thấy điều này: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline nhưng tôi gặp lỗi sau:

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

Có rất nhiều lớp học ngoài kia nhưng sau khi thử một vài trong số chúng dường như không hoạt động vì những cập nhật này tại Twitter, cộng với một số trong số chúng là các lớp khá tiên tiến với rất nhiều chức năng mà tôi không thực sự cần.

Cách đơn giản nhất / ngắn nhất để có được các trạng thái người dùng gần đây với PHP là gì?


97
Tôi sẽ giết cho câu trả lời này. Tài liệu của họ là khủng khiếp.
RCNeil

Tôi mới sử dụng API Twitter và đấu tranh một chút với nó. Tôi thấy mình sử dụng mã không dùng nữa.
Anthony


@Mark Cảm ơn Mark !! Điều đó thật dễ dàng !! Điều đó đã không làm việc cho tôi ban đầu. Tôi đang chạy WAMP. Tôi đã phải thay đổi php.ini trong thư mục Apache của mình theo chủ đề này: stackoverflow.com/questions/5444249/
Kẻ

1
Tôi vừa viết ra giải pháp không có CURL hoặc bất kỳ thư viện bổ sung nào khác: stackoverflow.com/questions/17049821/
mẹo

Câu trả lời:


820

Lưu ý quan trọng: Kể từ giữa năm 2018, quá trình nhận mã thông báo API twitter trở nên quan liêu hơn rất nhiều. Tôi đã mất hơn một tuần làm việc để được cung cấp một bộ mã thông báo API và đây là dự án nguồn mở dành cho các bạn và các cô gái với hơn 1,2 triệu lượt cài đặt trên Packagist và 1,6 nghìn sao trên Github, về mặt lý thuyết nên được ưu tiên cao hơn .

Nếu bạn được giao nhiệm vụ làm việc với API twitter cho công việc của mình, bạn phải tính đến thời gian chờ cực kỳ lâu này. Cũng xem xét các đại lộ truyền thông xã hội khác như Facebook hoặc Instagram và cung cấp các tùy chọn này, vì quá trình lấy mã thông báo của họ là ngay lập tức.


Vậy bạn có muốn sử dụng API Twitter v1.1 không?

Lưu ý: các tệp cho những thứ này có trên GitHub .

Phiên bản 1.0 sẽ sớm bị phản đối và các yêu cầu trái phép sẽ không được phép. Vì vậy, đây là một bài đăng để giúp bạn làm điều đó, cùng với một lớp PHP để làm cho cuộc sống của bạn dễ dàng hơn.

1. Tạo tài khoản nhà phát triển: Thiết lập tài khoản nhà phát triển trên Twitter

Bạn cần truy cập trang web chính thức của nhà phát triển Twitter và đăng ký tài khoản nhà phát triển. Đây là bước miễn phí và cần thiết để thực hiện các yêu cầu cho API v1.1.

2. Tạo một ứng dụng: Tạo một ứng dụng trên trang web của nhà phát triển Twitter

Gì? Bạn nghĩ rằng bạn có thể thực hiện các yêu cầu không được xác thực? Không phải với API v1.1 của Twitter. Bạn cần truy cập http://dev.twitter.com/apps và nhấp vào nút "Tạo ứng dụng".

Nhập mô tả hình ảnh ở đây

Trên trang này, điền bất cứ chi tiết nào bạn muốn. Đối với tôi, điều đó không thành vấn đề, vì tôi chỉ muốn thực hiện một loạt các yêu cầu chặn để loại bỏ những người theo dõi spam. Vấn đề là bạn sẽ có cho mình một bộ các khóa duy nhất để sử dụng cho ứng dụng của mình.

Vì vậy, quan điểm của việc tạo một ứng dụng là cung cấp cho bạn (và Twitter) một bộ khóa. Đó là:

  • Khóa tiêu dùng
  • Bí mật người tiêu dùng
  • Mã thông báo truy cập
  • Bí mật mã thông báo truy cập

Có một ít thông tin ở đây về những token này để làm gì.

3. Tạo mã thông báo truy cập : Bạn sẽ cần những mã này để thực hiện các yêu cầu thành công

OAuth yêu cầu một vài mã thông báo. Vì vậy, bạn cần phải có chúng được tạo ra cho bạn.

Nhập mô tả hình ảnh ở đây

Nhấp vào "tạo mã thông báo truy cập của tôi" ở dưới cùng. Sau đó, khi bạn cuộn xuống dưới một lần nữa, bạn sẽ có một số khóa mới được tạo. Bạn cần lấy bốn khóa được gắn nhãn trước đó từ trang này cho các lệnh gọi API của mình, vì vậy hãy ghi chú chúng ở đâu đó.

4. Thay đổi cấp độ truy cập : Bạn không muốn chỉ đọc, phải không?

Nếu bạn muốn sử dụng API này một cách hợp lý, bạn sẽ cần thay đổi cài đặt của mình thành Đọc & Viết nếu bạn đang làm bất cứ điều gì khác ngoài truy xuất dữ liệu tiêu chuẩn bằng các yêu cầu GET .

Nhập mô tả hình ảnh ở đây

Chọn tab "Cài đặt" gần đầu trang.

Nhập mô tả hình ảnh ở đây

Cấp cho ứng dụng của bạn quyền truy cập đọc / ghi và nhấn "Cập nhật" ở phía dưới.

Bạn có thể đọc thêm về mô hình cấp phép ứng dụng mà Twitter sử dụng ở đây.


5. Viết mã để truy cập API : Tôi đã thực hiện hầu hết mã này cho bạn

Tôi đã kết hợp mã ở trên, với một số sửa đổi và thay đổi, thành một lớp PHP để thực hiện các yêu cầu bạn yêu cầu thực sự đơn giản.

Điều này sử dụng OAuthAPI Twitter v1.1 và lớp tôi đã tạo mà bạn có thể tìm thấy bên dưới.

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

Hãy chắc chắn rằng bạn đặt các khóa bạn nhận được từ ứng dụng của bạn ở trên trong không gian tương ứng của chúng.

Tiếp theo, bạn cần chọn một URL mà bạn muốn đưa ra yêu cầu. Twitter có tài liệu API của họ để giúp bạn chọn URL nào và loại yêu cầu (POST hoặc 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';

Trong tài liệu, mỗi URL nêu những gì bạn có thể chuyển cho nó. Nếu chúng tôi đang sử dụng URL "khối" như ở trên, tôi có thể truyền các tham số POST sau:

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

Bây giờ bạn đã thiết lập những gì bạn muốn làm với API, đã đến lúc đưa ra yêu cầu thực tế.

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

Và cho một bài đăng yêu cầu , đó là nó!

Đối với một yêu cầu NHẬN , nó hơi khác một chút. Đây là một ví dụ:

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

Ví dụ mã cuối cùng : Đối với một yêu cầu GET đơn giản cho danh sách những người theo dõi tôi.

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

Tôi đã đặt các tệp này trên GitHub với khoản tín dụng cho @ Thiếuovic10 và @rivers! Tôi hy vọng ai đó thấy nó hữu ích; Tôi biết tôi đã làm (tôi đã sử dụng nó để chặn hàng loạt trong một vòng lặp).

Ngoài ra, đối với những người trên Windows đang gặp vấn đề với chứng chỉ SSL, hãy xem bài đăng này . Thư viện này sử dụng cURL dưới mui xe, vì vậy bạn cần chắc chắn rằng bạn có thể cài đặt các cURL của bạn. Google cũng là bạn của bạn.


4
@kaffolder Liên kết trên trang đó: profilepicture.co.uk/caching-api-responses-php gợi ý một cách đơn giản để làm điều đó. Bạn viết dữ liệu twitter của mình vào một tệp hoặc cơ sở dữ liệu (MySQL hoặc MongoDB) theo yêu cầu đầu tiên, sau đó mọi yêu cầu tiếp theo bạn kiểm tra thời gian hiện tại theo giới hạn thời gian bạn muốn cho tệp (bạn có thể đặt tên tệp là giới hạn thời gian) và nếu tệp tồn tại và tên tệp nằm trong giới hạn thời gian bạn muốn, sau đó kéo dữ liệu thay vì thực hiện yêu cầu API. Nếu tệp tồn tại nhưng giới hạn thời gian được thông qua, hãy xóa tệp sau đó thực hiện yêu cầu API.
Jimbo

7
Tôi không thể tìm ra cách xử lý dữ liệu json sau khi trả về. Tôi không muốn chỉ lặp lại màn hình như trong echo $ twitter -> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> biểu diễnRequest (); ỨNG DỤNG, tôi không thể tìm ra cách làm mới! Tôi muốn làm một cái gì đó như $ jsonData = json_decode ($ twitter); nhưng nó không hoạt động - Tôi cảm thấy như mình đang thiếu thứ gì đó cơ bản nhưng đồng xu không bị rớt ...
Ashley

67
Cảm ơn bạn, tài liệu của Twitter là một mớ hỗn độn vô tổ chức, điều này đã giúp rất nhiều.
joren

7
Có khá nhiều điều kiện tiên quyết để lớp này hoạt động trên Windows. Bạn cần tải phiên bản cURL đang hoạt động trong php.initệp của mình và cũng cần tải các CA CA trong php.initệp của bạn bằng cách sử dụng curl.cainfo = path\to\cacert.pem. Bạn có thể lấy CA certs ở đây .
Jake Z

4
@Jimbo Tôi chỉ lưu ý rằng một số tiện ích mở rộng cURL mặc định là lỗi trong Windows và yêu cầu thay thế (do đó liên kết đến các phiên bản "đã sửa") và không tải các certs CA, lớp của bạn trả về sai, vì curl_error () báo cáo rằng `vấn đề chứng chỉ SSL, xác minh rằng chứng chỉ CA là OK`. Điều này có thể tránh được bằng cách tắt CURLOPT_SSL_VERIFYPEER, nhưng tôi nghĩ rằng tôi sẽ bao gồm các hướng dẫn cơ bản để thực sự sử dụng các certs CA. Chỉ cần bao gồm điều này để có khả năng cứu một số người một vài phút tìm kiếm.
Jake Z

137

Truy cập dev.twitter.com và tạo một ứng dụng . Điều này sẽ cung cấp cho bạn các thông tin bạn cần. Đây là một triển khai gần đây tôi đã viết bằng PHPcURL .

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

?>

Điều này có thể được chạy từ dòng lệnh:

$ php <name of PHP script>.php

2
Cảm ơn đoạn mã, làm việc hoàn hảo. Vấn đề duy nhất là tôi dường như không thể tìm ra cách thiết lập trả về số lượng bài đăng. Nó chỉ trả về 20 và tôi muốn số tiền đầy đủ là 200 theo giới hạn twitter.
Flatlyn

23
Làm thế nào bạn sẽ thiết lập screen_namecountvới phương pháp này? Tôi đã thử thêm nó vào $urlbiến nhưng tôi gặp lỗi "Không thể xác thực bạn".
Javier Villanueva

1
Mã này hoạt động rất tốt! Tôi đang cố gắng sửa đổi nó để sử dụng api tìm kiếm / tweets.json, nhưng tôi luôn nhận được phản hồi 'không thể xác thực bạn' - có ý tưởng nào không?
Chris

1
Bài đăng này đã rất hữu ích. Mã của tôi dường như không trở lại từ curl_init()mặc dù. Tôi đã xem xét một số ví dụ và chúng trông rất đơn giản và dễ hiểu và chính xác như mã này ở đây ... Tôi có cần phải cài đặt một cái gì đó đặc biệt không?
jessicaraygun

1
Nó làm việc cho tôi ngày 26 tháng 10 năm 2016. Đầu ra phức tạp hơn một chút so với tôi dự kiến.
JohnC

61

Mã được dán bởi Rivers là tuyệt vời. Cảm ơn rất nhiều! Tôi mới ở đây và không thể nhận xét, tôi chỉ muốn trả lời câu hỏi từ javiervd (Bạn sẽ đặt screen_name và tính theo phương pháp này như thế nào?), Vì tôi đã mất rất nhiều thời gian để tìm ra nó ngoài.

Bạn cần thêm các tham số cho cả URL và quá trình tạo chữ ký. Tạo chữ ký là bài viết giúp tôi. Đây là mã của tôi:

$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
Tôi không thể bỏ phiếu này đủ. Trên tài liệu API của Twitter, điều này nhìn thẳng vào mặt bạn, nhưng nó không bao giờ siêu 'rõ ràng'. Liệu cách tiếp cận này gây rối với buildAuthorizationHeaderchức năng? Tôi thực hiện nó một cách riêng biệt.
Moe

Tôi đã không làm việc với điều này trong một thời gian dài vì vậy tôi không nhớ, nếu bạn chưa giải quyết được vấn đề của mình, tôi có thể xem xét vấn đề này trong những ngày tiếp theo.
thiếuovic10

Tôi đã cố gắng điều chỉnh giải pháp của bạn để thực hiện POST trên các trạng thái / update.json mà không gặp may, bạn có biết làm thế nào để đạt được điều này không?
perrohunter

1
@perrohunter tôi không có ý tưởng sẽ phải xem xét thêm về điều này. Nếu bạn không tìm thấy cách nào trong một vài ngày, hãy gửi cho tôi một tin nhắn, tôi sẽ cố gắng giúp bạn.
thiếuovic10

18

Giống như đã nêu trong các câu trả lời khác, hãy tạo một ứng dụng Twitter để nhận mã thông báo, khóa và bí mật. Sử dụng mã dưới đây, bạn có thể sửa đổi các tham số yêu cầu từ một điểm và tránh lỗi chính tả và các lỗi tương tự (thay đổi $requestmảng trong returnTweet()chức năng).

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

và sau đó chỉ cần gọi returnTweet()


1
Công việc tuyệt vời @budidino! Tạo ứng dụng trên dev.twitter.com/apps và điền vào x của bạn với oauth_access_token, oauth_access_token_secret, Consumer_key, Consumer_secret. * lưu ý * rằng bạn cần nhấn "tạo mã thông báo truy cập của tôi" và phải mất vài giây để được tạo, vì vậy vui lòng đợi nó.
Theo

@budidino dnt chúng tôi cần bao gồm bất kỳ thư viện ??
sáng

Tôi đã điền các khóa, thêm nó vào functions.phptệp của mình trong WordPress, đặt <?php echo returnTweet(); ?>vào tệp HTML và nó xuất ra từ "Mảng" và không có gì khác.
J82

@Desi, kết quả là một loạt các tweet, bạn nên xử lý cách bạn hiển thị từng tweet. hãy thử print_r (returnTweet ()) chỉ để xem những gì bên trong. Kiểm tra ví dụ này về việc hiển thị tất cả các tweet: gist.github.com/budidino/9681764#file-stackoverflow-returntweet
budidino

1
Nếu bạn chỉ muốn tìm nạp tweet mới nhất, bạn nên sửa đổi mảng $ request và đặt số đếm thành 1. Giả sử bạn sử dụng $ tweet = returnTweet (); sau đó nếu bạn muốn hiển thị tweet mới nhất (trong trường hợp này là duy nhất), bạn có thể viết một cái gì đó như thế này: echo "tweet mới nhất:". $ tweet [0] ["text"]; Hãy chắc chắn kiểm tra cấu trúc của twitter được trả về nếu bạn muốn rút ra nhiều hơn chỉ là văn bản của tweet (ví dụ $ userProfileImageURL = $ tweet [0] ["user"] ["profile_image_url"]). dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
budidino

16

Cảm ơn Kris!

Nó hoạt động với tôi mà không sử dụng tham số cho truy vấn, bất cứ khi nào tôi sử dụng nhiều hơn một tham số, nó sẽ hiển thị lỗi: 32 Không thể xác thực bạn.

Vấn đề đối với tôi, là ở mã hóa ký hiệu. Vì vậy, trong mã của bạn, nơi nó là dòng sau

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

Tôi đã thêm dòng dưới đây:

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

Và nó hoạt động bằng cách sử dụng hai hoặc nhiều tham số như screen_name và Count.

Toàn bộ mã trông như thế này:

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

Hy vọng nó sẽ giúp ai đó với cùng một vấn đề tôi đã có.


cảm ơn rất nhiều, cải tiến mã của bạn hoạt động tốt! Một câu hỏi lại: "// một nonce mạnh hơn được khuyến nghị". Điều đó có thể là gì? thời gian()?
Sebastian

Cảm ơn đã chỉ ra rằng. Sebastian: một nonce là một mã thông báo sử dụng một lần nên được bảo mật bằng mật mã. mt_rand () quá ngắn (32 bit) và không phải là PRNG mã hóa. Về lý thuyết, điều này làm cho mã thông báo oauth yếu đi, nhưng vì đơn giản trong mã ví dụ ban đầu của tôi, tôi muốn sử dụng thứ gì đó có sẵn trong PHP và dễ hiểu.
Kris Reeves

nhận lỗi 32. Không thể xác thực bạn .. bất kỳ trợ giúp xin vui lòng ??? Tôi đã sử dụng mã trên của bạn
saadk

@frewuill, bạn là người bạn tuyệt vời, nó làm việc cho tôi như một cơ duyên, cảm ơn.
vijay

9

Câu hỏi này đã giúp tôi rất nhiều nhưng không giúp tôi hiểu được những gì cần phải xảy ra. Bài đăng blog này đã làm một công việc tuyệt vời của tôi đi qua nó.

Dưới đây là các bit quan trọng tất cả ở một nơi:

  • Như đã chỉ ra ở trên, bạn PHẢI ký vào các yêu cầu API 1.1 của mình. Nếu bạn đang làm gì đó như nhận trạng thái công khai, bạn sẽ muốn có khóa ứng dụng thay vì khóa người dùng. Liên kết đầy đủ đến trang bạn muốn là: https://dev.twitter.com/apps
  • Bạn phải băm TẤT CẢ các tham số, cả hai tham số oauth VÀ các tham số get (hoặc tham số POST) cùng nhau.
  • Bạn phải NGẮN các tham số trước khi giảm chúng thành dạng được mã hóa url được băm.
  • Bạn phải mã hóa một số thứ nhiều lần - ví dụ: bạn tạo một chuỗi truy vấn từ các giá trị được mã hóa url của tham số, sau đó bạn url mã hóa THAT và nối với loại phương thức và url.

Tôi đồng cảm với tất cả các vấn đề đau đầu, vì vậy đây là một số mã để gói lại tất cả:

$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

Nếu bạn đã cài đặt thư viện PHP OAuth, bạn không phải lo lắng về việc tự mình tạo yêu cầu.

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

Để biết thêm thông tin, hãy xem Tài liệu hoặc ví dụ của họ . Bạn có thể sử dụng pecl install oauthđể có được thư viện.


5

Trước hết tôi muốn cảm ơn jimbo và ( thư viện đơn giản bài đăng / twitter-api-php của anh ấy ).

Nếu bạn định sử dụng API tìm kiếm / tweet của GET với thư viện PHP "twitter-api-php" (TwitterAPIExchange.php):

Trước tiên, bạn chỉ cần bình luận "Thực hiện một yêu cầu POST và lặp lại vùng mã".

Chỉ cần sử dụng mã "Thực hiện yêu cầu NHẬN và lặp lại phản hồi" và lặp lại phản hồi và thay đổi hai dòng này:

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

đến

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

(Thay đổi screen_namethành q, đó là :)


Tôi vẫn chưa gặp may: /
Ricardo

2

Bạn sẽ cần tạo một "ứng dụng" trên Twitter (và bạn cần có tài khoản Twitter để làm việc này).

Sau đó, bạn cần sử dụng OAuth để đưa ra yêu cầu được ủy quyền lên Twitter .

Bạn có thể sử dụng tài nguyên GET statuses / user_timeline để có danh sách các tweet gần đây.


4
Xin vui lòng, cho chúng tôi những người ngu ngốc, giải thích. Bạn đang đưa ra cái nhìn sâu sắc, nếu không ít hơn, so với tài liệu. Bạn có sử dụng HttpRequest()chức năng của PHP cho bước 2 không? Có TwitterOAuth PHP của Abraham - github.com/abraham/twitteroauth - thư viện được cho là cũng làm điều này, nhưng một ví dụ về cách thực hiện nó không thực sự được cung cấp.
RCNeil

2
github.com/abraham/twitteroauth/blob/master/test.php dường như có rất nhiều ví dụ!
Matthew Rapati

2
Trang @MatthewRapati bị thiếu.
RN Kushwaha

0

Đây là một tóm tắt để nhận được một số lượng tweet cụ thể từ dòng thời gian của bạn. Về cơ bản, nó thực hiện tương tự như các ví dụ khác, chỉ với ít mã hơn.

Chỉ cần điền vào các phím và điều chỉnh $counttheo ý thích của bạ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))))))));

Cái này sử dụng các hàm ẩn danh và file_get_contentsthay vì thư viện cURL. Lưu ý việc sử dụng một nonce băm MD5. Mọi người dường như đang đồng hành cùng với time()nonce, tuy nhiên, hầu hết các ví dụ trên web liên quan đến OAuth đều sử dụng một loại chuỗi được mã hóa (như thế này: http://www.sitepoint.com/under Hiểu-oanuth-1 / ). Điều này có ý nghĩa hơn với tôi quá.

Lưu ý thêm: bạn cần PHP 5.3+ cho các chức năng ẩn danh (trong trường hợp máy chủ / máy tính của bạn đang ở trong hang động chiến tranh lạnh và bạn không thể nâng cấp nó).


-1

Từ trình tạo chữ ký của họ , bạn có thể tạo curlcác lệnh có dạng:

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
Vui lòng bao gồm một lời giải thích về những gì mã này làm, để OP có thể học hỏi từ nó.
Cerbrus

-2

Nhờ chủ đề này, và đặc biệt là budidino bởi vì mã của anh ấy là thứ đã đưa nó về nhà cho tôi. Chỉ muốn đóng góp cách lấy dữ liệu JSON từ một yêu cầu. Thay đổi phần yêu cầu "// tạo yêu cầu" của mã để thực hiện các yêu cầu khác nhau. Cuối cùng, điều này sẽ xuất JSON lên màn hình trình duyệt

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

Nếu nó hữu ích cho bất cứ ai ... Trong blog của tôi, tôi đã triển khai mã PHP sau đây để truy xuất các tweet cuối cùng, trích xuất dữ liệu phù hợp nhất của họ và sau đó lưu chúng vào cơ sở dữ liệu MySQL. Nó hoạt động bởi vì tôi đã nhận nó trong blog của tôi.

Bảng "tweets" nơi lưu trữ chúng:

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

Chức năng lưu các 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;
}

'Nó hoạt động vì tôi đã nhận nó trong blog của mình' là một trong những mục yêu thích của tôi. Bài viết của bạn không trả lời câu hỏi thực tế. Ngoài ra mã php bạn đang sử dụng có chất lượng kém. Đọc một chút ở đây phptherightway.com . Đặc biệt là về DB
Maciej Paprocki

Ngoài ra, bạn đã công khai tất cả các khóa và mã thông báo của mình, vì vậy đừng ngạc nhiên nếu ai đó lấy nó và hack tài khoản twitter của bạn!
garrettlynch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.