PC から iPhone 専用サイトを覗く方法(User-Agentの偽装)

端的に言えば「User-Agent」を偽装します、ということです。
User-Agent というのは、HTTP プロトコルのヘッダ部に設定してある「今、私はこのブラウザを使っています」という印ですね。サーバーのほうで、携帯電話からなのか、PC からなのか、iPhone/iPad からなのか、Android からなのか、ということが分かります。

と、云いますか、当然これは「印(ルール)」でしかなくって、WebClinet クラスなり、Firefox のプラグインを利用するすれば、簡単に自分が何者かを偽装するこができます(「詐称」という言葉を使っているところもあるけど、技術的にすり替えるだけなので「偽装」のほうがよいかなと)。

さて、なぜ iphone 専用のサイトを pc から覗く必要があるかというと、hon.jp の api を利用して amazon 風のブログパーツを作りたいからなのです。amazon ブログパーツは、書籍の画像を返してくれるのですが、hon.jp api は、画像を返してくれません。hon.jp の場合、タイトル検索などのテキスト検索が主なので、電子書籍の画像は各社のサイトの中にしかありません。pc 用の電子書籍がある場合は、pc からキャッシュ的に取得すればよいのですが、iphone 用しかない場合には、iphone 用のページにアクセスする必要があります。なので、画像を取得するためには iphone であると偽装して画像用の url を取得しないと駄目なのです。

と前置きはそれくらいにして、ざっとこんな感じ。

private void button2_Click(object sender, EventArgs e)
{
	// url を取得
	string url = textBox1.Text;
	WebClientEx client = new WebClientEx();
	// cookie を設定
	client.Cookie = new CookieContainer();
	client.Headers.Add("User-Agent", "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_4 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8K2 Safari/6533.18.5");
	// sjis で全て読み込み
	StreamReader sr = new StreamReader(client.OpenRead(url), Encoding.GetEncoding("shift_jis"));
	string content = sr.ReadToEnd();
	sr.Close();
	// ファイルに出力
	StreamWriter sw = new StreamWriter("temp.html", false, Encoding.GetEncoding("shift_jis"));
	sw.Write(content);
	sw.Close();

	// ブラウザコントロールで表示
	webBrowser1.Navigate("file://" + @"D:\work\blog\src\SampleUserAgent\SampleUserAgent\bin\Debug\"+ "temp.html");
	// テキストボックスでも表示
	textBox2.Text = content;

}

文字コードが sjis になっているのは、電子文庫パブが sjis で返すからです。本来は charset を見てコードを判別しないと駄目ですね。また、電子文庫パブの場合は、cookie が必要になるのでこれも設定してます。
Cookie 自体は、内部の HttpWebRequest を弄る必要があるので、こんな風に継承したクラスを作ります(という例があった)。

class WebClientEx : WebClient
{
	public CookieContainer Cookie { get; set; }
	protected override WebRequest GetWebRequest(Uri address)
	{
		HttpWebRequest wreq = base.GetWebRequest(address) as HttpWebRequest;
		wreq.CookieContainer = this.Cookie;
		return wreq;
	}
}

実行するとこんな感じで取得できます。

画像が表示されないのは、img タグの src 相対パスになっているからです。
保存した html ファイルを開いて を追加すると、こんな感じで表示できます。

これで画像の url が分かるので、ブログパーツを表示する時に画像が表示できますね。
画像 url が変わる可能性もあるのでキャッシュしてもいいのですが、まぁ、amazon と同じで画像ファイル名はほとんど変わらないのではないかなと。これは、いくつかの電子書籍の会社を探ってから考えましょう。

■参考
userAgent一覧/ユーザーエージェント一覧
http://www.openspc2.org/userAgent/

カテゴリー: C# パーマリンク