web-dev-qa-db-ja.com

認証なしでTwitterフィードをJSONとして取得する

数年前に小さなJavaScriptを書いて、最新のツイート(ユーザー)を取得し、それを解析してリンクや日付などを表示しました。

このjson呼び出しを使用してツイートを取得しましたが、機能しなくなりました。

http://Twitter.com/statuses/user_timeline/radfan.json

エラーを返すようになりました:

{"errors":[{"message":"Sorry, that page does not exist","code":34}]}

私はAPIバージョン(以下のコード)の使用を検討しましたが、これには認証が必要です。これは、私のプロフィールページに公開されている私のウェブサイトに最新のツイートを表示するだけなので、むしろ行う必要はありません:

http://api.Twitter.com/1/statuses/radfan.json

TwitterのAPIの変更に対応できなくなったため、TwitterのAPIの変更に追いついていません。この問題を回避する方法はありますか、それとも不可能ですか。

21
SimonBarker

ドキュメント でわかるように、REST= APIを使用すると、これを行うために OAuthトークン が必要になります。幸いなことに、 検索 (OAuthを使用しない)を使用し、from:[USERNAME]演算子

例: http://search.Twitter.com/search.json?q=from:marcofolio
そのユーザーからのツイートを含むJSONオブジェクトを提供します。

object.results[0]

最後のツイートを提供します。

1
MarcoK

以前は、Search APIは、何らかの形式のOAuthを必要としない唯一のTwitter APIでした。現在は認証が必要です。

TwitterのSearch APIは、サードパーティの買収から買収されました-彼らはそれをサポートすることはめったになく、それが存在することさえ熱心に思われないようです。それに加えて、key:valueペアの[〜 #〜] json [〜#〜]または[〜#〜] xml [〜#〜]ファイルが返されます。

これを聞いたとき、私はショックを受けました。最小限のコードを使用して単純な[〜#〜] get [〜#〜]要求(タイムラインの表示など)を行う方法を見つけるのに長い時間を費やしました。

関連するペイロードを確保するために、OAuthルートに行くことにしました。これを行うには、サーバー側の言語が必要です。 JavaScriptはエンドユーザーに表示されるため、必要なkeysおよびを含めることはお勧めしません.jsファイルのsecrets

大きなライブラリを使いたくなかったので、私に対する答えは[〜#〜] php [〜#〜]と@Riversの答え ここ 。 @ lackovic10によるその下の答えは、認証にクエリを含める方法を説明しています。

これにより、新しいOAuth要件でTwitterのAPIを使用する方法について考える時間を節約できることを願っています。

14
Dustin

ログインせずに、高度な検索でTwitterにアクセスしてスクレイピングできます。

GETリクエスト

基本的な検索リクエストを実行すると、以下が得られます。

https://Twitter.com/search?q=Babylon%205&src=typd
  • q (our query encoded)
  • src(クエリのソースであると想定、つまり入力)

デフォルトでは、Twitterは上位25件の結果を返しますが、allをクリックすると、リアルタイムのツイートを取得できます。

https://Twitter.com/search?f=realtime&q=Babylon%205&src=typd

JSONコンテンツ

より多くのツイートがAJAX経由でページにロードされます。

https://Twitter.com/i/search/timeline?f=realtime&q=Babylon%205&src=typd&include_available_features=1&include_entities=1&last_note_ts=85&max_position=Tweet-553069642609344512-553159310448918528-BD1UO2FFu9QAAAAAAAAETAAAAAcAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

max_positionを使用して、次のツイートをリクエストします

次のjson配列は、コンテンツをスクレイピングするために必要なすべてを返します。

https://Twitter.com/i/search/timeline?f=realtime&q=Babylon%205&src=typd
  • has_more_items(ブール値)
  • items_html(html)
  • max_position(キー)
  • refresh_cursor(キー)

DOM要素

抽出に使用できるDOM elementsのリストがあります

著者のTwitterハンドル

div.original-Tweet[data-Tweet-id]   

著者の名前

div.original-Tweet[data-name]

作成者のユーザーID

div.original-Tweet[data-user-id]    

投稿のタイムスタンプ

span._timestamp[data-time]  

投稿のタイムスタンプ(ミリ秒)

span._timestamp[data-time-ms]

ツイートのテキスト

p.Tweet-text

リツイート数

span.ProfileTweet-action–retweet > span.ProfileTweet-actionCount[data-Tweet-stat-count] 

ファボの数

span.ProfileTweet-action–favorite > span.ProfileTweet-actionCount[data-Tweet-stat-count]    

リソース

9
RafaSashi

JSONで認証されていないツイートを探している場合、これは機能するはずです: https://github.com/cosmocatalano/Tweet-2-json

5
cosmocatalano

TweetJS.com などのTwitter APIラッパーを使用できます。これは、Twitter APIの機能の限られたセットを提供しますが、認証は必要ありません。このように呼ばれています。

TweetJs.ListTweetsOnUserTimeline("PetrucciMusic",
function (data) {
    console.log(data);
});
0
Fiach Reid

Twitter api v1を使用して、OAuthを使用せずにツイートを取得できます。例: this linkは@jackの最後の100件のツイートになります。

タイムラインのドキュメントは here です。

0
Dorukcan Kişin

http://anyorigin.com を使用して最新のツイートのTwitterサイトをスクレイピングするクイックハック(実際にはハックであり、将来の証拠ではないことに注意して使用する必要があります)です。

http://codepen.io/JonOlick/pen/XJaXBd

Anyoriginを使用して(使用するには料金がかかります)HTMLを取得します。次に、jqueryを使用してHTMLを解析し、関連するツイートを抽出します。

モバイルサイトのツイートでは、.Tweet-textクラスのdivを使用しているため、これは非常に簡単です。

関連するコードは次のようになります。

$.getJSON('http://anyorigin.com/get?url=mobile.Twitter.com/JonOlick&callback=?', function(data){

  // Remap ... utf8 encoding to ascii. 
  var bar = data.contents;
  bar = bar.replace(/…/g, '...');

  var el = $( '<div></div>' );
  el.html(bar);

  // Change all links to point back at Twitter
  $('.Twitter-atreply', el).each(function(i){
    $(this).attr('href', "https://Twitter.com" + $(this).attr('href'))
  });

  // For all tweets
  $('.Tweet-text', el).each(function(i){
    // We only care about the first 4 tweets
    if(i < 4) {
      var foo = $(this).html();
      $('#test').html($('#test').html() + "<div class=ProfileTweet><div class=ProfileTweet-contents>" + foo + "</div></div><br>");
    }
  });

});
0
Jon Olick