mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Linux - シェルスクリプトで Twitter アカウント ID を取得!

[ pc_tips, sns ] [ JavaScript, Linux, Twitter ]

こんばんは。

Twitter API を使用せず、特定の Twitter アカウントの ID (数字だけのID)を取得する方法についてです。
今回紹介する方法だと、アカウント ID を取得するだけのことに API 認証までしなくてもよいです。

実際には、シェルスクリプトで HTML を解析する方法になっています。(前回の「Linux - シェルスクリプトで天気予報取得!」の応用です)

最終的にワンライナー(1行完結のスクリプト)にしているが、以下で順を追って説明します。
また、後半ではブラウザ + JavaScript でアカウント ID を取得する方法も紹介しています。

0. 前提条件

  • Linux Mint 14 (64bit) での作業を想定。
  • bash もしくは zsh での作業を想定。(当方、動作確認済み)
  • curl, grep, sed コマンドの詳細は説明しない。(特に難しいオプションは使用していない)
  • 正規表現の詳細は説明しない。(特に難しい正規表現は使用していない)
  • 取得元サイトの HTML ソースは予期せず変更されることがあるので注意。
  • Twitter のアカウントには、以下の3つがあることを理解しておく。
    • 半角英数字・記号からなる一意の「アカウント名」
    • 任意の「表示名」
    • 数字だけからなる一意の「アカウント ID」

1. HTML 取得

調べたいアカウントの Twitter ページの URL は https://twitter.com/hoge なので、curl コマンドで以下のようにして HTML を取得する。("hoge" は調べたいアカウントのアカウント名(API で言うところの screen_name))

1
$ curl https://twitter.com/hoge

ページの HTML が全部取得される。

2. 必要な行のみ抽出

取得された HTML から、grep コマンドで必要な部分のみ抽出する。
HTML ソースを眺めると分かると思うが、<div class="profile-card-inner" data-screen-name="hoge" data-user-id="999999999"> という行を抽出すればよい。
なので、profile-card-inner という文字列が存在する行のみを抽出するようにする。
("data-screen-name" や “data-user-id” を含む行を抽出してもよいが、それらは複数行存在する。1行しか存在しない “profile-card-inner” を含む行を抽出する方が簡素な処理になるだろう)

1
2
3
4
5
curl https://twitter.com/hoge | grep -e "profile-card-inner"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 14  181k   14 26536    0     0  25541      0  0:00:07  0:00:01  0:00:06 31292    <div class="profile-card-inner" data-screen-name="hoge" data-user-id="999999999">
100  181k  100  181k    0     0   108k      0  0:00:01  0:00:01 --:--:--  122k

ただし、curl コマンドが標準エラー出力に余分な情報も出力する。

3. 標準エラー出力を抑制

curl コマンドによる余分な出力情報を破棄するため、以下のようにする。(標準エラー出力を破棄するようにする)

1
2
$ curl https://twitter.com/hoge 2> /dev/null | grep -e "profile-card-inner"
    <div class="profile-card-inner" data-screen-name="hoge" data-user-id="999999999">

4. 該当の数字文字列を抽出

取得した行内の “data-user-id” に設定されている数字を sed コマンド+正規表現で抽出する。

1
2
$ curl https://twitter.com/hoge 2> /dev/null | grep -e "profile-card-inner" | sed -e 's/^.*data-user-id="\(.*\)">$/ID: \1/'
ID: 999999999

これで完成である。

5. その他(ブラウザで JavaScript を使用する方法)

HTML 内の指定の属性の値を取得するという意味で考えると、JavaScript を使用してアカウント ID を取得することもできる。

以下のような文字列を URL としてブラウザのお気に入りに登録する。

1
javascript:(function(){window.alert('ID:'+$('.profile-card-inner[data-user-id]').attr('data-user-id'));})()

そして、アカウント ID を調べたいアカウントのページ(https://twitter.com/hoge)を開き、ブックマークから実行する(先ほどの登録したリンクを開く)と、ダイアログが開いてアカウント ID が表示される。


他にも方法はあるかも知れませんが、当方はこれらで落ち着いています。
ブラウザ+ JavaScript でアカウント ID を調べるほうが多いかも知れませんが。。。

ただ、当然ながら処理するアカウントが大量にある場合などは、定石とおり Twitter API で認証して取得する方法が良いでしょう。

以上。

Comments