我正在尝试构建一项服务,在持续监控的基础上为 Twitter 中的多个用户执行关键字搜索。似乎有 5 种不同的方法可以实现这一点——所有方法都有各自的缺点。我浏览了 Twitter 和 twitter4j 文档,找不到任何其他方法。
使用 Twitter REST API 执行搜索 (https://dev.twitter.com/docs/api/1/get/search)。此 API 是结果受限的:要求太多,您将受到限制。我确实必须跟踪上次阅读的推文,这样我就不会重复结果。需要一个计时器来轮询流。如果有多个搜索词,则进行多次调用很简单。
搜索公共(public)流方法 (https://dev.twitter.com/docs/streaming-apis/streams/public)。虽然这对于持续搜索非常有用,但 Twitter 只允许每个帐户建立一个连接,并且对可以传递到 Twitter 的术语数量有限制。对于我的用例来说绝对不可能
尝试使用用户流进行过滤。我这样做了,但发现很难快速确定一条推文是来自搜索还是来自用户流。此外,Twitter 声明他们将限制每个 IP 地址的用户流数量,因此这种方法无法扩展。 (Twitter 一直在谈论一种叫做 SiteStreams 的东西,但它是一个非常有限的测试版,没有任何文档,所以我不能考虑它)。
找到从 Twitter 购买整个 firehose 的第三方(例如 Datasift)并在那里搜索 Twitter 流。这变得昂贵——基本计划每月 3000 美元。全天候 24 小时搜索单个单词的费用约为 45 美元/月)
我对社区的问题是“我是否已经用尽了所有可能性”?如果是,那么在我看来#1——使用带有计时器的 REST API 并跟踪最后找到的是正确的方法。有人不同意吗?如果是这样,您能否指出可帮助我解决此问题的文档(或库)。
谢谢大家
最佳答案
我整理了一个不错的 JS fiddle ,它应该可以回答您在处理 Twitter API 时的所有问题。该 Web 应用程序会抓取热门地区,并允许您深入了解热门话题,然后查看其中的推文。
我还包括一个标准的 Twitter 搜索提交框,所以以一种奇怪的方式,这是一个供您检查的准系统 Tweetdeck 客户端。此外,为了插入新 Jquery 库的适应,我使用了 1.91,它使用了新的 live.bind 单击事件语法。
享受
http://jsfiddle.net/jdrefahl/5M3Gn/
function searchTwitter(query) {
$.ajax({
url: 'http://search.twitter.com/search.json?' + jQuery.param(query),
dataType: 'jsonp',
success: function (data) {
var tweets = $('#tweets');
tweets.html('');
for (res in data['results']) {
tweets.append('<div>' + data['results'][res]['from_user'] + ' wrote: <p>' + data['results'][res]['text'] + '</p></div><br />');
}
}
});
}
$(document).ready(function () {
function getTrendsByID(id) {
$.ajax({
url: 'http://api.twitter.com/1/trends/' + id + '.json',
dataType: 'jsonp',
success: function (data) {
$.each(data[0].trends, function (i) {
});
}
});
};
function getLocales() {
$.ajax({
url: 'https://api.twitter.com/1/trends/available.json',
dataType: 'jsonp',
success: function (data) {
var locales = $('ul#locales');
locales.html('');
$.each(data, function (i) {
localeID[i] = data[i].woeid;
$('ul#locales').append('<li>' + data[i].name + '</li>');
});
}
});
};
function getTrends(id) {
$.ajax({
url: 'https://api.twitter.com/1/trends/' + id + '.json',
dataType: 'jsonp',
success: function (data) {
var trends = $('ul#currentTrends');
trends.html('');
$.each(data[0].trends, function (i) {
$('ul#currentTrends').append('<li>' + data[0].trends[i].name + '</li>');
});
}
});
};
// Event Handlers
$(document).on("click", "#locales li", function () {
var $this = $(this);
var localesHdr = $('#currentTrendsCont h3');
var tweets = $('#tweets');
var trendsHdr = $('#tweetsCont h3');
trendsHdr.html('');
tweets.html('');
localesHdr.html('');
$('#currentTrendsCont h3').html($this.text());
getTrends(localeID[$this.index()]);
});
$(document).on("click", "#currentTrends li", function () {
var $this = $(this);
var trendsHdr = $('#tweetsCont h3');
trendsHdr.html('');
$('#tweetsCont h3').html($this.text());
var params = {
q: $this.text(),
rpp: 10
};
searchTwitter(params);
});
$('#submit').click(function () {
var trendsHdr = $('#tweetsCont h3');
var trends = $('#currentTrends');
var local = $('#currentTrendsCont h3');
local.html('');
trendsHdr.html('');
trends.html('');
$('#tweetsCont h3').html('search query: '+$('#query').val());
var params = {
q: $('#query').val(),
rpp: 10
};
searchTwitter(params);
});
// Globals
var localeID = new Array();
// Init!
getLocales();
});
关于twitter - 如何在推特上搜索关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13407431/