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 を取得しないと駄目なのです。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 を弄る必要があるので、こんな風に継承したクラスを作ります(という例があった)。

1
2
3
4
5
6
7
8
9
10
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# パーマリンク