代码之家  ›  专栏  ›  技术社区  ›  Mittul At TechnoBrave

带分页功能的php-twitter api(oauth)无法正常工作

  •  8
  • Mittul At TechnoBrave  · 技术社区  · 8 年前

    我集成了TwitterAPI(TwitterOAuth)来获取特定公司帐户的最新订阅源,下面是我迄今为止所做的代码。( 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 
                                } ?>
    

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

    <?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;
    ?>
    

    如你所见,这里我已经添加了 $cursor = -1; 并将我的API目标URL更新为 $tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" . $twitteruser . "&count=" . $notweets . "&cursor=" . $cursor); ,传球 光标 价值。

    不过,根据上述链接中的文档所述,我在这里收到了3条最近的tweets。( https://developer.twitter.com/en/docs/basics/cursoring.html网站 ,您应该得到如下的响应。

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

    我还尝试将请求的源URL更新到此。

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

    但是我没有拿到钥匙 next_cursor 以任何方式进行。有人能指导我吗?我在这里做错了什么?我该怎么做才能使分页从这里开始?

    任何帮助或建议都将受到高度赞赏。

    谢谢

    3 回复  |  直到 8 年前
        1
  •  3
  •   Dinesh Ghule    8 年前

    Refer Link :: Github :: https://github.com/dineshghule321/codebird-php

    使用codebird从您的php代码___中连接到twitter rest api、流式api、集合api、ton(object nest)api和twitter ads api,所有这些都只使用一个库。codebird支持完整的3路OAuth和仅应用程序身份验证。

        2
  •  2
  •   Saral    8 年前

    标准的分页方法不适用于 GET statuses/user_timeline 由于Twitter的实时性。

    https://developer.twitter.com/en/docs/tweets/timelines/guides/working-with-timelines

    只有在需要检索非常大的数据而不是同时检索某些方法(如 GET friends/ids 您可以在其中发送 cursor 作为参数。换句话说,该方法需要支持 光标 作为参数。

    https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-ids

        3
  •  1
  •   Mittul At TechnoBrave    8 年前

    好的,伙计们,

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

    我写了两页。一个发送Ajax请求以获取结果中的数据( 第1.php页 )第二页是获取API并基于Ajax请求( twitter发布ajax.php )

    第1.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发布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; ?>
    

    这里,如你所见,我们有两页, 第1.php页 通过它,我将通过Ajax请求从 twitter发布ajax.php .

    我也用过 session_start() 在里面 twitter发布ajax.php 只获取一次tweet的总数,这样我就不需要每次都重新计数。我也用过 offset limit 因为我的分页很好 ajax .

    希望这有帮助。