在Twitter API中使用since_id和max_id

时间:2012-03-15 10:01:46

标签: javascript twitter increment biginteger

我希望我能够过度思考这个并且有一个明显的解决方案。

来自API(GET状态/ user_timeline)

  

max_id - 返回ID小于(即早于)或等于指定ID的结果。

“或等于”表示它将包含我发送的ID为我的max_id参数的推文。

-

我的问题是:如果我存储了我最早的推文的ID(来自之前的请求),我该如何从此ID中减去1以将其排除在我的下一个请求中?

显而易见的解决方案是执行类似'& max_id ='+ lastID-1的操作,但是对于此类数学运算而言,推特ID会变大,而javascript会对结果进行舍入。

有关雪花更新的详细信息: https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

可行的解决方案:

有人提到我可以使用BigInteger Javascript库:http://silentmatt.com/biginteger/,但在我看来,这对于小型任务来说是多余的。

我是否必须对字符串(id_str)使用递归并将其递增或递减1?我讨厌使用hack来处理那些应该工作的小细节。

-

如果您遇到此问题,请分享您的解决方案。

谢谢!

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,最后通过从最后一位数减去1来解决它,然后考虑我们通过递归从0减去1的情况。

function decrementHugeNumberBy1(n) {
    // make sure s is a string, as we can't do math on numbers over a certain size
    n = n.toString();
    var allButLast = n.substr(0, n.length - 1);
    var lastNumber = n.substr(n.length - 1);

    if (lastNumber === "0") {
        return decrementHugeNumberBy1(allButLast) + "9";
    }
    else {      
        var finalResult = allButLast + (parseInt(lastNumber, 10) - 1).toString();
        return trimLeft(finalResult, "0");
    }
}

function trimLeft(s, c) {
    var i = 0;
    while (i < s.length && s[i] === c) {
        i++;
    }

    return s.substring(i);
}

答案 1 :(得分:4)

实际上,除非我们减少max_id参数,否则Twitter API将使用重复的推文进行回复。

这是关于max_id的一篇很好的Twitter API文章:https://dev.twitter.com/docs/working-with-timelines 关于在JavaScritp中使用大(超过53位)数字的一般概念:http://www.2ality.com/2012/07/large-integers.html

回到问题:除非你将它用于其他东西,否则使用库似乎是一种过度杀伤力。 @ bob-lauer有一个很好的轻量级解决方案,但我编写了自己的函数没有递归

function decStrNum (n) {
    n = n.toString();
    var result=n;
    var i=n.length-1;
    while (i>-1) {
      if (n[i]==="0") {
        result=result.substring(0,i)+"9"+result.substring(i+1);
        i --;
      }
      else {
        result=result.substring(0,i)+(parseInt(n[i],10)-1).toString()+result.substring(i+1);
        return result;
      }
    }
    return result;
}

使用以下数字/字符串测试它:

console.log("290904187124985850");
console.log(decStrNum("290904187124985850"));
console.log("290904187124985851");
console.log(decStrNum("290904187124985851"));
console.log("290904187124985800");
console.log(decStrNum("290904187124985800"));
console.log("000000000000000001");
console.log(decStrNum("0000000000000000001"));

答案 2 :(得分:0)

这是一个快速的PHP版本@ Azat的非递归函数的答案,用于递减长字符串格式(非负)整数。

<?php
function decStrNum($n)
{
  $n = (string)$n;
  if ((int)$n == 0 || 0 === strpos($n, '-'))
    return false;
  $result = $n;
  $len = strlen($n);
  $i = $len - 1;
  while ($i > -1) {
    if ($n[$i] === "0") {
      $end = substr($result, $i + 1);
      if ($end === false) $end = '';
      $result = substr($result, 0, -($len - $i)) . "9" . $end;
      $i--;
    } else {
      $end = substr($result, $i + 1);
      if ($end === false) $end = '';
      return substr($result, 0, -($len - $i)) . ((int)$n[$i] - 1) . $end;
    }
  }
  return $result;
}