PHP - Twitter API (OAuth) с нумерацией страниц не работает должным образом - PullRequest
0 голосов
/ 22 мая 2018

Я интегрировал Twitter API (Twitter OAuth), чтобы получать последние фиды для конкретной учетной записи компании, и вот мой код, который я сделал до сих пор (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; и обновил URL-адрес моей цели 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), вы должны получить ответ, как показано ниже.

{
    "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 ]

0 голосов
/ 30 мая 2018

Стандартные подходы к пейджингу не подходят для таких методов, как GET statuses/user_timeline, из-за характера Твиттера в реальном времени.

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

Курсор по вашему запросу применяется только в том случае, если вам нужно извлечь очень большие данные, а не извлекать все сразу для некоторых методов, таких как GET friends/ids, в которых вы можетеотправить cursor в качестве параметра.Другими словами, метод должен поддерживать cursor в качестве параметра.

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

0 голосов
/ 30 мая 2018

OK, ребята,

Я нашел свой собственный способ решить эту проблему, чтобы интегрировать ajax-нумерацию страниц, используя мою библиотеку, которую я уже использовал.Вот то, что я сделал.

Я создал две страницы.Одна для отправки запроса AJAX для получения данных в результатах ( page1.php ), вторая страница для загрузки API и на основе запроса AJAX ( 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; ?>

Здесь, как вы можете видеть, у нас есть две страницы, page1.php , через который я передаю ajax-запрос для загрузки данных из twitter_posts_ajax.php .

Я также использовал session_start() в twitter_posts_ajax.php , чтобы получить общее количество твитов только один раз, чтобы мне не приходилось пересчитывать каждый раз.Я также использовал offset и limit для своей нумерации страниц, которая хорошо работает с ajax.

Надеюсь, это поможет.

0 голосов
/ 25 мая 2018

См. Ссылку :: Github :: https://github.com/dineshghule321/codebird-php

Используйте Codebird для подключения к API REST Twitter, API потоковой передачи, API коллекций, API TON (Object Nest) и API объявлений Twitter из вашего PHP-кода -все используют только одну библиотеку.Codebird поддерживает полную 3-стороннюю OAuth, а также аутентификацию только для приложений.

...