PHP - 分页无法正常工作的 Twitter API (OAuth) [英] PHP - Twitter API (OAuth) with pagination not working properly

查看:48
本文介绍了PHP - 分页无法正常工作的 Twitter API (OAuth)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已集成 Twitter API (Twitter OAuth) 以获取特定公司帐户的最新提要,以下是我迄今为止所做的代码(https://tomelliott.com/php/authenticating-twitter-feed-timeline-oauth).

get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser . "&count=" . $notweets);?><?php foreach ($tweets as $current_tweet) { ?><div class="card"><div class="card-body"><div class="media"><div class="media-body"><h5 class="F-20 themeFontGrey MontSemBold text-uppercase">REGENCY CORPORATE</h5><p class="MontRegular themeFontGrey"><?php$date = $current_tweet->created_at;echo date("F d Y, H:i A", strtotime($date));?></p>

<?php$twitt_url = '#';$twitter_target = '';如果 (!empty($current_tweet->id)) {$twitt_url = 'https://twitter.com/' .$推特用户.'/地位/' .$current_tweet->id;$twitter_target = 'target="_blank"';}?><a href="<?php echo $twitt_url; ?>"class="hovicon effect-5 news-icon" <?php echo $twitter_target;?>><i class="fa fa-twitter"></i></a>

<p class="MontRegular themeFontGrey"><?php echo $current_tweet->text;?></p>

<?php if (!empty($current_tweet->entities->media[0]->media_url)) { ?><div class="newsImages"><img src="<?php echo $current_tweet->entities->media[0]->media_url; ?>"alt="图像" height="20%" width="20%"/>

<?php?><小时/>

<?php?>

这很有效,我收到了 3 条最新的推文.现在我想在其中添加分页,因此我遵循了 Twitter 提供的文档(https://developer.twitter.com/en/docs/basics/cursoring.html),下面是我用 cursor 更新的代码,我打印了数组(响应).

get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=".$twitteruser."&count=".$notweets."&cursor=".$光标);echo '

';print_r($tweets);出口;?>

如您所见,这里我添加了 $cursor = -1; 并将我的 api 目标网址更新为 $tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=".$twitteruser."&count=".$notweets."&cursor=".$cursor);,传递cursor 值.

这里我收到了最近的 3 条推文,但是,正如上面链接中的文档中提到的那样(https://developer.twitter.com/en/docs/basics/cursoring.html),您应该得到如下回复.

<代码>{ID":[385752029,602890434,...333181469,333165023],next_cursor":1374004777531007833,"next_cursor_str": "1374004777531007833",previous_cursor":0,previous_cursor_str":0"}

我也尝试将请求的提要网址更新为此.

$tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser . "&cursor=" . $光标);

但到目前为止,我没有以任何方式获得像 next_cursor 这样的任何键来继续.有人可以指导我,我在这里做错了什么,我应该怎么做才能从这里启用分页?

任何帮助或建议将不胜感激.

谢谢

解决方案

大家好,

我找到了自己的方法来解决这个问题,使用我已经使用过的同一个库来集成 ajax 分页.这是我所做的.

我创建了两个页面.一个发送ajax请求以获取结果中的数据(page1.php),第二个页面是获取api并基于ajax请求(twitter_posts_ajax.php).

page1.php

<脚本>$( 文档 ).ready(function() {$.ajax({类型:'POST',网址:twitter_posts_ajax.php",数据类型:html",成功:功能(结果数据){控制台日志(结果数据);$( ".twitter_posts" ).html(resultData);}});$(document).on('click', '.twitter_posts_anchor', function(){var twitterpagenumber = $(this).data('twitterpagenumber');var myKeyVals = { twitterInpage : twitterpagenumber}$.ajax({类型:'POST',网址:twitter_posts_ajax.php",数据:myKeyVals,数据类型:html",成功:功能(结果数据){控制台日志(结果数据);$( ".twitter_posts" ).html(resultData);$('html, body').animate({scrollTop: $( '.twitter_posts' ).offset().top}, 500);}});});});

twitter_posts_ajax.php

get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=". $twitteruser);$twitter_total_pages = ceil(count($count_all_tweets)/$limit);$_SESSION['twitter_total_pages'] = $twitter_total_pages;} 别的 {$twitter_total_pages = $_SESSION['twitter_total_pages'];}$twitterInpage = !empty($_POST['twitterInpage']) ?(int)$_POST['twitterInpage'] : 1;$totalPages = $_SESSION['twitter_total_pages'];//计算总页数$twitterInpage = max($twitterInpage, 1);//当 $_GET['page'] <= 0 时获取 1 页$twitterInpage = min($twitterInpage, $totalPages);//当 $_GET['page'] > 时获取最后一页$总页数$offset = ($twitterInpage - 1) * $limit;如果 ($offset <0) $offset = 0;$link = '?twitterInpage=%d';$pagerContainer = '<div style="width: 300px;"class="linkedin_pagination">';如果 ($totalPages != 0) {如果($twitterInpage == 1){$pagerContainer .= '';} 别的 {$page_number = $twitterInpage - 1;$pagerContainer .= sprintf('<a href="javascript:void(0)" style="color: #c00" class="twitter_posts_anchor" data-twitterpagenumber='. $page_number .'> &#171;上一页</a>');}$pagerContainer .= ' 页面<strong>'.$twitterInpage .'</strong>从 ' .$totalPages .'</span>';如果($twitterInpage == $totalPages){$pagerContainer .= '';} 别的 {$page_number = $twitterInpage + 1;$pagerContainer .= sprintf('<a href="javascript:void(0)" style="color: #c00" class="twitter_posts_anchor" data-twitterpagenumber='. $page_number .'>下一页&#187;</a>');}}$pagerContainer .= '</div>';如果 ($twitterInpage == $_SESSION['twitter_total_pages']) {$twitter_page_number = $_SESSION['twitter_total_pages'];} 别的 {$twitter_page_number = ($page_number - 1);}$tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=".$twitteruser."&page=".$twitter_page_number."&count=".$限制);?><?php foreach ($tweets as $current_tweet) { ?><div class="card"><div class="card-body"><div class="media"><div class="newsIcon"><img src="img/theme-logo-icon.png" alt="logo"/>

<div class="media-body"><h5 class="F-20 themeFontGrey MontSemBold text-uppercase">REGENCY CORPORATE</h5><p class="MontRegular themeFontGrey"><?php$date = $current_tweet->created_at;echo date("F d Y, H:i A", strtotime($date));?></p>

<?php$twitt_url = '#';$twitter_target = '';如果 (!empty($current_tweet->id)) {$twitt_url = 'https://twitter.com/' .$推特用户.'/地位/' .$current_tweet->id;$twitter_target = 'target="_blank"';}?><a href="<?php echo $twitt_url; ?>"class="hovicon effect-5 news-icon" <?php echo $twitter_target;?>><i class="fa fa-twitter"></i></a>

<p class="MontRegular themeFontGrey"><?php echo $current_tweet->text;?></p>

<?php if (!empty($current_tweet->entities->media[0]->media_url)) { ?><div class="newsImages"><img src="<?php echo $current_tweet->entities->media[0]->media_url; ?>"alt="图像"/>

<?php?>

<?php?><?php echo $pagerContainer;?>

这里,如您所见,我们有两个页面,page1.php,我通过它传递 ajax 请求以从 twitter_posts_ajax.php 加载数据.

我还在 twitter_posts_ajax.php 中使用了 session_start() 只抓取了一次推文总数,这样我就不需要每次都重新计算.我还为我的分页使用了 offsetlimit,这与 ajax 配合得很好.

希望这会有所帮助.

I have integrated Twitter API (Twitter OAuth) to get latest feeds of particular company account and here below is my code what I have done so far (https://tomelliott.com/php/authenticating-twitter-feed-timeline-oauth).

<?php 
require_once("twitteroauth/twitteroauth.php"); //Path to twitteroauth library

$twitteruser = "CompanyName";
$notweets = 3;
$consumerkey = "xxxxxxxx";
$consumersecret = "xxxxxxxx";
$accesstoken = "xxxxxxxx";
$accesstokensecret = "xxxxxxxx";

function getConnectionWithAccessToken($cons_key, $cons_secret, $oauth_token, $oauth_token_secret)
{
    $connection = new TwitterOAuth($cons_key, $cons_secret, $oauth_token, $oauth_token_secret);
    return $connection;
}

$connection = getConnectionWithAccessToken($consumerkey, $consumersecret, $accesstoken, $accesstokensecret);

$tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser . "&count=" . $notweets);


?>


                                <?php foreach ($tweets as $current_tweet) { ?>
                                    <div class="card">
                                        <div class="card-body">
                                            <div class="media">

                                                <div class="media-body">
                                                    <h5 class="F-20 themeFontGrey MontSemBold text-uppercase">REGENCY CORPORATE</h5>
                                                    <p class="MontRegular themeFontGrey">
                                                        <?php 
                                                        $date = $current_tweet->created_at;

                                                        echo date("F d Y,  H:i A", strtotime($date));
                                                        ?>
                                                    </p>
                                                </div>
                                                <?php 
                                                $twitt_url = '#';
                                                $twitter_target = '';
                                                if (!empty($current_tweet->id)) {
                                                    $twitt_url = 'https://twitter.com/' . $twitteruser . '/status/' . $current_tweet->id;
                                                    $twitter_target = 'target="_blank"';
                                                }
                                                ?>
                                                <a href="<?php echo $twitt_url; ?>" class="hovicon effect-5 news-icon" <?php echo $twitter_target; ?> >
                                                    <i class="fa fa-twitter"></i>
                                                </a>
                                            </div>
                                            <p class="MontRegular themeFontGrey">
                                                <?php echo $current_tweet->text; ?>
                                            </p>

                                        </div>

                                        <?php if (!empty($current_tweet->entities->media[0]->media_url)) { ?>
                                        <div class="newsImages">
                                            <img src="<?php echo $current_tweet->entities->media[0]->media_url; ?>" alt="Images" height="20%" width="20%" />
                                        </div>

                                        <?php 
                                    } ?>
                                        <hr />
                                    </div>
                                <?php 
                            } ?>

This works well, I am getting 3 latest tweets. Now I want to add pagination into this, hence I followed documentation provided by Twitter (https://developer.twitter.com/en/docs/basics/cursoring.html), and below is my updated code with cursor for the same and I printed the array (response).

<?php 
require_once("twitteroauth/twitteroauth.php"); //Path to twitteroauth library

$twitteruser = "CompanyName";
$notweets = 3;
$cursor = -1;

$consumerkey = "xxxxxxxx";
$consumersecret = "xxxxxxxx";
$accesstoken = "xxxxxxxx";
$accesstokensecret = "xxxxxxxx";

function getConnectionWithAccessToken($cons_key, $cons_secret, $oauth_token, $oauth_token_secret)
{
    $connection = new TwitterOAuth($cons_key, $cons_secret, $oauth_token, $oauth_token_secret);
    return $connection;
}

$connection = getConnectionWithAccessToken($consumerkey, $consumersecret, $accesstoken, $accesstokensecret);

$tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser . "&count=" . $notweets . "&cursor=" . $cursor);
echo '<pre>';
print_r($tweets);
exit;
?>

As you can see, here I have added $cursor = -1; and updated my api target url to $tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser . "&count=" . $notweets . "&cursor=" . $cursor);, passing cursor value.

Here I am getting the 3 recent tweets, however, as per mentioned in documentation from above link (https://developer.twitter.com/en/docs/basics/cursoring.html), you should get response like below.

{
    "ids": [
        385752029,
        602890434,
        ...
        333181469,
        333165023
    ],
    "next_cursor": 1374004777531007833,
    "next_cursor_str": "1374004777531007833",
    "previous_cursor": 0,
    "previous_cursor_str": "0"
}

I have also tried to update requested feed url to this.

$tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser .  "&cursor=" . $cursor);

But I am not getting any keys like next_cursor in any ways so far to be able to proceed. Can someone guide me, what I am doing wrong here, and what should I do to enable pagination from here on?

Any help or suggestion will be highly appreciated.

Thanks

解决方案

OK Guys,

I have found my own way to solve this to integrate ajax pagination using my same library which I have already used. Here is the way what I have done.

I have created two pages. One to send ajax request to grab data in results (page1.php), second page is to fetch api and based on ajax request (twitter_posts_ajax.php).

page1.php

<div class="col-xs-12 twitter_posts">
</div>

<script>

$( document ).ready(function() {

      $.ajax({
            type: 'POST',
            url: "twitter_posts_ajax.php",      
            dataType: "html",
                success: function(resultData) { 
                console.log(resultData);
                    $( ".twitter_posts" ).html(resultData);
                }
            });


             $(document).on('click', '.twitter_posts_anchor', function(){

        var twitterpagenumber = $(this).data('twitterpagenumber');
        var myKeyVals = { twitterInpage : twitterpagenumber}

        $.ajax({
        type: 'POST',
        url: "twitter_posts_ajax.php",
        data: myKeyVals,
        dataType: "html",
            success: function(resultData) { 
                console.log(resultData);
                $( ".twitter_posts" ).html(resultData);

                $('html, body').animate({
                        scrollTop: $( '.twitter_posts' ).offset().top
                    }, 500);

            }
        });

    });
});

twitter_posts_ajax.php

<?php 
session_start();
require_once("twitteroauth/twitteroauth.php"); //Path to twitteroauth library

$twitteruser = "CompanyName";
$limit = 10; //per page    


$consumerkey = "xxxxxxxx";
$consumersecret = "xxxxxxxx";
$accesstoken = "xxxxxxxx";
$accesstokensecret = "xxxxxxxx";

function getConnectionWithAccessToken($cons_key, $cons_secret, $oauth_token, $oauth_token_secret)
{
    $connection = new TwitterOAuth($cons_key, $cons_secret, $oauth_token, $oauth_token_secret);
    return $connection;
}

$connection = getConnectionWithAccessToken($consumerkey, $consumersecret, $accesstoken, $accesstokensecret);

if (!isset($_SESSION['twitter_total_pages'])) {
    // Counting all tweets first 
    $count_all_tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser);
    $twitter_total_pages = ceil(count($count_all_tweets) / $limit);
    $_SESSION['twitter_total_pages'] = $twitter_total_pages;
} else {
    $twitter_total_pages = $_SESSION['twitter_total_pages'];
}





$twitterInpage = !empty($_POST['twitterInpage']) ? (int)$_POST['twitterInpage'] : 1;


$totalPages = $_SESSION['twitter_total_pages']; //calculate total pages
$twitterInpage = max($twitterInpage, 1); //get 1 page when $_GET['page'] <= 0
$twitterInpage = min($twitterInpage, $totalPages); //get last page when $_GET['page'] > $totalPages
$offset = ($twitterInpage - 1) * $limit;

if ($offset < 0) $offset = 0;



$link = '?twitterInpage=%d';
$pagerContainer = '<div style="width: 300px;" class="linkedin_pagination">';
if ($totalPages != 0) {
    if ($twitterInpage == 1) {
        $pagerContainer .= '';
    } else {


        $page_number = $twitterInpage - 1;
        $pagerContainer .= sprintf('<a href="javascript:void(0)" style="color: #c00" class="twitter_posts_anchor" data-twitterpagenumber=' . $page_number . '> &#171; prev page</a>');
    }
    $pagerContainer .= ' <span> page <strong>' . $twitterInpage . '</strong> from ' . $totalPages . '</span>';
    if ($twitterInpage == $totalPages) {
        $pagerContainer .= '';
    } else {
        $page_number = $twitterInpage + 1;
        $pagerContainer .= sprintf('<a href="javascript:void(0)" style="color: #c00" class="twitter_posts_anchor" data-twitterpagenumber=' . $page_number . '> next page &#187; </a>');

    }
}
$pagerContainer .= '</div>';



if ($twitterInpage == $_SESSION['twitter_total_pages']) {
    $twitter_page_number = $_SESSION['twitter_total_pages'];
} else {
    $twitter_page_number = ($page_number - 1);
}

$tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser . "&page=" . $twitter_page_number . "&count=" . $limit);
?>


                                <?php foreach ($tweets as $current_tweet) { ?>
                                    <div class="card">
                                        <div class="card-body">
                                            <div class="media">
                                                <div class="newsIcon">
                                                    <img src="img/theme-logo-icon.png" alt="logo" />
                                                </div>
                                                <div class="media-body">
                                                    <h5 class="F-20 themeFontGrey MontSemBold text-uppercase">REGENCY CORPORATE</h5>
                                                    <p class="MontRegular themeFontGrey">
                                                        <?php 
                                                        $date = $current_tweet->created_at;                                                        
                                                        echo date("F d Y,  H:i A", strtotime($date));
                                                        ?>
                                                    </p>
                                                </div>
                                                <?php 
                                                $twitt_url = '#';
                                                $twitter_target = '';
                                                if (!empty($current_tweet->id)) {
                                                    $twitt_url = 'https://twitter.com/' . $twitteruser . '/status/' . $current_tweet->id;
                                                    $twitter_target = 'target="_blank"';
                                                }
                                                ?>
                                                <a href="<?php echo $twitt_url; ?>" class="hovicon effect-5 news-icon" <?php echo $twitter_target; ?> >
                                                    <i class="fa fa-twitter"></i>
                                                </a>
                                            </div>
                                            <p class="MontRegular themeFontGrey">
                                                <?php echo $current_tweet->text; ?>
                                            </p>

                                        </div>

                                        <?php if (!empty($current_tweet->entities->media[0]->media_url)) { ?>
                                        <div class="newsImages">
                                            <img src="<?php echo $current_tweet->entities->media[0]->media_url; ?>" alt="Images" />
                                        </div>
                                        <?php 
                                    } ?>

                                    </div>
                                <?php 
                            } ?>
<?php echo $pagerContainer; ?>

Here, as you can see, we have two pages, page1.php through which I am passing ajax request to load data from twitter_posts_ajax.php.

I have also used session_start() in twitter_posts_ajax.php to grab total number of tweets only once so that I do not need to recount every time. I have also used offset and limit for my pagination which works well with ajax.

Hope this helps.

这篇关于PHP - 分页无法正常工作的 Twitter API (OAuth)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
PHP最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆