Статьи

Использование нового API Twitter V1.1


С 5 марта 2013 года Twitter удаляет текущий API, и он будет полностью заменен новым API V1.1.
Это означает, что любое приложение, которое в настоящее время использует старый API, перестанет работать 5 марта. Главной особенностью API является то, что запросы должны пройти проверку подлинности, прежде чем они будут работать правильно. Это так, что Twitter может предотвратить злоупотребления своим API.

Некоторое время назад я написал виджет WordPress, который будет отображать ваши последние посты в Твиттере , теперь этот виджет нужно будет обновить и заменить новым API.

В этом уроке мы собираемся исследовать изменения, которые мы должны внести, чтобы обновить приложение Twitter с версии 1 до версии 1.1, в предыдущем уроке мы использовали WordPress для кэширования и отображения твитов и будем продолжать использовать WordPress с новым API.

Создать приложение на Twitter

Чтобы начать использовать новый API, вам необходимо пройти аутентификацию, а это значит, что Twitter должен иметь определенную информацию о вашем приложении и о том, как оно будет использоваться, чтобы предоставить вам ключи доступа для использования API.

Чтобы получить ключи доступа, вам нужно создать приложение на сайте Twitter Developer.

Разработчики Twitter

Как только ваше приложение будет создано, Twitter сгенерирует ваши настройки Oauth и ваши маркеры доступа к вашему новому приложению. Вам нужно будет использовать эти данные при подключении к Oauth Twitter, чтобы запросить API Twitter.

Скачать Twitter OAUTH PHP класс

Со всеми данными, которые нам нужны для подключения к Twitter. Теперь нам нужен способ подключения к API. Twitter создал коллекцию библиотек, которые позволят вам подключаться к новому API на любом языке, который вы используете.

Библиотеки API Twitter

Поскольку это приложение использует WordPress, мы собираемся использовать одну из библиотек PHP под названием Twitteroauth, которую вы можете бесплатно загрузить с Github.

Twitteroauth

Эта библиотека имеет 2 класса, которые позволяют легко подключаться к Twitter с помощью OAuth, и в этом уроке мы увидим, насколько это просто, получив список последних твитов.

Получите последние твиты

Теперь у нас есть библиотека PHP для подключения к Twitter, теперь мы можем использовать это в нашем виджете WordPress для получения последних твитов.

API версии 1

В версии 1 Twitter API вы можете позвонить, как показано ниже, чтобы вернуть ваши твиты.

$transName = 'list-tweets';
$cacheTime = 10; 
if(false === ($twitterData = get_transient($transName) ) ){
     // Get the tweets from Twitter.
     $json = wp_remote_get("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=".$this->twitter_username."&count=".$this->twitter_postcount);
     // Get tweets into an array.
     $twitterData = json_decode($json['body'], true);
     // Save our new transient.
     set_transient($transName, $twitterData, 60 * $cacheTime);
}
foreach($twitterData as $tweets)
{
     // display a list of your tweets
}

При этом используется переходный API WordPress для кэширования результатов вызова Twitter, поэтому нам нужно каждые 10 минут вызывать API только для проверки новых обновлений. Чтобы сделать вызов API Twitter, мы используем другую встроенную функцию WordPress под названием wp_remote_get (), которая использует параметр для URL-адреса, это сделает HTTP-запрос к этому URL-адресу и вернет содержимое файла. Так как он возвращает JSON, мы можем заполнить его объектом, используя PHP-функцию json_decode () . Когда эти данные находятся в переменной, мы сохраняем новое содержимое в кэше базы данных, используя временный API . Затем мы можем просмотреть данные, чтобы отобразить каждый твит на странице.

API версии 1.1

Благодаря классу TwitterOauth, который мы скачали с Github, вызов API версии 1.1 очень похож, ниже приведен код, который мы будем использовать для версии 1.1.

$transName = 'list_tweets';
$cacheTime = 10;
if(false === ($twitterData = get_transient($transName) ) ){
     // require the twitter auth class
     require_once 'twitteroauth/twitteroauth.php';
     $twitterConnection = new TwitterOAuth(
					'xxxxxxxxxxxxxxxxxxxxxx',	// Consumer Key
					'xxxxxxxxxxxxxxxxxxxxxx',   	// Consumer secret
					'xxxxxxxxxxxxxxxxxxxxxx',       // Access token
					'xxxxxxxxxxxxxxxxxxxxxx'    	// Access token secret
					);
     $twitterData = $twitterConnection->get(
					  'statuses/user_timeline',
					  array(
					    'screen_name'     => $tab['twitter_username'],
					    'count'           => $tab['twitter_post_count'],
					    'exclude_replies' => false
					  )
					);
     if($twitterConnection->http_code != 200)
     {
          $twitterData = get_transient($transName);
     }
     // Save our new transient.
     set_transient($transName, $twitterData, 60 * $cacheTime);
}

Как вы можете видеть, код очень похож на код версии 1, мы начинаем таким же образом, используя временный API, чтобы проверить, есть ли какие-либо данные в кэше. Если данных нет или срок действия кэша истек, мы должны получить твиты с помощью API.

Чтобы использовать API, мы сначала должны аутентифицировать наш запрос с помощью класса TwitterOauth. Чтобы сделать это, нам нужно включить его в наш код, а затем создать экземпляр класса TwitterOath. Конструктор этого класса имеет 4 параметра, которые вы получите с сайта Twitter для разработчиков.

require_once 'twitteroauth/twitteroauth.php';
     $twitterConnection = new TwitterOAuth(
					'xxxxxxxxxxxxxxxxxxxxxx',	// Consumer Key
					'xxxxxxxxxxxxxxxxxxxxxx',   	// Consumer secret
					'xxxxxxxxxxxxxxxxxxxxxx',       // Access token
					'xxxxxxxxxxxxxxxxxxxxxx'    	// Access token secret
					);

Теперь мы можем использовать эту переменную $ twitterConnection для вызова нового API Twitter с помощью метода get (). Этот метод get () принимает 2 параметра: первый — это вызов, который вы хотите сделать, а второй — параметры, передаваемые в API.

$twitterData = $twitterConnection->get(
				'statuses/user_timeline',
				 array(
					 'screen_name'     => $tab['twitter_username'],
					 'count'           => $tab['twitter_post_count'],
					 'exclude_replies' => false
				)
				);
foreach($twitterData as $tweets)
{
     // Display the tweets
}

Возвращаемым методом get будет объект данных из Twitter API, заполненный твитами, которые соответствуют заданным вами параметрам. Как только эта переменная заполнена, мы можем просмотреть содержимое для отображения твитов.

Это все, что вам нужно, чтобы начать использовать новый API, вам нужно внести изменения в существующие приложения Twitter до 5 марта, иначе ваше приложение перестанет работать.

Полный код виджета Twitter V1.1 WordPress

<?php
/*
 * Plugin Name: Paulund Display Latest Tweets
 * Plugin URI: http://www.paulund.co.uk
 * Description: A widget that displays your latest tweets
 * Version: 1.0
 * Author: Paul Underwood
 * Author URI: http://www.paulund.co.uk
 * License: GPL2
    Copyright 2012  Paul Underwood
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License,
    version 2, as published by the Free Software Foundation.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
*/
/**
 * Register the Widget
 */
add_action( 'widgets_init', create_function( '', 'register_widget("pu_tweet_widget");' ) );
/**
 * Create the widget class and extend from the WP_Widget
 */
 class pu_tweet_widget extends WP_Widget {
	private $twitter_title = "My Tweets";
	private $twitter_username = "paulund_";
	private $twitter_postcount = "10";
	private $twitter_follow_text = "Follow Me On Twitter";
	/**
	 * Register widget with WordPress.
	 */
	public function __construct() {
		parent::__construct(
			'pu_tweet_widget',		// Base ID
			'Paulund Twitter Widget',		// Name
			array(
				'classname'		=>	'pu_tweet_widget',
				'description'	=>	__('A widget that displays your latest tweets.', 'framework')
			)
		);
		// Load JavaScript and stylesheets
		$this->register_scripts_and_styles();
	} // end constructor
	/**
	 * Registers and enqueues stylesheets for the administration panel and the
	 * public facing site.
	 */
	public function register_scripts_and_styles() {
	} // end register_scripts_and_styles
	/**
	 * Front-end display of widget.
	 *
	 * @see WP_Widget::widget()
	 *
	 * @param array $args     Widget arguments.
	 * @param array $instance Saved values from database.
	 */
	public function widget( $args, $instance ) {
		extract( $args );
		/* Our variables from the widget settings. */
		$this->twitter_title = apply_filters('widget_title', $instance['title'] );
		$this->twitter_username = $instance['username'];
		$this->twitter_postcount = $instance['postcount'];
		$this->twitter_follow_text = $instance['tweettext'];
		$transName = 'list_tweets';
	    $cacheTime = 20;
	    if(false === ($twitterData = get_transient($transName) ) ){
	    	require_once 'twitteroauth/twitteroauth.php';
			$twitterConnection = new TwitterOAuth(
								'xxxxxxxxxxxxxxxxxxxxxx',	// Consumer Key
								'xxxxxxxxxxxxxxxxxxxxxx',   	// Consumer secret
								'xxxxxxxxxxxxxxxxxxxxxx',       // Access token
								'xxxxxxxxxxxxxxxxxxxxxx'    	// Access token secret
								);
			$twitterData = $twitterConnection->get(
					  'statuses/user_timeline',
					  array(
					    'screen_name'     => $tab['twitter_username'],
					    'count'           => $tab['twitter_post_count'],
					    'exclude_replies' => false
					  )
					);
			if($twitterConnection->http_code != 200)
			{
				$twitterData = get_transient($transName);
			}
	        // Save our new transient.
	        set_transient($transName, $twitterData, 60 * $cacheTime);
	    }
		/* Before widget (defined by themes). */
		echo $before_widget;
		?>
<div class="twitter_box"><?php
		/* Display the widget title if one was input (before and after defined by themes). */
		if ( $this->twitter_title )
			echo $before_title . $this->twitter_title . $after_title;
		/* Display Latest Tweets */
		 ?>
			<a href="https://twitter.com/<?php echo $this->twitter_username; ?>"
				class="twitter-follow-button"
				data-show-count="true"
				data-lang="en">Follow @<?php echo $this->twitter_username; ?></a>
			<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
            <?php
            	if(!empty($twitterData) || !isset($twitterData['error'])){
            		$i=0;
					$hyperlinks = true;
					$encode_utf8 = true;
					$twitter_users = true;
					$update = true;
					echo '
<ul class="twitter_update_list">';
		            foreach($twitterData as $item){
		                    $msg = $item->text;
		                    $permalink = 'http://twitter.com/#!/'. $this->twitter_username .'/status/'. $item->id_str;
		                    if($encode_utf8) $msg = utf8_encode($msg);
		                    $link = $permalink;
		                     echo '
<li class="twitter-item">';
		                      if ($hyperlinks) {    $msg = $this->hyperlinks($msg); }
		                      if ($twitter_users)  { $msg = $this->twitter_users($msg); }
		                      echo $msg;
		                    if($update) {
		                      $time = strtotime($item->created_at);
		                      if ( ( abs( time() - $time) ) < 86400 )
		                        $h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
		                      else
		                        $h_time = date(__('Y/m/d'), $time);
		                      echo sprintf( __('%s', 'twitter-for-wordpress'),' <span class="twitter-timestamp"><abbr title="' . date(__('Y/m/d H:i:s'), $time) . '">' . $h_time . '</abbr></span>' );
		                     }
		                    echo '</li>
';
		                    $i++;
		                    if ( $i >= $this->twitter_postcount ) break;
		            }
					echo '</ul>
';
            	}
            ?>
       		</div>
		<?php
		/* After widget (defined by themes). */
		echo $after_widget;
	}
	/**
	 * Sanitize widget form values as they are saved.
	 *
	 * @see WP_Widget::update()
	 *
	 * @param array $new_instance Values just sent to be saved.
	 * @param array $old_instance Previously saved values from database.
	 *
	 * @return array Updated safe values to be saved.
	 */
	function update( $new_instance, $old_instance ) {
		$instance = $old_instance;
		// Strip tags to remove HTML (important for text inputs)
		foreach($new_instance as $k => $v){
			$instance[$k] = strip_tags($v);
		}
		return $instance;
	}
	/**
	 * Create the form for the Widget admin
	 *
	 * @see WP_Widget::form()
	 *
	 * @param array $instance Previously saved values from database.
	 */
	function form( $instance ) {
		/* Set up some default widget settings. */
		$defaults = array(
		'title' => $this->twitter_title,
		'username' => $this->twitter_username,
		'postcount' => $this->twitter_postcount,
		'tweettext' => $this->twitter_follow_text,
		);
		$instance = wp_parse_args( (array) $instance, $defaults ); ?>
		<!-- Widget Title: Text Input -->

			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Title:', 'framework') ?></label>
			<input type="text" class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" />
		
		<!-- Username: Text Input -->

			<label for="<?php echo $this->get_field_id( 'username' ); ?>"><?php _e('Twitter Username e.g. paulund_', 'framework') ?></label>
			<input type="text" class="widefat" id="<?php echo $this->get_field_id( 'username' ); ?>" name="<?php echo $this->get_field_name( 'username' ); ?>" value="<?php echo $instance['username']; ?>" />
		
		<!-- Postcount: Text Input -->

			<label for="<?php echo $this->get_field_id( 'postcount' ); ?>"><?php _e('Number of tweets (max 20)', 'framework') ?></label>
			<input type="text" class="widefat" id="<?php echo $this->get_field_id( 'postcount' ); ?>" name="<?php echo $this->get_field_name( 'postcount' ); ?>" value="<?php echo $instance['postcount']; ?>" />
		
		<!-- Tweettext: Text Input -->

			<label for="<?php echo $this->get_field_id( 'tweettext' ); ?>"><?php _e('Follow Text e.g. Follow me on Twitter', 'framework') ?></label>
			<input type="text" class="widefat" id="<?php echo $this->get_field_id( 'tweettext' ); ?>" name="<?php echo $this->get_field_name( 'tweettext' ); ?>" value="<?php echo $instance['tweettext']; ?>" />
		
	<?php
	}
	/**
	 * Find links and create the hyperlinks
	 */
	private function hyperlinks($text) {
	    $text = preg_replace('/\b([a-zA-Z]+:\/\/[\w_.\-]+\.[a-zA-Z]{2,6}[\/\w\-~.?=&%#+$*!]*)\b/i',"<a href=\"$1\" class=\"twitter-link\">$1</a>", $text);
	    $text = preg_replace('/\b(?<!:\/\/)(www\.[\w_.\-]+\.[a-zA-Z]{2,6}[\/\w\-~.?=&%#+$*!]*)\b/i',"<a href=\"http://$1\" class=\"twitter-link\">$1</a>", $text);
	    // match name@address
	    $text = preg_replace("/\b([a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]*\@[a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]{2,6})\b/i","<a href=\"mailto://$1\" class=\"twitter-link\">$1</a>", $text);
	        //mach #trendingtopics. Props to Michael Voigt
	    $text = preg_replace('/([\.|\,|\:|\¡|\¿|\>|\{|\(]?)#{1}(\w*)([\.|\,|\:|\!|\?|\>|\}|\)]?)\s/i', "$1<a href=\"http://twitter.com/#search?q=$2\" class=\"twitter-link\">#$2</a>$3 ", $text);
	    return $text;
	}
	/**
	 * Find twitter usernames and link to them
	 */
	private function twitter_users($text) {
	       $text = preg_replace('/([\.|\,|\:|\¡|\¿|\>|\{|\(]?)@{1}(\w*)([\.|\,|\:|\!|\?|\>|\}|\)]?)\s/i', "$1<a href=\"http://twitter.com/$2\" class=\"twitter-user\">@$2</a>$3 ", $text);
	       return $text;
	}
 }
?>