javascriptで特定ユーザーの最新ツイートを 認証なしで取得する

現在 twitter APIはoauh認証が必須となり、APIの認証キーの取得にはデベロッパーの登録が必須となっている。
....が簡単に最新のツイートを取ってきたいので、javascriptでスクレイピングしてくることにする。

javascriptでスクレイピングする場合、AJAX XMLHttpRequest()または、JQueryを使って$.ajaxで非同期にhttpを取得し
JQueryでDOMをパースする流れになる。

但し、JQueryはbodyタグやheadタグなどが入っていたり、htmlが壊れているパースができないので、
パースする前に取得したデータを加工しておく必要がある。

bodyタグより前を削除 ※twitterのhtml構造は壊れていて

の閉じタグはなくで終わっているのでこれで問題ない。

data.slice(data.search('<body'))

svgのソースのurl指定が絶対指定になっている影響でjqueryでのパース時にエラーが発生するのでjqueryに読み込ませる前に正規表現で除去する。

この正規表現は簡易なので、のように属性値に『>』が入っている場合には対応できないが、今回はtwitter限定なのでよしとする。

.replace(/<svg.*?>.*?<\/svg>/g,'')

正規表現で、特定htmlタグを除去する方法は突き詰めるとトコトンめんどくさい....。
他にも入れ子になった場合とかも考慮する必要がある...。

$(function(){
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "https://mobile.twitter.com/<ユーザー>?lang=ja");
  xhr.onload = function(){
    var data = this.response;
    var body = '<div>'+data.slice(data.search('<body')).replace(/<svg.*?>.*?<\/svg>/g,'')+'</div>';
    console.log($(body).find('div.Timeline-item div.Tweet-body div.Tweet-text').html());
  };
  xhr.send(null);
});

尚、クロスドメインになるため、chrome拡張ではmanifest.jsonにパーミッションの設定が必要になる。
つまりは、普通のブラウザのjabascripでtはクロスドメインでのアクセスはできないので、この記事は役に立ちません.....。

  "permissions": [
    "https://twitter.com/",
    "https://mobile.twitter.com/"
  ],

参考