TwitterのユーザーホームのHTMLから、アイコン画像のURLを取得する

Twitterでユーザーのアイコン画像を取得する場合、OAuth認証し、user/lookupで取得できるprofile_image_urlの値を取るのが信頼性が高い…はずなのですが、たまにこのURLの画像が壊れていたり、アクセス拒否されたりすることがあり、うまく画像データを取得できないことがあります。

この現象はここ最近よく起きているようで、iconDecotterのTwitterアイコン取得時のエラーログが溜まっていて気づきました。APIで取得したデータにおかしいところは無さそうなので、profile_image_urlの値がTwitter側で上手く更新されてなかったりとかそういうことなのかなと。
完全に憶測ですが、ちょっと前にあったアカウント凍結事件と期を近くして起き始めてたので、そのあたりに何か関連があるのかもしれません。

それはさておき、そういう状況となると、別の方法でアイコン画像が取得できるバックアップが必要です。
力技ですが確実なのは、ユーザーホーム画面(https://twitter.com/[ユーザーID])のHTMLから、アイコン画像のURLを抽出するという方法です。これは、TwitterがHTMLソースを大幅に変更しない限りは、恐らく問題なく使える手法です。今回はその方法について、現時点のものを書いておきます。

ユーザーホーム画面内のアイコン

今回の場合はアイコンといっても、加工に使うものなのでオリジナルサイズのアイコンを取得する必要があります。
ユーザーホーム画面で言うと、下記のあたりのコードにURLが含まれていますので、このあたりを抽出するスクリプトを書きます。

Twitter ユーザーホーム画面

ここにaタグがあるのですが、下記のようなコードになっていました。

<a href="https://si0.twimg.com/profile_images/3201086865/1ba88ce1abd0d46e9ba284942db65e05.png" class="profile-picture media-thumbnail" data-resolved-url-large="https://si0.twimg.com/profile_images/3201086865/1ba88ce1abd0d46e9ba284942db65e05.png" data-url="https://si0.twimg.com/profile_images/3201086865/1ba88ce1abd0d46e9ba284942db65e05.png" target="_blank" _pageexpand_="12" rel="noreferrer">

        <img src="https://si0.twimg.com/profile_images/3201086865/1ba88ce1abd0d46e9ba284942db65e05_bigger.png" alt="iconDecotter" class="avatar size73" _pageexpand_="30">
</a>

aタグのhref要素、data-resolved-url-large要素、data-url要素の3つ全てに同じURLがありますが、これがどうやらオリジナルサイズのアイコン画像のURLのようです。同じなのでどれでもいいとは思いますが、恐らくこのページ内ではここでしか使われないと思しき、data-resolved-url-largeを抽出する方向で行こうと思います。

PHPでアイコン画像URLを抽出

では実際にPHPでこの値を抽出するスクリプトです。

//ユーザーホームのURL
$screen_name = "iconDecotter";     //ユーザー名
$url = "https://twitter.com/".$screen_name;

$html = file_get_contents($url);
if(!empty($html)){
	//data-resolved-url-large要素にオリジナルアイコンのURLがある
	$pattern = '/data\-resolved\-url\-large=".*?"/';
	$searched = preg_match($pattern, $html, $match, PREG_OFFSET_CAPTURE, 0);
	//マッチした文字列から不要部分(要素名、ダブルクォーテーション)を除く
	$res = preg_replace("/(data\-resolved\-url\-large=)|\"/","",$match[0][0]);
}else{
	$res = false;
}

preg_matchで検索し、マッチした文字列からdata-resolved-url-large要素名、「=」、「”」を取り除けばURLだけが残ります。これでアイコン画像のURLが取得出来ました。

もっといい書き方があるかもしれませんが、とりあえずはこれで上手いこと抽出できているようです。鍵付きアカウントでも、アイコン画像周辺のコードについては同様で、画像アクセスももちろんPublicなので、特に問題なく取得出来ます。

もし、Twitter側のデータ構造・レイアウト変更等に伴うソースの大幅整理等があった場合は、これで上手く取得できなくなることもあるかもしれませんので、その時はまた見つけ方を変えて修正するしかないのが、少々不安なところです。

コメント

  1. […] が不正なのでエラーになるという点です。 エラーにはなりますが、先日のユーザーホームからアイコンを取得するという方法でフォローしているので、動作上はなんとかなっています。 […]

タイトルとURLをコピーしました