我使用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;
}
答案 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个月前发过推文!