Twitter lib的fetchTweets()方法接受

时间:2016-03-11 16:13:41

标签: javascript twitter google-apps-script google-apps twitter-search

我使用Agarwal's tutorial使用Twitter lib库来搜索推文,创建了一个Twitter转发和喜欢推文的Twitter机器人。我在我的项目中使用Twitterlib version 21

它似乎在很大程度上起作用,但我有一个特别的问题。当我包含" min_retweets:X"在我的搜索中,它似乎没有得到识别。这不是官方记录的搜索参数,但是当您在网站上的普通Twitter搜索中使用它并且仅返回已被转发X次的推文时,它确实有效。

如果我制作" min_retweets:X"第一个搜索词然后搜索将不返回任何结果。如果我把它作为最后一个搜索词我得到了结果,但它们并不仅限于被转发X次的推文。

我在Twitterlib内部的fetchtweets()方法中略微探讨了一下,但目前我已经超出了我的想法,可以找出问题所在。该库的第21版表示它已更新为使用"进行搜索:"工作正常,就我使用的其他一些搜索词而言,这似乎是准确的,而不是这个。还有一个" min_faves:X"参数,但我没有经过测试,看看它是否适用于Twitterlib的搜索。

如果有人知道要解决这个问题的方法,我会很感激。下面是我用来调用函数的代码和来自Twitter lib的函数本身的代码:

var tweets = twit.fetchTweets( 
  TWITTER_SEARCH_PHRASE, function(tweet) {
    if (!tweet.possibly_sensitive) {
      return tweet.id_str;
    }
  }, {
    multi: true,
    lang: "en",
    count: 5,
    since_id: props.getProperty("SINCE_TWITTER_ID")
  });
OAuth.prototype.fetchTweets = function(search, tweet_processor, options) {

  var tweets, response, result = [], data, i, candidate;  
  var phrase = encodeString('lang:' + (options && options.lang || 'en') + ' ' + encodeString(search).replace(/%3A/g, ":")); // English language by default

  this.checkAccess();

  if(options == null) {
    options = {};
  }

  var url = [
    "https://api.twitter.com/1.1/search/tweets.json?count=", 
    (options.count || "5"),
    options.filter ? ("&filter=" + encodeString(options.filter)) : "",
    "&include_entities=",
    options.include_entities ? encodeString(options.include_entities) : "false",
    "&result_type=",
    options.result_type ? encodeString(options.result_type) : "recent",
    "&q=",
    phrase,
    options.since_id ? "&since_id=" + encodeString(options.since_id) : ""
    ].join("");
  var request_options =
  {
    "method": "get"
  };

try {

    response = this.fetch(url, request_options);

    if (response.getResponseCode() === 200) {

      data = JSON.parse(response.getContentText());
      if (data) {

        tweets = data.statuses;

        if(!tweet_processor) {
          return options && options.multi ? tweets : tweets[tweets.length - 1];
        }
        for (i=tweets.length-1; i>=0; i--) {
          candidate = tweet_processor(tweets[i]);
          if(candidate === true) candidate = tweets[i];
          if(candidate) {
            if(options && options.multi) {
              result.push(candidate);
            } else {
              return candidate;
            }
          }
        }
        if(result.length) {
          return result;
        }
        if(i < 0) {
          Logger.log("No matching tweets this go-round");
        }
      }
    } else {
      Logger.log(response);
    }
  } catch (e) {
    Logger.log(JSON.stringify(e));
    throw e;
  }
  return result;
}

2 个答案:

答案 0 :(得分:1)

是的,看起来你已经发现了一个合法的错误。如果在使用min_retweets搜索查询运行fetchTweets()后查看执行脚本,它看起来像这样:

https://api.twitter.com/1.1/search/tweets.json?count=5&include_entities=false&result_type=recent&q=lang%3Aen%20min_retweets%3A100%2520swag

额外的%25是百分号本身被重新转发,并且它打破了查询。我将不得不回去全面重新审视所有特殊人物;我非常肯定有些人必须双重逃脱,有些人不得。与此同时,这是一个解决方法。您可以直接调用twit.fetch并将其提供给URL,如下所示:

var tweets = JSON.parse(
  twit.fetch(
     "https://api.twitter.com/1.1/search/tweets.json?"
     + "count=5&result_type=recent&q=" 
     + Twitterlib.encodeString("lang:en min_retweets:100 #swag"),     
    {method: "get"}).getContentText("UTF-8")
).statuses;

我还会回来告诉你什么时候v22掉线并修复你的问题。感谢您使用我的图书馆!

答案 1 :(得分:-1)

我检查了其他字符(/#@; $,?= +)并获得了各自的执行记录:

%252F%2523%2540%253B%2524%252℃%253F 253D%%252B

所以百分号正在重新转发。

仅适用于“:”它正常工作。

在fetchtweets函数中:

var phrase = encodeString('lang:' + (options && options.lang || 'en') + ' ' + encodeString(search).replace(/%3A/g, ":"));

这里“:”被替换为%3A,这是正确的。也许为其他角色添加相同的东西也会有用吗?

此外,变通办法脚本执行时间太长,并不总是返回最近的推文。我收到了一些推文,这些推文大约在3个月前发过推文!