Twitter membuat beberapa perubahan semasa ia melancarkan versi 1.1 APInya. Salah satu perubahan yang paling ketara ialah pengenalan pengesahan. Iaitu, aplikasi perlu disahkan untuk menghantar permintaan kepada API.
Pengesahan dikuasakan oleh OAuth - protokol terbuka yang membenarkan kebenaran selamat melalui kaedah mudah dan standard, membenarkan kelulusan pengguna Mohon untuk bertindak bagi pihak mereka tanpa berkongsi kata laluan mereka.
Dalam tutorial ini, kita akan belajar cara berinteraksi dengan API Twitter secara pemprograman sambil membangunkan widget Twitter Timeline WordPress yang memaparkan senarai tweet terkini yang disiarkan oleh pengguna Twitter.
Berikut ialah pratonton widget Garis Masa Twitter yang akan anda bina pada penghujung tutorial ini.
Untuk berjaya menghantar permintaan ke API Twitter, anda perlu membuat Apl dengan keizinan OAuth kerana permintaan yang tidak dibenarkan tidak ditolak benarkan.
Untuk mencipta aplikasi Twitter, anda perlu log masuk ke Twitter Gunakan papan pemuka pembangun untuk akaun Twitter anda. Mata untuk mencipta a Aplikasi ini hanya memberikan diri anda (dan Twitter) satu set kunci.
Ini termasuk:
Ikuti langkah di bawah untuk mencipta aplikasi Twitter dan menjana kunci.
Jika anda ingin melakukan sebarang operasi untuk menggunakan API ini dengan betul, anda perlu menukar Jika anda melakukan apa-apa selain daripada yang berikut, tetapkan tetapan anda kepada Baca dan Tulis Pendapatan semula data standard menggunakan permintaan GET.
Untuk mendapatkan kunci dan rahsia pengguna aplikasi, navigasi ke tab API Keys.
Kunci API dan Rahsia API adalah Kunci Pengguna dan Rahsia Pengguna masing-masing.
Untuk mendapatkan Token Akses Aplikasi dan Rahsia Token Akses, masih dalam tab API Keys strong>, tatal ke bawah dan klik pada butang "Buat Token Akses Saya" untuk mencipta token akses.
Muat semula halaman dan anda akan melihat token akses aplikasi anda.
kami Kini mempunyai kunci dan rahsia pengguna serta token akses dan kunci rahsia. Bukti kelayakan OAuth ini disahkan oleh Twitter apabila membuat permintaan kepada API.
Tetapan widget untuk widget garis masa Twitter yang kami kodkan akan mengandungi medan borang yang akan mengumpulkan bukti kelayakan OAuth ini dan menyimpannya ke pangkalan data untuk digunakan semula oleh widget.
Mari mulakan pengekodan pemalam widget Garis Masa Twitter.
Tajuknya Perkara pertama yang masuk ke dalam fail pemalam ialah pengepala pemalam.
<?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 */
Buat kelas yang memanjangkan kelas induk WP_Widget
. 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
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; }
__construct()
. 🎜🎜🎜
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' ); } }
form()
di bawah mencipta borang tetapan widget, yang menyimpan bukti kelayakan OAuth ke pangkalan data untuk digunakan semula oleh widget kemudian. 🎜🎜🎜
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=""></a>', '<a href="http://twitter.com/">@</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']; }
form()
di atas. 🎜
🎜🎜🎜Bilakah masanya berbaloi? dimasukkan ke dalam medan borang tetapan, mereka perlu disimpan ke pangkalan data. Kaedah kemas kini()
membersihkan nilai bentuk widget dengan mengalih keluar data hasad dan kemudian menyimpan data yang dibersihkan ke pangkalan data. 🎜🎜🎜
function register_twitter_widget() { register_widget( 'Twitter_Tweets_Widget' ); } add_action( 'widgets_init', 'register_twitter_widget' );
TwitterAPIExchange.php
yang mengandungi kelas pembalut. 🎜🎜🎜
下面的 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 的人员来说可能比较陌生的主题。
如果您有任何问题或代码改进建议,请在评论中告诉我。
Atas ialah kandungan terperinci Reka widget Twitter menggunakan API Twitter terkini. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!