はじめに
例えば、次のようなプログラムを書いて配布する場合、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関連情報を取得する */ 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関連情報を取得する */ 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 ); }