Twitter API 버전 1.1로 user_timeline을 검색하기위한 가장 간단한 PHP 예제


292

2013 년 6 월 11 일 기준 으로 Twitter API 1.0이 중단되었으므로 아래 스크립트는 더 이상 작동하지 않습니다.

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

가능한 최소한의 코드로 user_timeline (최근 상태)을 얻는 방법은 무엇입니까?

나는 이것을 발견했다 : https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline 그러나 다음과 같은 오류가 발생합니다 :

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

거기에는 많은 수업이 있지만 몇 가지 시도한 후에는 트위터의 업데이트로 인해 작동하지 않는 것 같습니다. 일부는 실제로 필요하지 않은 많은 기능을 갖춘 고급 클래스입니다.

PHP로 최근 사용자 상태를 얻는 가장 간단한 방법은 무엇입니까?


97
나는 이것에 대한 답을 원한다. 그들의 문서는 끔찍합니다.
RCNeil 2016 년

나는 트위터 API를 처음 사용하고 조금 어려움을 겪고 있습니다. 더 이상 사용되지 않는 코드를 사용했습니다.
Anthony


@ 마크 고마워요 !! 그것은 쉽다!! 처음에는 효과가 없었습니다. WAMP를 사용하고 있습니다. 이 스레드에 따라 Apache 디렉토리에서 php.ini를 변경해야했습니다. stackoverflow.com/questions/5444249/…
Adlin Ling

1
방금 CURL이나 다른 추가 라이브러리가없는 솔루션을 작성했습니다 : stackoverflow.com/questions/17049821/…
Rauli Rajande

답변:


820

중요 사항 : 2018 년 중반부터 트위터 API 토큰을 얻는 프로세스가 훨씬 관료적으로되었습니다. 그것은을 통해 저를 얻었습니다 주 작업 한 API 토큰 세트를 제공하고,이 이상하면 남자와 여자를위한 오픈 소스 프로젝트입니다 만 1.2 설치 이론적으로 더 높은 우선 순위해야 Github에서에 Packagist에와 1,600 회의 별 .

작업을 위해 twitter API를 사용하는 작업을 수행하는 경우 잠재적으로 매우 긴 대기 시간을 고려해야합니다. 또한 토큰을 검색하는 프로세스가 즉각적이므로 Facebook 또는 Instagram과 같은 다른 소셜 미디어 수단을 고려하고 이러한 옵션을 제공하십시오.


트위터 v1.1 API를 사용 하시겠습니까?

참고 : 이들 파일은 GitHub에 있습니다 .

버전 1.0 은 곧 더 이상 사용되지 않으며 승인되지 않은 요청은 허용되지 않습니다. 그래서 여기에 당신의 삶을 편하게 해주는 PHP 클래스와 함께 그 일을 도와주는 게시물이 있습니다.

1. 개발자 계정 만들기 : Twitter 에서 개발자 계정 을 설정하십시오 .

공식 Twitter 개발자 사이트를 방문하여 개발자 계정을 등록해야합니다. 이것은 v1.1 API를 요청 하는 무료 단계입니다.

2. 애플리케이션 작성 : Twitter 개발자 사이트에서 애플리케이션 작성

뭐? 인증되지 않은 요청을 할 수 있다고 생각 했습니까? Twitter의 v1.1 API에는 해당되지 않습니다. http://dev.twitter.com/apps 를 방문 하여 "응용 프로그램 만들기"버튼을 클릭 해야 합니다.

여기에 이미지 설명을 입력하십시오

이 페이지에서 원하는 세부 사항을 입력하십시오. 스팸 추종자를 제거하기 위해 많은 차단 요청을 원했기 때문에 문제가되지 않았습니다. 요점은 응용 프로그램에 사용할 고유 키 세트 를 얻는 것 입니다.

따라서 응용 프로그램을 만드는 요점은 자신과 트위터에 일련의 키를 제공하는 것입니다. 이것들은:

  • 소비자 키
  • 소비자 비밀
  • 액세스 토큰
  • 액세스 토큰 비밀

여기 에 이러한 토큰에 대한 정보가 약간 있습니다 .

3. 액세스 토큰 생성 : 성공적인 요청을 위해서는이 토큰 이 필요합니다

OAuth 는 몇 개의 토큰을 요청합니다. 따라서 당신을 위해 그것들을 생성해야합니다.

여기에 이미지 설명을 입력하십시오

하단에서 "내 액세스 토큰 만들기"를 클릭하십시오. 그런 다음 바닥으로 다시 스크롤하면 새로 생성 된 키가 생깁니다. API 호출을 위해이 페이지에서 이전에 레이블이 지정된 4 개의 키를 가져 와서 어딘가에 기록하십시오.

4. 액세스 수준 변경 : 읽기 전용을 원하지 않습니까?

이 API를 적절하게 사용하려면 GET 요청을 사용하여 표준 데이터 검색 이외의 작업을 수행하는 경우 설정을 읽기 및 쓰기로 변경해야 합니다.

여기에 이미지 설명을 입력하십시오

페이지 상단 근처의 "설정"탭을 선택하십시오.

여기에 이미지 설명을 입력하십시오

응용 프로그램에 읽기 / 쓰기 권한을 부여하고 맨 아래에서 "업데이트"를 누르십시오.

당신은 할 수 있는 응용 프로그램 권한 모델에 대한 자세한 내용을 트위터 여기에 사용.


5. API에 액세스하기위한 코드 작성 : 대부분의 작업을 수행했습니다

위의 코드를 일부 수정 및 변경과 함께 PHP 클래스로 결합하여 필요한 요청을하는 것이 매우 간단합니다.

이것은 OAuthTwitter v1.1 API 및 내가 만든 클래스를 사용합니다.

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

위의 응용 프로그램에서 얻은 키를 각각의 공간에 두십시오.

다음으로 요청하려는 URL을 선택해야합니다. Twitter에는 URL 및 요청 유형 (POST 또는 GET)을 선택하는 데 도움이되는 API 설명서 가 있습니다.

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

설명서에서 각 URL에는 전달할 수있는 내용이 나와 있습니다. 위와 같은 "blocks"URL을 사용하는 경우 다음 POST 매개 변수를 전달할 수 있습니다.

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

API로 수행하려는 작업을 설정 했으므로 이제 실제 요청을해야합니다.

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

그리고 POST 요청의 경우 끝입니다!

A에 대한 GET의 요청, 그것은 약간의 다릅니다. 예를 들면 다음과 같습니다.

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

최종 코드 예 : 내 팔로워 목록에 대한 간단한 GET 요청.

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

이 파일 들을 @ lackovic10과 @rivers의 신용 으로 GitHub 에 넣었습니다! 누군가가 유용하다고 생각합니다. 나는 내가 한 일을 알고있다 (루프에서 대량 차단에 사용했다).

또한 SSL 인증서에 문제가있는 Windows 사용자는 이 게시물을 참조하십시오 . 이 라이브러리는 후드 아래에서 cURL을 사용하므로 cURL 인증서가 설정되어 있는지 확인해야합니다. 구글도 친구입니다.


4
@kaffolder 해당 페이지의 링크 : profilepicture.co.uk/caching-api-responses-php 는 간단한 방법을 제안합니다. 첫 번째 요청에서 트위터 데이터를 파일 또는 데이터베이스 (MySQL 또는 MongoDB)에 쓴 다음 후속 요청마다 현재 시간을 파일에 대해 원하는 시간 제한 ( 파일 이름을 시간 제한으로 지정할 수 있음 )과 비교합니다. 파일이 존재하고 파일 이름이 원하는 시간 제한 내에 있으면 API 요청을 수행하는 대신 데이터를 가져옵니다. 파일이 존재하지만 시간 제한이 전달 된 경우 파일을 삭제 한 후 API 요청을 수행하십시오.
Jimbo

7
일단 반환 된 json 데이터를 처리하는 방법을 알 수 없습니다. echo와 같이 화면에 에코하고 싶지는 않습니다. $ twitter-> setGetfield ($ getfield)-> buildOauth ($ url, $ requestMethod)-> performRequest (); 사과, 줄 바꿈 방법을 알 수 없습니다! $ jsonData = json_decode ($ twitter); 그러나 그것은 작동하지 않습니다-나는 근본적인 것을 놓치고 있다고 느끼지만 페니가 떨어지지 않습니다 ...
Ashley

67
고맙습니다. 트위터의 문서는 혼란스러워 져서 크게 도움이되었습니다.
joren

7
이 클래스를 Windows에서 사용하려면 몇 가지 전제 조건이 있습니다. 파일 에 cURL 의 작업 버전이 로드되어 php.ini있어야하고 또한를 php.ini사용 하여 파일에 CA 인증서를로드해야합니다 curl.cainfo = path\to\cacert.pem. 여기 에서 CA 인증서를 얻을 수 있습니다 .
Jake Z

4
@ Jimbo 나는 기본 cURL 확장 중 일부가 Windows에서 버그가 있고 교체 (따라서 "고정 된"버전에 대한 링크)가 필요하고 CA 인증서를로드하지 않으면 클래스가 curl_error () SSL 인증서 문제, CA 인증서가 정상인지 확인합니다. CURLOPT_SSL_VERIFYPEER를 끄면 피할 수 있지만 실제로 CA 인증서를 사용하는 기본 지침을 포함시킬 것이라고 생각했습니다. 몇 분의 검색 시간을 절약 할 수 있도록이 기능을 포함했습니다.
Jake Z

137

dev.twitter.com으로 이동하여 응용 프로그램을 만듭니다 . 필요한 자격 증명이 제공됩니다. 다음은 최근에 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);

?>

이것은 명령 행에서 실행할 수 있습니다.

$ php <name of PHP script>.php

2
코드 스 니펫에 감사드립니다. 유일한 문제는 포스트 카운트 리턴을 설정하는 방법을 알아낼 수 없다는 것입니다. 그것은 20 만 반환하고 트위터 한도에 따라 200 인 전체 금액을 원합니다.
Flatlyn

23
당신은 어떻게 설정할 것입니다 screen_namecount이 방법? $url변수에 추가하려고했지만 "인증 할 수 없습니다"오류가 발생했습니다.
Javier Villanueva

1
이 코드는 훌륭하게 작동합니다! search / tweets.json API를 사용하도록 수정하려고하지만 항상 '당신을 인증 할 수 없습니다'라는 응답이 있습니다-어떤 아이디어?
Chris

1
이 게시물은 매우 도움이되었습니다. 내 코드는 돌아 오는 것 같지 않습니다 curl_init(). 몇 가지 예를 살펴 봤는데 여기에서이 코드와 매우 간단하고 간단하고 정확하게 보입니다 ... 특별한 것을 설치해야합니까?
jessicaraygun

1
2016 년 10 월 26 일에 효과가있었습니다. 결과는 예상보다 조금 더 복잡했습니다.
JohnC

61

Rivers가 붙여 넣은 코드는 훌륭합니다. 고마워요! 나는 여기에 새로 왔고 논평 할 수 없다. 나는 javiervd의 질문에 대답하고 싶다. 밖.

URL 및 서명 작성 프로세스 모두에 매개 변수를 추가해야합니다 . 서명을 작성하면 도움이 된 기사입니다. 내 코드는 다음과 같습니다.

$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
나는 이것을 충분히 투표 할 수 없다. 트위터의 API 문서에서 이것은 당신을 정면으로 응시하지만 결코 '명백한'것은 아닙니다. 이 접근 방식이 buildAuthorizationHeader함수를 혼란스럽게합니까 ? 별도로 구현했습니다.
Moe

이 문제를 오랫동안 해결하지 않았으므로 아직 문제가 해결되지 않았다면 다음 날에 살펴볼 수 있습니다.
lackovic10

운이없이 statuses / update.json에서 POST를 수행하도록 솔루션을 조정하려고 시도했지만 이것이 어떻게 달성 될 수 있는지 알고 있습니까?
perrohunter

1
@ perrohunter 나는 이것에 대해 더 많이 볼 필요가 없다고 생각합니다. 며칠 안에 방법을 찾지 못하면 메시지를 보내 주시면 도와 드리겠습니다.
lackovic10

18

다른 답변에서 언급했듯이 Twitter 앱을 만들어 토큰, 키 및 비밀을 얻으십시오. 다음 코드를 사용하면 한 지점에서 요청 매개 변수를 수정하고 오타 및 유사한 오류를 피할 수 있습니다 ( $request배열 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);
}

그런 다음 전화 returnTweet()


1
멋진 직업 @budidino! dev.twitter.com/apps 에서 애플리케이션을 만들고 x를 oauth_access_token, oauth_access_token_secret, consumer_key, consumer_secret로 채웠습니다. * 참고 * "내 액세스 토큰 만들기"를 눌러야하며 생성하는 데 몇 초가 걸리므로 기다려주십시오.
Theo

@ budidino dnt 우리는 모든 라이브러리를 포함해야합니까 ??
anam

키를 채우고 functions.phpWordPress의 파일에 추가 <?php echo returnTweet(); ?>하고 HTML 파일을 넣은 다음 "Array"라는 단어를 출력합니다.
J82

@Desi, 결과는 트윗의 배열입니다, 당신은 당신이 그들 각각을 표시하는 방법을 처리해야합니다. 안에 무엇이 있는지 보려면 print_r (returnTweet ())을 사용해보십시오. : 트윗의 모든 표시의 예를 확인 gist.github.com/budidino/9681764#file-stackoverflow-returntweet을
budidino

1
최신 트윗 만 가져 오려면 $ request 배열을 수정하고 개수를 1로 설정해야합니다. $ tweet = returnTweet (); 그런 다음 최신 트윗 (이 경우 유일한 트윗)을 표시하려면 다음과 같이 작성할 수 있습니다. echo "latest tweet :". $ tweet [0] [ "text"]; 트윗의 텍스트 이상을 가져 오려면 트위터의 반환 구조를 확인하십시오 (예 : $ userProfileImageURL = $ tweet [0] [ "user"] [ "profile_image_url"]). dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
budidino

16

크리스 감사합니다!

하나 이상의 매개 변수를 사용할 때마다 오류가 표시됩니다. 32 인증 할 수 없습니다.

나를위한 문제는 앰퍼샌드 인코딩에있었습니다. 따라서 코드에서 다음 줄이있는 곳

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

아래에 다음 줄을 추가했습니다.

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

그리고 screen_name 및 count와 같은 두 개 이상의 매개 변수를 사용하여 작동했습니다.

전체 코드는 다음과 같습니다.

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

희망 그것은 내가 가진 것과 같은 문제를 가진 누군가를 돕습니다.


고마워, 코드 개선이 잘 작동합니다! 다시 한 가지 질문 : "// 더 강한 nonce가 권장됩니다". 그게 뭐야? 시각()?
Sebastian

지적 해 주셔서 감사합니다. Sebastian : nonce는 암호로 안전한 일회용 토큰입니다. mt_rand ()는 너무 짧고 (32 비트) 암호화 PRNG가 아닙니다. 이론적으로 이것은 oauth 토큰을 약하게 만들지 만 원래 예제 코드에서 단순화하기 위해 PHP에서 직접 이해하고 쉽게 이해할 수있는 것을 사용하고 싶었습니다.
Kris Reeves

32 오류가 발생했습니다. 인증 할 수 없습니다 .. 도와주세요 ??? 위 코드를 사용했습니다
saadk

@frewuill, 당신은 훌륭한 형제입니다, 그 매력처럼 작동합니다, 감사합니다.
vijay

9

이 질문은 많은 도움이되었지만 필요한 일을 이해하는 데 도움이되지 못했습니다. 이 블로그 게시물 은 저를 안내하는 놀라운 일을했습니다.

중요한 것은 다음과 같습니다.

  • 위에서 지적했듯이 1.1 API 요청에 서명해야합니다. 공개 상태를 얻는 것과 같은 일을하는 경우 사용자 키가 아닌 응용 프로그램 키가 필요합니다. 원하는 페이지의 전체 링크는 https://dev.twitter.com/apps입니다.
  • oauth 매개 변수와 get 매개 변수 (또는 POST 매개 변수)를 모두 함께 모든 매개 변수를 해시해야합니다.
  • 해시되는 URL 인코딩 형식으로 줄이기 전에 매개 변수를 정렬해야합니다.
  • 몇 가지 사항을 여러 번 인코딩해야합니다. 예를 들어 매개 변수의 URL 인코딩 된 값에서 쿼리 문자열을 만든 다음 THAT를 인코딩하고 메서드 유형 및 URL과 연결합니다.

나는 모든 두통에 동정한다. 그래서 그것을 마무리하는 코드가있다.

$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 라이브러리가 설치되어 있으면 직접 요청을 작성할 필요가 없습니다.

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

자세한 내용은 문서 또는 예제를 확인하십시오 . pecl install oauth라이브러리를 얻는 데 사용할 수 있습니다 .


5

우선 점보와 그의 게시물 / twitter-api-php simple library 에 감사하고 싶었습니다 .

"twitter-api-php"PHP 라이브러리 (TwitterAPIExchange.php)와 함께 GET search / tweets API 를 사용하려는 경우 :

먼저, "POST 요청을 수행하고 응답 코드를 에코하십시오"라고 주석을 달아야합니다.

"GET 요청 수행 및 응답 에코"코드를 사용하여 응답을 에코하고 다음 두 줄을 변경하십시오.

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

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

(변경 screen_name하는 q, 그것 뿐이다 :)


나는 아직 운이 없다 : /
Ricardo

2

Twitter에서 "앱"작성 해야합니다 (이를 수행하려면 Twitter 계정이 필요함).

그런 다음 OAuth사용하여 Twitter에 승인 된 요청을해야 합니다.

GET statuses / user_timeline 자원을 사용하여 최근 트윗 목록을 얻을 수 있습니다.


4
어리석은 사람들을 위해 설명하십시오. 당신은 문서보다 훨씬 적은 통찰력을 제공합니다. HttpRequest()2 단계에서 PHP의 기능을 사용 합니까? 이 작업을 수행 해야하는 Abraham의 TwitterOAuth PHP-github.com/abraham/twitteroauth 라이브러리가 있지만 구현 방법의 예는 실제로 제공되지 않습니다.
RCNeil

2
github.com/abraham/twitteroauth/blob/master/test.php 는 많은 예제를 가지고있는 것 같습니다!
Matthew Rapati

2
@MatthewRapati 페이지가 없습니다.
RN Kushwaha 2016 년

0

다음은 타임 라인에서 지정된 수의 트윗을 가져 오는 간단한 것입니다. 기본적으로 다른 예제와 동일한 방식으로 코드가 적습니다.

키를 채우고 $count원하는대로 조정 하십시오.

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

이것은 file_get_contentscURL 라이브러리 대신 익명 함수를 사용합니다. MD5 해시 된 nonce 사용을 참고하십시오. 모든 사람들이 time()nonce 와 함께 가고있는 것처럼 보이지만 OAuth에 관한 웹의 대부분의 예는 일종의 암호화 된 문자열을 사용합니다 (예 : http://www.sitepoint.com/understanding-oauth-1/ ). 이것은 나에게 더 의미가 있습니다.

추가 참고 사항 : 익명 기능을 위해서는 PHP 5.3 이상이 필요합니다 (서버 / 컴퓨터가 냉전 동굴에 있고 업그레이드 할 수없는 경우).


-1

자신의에서 서명 생성기 , 당신은 생성 할 수있는 curl형태의 명령을 :

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
OP가 배울 수 있도록이 코드의 기능에 대한 설명을 포함하십시오.
Cerbrus

-2

이 스레드, 특히 budidino 덕분에 그의 코드가 나를 위해 집으로 몰아 넣었습니다. 요청에서 JSON 데이터를 검색하는 방법에 기여하고 싶었습니다. 다른 요청을 수행하려면 코드의 "// request request"요청 배열 부분을 변경하십시오. 궁극적으로 이것은 JSON을 브라우저 화면에 출력합니다.

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

누군가에게 유용하다면 ... 내 블로그에서 마지막 트윗을 검색하고 가장 관련성이 높은 데이터를 추출한 다음 MySQL 데이터베이스에 저장하기 위해 다음 PHP 코드를 구현했습니다. 내 블로그에 넣었 기 때문에 작동합니다.

그것들을 저장하는 "tweets"테이블 :

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

트윗을 저장하는 기능 :

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

'내 블로그에 넣었 기 때문에 작동합니다'는 내가 가장 좋아하는 것 중 하나입니다. 게시물에 실제 질문에 대한 답변이 없습니다. 또한 사용중인 PHP 코드의 품질이 좋지 않습니다. 여기 phptherightway.com을 읽어보십시오 . 특히 DB에 대하여
Maciej Paprocki

또한 모든 키와 토큰을 공개 했으므로 누군가가 그것을 가져 와서 트위터 계정을 해킹하더라도 놀라지 마십시오!
garrettlynch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.