【问题标题】:How to be sure my web app gets the next tweet after specified tweet如何确保我的网络应用程序在指定推文后获得下一条推文
【发布时间】:2011-01-03 15:48:54
【问题描述】:

我正在创建一个 webapp,它依赖于 php 中的 twitter 状态时间线

我正在使用以下 API 调用向 twitter 发出请求:

$since_id 等于根据最后解析的推文存储的 id。

$req_url = 'http://twitter.com/statuses/friends_timeline.xml?count=20&page=1&since_id='.$since_id;

我注意到,如果自上次通话以来收到超过 20 条推文,我将获得自上次通话以来最近的 20 条推文,而反过来又会丢失 $since_id 和当前 20 条之间的推文。

示例:

  1. 在 0800 时,最后一条推文解析为 70001
  2. 自上次 API 调用后的 10 分钟窗口内发布了 50 条推文
  3. 在 0810 我调用 API 以获取自 70001 以来的推文
  4. 它返回推文 70031 - 70051

这让我错过了 70002-70030

现在开始任务: 有没有办法知道自上次通话以来已经发布了多少条推文?如果是这样,有没有办法确保当我调用 API 时,我得到的是下一条推文,而不是最近发布的推文?

语言:PHP5 使用:Twitter REST API

【问题讨论】:

    标签: php twitter


    【解决方案1】:

    您可以将 since_id 参数设置为上次看到的推文并指定计数为 200。然后通过指定 max_id 检索较旧的推文。

    $startId = [last tweet_id]
    $tweets = "twitter.com/statuses/friends_timeline.xml?since_id=${istartId}" .
      "&count=200"
    
    while (count($tweets)) {
       insert $tweets into table on duplicate key update none
       $maxId = $tweets[count($tweets) - 1]['id'];
       if ($maxId <= $startId) {
         break;
       }
       $tweets = "twitter.com/statuses/friends_timeline.xml?max_id=${maxId}" .
         "&count=200"
    }
    

    似乎没有办法以特定的 id 开始分页。在 api 中,您总是从最近的条目开始,然后及时回到上次看到的 id。

    可以使用搜索原子和运算符 since、until 和 from 在日期范围内进行搜索:

    http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search
    

    但事实上,它仍然是按时间降序排序的,所以无论如何你都需要向后滚动。

    【讨论】:

    • 我试图避免对 API 进行大量调用,至少在我发现我是否已被批准提高速率限制之前。 since_id 似乎只是在该 id 之后获得最近指定数量的推文,而不是紧随其后的推文,这是我需要它做的。
    • 一次请求 200 个将被视为 1 个 api 调用。该 api 基本上要求您从最后一页开始并向后继续,直到您获得最后一次看到的 id 之后的页面。
    • while(true) 会比for (;;) 更漂亮。
    • @Alix:你沉迷于语法糖,但如果你需要一个理由,while (true)for (;;) 慢(是的,在 php 中它更慢)除了是一个重言式 :)跨度>
    • jspcal,我今晚试试。我想我很可能不得不走这条路,但由于(当前)每小时 150 个呼叫的速率限制,我试图避免它。我已提出增加此限制的请求,祝我好运:)
    猜你喜欢
    • 2021-12-31
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多