前回の予告どおり、今回はモバイルからのアクセスを擬似的に行うクライアントを作成します。
具体的に Google では現在のところ、「環境変数」の「HTTP_USER_AGENT」をキーとして携帯からのアクセスかどうかを判断しているようです。そこで、この HTTP_USER_AGENT の値を変更して携帯からのアクセスっぽいアクセスに仕立て上げることで、Google からモバイル用のコンテンツを応答させてみましょう。
コードは以下のとおりです。MobileClient.cs として保存します。
using System;
using System.Net;
using System.IO;
using System.Text;
class MobileClient {
static void Main(string[] args){
String url = "http://google.jp";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
// ここがポイント。UserAgentの一覧は各キャリアのページ等を参考のこと
req.UserAgent = "DoCoMo/2.0 D903i(c100;TB;W28H20)";
// 実際にリクエストを行う
WebResponse res = req.GetResponse();
// Streamとして受け取り、最後まで読み込んで表示する。
// 文字コードはShift_JISと限定して読みこみます。
Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS"));
String html = sr.ReadToEnd();
sr.Close();
st.Close();
// 読み込んだコンテンツを出力します
Console.WriteLine(html);
}
}
前回までと同じく、 csc MobileClient.cs としてコンパイルすると、 MobileClient.exe ができます。これを実行した内容を保存すると、半角カナの混じったデータが取得できるかと思います。これが、Google のモバイル版のコンテンツです。
ちなみに、このコードの一部を変更してみましょう。
// Console.WriteLine(html); Console.WriteLine(res.ResponseUri);
このコードを実行すると、実際に転送されたURL (たとえば: http://www.google.co.jp/m?id=0d4c0f4355d906cec0ceaed349c734f9)がどこになるのかわかります。 Google のコンテンツは Gmail をはじめとして、転送が非常に多いので、このように転送された URL がどこになっているかということを知ることは、サイトのコンテンツおよび URL を設計するのに、参考になる情報なのではないかと思います。(mというのがおそらくモバイルの意味でしょう)
今回の実験をもとに、わかったことがあります。一つは「携帯からのアクセス」を確実に判定するためには「環境変数 HTTP_USER_AGENT」だけでは不十分であるということです。環境変数の多くはこのように、アクセスする側から簡単に詐称できるものです。悪意のあるユーザがこの値に不正な値を挿入することによって問題の起こるサーバプログラムを作ってしまっていないか?そういうテストにも、こういったちょっとしたプログラムは有用であるといえます。
ちなみに携帯からのアクセスかどうかの判定にはアクセス元IPアドレスかどうか、HTTP_USER_AGENTの値が本当に存在するものかどうかなどなど、複合的な情報を元に判定を行います。公式サイトの場合にはより厳しい条件にて判定が行われています。モバイルへの対応というのは、なかなか難しいものですね。
4回にわたって「ちょっとしたプログラミング」のコーナーを連載してきましたが、読者の方々は「ちょっとしたプログラミング」をやってみようという気になったでしょうか?筆者は今度はZipファイルの圧縮・解凍にチャレンジしてみようかと思っています。.NET Framework の バージョン3.0からはZipPackage という便利なクラスがあり簡単にできるのですが、2.X だとかなり難しそうで「ちょっとした」とは言えないものなのでこちらの記事とするのは断念しました。
次回以降は「Webの世界のちょっとしたプログラミング」 Javascript を扱ってみたいと思います。「.NET でちょっとしたプログラミング」 をお読みいただきましてありがとうございました。