CodeZine(コードジン)

特集ページ一覧

各ブラウザのproxyサーバ情報を読み出して利用する

Internet Explorer、Firefox、Operaの設定情報を取得する

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/01/04 00:00

自前のWebクライアントを作成する場合、proxy経由のWebアクセスも考慮する必要があります。このとき、Webブラウザの設定情報からproxyサーバに関する情報を拾ってこれれば便利です。本稿では、代表的な3つのブラウザ(IE、Firefox、Opera)を対象にその方法を解説します。

目次

はじめに

 例えば、次のようなプログラムを書いて配布する場合、proxy経由でWebにアクセスする人のことも考えてプログラムを作ることになるでしょう。

  • Webブラウザ
  • 自分の注目しているWebページを日々自動収集して解析するプログラム
  • Web上に存在する各種RSS/Atomフィードの自動収集プログラム、あるいはRSS/Atomリーダ
  • ブログに記事を投稿するツール
  • オンラインヘルプ機能を内蔵したデスクトップアプリケーション
  • WindowsアップデートのようなWeb経由での自動更新機能を備えたプログラム

 上記のようなプログラムを使おうとするような人なら、おそらく何らかのWebブラウザを使っているはずですし、proxyサーバの情報も設定済みでしょう。この情報を他のプログラムでも利用しない手はない、という訳です。

 そのプログラム専用の設定ファイルを用意して、そこにproxyサーバの情報を手で書くようにする、というのでも構いませんが、Webブラウザの設定情報からproxyサーバに関する情報を拾ってくることができれば、わざわざ独自の設定ファイルを用意する必要はありませんし、同じような情報を各アプリケーションごとに設定する手間の発生を抑えることもできます。

 この記事では、Windows上で比較的広く使用されていると思われる3つのブラウザ(Internet Explorer、Firefox、Opera)について、各々の設定ファイル(もしくはレジストリ)からproxyサーバの設定情報を拾ってくる方法を紹介します。

対象読者

  • 自前のWebクライアント(Webブラウザ、フィードリーダなど)を作りたい人
  • Webブラウザの設定情報を利用するアプリケーションを書きたい人
  • あるいはWebブラウザの設定情報自体に興味のある人

必要な環境

 Windows(95、NT以降)と以下のWebブラウザのうちの少なくともどれか1つ。

  • Internet Explorer 5.5、6.0あるいは7.0
  • Firefox 1.xまたはFirefox 2.x
  • Opera 7.x、8.xまたは9.x

各ブラウザのproxyサーバ情報を読み出して利用する方法(1/2)

Internet Explorerの場合

 Intrernet Explorerの設定情報は、基本的にレジストリに存在します。proxyサーバ情報に関する情報もレジストリにあります。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

 の

ProxyServer

 に

サーバ名:ポート番号

 という形式の文字列として格納されています

Internet Explorerの設定情報からproxy関連情報を取得する処理の例

 「Internet Explorerの設定情報からproxy関連情報を取得する」処理の例を以下に示します(Cで記述しています)。

Internet Explorerの設定情報からproxy関連情報を取得する
/*
 *  Internet Explorer の設定情報から、proxy関連情報を取得する
 */
BOOL
getProxyInfoViaInternet Explorer(
        BOOL           *useProxy,   /* (O) proxy を使っているか否か */
        char           *proxyServer,/* (O) proxy サーバ名           */
        unsigned short *proxyPort,  /* (O) proxy ポート番号         */
        BOOL           verbose      /* (I) verbose モード           */
    )
{
    /* 以下のレジストリから proxy 関連情報を取得する                   */
    /*   HKEY_CURRENT_USER                                             */
    /*     Software\Microsoft\Windows\CurrentVersion\Internet Settings */
    /*       ProxyServer                                               */

    long    ret;
    HKEY    hk;
    long    type;
    char    buf[BUFSIZ], *p;
    long    sz = BUFSIZ - 1;
    BOOL    isInternet ExplorerActive = FALSE;

    ret = RegOpenKeyEx( HKEY_CURRENT_USER,
            "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
                        0,
                        KEY_READ,
                        &hk );
    if ( ret == ERROR_SUCCESS ) {
        isInternet ExplorerActive = TRUE;
                            /* Internet Explorer インストール済み */

        ret = RegQueryValueEx( hk,
                               "ProxyServer",
                               NULL,
                               (unsigned long *)&type,
                               (unsigned char *)buf,
                               (unsigned long *)&sz );
        if ( ret == ERROR_SUCCESS ) {
            if ( type == REG_SZ ) {
                p = strchr( buf, ':' );
                if ( p ) {
                    *p = '\0';
                    strcpy( proxyServer, buf );
                    *proxyPort = (unsigned short)(atol( p + 1 ) & 0xFFFF);
                    if ( (*proxyPort > 0) && (proxyServer[0] != '\0') ) {
                        if ( verbose )
                            fprintf( stderr, "\tproxy = %s:%d\n",
                                     proxyServer, *proxyPort );
                        *useProxy = TRUE;
                    }
                }
            }
        }
        RegCloseKey( hk );
    }

    return ( isInternet ExplorerActive );
}

Firefoxの場合

 Firefoxの設定情報は、設定ファイルの形で存在しています。proxyサーバ情報に関する情報は、通常「prefs.js」という名前のファイルに格納されています。

 まず、Firefoxの大元の設定ファイル「profiles.ini」は、環境変数USERPROFILEで示されるディレクトリ(フォルダ)直下の「Application Data\Mozilla\Firefox\」というディレクトリに置かれています。このファイルのPath=で始まる行に書かれている文字列が、「prefs.js」ファイルの置かれている場所を示しています。

 そして、「prefs.js」ファイルの中の

user_pref("network.proxy.http", "proxyサーバ名");
user_pref("network.proxy.http_port", ポート番号);

 という行から、「proxyサーバ名」と「ポート番号」を取得することができます。

 ちなみに、環境変数USERPROFILEの値は、通常、Windows XPの場合は

C:\Documents and Settings\ユーザー名

 に設定されています。

Firefoxの設定情報からproxy関連情報を取得する処理の例

 上記のことを踏まえ、「Firefoxの設定情報からproxy関連情報を取得する」処理を書いてみた例を、以下に示します(Cで記述しています)。

Firefoxの設定情報からproxy関連情報を取得する
/*
 *  Firefox の設定情報から、proxy関連情報を取得する
 */
BOOL
getProxyInfoViaFirefox(
        BOOL           *useProxy,   /* (O) proxy を使っているか否か */
        char           *proxyServer,/* (O) proxy サーバ名           */
        unsigned short *proxyPort,  /* (O) proxy ポート番号         */
        BOOL           verbose      /* (I) verbose モード           */
    )
{
    /* 手順                                                              */
    /*  (1) 環境変数 USERPROFILE の指すディレクトリ以下のファイルを探索  */
    /*  (2) Application Data/Mozilla/Firefox/profiles.ini というファイル */
    /*      から                                                         */
    /*        Path=Profiles/*.default                                    */
    /*      という行を取得する (* 部分は環境によって変わる)              */
    /*  (4) Application Data/Mozilla/Firefox/Profiles/*.default/prefs.js */
    /*      (ただし、設定ファイルを置く場所を(Profiles/*.default以外の)  */
    /*       別のところに変更している場合も考慮して Path  の示すディレク */
    /*      トリ直下から prefs.js を探した方がいい)                      */
    /*      というファイルの中に                                         */
    /*        user_pref("network.proxy.http", "proxyサーバ名");          */
    /*        user_pref("network.proxy.http_port", ポート番号);          */
    /*      という記述があれば、proxy を使用する                         */
    /* 注意: 用途に合わせて profile を複数用意し使い分けているような場合 */
    /*       は、この手順で proxy の設定を取得できるとは限らない (取得で */
    /*       きるのは、現在 active 状態になっている設定のみ)             */

    char    buf[BUFSIZ];
    BOOL    isFirefoxActive = FALSE;
    char    *p = getenv("USERPROFILE");

    if ( p && *p ) {
        char    targetDir[MAX_PATH];
        char    filename[MAX_PATH];
        char    path[MAX_PATH];
        FILE    *fp;
        BOOL    isRelative = TRUE;

        sprintf( targetDir,
                 "%s\\Application Data\\Mozilla\\Firefox\\", p );
        sprintf( filename, "%sprofiles.ini", targetDir );
        path[0] = '\0';

        if ( ( fp = fopen( filename, "r" ) ) != NULL ) {
            char    *p;

            isFirefoxActive = TRUE;
            while ( ( p = fgets( buf, BUFSIZ - 1, fp ) ) != NULL ) {
                if ( !strncmp( p, "IsRelative=", 11 ) ) {
                    p += 11;
                    isRelative = (atol( p ) == 0) ? FALSE : TRUE;
                    continue;
                }
                if ( !strncmp( p, "Path=", 5 ) ) {
                    p += 5;
                    strcpy( path, p );
                    while ( (path[strlen(p) - 1] == '\n') ||
                            (path[strlen(p) - 1] == '\r') ||
                            (path[strlen(p) - 1] == ' ' ) ||
                            (path[strlen(p) - 1] == '/' ) ||
                            (path[strlen(p) - 1] == '\\')    )
                        path[strlen(p) - 1] = '\0';
                    break;
                }
            }
            fclose( fp );

            if ( path[0] ) {
                if ( isRelative )
                    sprintf( filename, "%s%s\\prefs.js",
                             targetDir, path );
                else
                    sprintf( filename, "%s\\prefs.js", path );

                if ( ( fp = fopen( filename, "r" ) ) != NULL ) {
                    while ( (p = fgets( buf, BUFSIZ - 1, fp )) != NULL ) {
                        if ( !strncmp( p,
                                       "user_pref(\"network.proxy.http\"",
                                       30 ) ) {
                            char    *q;

                            p += 30;
                            q = strchr( p, '"' );
                            if ( q ) {
                                q++;
                                p = strchr( q, '"' );
                                if ( p ) {
                                    *p = '\0';
                                    strcpy( proxyServer, q );
                                    *useProxy  = TRUE;
                                    *proxyPort = DEFAULT_HTTP_PORT;
                                        /* とりあえず、デフォルト値を */
                                        /* 入れておく                 */
                                }
                            }
                        }
                        else if ( !strncmp( p,
                                  "user_pref(\"network.proxy.http_port\"",
                                            35 ) ) {
                            p += 35;
                            while ( *p && ((*p < '0') || (*p > '9')) )
                                p++;
                            if ( *p ) {
                                *proxyPort =
                                    (unsigned short)(atol( p ) & 0xFFFF);
                                if ( *useProxy == TRUE )
                                    break;
                            }
                        }
                    }
                    fclose( fp );
                }
                else {
                    if ( verbose )
                        fprintf( stderr,
                                 "設定ファイル(%s)が見つかりません\n",
                                 filename );
                }
            }
        }
        else {
            if ( verbose )
                fprintf( stderr, "設定ファイル(%s)が見つかりません\n",
                         filename );
        }
    }

    if ( *useProxy == TRUE )
        if ( verbose )
            fprintf( stderr, "\tproxy = %s:%d\n",
                     proxyServer, *proxyPort );

    return ( isFirefoxActive );
}

  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

著者プロフィール

  • tsu(ツ)

    「行き当たりばったり指向プログラミング」や「イベント参加報告」といったWebページを細々と書いています。

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5