используя since_id и max_id в Twitter API - PullRequest
4 голосов
/ 15 марта 2012

Надеюсь, я обдумываю это и есть очевидное решение.

Из API (GET statuses / user_timeline)

max_id - возвращает результаты с идентификатором меньше ((то есть старше) или равно указанному идентификатору.

"или равно" означает, что в него будет включен твит с идентификатором, который я отправил в качестве параметра max_id.

-

У меня такой вопрос: если я сохраню идентификатор моего самого старого твита (из предыдущего запроса), как я могу вычесть 1 из этого идентификатора, чтобы исключитьэто от того, чтобы быть возвращенным в моем следующем запросе?

Очевидным решением было бы сделать что-то вроде '& max_id =' + lastID-1, но идентификаторы твиттера слишком велики для таких математических операций, и javascript округляет результаты.

Подробная информация об обновлении снежинки: https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

Возможные решения:

Было упомянуто, что я могу использовать библиотеку JavaScript BigInteger: http://silentmatt.com/biginteger/, но, на мой взгляд, это избыточно для такой небольшой задачи.

Нужно ли использовать рекурсию для строки (id_str) и увеличивать или уменьшать ее на единицу?Я ненавижу использовать хак для таких мелких деталей, которые должны просто работать.

-

Если у вас возникла эта проблема, пожалуйста, поделитесь своим решением.

спасибо!

Ответы [ 3 ]

5 голосов
/ 28 марта 2012

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

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);
}
4 голосов
/ 15 января 2013

Действительно, API Twitter будет отвечать дублирующими твитами, если мы не уменьшим параметр max_id.

Вот хорошая статья в Twitter API по max_id: https://dev.twitter.com/docs/working-with-timelines Об общей концепции работы с большими (более 53-битными) числами в JavaScritp: 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"));
0 голосов
/ 10 апреля 2015

Вот быстрая и нездоровая 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;
}
...