0

我正在尝试使用一个类使用 twitter api v1.1 进行一些搜索,但每次我得到和身份验证错误消息时:

这是原始课程的链接:https ://gist.github.com/tw2113/5468916

这是我正在使用的代码:

<?php
/**
 * Class for connecting to Twitter's API 1.1 using WordPress APIs
 */
class TwitterAuth11 {

    protected $consumer_key        = 'MCQ8u3TMuBAidL4AKBtQ';
    protected $consumer_secret     = 'HIyZbh1FTDtpOK9qdX5yP3ZmNobnJcb2lKnhPONg6WI';
    protected $access_token        = '104977066-dLQj8ibcxlafcsGiwTOanw1buy0OIejhy51PzFsc';
    protected $access_token_secret = 'nUkWIGX21LICgw8ZqoxwfasisB4ma3YpzwXr7EzY8';
    protected $url                 = 'https://api.twitter.com/1.1/';

    protected function authenticate( $user, $return = true ) {

        $body = json_decode( $body );

        if ( $body && !empty( $response['headers']['status'] ) && $response['headers']['status'] == '200 OK' ) {
            if ( $return == false ) $body = null;
            $noauth  = '';
            $badauth = 'good';
        } else {
            $body    = null;
            $badauth = 'error';
            $noauth  = true;
        }

        return array(
            'response' => $body,
            'badauth'  => $badauth,
            'noauth'   => $noauth,
        );

    }

    function get_tweets( $user = '', $count = 1 ) {

        $this->user = $user;

        $url      = $this->twAPIurl( array( 'screen_name' => $user, 'count' => $count ) );
        $args     = $this->header_args( array( 'screen_name' => $user, 'count' => $count ) );

        //$this->salida = '<br> url: ' . $url . '<br>Args: ' . '<pre>'. htmlentities( print_r( $args, true ) ) .'</pre>';

        $response = wp_remote_get( $url, $args );

        if( is_wp_error( $response ) )
           return '<strong>ERROR:</strong> '. $response->get_error_message();

        $error = 'Could not access Twitter feed.';
        return $this->returnData( $response, $error );

    }

    function search_tweets( $user = '', $count = 1, $search = '' ) {

        $this->user = $user;

        $url      = $this->twAPIurl( array( 'q' => urlencode( $search ) ), 'search/tweets.json' );
        $args     = $this->header_args( array( 'q' => urlencode( $search ) ) );

        //$this->salida = '<br> url: ' . $url . '<br>Args: ' . '<pre>'. htmlentities( print_r( $args, true ) ) .'</pre>';

        $response = wp_remote_get( $url, $args );

        if( is_wp_error( $response ) )
           return '<strong>ERROR:</strong> '. $response->get_error_message();

        $error = 'Could not access Twitter feed.';
        return $this->returnData( $response, $error );

    }

    function authenticate_user( $user = '' ) {

        $this->user = $user;

        $url        = $this->twAPIurl( array( 'screen_name' => $user ), 'users/lookup.json' );
        $args       = $this->header_args( array( 'screen_name' => $user ) );
        $response   = wp_remote_get( $url, $args );

        if( is_wp_error( $response ) )
           return false;

        $error = 'Could not access Twitter user.';
        return $this->returnData( $response, $error );

    }

    protected function returnData( $response, $error_message = '' ) {

        $body = wp_remote_retrieve_body( $response );
        $json = json_decode( $body );

        if ( isset( $json->errors ) ) {
            $errors = new WP_Error( 'twitter_auth_error', $error_message );

            foreach ( $json->errors as $key => $error ) {

                $errors->add( 'twitter_auth_error', '<strong>ERROR '. $error->code .':</strong> '. $error->message );
            }
            return $errors;
        }

        return $json;
    }

    protected function header_args( $args = array() ) {

        if ( !isset( $this->user ) || ! $this->user )
            return null;

        // Set our oauth data
        $defaults = array(
            //'screen_name'            => $this->user,
            'oauth_consumer_key'     => $this->consumer_key,
            'oauth_nonce'            => base64_encode( substr(md5(rand(0, 1000000)), 0, 32 ) ),
            'oauth_signature_method' => 'HMAC-SHA1',
            'oauth_token'            => $this->access_token,
            'oauth_timestamp'        => time(),
            'oauth_version'          => '1.0'
        );

        $oauth = wp_parse_args( $defaults, $args );

        //echo '<pre>'. htmlentities( print_r( $oauth, true ) ) .'</pre>';
        //echo '<br><br><hr><br>';

        $base_info = $this->build_base( $this->base_url(), $oauth );
        $composite_key = $this->consumer_secret .'&'. $this->access_token_secret;

        // create our oauth signature
        $oauth['oauth_signature'] = base64_encode( hash_hmac( 'sha1', $base_info, $composite_key, true ) );

        echo '<span>'.$base_info .'</span>';
        echo '<br><br><hr><br>';
        echo '<span>'. urldecode( $base_info ) .'</span>';
        echo '<br><br><hr><br>';


        $auth_args = array(
            'sslverify' => false,
            'headers'   => array(
                'Authorization'   => 'OAuth '. $this->authorize_header( $oauth ),
                'Expect'          => false,
                'Accept-Encoding' => false
            ),
        );

        return $auth_args;
    }

    protected function build_base( $baseURI, $params ) {
        $base = array();
        ksort( $params );
        foreach( $params as $key => $value ){
            $base[] = $key .'='. rawurlencode( $value );
        }

        return 'GET&'. rawurlencode( $baseURI ) .'&'. rawurlencode( implode( '&', $base ) );

    }

    protected function authorize_header( $oauth ) {
        $header = '';
        $values = array();
        foreach( $oauth as $key => $value ) {
            if ( $key == 'screen_name' || $key == 'count' )
                continue;
            $values[] = $key .'="'. rawurlencode( $value ) .'"';
        }

        $header .= implode( ', ', $values );

        return $header;
    }

    protected function twAPIurl( $params = false, $trail = 'statuses/user_timeline.json' ) {

        // append trailing path
        $this->base_url = $this->url . $trail;
        // append query args
        return $params ? add_query_arg( $params, $this->base_url ) : $this->base_url;
    }

    protected function base_url() {

        // set it up
        if ( !isset( $this->base_url ) )
            $this->twAPIurl();

        return $this->base_url;
    }
}


add_action( 'all_admin_notices', 'testing_twitter_api');

/**
 * Test the api in the WordPress Dashboard
 */
function testing_twitter_api() {
    echo '<div id="message" class="updated"><p>';

        $twitter = new TwitterAuth11();


        // Search api
        $search = $twitter->search_tweets( 'ntrzacatecas', 3, '#ntr from:212Toga OR from:jasonbarkerm OR from:ntrzacatecas OR from:AlbertoChiu OR from:marcazac OR from:ortegasaul' );

        // uses proper wp_error objects
        if ( is_wp_error( $search ) )
            echo implode( '<br/>', $search->get_error_messages( 'twitter_auth_error' ) );
        else
            echo '<pre>'. htmlentities( print_r( $search, true ) ) .'</pre>';

    echo '</p></div>';

}

有任何想法吗?

谢谢您的帮助

4

1 回答 1

0

尝试使用适用于 WordPress 的 Twitter API 1.1 客户端

它很容易实现,你只需要你的consumer_keyconsumer_secret

示例(来自自述文件):

<?php

// Include Twitter API Client
require_once( 'class-wp-twitter-api.php' );

// Set your personal data retrieved at https://dev.twitter.com/apps
$credentials = array(
  'consumer_key' => 'xxxxxxxxxxxxxxxx',
  'consumer_secret' => 'xxxxxxxxxxxxxxxx'
);

// Let's instantiate Wp_Twitter_Api with your credentials
$twitter_api = new Wp_Twitter_Api( $credentials );

// Example a - Retrieve last 5 tweets from my timeline (default type statuses/user_timeline)
$query = 'count=5&include_entities=true&include_rts=true&screen_name=micc1983';
var_dump( $twitter_api->query( $query ) );
于 2013-07-23T06:30:57.207 回答