Twitter 在推出 1.1 版 API 時做出了一些更改。最顯著的變化之一是身份驗證的引入。也就是說,應用程式需要經過身份驗證才能向 API 發送請求。
身份驗證由 OAuth 提供支援 - 一種開放協議,允許透過簡單且標準的方法進行安全授權,從而允許用戶批准 申請代表他們行事而不共享他們的密碼。
在本教程中,我們將學習如何以程式設計方式與 Twitter 的 API 進行交互,同時開發一個 Twitter 時間軸 WordPress 小部件,該小部件顯示 Twitter 用戶發布的最新推文列表。
以下是本教學最後要建立的 Twitter 時間軸小工具的預覽。
至成功向 Twitter API 發送請求,您需要建立一個 具有 OAuth 授權的應用程序,因為未經授權的請求不會被拒絕 允許。
要建立 Twitter 應用程序,您需要登入 Twitter 使用您的 Twitter 帳戶的開發人員儀表板。創建一個的要點 應用程式就是給你自己(和Twitter)一組金鑰。
其中包括:
請依照下列步驟建立 Twitter 應用程式並產生金鑰。
如果您想要執行任何動作,正確使用這個API,你需要改變 如果您正在執行除以下操作以外的任何操作,請將您的設定設為讀取和寫入 使用 GET 請求的標準資料檢索。
#要取得應用程式使用者金鑰和秘密,請導航至 API 金鑰標籤。
API 金鑰和 API 秘密分別是使用者金鑰和使用者秘密。
#要取得應用程式存取權杖和存取權杖機密,仍在API 金鑰 strong> 選項卡,向下捲動並按一下「建立我的訪問令牌”按鈕以建立訪問令牌。
刷新頁面,您將看到您的應用程式存取權杖。
我們 現在擁有消費者密鑰和秘密以及存取令牌和秘密密鑰。這些 OAuth 憑證在向 API 發送請求時由 Twitter 進行身份驗證。
我們正在編碼的 Twitter 時間軸小部件的小部件設定將包含表單字段,這些字段將收集這些 OAuth 憑證並將其保存到資料庫中,以供小部件重複使用。
讓我們開始編寫 Twitter 時間軸小工具外掛程式的程式碼。
標題是 進入插件檔案的第一件事是插件頭。
<?php /* Plugin Name: Twitter Tweets Widget Plugin URI: http://code.tutsplus.com Description: Displays latest tweets from Twitter. Author: Agbonghama Collins Author URI: http://tech4sky.com */
建立一個擴充 WP_Widget
父類別的類別。
class Twitter_Tweets_Widget extends WP_Widget { // ...
透過 __construct()
魔術方法為小部件指定名稱和描述。
function __construct() { parent::__construct( 'twitter-tweets-widget', __( 'Twitter Tweets Widget', 'twitter_tweets_widget' ), array( 'description' => __( 'Displays latest tweets from Twitter.', 'twitter_tweets_widget' ) ) ); }
下面的 form()
方法會建立小部件設定表單,該表單將 OAuth 憑證儲存到資料庫以供小部件稍後重複使用。
public function form( $instance ) { if ( empty( $instance ) ) { $twitter_username = ''; $update_count = ''; $oauth_access_token = ''; $oauth_access_token_secret = ''; $consumer_key = ''; $consumer_secret = ''; $title = ''; } else { $twitter_username = $instance['twitter_username']; $update_count = isset( $instance['update_count'] ) ? $instance['update_count'] : 5; $oauth_access_token = $instance['oauth_access_token']; $oauth_access_token_secret = $instance['oauth_access_token_secret']; $consumer_key = $instance['consumer_key']; $consumer_secret = $instance['consumer_secret']; if ( isset( $instance['title'] ) ) { $title = $instance['title']; } else { $title = __( 'Twitter feed', 'twitter_tweets_widget' ); } } ?> <p> <label for="<?php echo $this->get_field_id( 'title' ); ?>"> <?php echo __( 'Title', 'twitter_tweets_widget' ) . ':'; ?> </label> <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'twitter_username' ); ?>"> <?php echo __( 'Twitter Username (without @)', 'twitter_tweets_widget' ) . ':'; ?> </label> <input class="widefat" id="<?php echo $this->get_field_id( 'twitter_username' ); ?>" name="<?php echo $this->get_field_name( 'twitter_username' ); ?>" type="text" value="<?php echo esc_attr( $twitter_username ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'update_count' ); ?>"> <?php echo __( 'Number of Tweets to Display', 'twitter_tweets_widget' ) . ':'; ?> </label> <input class="widefat" id="<?php echo $this->get_field_id( 'update_count' ); ?>" name="<?php echo $this->get_field_name( 'update_count' ); ?>" type="number" value="<?php echo esc_attr( $update_count ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'oauth_access_token' ); ?>"> <?php echo __( 'OAuth Access Token', 'twitter_tweets_widget' ) . ':'; ?> </label> <input class="widefat" id="<?php echo $this->get_field_id( 'oauth_access_token' ); ?>" name="<?php echo $this->get_field_name( 'oauth_access_token' ); ?>" type="text" value="<?php echo esc_attr( $oauth_access_token ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'oauth_access_token_secret' ); ?>"> <?php echo __( 'OAuth Access Token Secret', 'twitter_tweets_widget' ) . ':'; ?> </label> <input class="widefat" id="<?php echo $this->get_field_id( 'oauth_access_token_secret' ); ?>" name="<?php echo $this->get_field_name( 'oauth_access_token_secret' ); ?>" type="text" value="<?php echo esc_attr( $oauth_access_token_secret ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'consumer_key' ); ?>"> <?php echo __( 'Consumer Key', 'twitter_tweets_widget' ) . ':'; ?> </label> <input class="widefat" id="<?php echo $this->get_field_id( 'consumer_key' ); ?>" name="<?php echo $this->get_field_name( 'consumer_key' ); ?>" type="text" value="<?php echo esc_attr( $consumer_key ); ?>" /> </p> <p> <label for="<?php echo $this->get_field_id( 'consumer_secret' ); ?>"> <?php echo __( 'Consumer Secret', 'twitter_tweets_widget' ) . ':'; ?> </label> <input class="widefat" id="<?php echo $this->get_field_id( 'consumer_secret' ); ?>" name="<?php echo $this->get_field_name( 'consumer_secret' ); ?>" type="text" value="<?php echo esc_attr( $consumer_secret ); ?>" /> </p> <?php }
下面是由上面的 form()
方法建立的小部件設定的螢幕截圖。
何時值輸入到設定表單欄位中,需要將它們儲存到資料庫中。 update()
方法透過移除惡意資料來清理小工具表單值,然後將清理後的資料儲存到資料庫中。
public function update( $new_instance, $old_instance ) { $instance = array(); $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : ''; $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : ''; $instance['twitter_username'] = ( ! empty( $new_instance['twitter_username'] ) ) ? strip_tags( $new_instance['twitter_username'] ) : ''; $instance['update_count'] = ( ! empty( $new_instance['update_count'] ) ) ? strip_tags( $new_instance['update_count'] ) : ''; $instance['oauth_access_token'] = ( ! empty( $new_instance['oauth_access_token'] ) ) ? strip_tags( $new_instance['oauth_access_token'] ) : ''; $instance['oauth_access_token_secret'] = ( ! empty( $new_instance['oauth_access_token_secret'] ) ) ? strip_tags( $new_instance['oauth_access_token_secret'] ) : ''; $instance['consumer_key'] = ( ! empty( $new_instance['consumer_key'] ) ) ? strip_tags( $new_instance['consumer_key'] ) : ''; $instance['consumer_secret'] = ( ! empty( $new_instance['consumer_secret'] ) ) ? strip_tags( $new_instance['consumer_secret'] ) : ''; return $instance; }
我發現了一個非常有用的 Twitter API 的簡單 PHP 包裝器,它可以輕鬆地發送請求並從 API 接收回應,我們的小部件將使用它。
從 GitHub 儲存庫下載 zip 檔案中的 PHP 包裝器,提取並包含包含包裝器類別的 TwitterAPIExchange.php
檔案。
下面的 twitter_timeline()
方法接受以下参数作为其参数,这在向 Twitter API 发出请求时会派上用场。
$username:
Twitter 用户名
$limit:
小部件要显示的推文数量
$oauth_access_token:
Twitter 应用程序 OAuth 访问令牌。
$oauth_access_token_secret:
应用程序 OAuth 访问令牌 秘密。
$consumer_key:
Twitter 应用程序消费者密钥。
$consumer_secret:
应用程序消费者秘密。public function twitter_timeline( $username, $limit, $oauth_access_token, $oauth_access_token_secret, $consumer_key, $consumer_secret ) { require_once 'TwitterAPIExchange.php'; /** Set access tokens here - see: https://dev.twitter.com/apps/ */ $settings = array( 'oauth_access_token' => $oauth_access_token, 'oauth_access_token_secret' => $oauth_access_token_secret, 'consumer_key' => $consumer_key, 'consumer_secret' => $consumer_secret ); $url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; $getfield = '?screen_name=' . $username . '&count=' . $limit; $request_method = 'GET'; $twitter_instance = new TwitterAPIExchange( $settings ); $query = $twitter_instance ->setGetfield( $getfield ) ->buildOauth( $url, $request_method ) ->performRequest(); $timeline = json_decode($query); return $timeline; }
该方法使用 PHP Wrapper for Twitter API 向 Twitter API 发送请求,保存并返回响应(用户时间线的 JSON 数据)。
创建或制作推文的时间由 API 以英文文本日期时间保存。例如。 星期四 6 月 26 日 08:47:24 +0000 2014
为了使推文时间更加用户友好,我创建了方法 tweet_time()
,它通过以下方式显示时间。
这是 tweet_time()
方法的代码。
public function tweet_time( $time ) { // Get current timestamp. $now = strtotime( 'now' ); // Get timestamp when tweet created. $created = strtotime( $time ); // Get difference. $difference = $now - $created; // Calculate different time values. $minute = 60; $hour = $minute * 60; $day = $hour * 24; $week = $day * 7; if ( is_numeric( $difference ) && $difference > 0 ) { // If less than 3 seconds. if ( $difference < 3 ) { return __( 'right now', 'twitter_tweets_widget' ); } // If less than minute. if ( $difference < $minute ) { return floor( $difference ) . ' ' . __( 'seconds ago', 'twitter_tweets_widget' );; } // If less than 2 minutes. if ( $difference < $minute * 2 ) { return __( 'about 1 minute ago', 'twitter_tweets_widget' ); } // If less than hour. if ( $difference < $hour ) { return floor( $difference / $minute ) . ' ' . __( 'minutes ago', 'twitter_tweets_widget' ); } // If less than 2 hours. if ( $difference < $hour * 2 ) { return __( 'about 1 hour ago', 'twitter_tweets_widget' ); } // If less than day. if ( $difference < $day ) { return floor( $difference / $hour ) . ' ' . __( 'hours ago', 'twitter_tweets_widget' ); } // If more than day, but less than 2 days. if ( $difference > $day && $difference < $day * 2 ) { return __( 'yesterday', 'twitter_tweets_widget' );; } // If less than year. if ( $difference < $day * 365 ) { return floor( $difference / $day ) . ' ' . __( 'days ago', 'twitter_tweets_widget' ); } // Else return more than a year. return __( 'over a year ago', 'twitter_tweets_widget' ); } }
接下来是 widget()
方法,用于在 WordPress 前端显示 Twitter 时间线。
public function widget( $args, $instance ) { $title = apply_filters( 'widget_title', $instance['title'] ); $username = $instance['twitter_username']; $limit = $instance['update_count']; $oauth_access_token = $instance['oauth_access_token']; $oauth_access_token_secret = $instance['oauth_access_token_secret']; $consumer_key = $instance['consumer_key']; $consumer_secret = $instance['consumer_secret']; echo $args['before_widget']; if ( ! empty( $title ) ) { echo $args['before_title'] . $title . $args['after_title']; } // Get the tweets. $timelines = $this->twitter_timeline( $username, $limit, $oauth_access_token, $oauth_access_token_secret, $consumer_key, $consumer_secret ); if ( $timelines ) { // Add links to URL and username mention in tweets. $patterns = array( '@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '/@([A-Za-z0-9_]{1,15})/' ); $replace = array( '<a href="$1">$1</a>', '<a href="http://twitter.com/$1">@$1</a>' ); foreach ( $timelines as $timeline ) { $result = preg_replace( $patterns, $replace, $timeline->text ); echo '<div>'; echo $result . '<br/>'; echo $this->tweet_time( $timeline->created_at ); echo '</div>'; echo '<br/>'; } } else { _e( 'Error fetching feeds. Please verify the Twitter settings in the widget.', 'twitter_tweets_widget' ); } echo $args['after_widget']; }
小部件类 Twitter_Tweets_Widget
最终使用 widgets_init
挂钩注册,因此 WordPress 可以识别它。使用结束语 }
结束您的课程,然后添加以下代码来初始化
function register_twitter_widget() { register_widget( 'Twitter_Tweets_Widget' ); } add_action( 'widgets_init', 'register_twitter_widget' );
最后,我们完成了 Twitter 时间轴小部件的编码。
在本文中,我们学习了如何在实际项目中使用 Twitter API 来构建我们自己的 Twitter 时间线 WordPress 小部件。尽管本教程应该相对简单,但我们涵盖了 OAuth、密钥等主题,以及其他对于使用 API 的人员来说可能比较陌生的主题。
如果您有任何问题或代码改进建议,请在评论中告诉我。
以上是利用最新的 Twitter API 設計 Twitter 小工具的詳細內容。更多資訊請關注PHP中文網其他相關文章!