3

Twitterで複数のユーザーのキーワード検索を常時監視するサービスを構築しようとしています。これを達成するための5つの異なる方法があるようです-すべて独自の欠点があります。Twitterとtwitter4jのドキュメントを調べましたが、他のアプローチが見つかりません。

  1. Twitter REST APIを使用して検索を実行します(https://dev.twitter.com/docs/api/1/get/search)。このAPIは結果が制限されています。要求が多すぎると、制限されます。結果を複製しないように、最後に読んだツイートを追跡する必要があります。ストリームをポーリングするにはタイマーが必要です。複数の検索語がある場合は、複数の呼び出しを行うのは簡単です。

  2. パブリックストリームアプローチを検索します(https://dev.twitter.com/docs/streaming-apis/streams/public)。これは継続的な検索には最適ですが、Twitterではアカウントごとに1つの接続しか許可されておらず、Twitterに渡すことができる用語の数には制限があります。私のユースケースでは絶対に不可能です

  3. フィルタリングにユーザーストリームを使用してみてください。私はこれを行いましたが、ツイートが検索からのものかユーザーストリームからのものかをすばやく判断するのは難しいことがわかりました。また、Twitterは、IPアドレスごとのユーザーストリームの数を制限するため、このアプローチは拡張できないと述べています。(TwitterはSiteStreamsと呼ばれるものについて話し合っていますが、ドキュメントがない非常に限定されたベータ版であるため、私が検討できるものではありません)。

  4. Twitterから消防ホース全体を購入しているサードパーティ(Datasiftなど)にアクセスして、そこでTwitterストリームを検索します。これは高くつきます-基本計画のために月額3000ドル。24時間年中無休で1つの単語を検索するには、月額45ドルかかります)

コミュニティへの私の質問は、「私はすべての可能性を使い果たしましたか」です。はいの場合、#1--タイマー付きのREST APIを使用し、最後に見つかったものを追跡することが正しいアプローチであるように思われます。誰かが同意しませんか?もしそうなら、この問題を解決するのに役立つドキュメント(またはライブラリ)を教えていただけますか。

皆さんありがとう

4

3 に答える 3

4

Twitter API を扱う際のすべての質問に答える素敵な JS フィドルをまとめました。Web アプリはトレンドのロケールを取得し、トレンドのトピックにドリルダウンして、その中のツイートを表示できるようにします。

また、標準の Twitter 検索送信ボックスも含めたので、奇妙なことに、これは調べてみる必要最低限​​の Tweetdeck クライアントです。また、新しい Jquery ライブラリの適応を促進するために、新しい live.bind クリック イベント構文を利用する 1.91 を使用しました。

楽しみ

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();

});
于 2013-03-06T13:19:19.913 に答える
0

Twitter からの応答は、#4 を使用することでした。Datasift などのベンダーからアクセスを購入します。

于 2012-11-19T02:07:54.227 に答える
0

どれくらいの頻度で Twitter を検索しますか? また、検索ボリュームはどのくらいですか (つまり、ユーザー数とユーザーあたりのキーワード数)?

ブラウザ内スクレイピング ツールも検討しましたか? つまり、検索結果が最新の状態に保たれているサーバー上でブラウザを実行したままにし、そのブラウザ用の単純なプラグインを開発して、データをキャプチャしてデータベースに投稿したり、処理のためにどこかに送信したりしますか?

于 2012-11-16T12:20:46.850 に答える