Reka widget Twitter menggunakan API Twitter terkini

PHPz
Lepaskan: 2023-09-04 16:13:01
asal
873 orang telah melayarinya

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.

利用最新的 Twitter API 设计 Twitter 小部件

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:

  • Kunci Pengguna
  • Rahsia Pengguna
  • Token Akses
  • Rahsia Token Akses

Ikuti langkah di bawah untuk mencipta aplikasi Twitter dan menjana kunci.

  • Log masuk ke akaun Pembangun Twitter anda menggunakan akaun Twitter anda dan navigasi ke konsol pengurusan aplikasi.

  • Klik butang Buat Apl Baharu untuk memulakan penciptaan apl Twitter.
  • Isi borang dan klik butang hantar untuk membuat permohonan.
  • Klik pada apl, navigasi ke tab Kebenaran dan tukar tahap akses kepada Baca dan Tulis.

    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.

    利用最新的 Twitter API 设计 Twitter 小部件

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.

利用最新的 Twitter API 设计 Twitter 小部件

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.

利用最新的 Twitter API 设计 Twitter 小部件

Muat semula halaman dan anda akan melihat token akses aplikasi anda.

利用最新的 Twitter API 设计 Twitter 小部件

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.

Pembangunan 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
 */
Salin selepas log masuk

Buat kelas yang memanjangkan kelas induk WP_Widget. WP_Widget 父类的类。

class Twitter_Tweets_Widget extends WP_Widget {
// ...
Salin selepas log masuk

通过 __construct() 魔术方法为小部件指定名称和描述。

function __construct() {
    parent::__construct(
        'twitter-tweets-widget',
        __( 'Twitter Tweets Widget', 'twitter_tweets_widget' ),
        array(
            'description' => __( 'Displays latest tweets from Twitter.', 'twitter_tweets_widget' )
        )
    );
}
Salin selepas log masuk

下面的 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
    
}
Salin selepas log masuk

下面是由上面的 form() 方法创建的小部件设置的屏幕截图。

利用最新的 Twitter API 设计 Twitter 小部件

何时值被输入到设置表单字段中,需要将它们保存到数据库中。 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;
}
Salin selepas log masuk

我发现了一个非常有用的 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;
}
Salin selepas log masuk
Salin selepas log masuk

🎜Nyatakan nama dan penerangan untuk widget melalui kaedah ajaib __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' );
    }
}
Salin selepas log masuk
Salin selepas log masuk
🎜Kaedah 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'];
}
Salin selepas log masuk
🎜Di bawah ialah tangkapan skrin tetapan widget yang dibuat oleh kaedah form() di atas. 🎜 🎜Gunakan API Twitter terkini untuk mereka bentuk widget Twitter🎜🎜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' );
Salin selepas log masuk
Salin selepas log masuk
🎜Saya menemui pembungkus PHP mudah yang sangat berguna untuk API Twitter yang memudahkan untuk menghantar permintaan dan menerima respons daripada API, yang akan digunakan oleh widget kami. 🎜 🎜Muat turun pembalut PHP dalam arkib zip daripada repositori GitHub, ekstrak dan sertakan fail TwitterAPIExchange.php yang mengandungi kelas pembalut. 🎜🎜🎜

下面的 twitter_timeline() 方法接受以下参数作为其参数,这在向 Twitter API 发出请求时会派上用场。

  1. $username: Twitter 用户名

  2. $limit: 小部件要显示的推文数量

  3. $oauth_access_token: Twitter 应用程序 OAuth 访问令牌。

  4. $oauth_access_token_secret: 应用程序 OAuth 访问令牌 秘密。

  5. $consumer_key: Twitter 应用程序消费者密钥。

  6. $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;
}
Salin selepas log masuk
Salin selepas log masuk

该方法使用 PHP Wrapper for Twitter API 向 Twitter API 发送请求,保存并返回响应(用户时间线的 JSON 数据)。

创建或制作推文的时间由 API 以英文文本日期时间保存。例如。 星期四 6 月 26 日 08:47:24 +0000 2014

为了使推文时间更加用户友好,我创建了方法 tweet_time(),它通过以下方式显示时间。

  • 如果时间少于三秒,则返回现在。
  • 不到一分钟,返回x秒前。
  • 不到两分钟,返回大约 1 分钟前。
  • 不到一小时,n 分钟前返回,依此类推。

这是 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' );
    }
}
Salin selepas log masuk
Salin selepas log masuk

接下来是 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'];
}
Salin selepas log masuk

小部件类 Twitter_Tweets_Widget 最终使用 widgets_init 挂钩注册,因此 WordPress 可以识别它。使用结束语 } 结束您的课程,然后添加以下代码来初始化

function register_twitter_widget() {
    register_widget( 'Twitter_Tweets_Widget' );
}

add_action( 'widgets_init', 'register_twitter_widget' );
Salin selepas log masuk
Salin selepas log masuk

最后,我们完成了 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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan