Windows Phone でUser Agent を偽装し続ける方法

現在、iPhone やAndorid でWebページにアクセスすると、ほとんどのサイトがスマートフォンに最適化されたページが表示されます。

しかし、IS12TなどのWindows Phone では、ブラウザエンジンがIE9 Mobile といったUser Agent を用いているため、残念ながらPCサイトのページが表示されてしまっています。

IE9 Mobile へのスマートフォン最適化ページの反映は、まだまだ先になると思われます。

そこで、今回はUser Agent を偽装し続けることで、IE9 Mobile をブラウザとしたWindows Phone でもスマートフォン最適化ページを表示できるような仕組みについて記述したいと思います。


バイスごとのUser Agent を知りたい方はこちら:ユーザエージェント一覧 web showcase : s-ej web tips

今回は、iOS4でのUser Agent を利用します。


まず、User Agentを偽装するためには、次のようにします。

string uri = "http://www.yahoo.co.jp/";
string userAgent = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; ja-jp) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7";
webBrowser.Navigate(uri, null, "User-Agent: " + userAgent);

指定したURIをブラウザで表示するには、WebBrowserクラスのNavigate(Uri, Byte(), String)メソッドを用います。

Navigate()メソッドの第3引数にHTTP headers として、User Agent をアクセス先であるWebページに渡してあげます。


そうすると、User Agent が偽装されYahoo! JAPAN のWebページがiPhone 用に最適化されたページが表示されます。

これで一見すべて大丈夫に見えますが、ここで表示されているリンク先に接続するとスマートフォン用のページではなく、PC版のページが表示されてしまいます。

これは何故かというと、一番最初にアクセスした『http://www.yahoo.co.jp/』には、HTTP リクエストとして偽装したUser Agent を渡してあげました。

しかし、リンクをタップした場合、HTTP リクエストに偽装したUser Agent は含まないからです。


そこで、URIが変更されるたびにUser Agent を偽装してあげる処理が必要になります。

まずURIが現在のサイトから他のサイトに移動した時に発生するイベントを取得できるWebBrowser.Navigating Event と、
新しいサイトに移動した時に発生するWebBrowser.Navigated Event が必要になります。

private string userAgent = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; ja-jp) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7";
private bool isNavigating = false;

// コンストラクター
public MainPage()
{
    InitializeComponent();

    webBrowser1.Navigating += new EventHandler<NavigatingEventArgs>(webBrowser1_Navigating);
    webBrowser1.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(webBrowser1_Navigated);
    this.Navigate(new Uri("http://www.yahoo.co.jp/"));
}

private void webBrowser1_Navigating(object sender, NavigatingEventArgs e)
{
    if (!this.isNavigating)
    {
        this.isNavigating = true;
        e.Cancel = true;
        this.Navigate(e.Uri);
    }
}

private void webBrowser1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    this.isNavigating = false;
}

private void Navigate(Uri uri) 
{
    webBrowser1.Navigate(uri, null, "User-Agent: " + this.userAgent);
}

WebBrowser.Navigating Event で新しくWebページにアクセスした場合は、 e.Cancel = true; で一度Webページへのアクセスをキャンセルします。

そして、キャンセルしたアクセス先であるURIを、webBrowser.Navigate() メソッドを用いて偽装したいUser Agent を再びHTTP リクエストに織り交ぜてアクセスします。

このように、新しいURIにアクセスするたびにUser Agent をWebサイトに送ることで、すべてのWebページがスマートフォン最適化ページとして閲覧することが可能になります。


以上で、Windows Phone のブラウザであるIE9 Mobile でiPhoneなどのスマートフォン最適化サイトをUser Agent を偽装し続ける方法になります。

ただし、この方法では何度もHTTP リクエストを送信する必要があります。

やはり、一番いいのは早く各サイトがIE9 Mobile に対応してくれることだと思います。


ggった結果の参考サイトさま
[twitter:@ch3cooh]さん 酢ろぐ(ch3cooh.jp) http://d.hatena.ne.jp/ch3cooh393/20111109/1320853045


2011/11/16 追記
この方法ではGETパラメータは問題ないが、POSTでの送信の場合はPOSTデータを渡すことができない。
その回避方法も後日判明すれば、記述します。

http://www.st-hatena.com/users/sa/samril/user_p.gif[twitter:@tezawaly]さんのご協力で解決しました!