header

WinBinderでHTTP通信

(1/2)

WinBinderを使うと、PHPで作成したインターネット利用アプリを簡単に Windows アプリに移植できる。ここでは、「PHPで住所から緯度経度を求める」でつくったプログラムを Windows アプリとして移植してみよう。

0001: <?php
0002: /** adr2geo.phpw
0003:  * 住所から緯度経度を求める(MapFanを利用)
0004:  *
0005:  * @copyright (c)studio pahoo
0006:  * @author     パパぱふぅ
0007:  * @version     1.0  2006/02/06
0008: */
0009: include "./include/winbinder.php";        //WinBinder ライブラリをインクルード 
0010: mb_internal_encoding("Shift_JIS");      //内部コードは SHIFT-JISに統一
0011: 
0012: //通常のユーザー関数定義 =====================================================
0013: //グローバル変数
0014: $url = "http://www.mapfan.com/keywordsrch.cgi";        //mapfan
0015: $method = "POST";
0016: $post["SRCHKIND"] = "SRCH_ADR";
0017: 
0018: /**
0019:  * HTTP通信を行う
0020:  * @param string $url "http://" から始まるURL
0021:  * @param string $method GET,POST,HEAD (省略時はGET)
0022:  * @param string $headers その他の任意のヘッダ (省略時は"")
0023:  * @param array  $post POST変数を格納した連想配列("変数名"=>"値") (省略時はNULL)
0024:  * @param string $cookie Cookie(利用するときは常に$method="POST") (省略時は"")
0025:  * @return string 取得したコンテンツ/FALSE 取得エラー
0026: */
0027: function http($url$method="GET", $header="", $post=NULL$cookie="") {
0028:     if ($cookie != "")    $method = "POST";
0029: 
0030:     $URL = parse_url($url);
0031: 
0032:     $URL["query"] = isset($URL["query"]) ? $URL["query"] : "";   //クエリ
0033:     $URL["port"]  = isset($URL["port"])  ? $URL["port"]  : 80;    //ポート番号
0034: 
0035:     //リクエストライン
0036:     $request  = $method . " " . $URL["path"] . $URL["query"] . " HTTP/1.1\r\n";
0037: 
0038:     //リクエストヘッダ
0039:     $request .= "Host: " . $URL["host"] . "\r\n";
0040:     $request .= "User-Agent: PHP/" . phpversion() . "\r\n";
0041: 
0042:     //Basic認証用のヘッダ
0043:     if (isset($URL["user"]) && isset($URL["pass"])) {
0044:         $request .= "Authorization: Basic " . base64_encode($URL["user"] . ":" . $URL["pass"]) . "\r\n";
0045:     }
0046: 
0047:     //追加ヘッダ
0048:     $request .= $headers;
0049: 
0050:     //POSTの時
0051:     if (strtoupper($method) == "POST") {
0052:         while (list($name$value) = each($post)) {
0053:             $POST[] = $name . "=" . urlencode($value);
0054:         }
0055:         $postdata = implode("&", $POST);
0056:         $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
0057:         $request .= "Content-Length: " . strlen($postdata) . "\r\n";
0058:         if ($cookie != "")    $request .= "Cookie: $cookie\r\n";
0059:         $request .= "\r\n";
0060:         $request .= $postdata;
0061:     } else {
0062:         $request .= "\r\n";
0063:     }
0064: 
0065:     //接続
0066:     $fp = fsockopen($URL["host"]$URL["port"]);
0067:     //エラー処理
0068:     if (!$fp)    return FALSE;
0069: 
0070:     //リクエスト送信
0071:     fputs($fp$request);
0072: 
0073:     //応答データ受信
0074:     $response = "";
0075:     while (!feof($fp)) $response .= fgets($fp);
0076: 
0077:     fclose($fp);
0078: 
0079:     return $response;
0080: }
0081: 
0082: 
0083: /**
0084:  * 住所→緯度・経度変換
0085:  * @param string $adr 住所
0086:  * @return string 緯度・経度(テキスト)
0087: */
0088: function geo($adr) {
0089:     global $post$url$method;
0090: 
0091:     $post["PARAM"] = mb_convert_encoding($adr, "EUC-JP", "Shift_JIS");
0092: 
0093:     $result = http($url$method, "", $post);
0094: 
0095:     preg_match("/(Location: http)(.*)/", $result$arr);
0096: 
0097:     if (isset($arr[2]) == FALSE) {
0098:         echo "住所を正確に入力してください";
0099:         exit(1);
0100:     }
0101:     $url2 = "http" . $arr[2];
0102: 
0103:     $result = file_get_contents($url2);
0104: 
0105:     //緯度経度
0106:     preg_match("/var MAP = \"E([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)N([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)\"/", $result$arr);
0107:     $str = sprintf("東経 %d度%d分%d.%d秒、北緯 %d度%d分%d.%d秒 \n",
0108:         $arr[1]$arr[2]$arr[3]$arr[4]$arr[5]$arr[6]$arr[7]$arr[8]);
0109: 
0110: //  preg_match("/var MAP = \"([A-Z|0-9|\.]*)\"/", $result, $arr);
0111: //  printf("(%s)<br />\n", $arr[1]);
0112: 
0113: //$s = mb_convert_encoding("/〒([0-9|\-]*)/", "EUC-JP", "Shift_JIS");
0114: //preg_match($s, $result, $arr);
0115: //printf("郵便番号 %s<br />\n", $arr[1]);       //おまけ
0116: 
0117:     return $str;
0118: }
0119: 
0120: // WinBinder 専用 ============================================================
0121: //イベントIDの定義
0122: if (!defined("IDCLOSE"))            define("IDCLOSE", 9);
0123: if (!defined("ID_ABOUT"))            define("ID_ABOUT", 1);
0124: if (!defined("IDC_EDIT_ADR"))        define("IDC_EDIT_ADR", 1001);
0125: if (!defined("IDC_BUTTON_EXEC"))    define("IDC_BUTTON_EXEC", 1002);
0126: if (!defined("IDC_LABEL_RESULT"))    define("IDC_LABEL_RESULT", 1003);
0127: 
0128: //メインウィンドウ生成
0129: $mainwin = wb_create_window(NULLAppWindow,"緯度・経度を求める", WBC_CENTER, WBC_CENTER, 450, 250, 0, 0);
0130: 
0131: //イベントハンドラの設定
0132: wb_set_handler($mainwin, "process_main");
0133: 
0134: //コントロールの生成
0135: $edit_adr = wb_create_control($mainwin, EditBox, "", 20, 20, 280, 24, IDC_EDIT_ADR, WBC_VISIBLE | WBC_ENABLED, 0);
0136: wb_create_control($mainwin, PushButton, "実行", 320, 20, 80, 24, IDC_BUTTON_EXEC, WBC_VISIBLE | WBC_ENABLED, 0);
0137: $label_result = wb_create_control($mainwin, Label, "", 20, 80, 300, 24, IDC_LABEL_RESULT, WBC_VISIBLE | WBC_ENABLED, 0);
0138: 
0139: //メニューバーの生成
0140: $mainmenu = wb_create_control($mainwin, Menu, array(
0141:     "ファイル(&F)",
0142:         array(IDCLOSE,    "終了(&X)\tCtrl+Q", "", "", "Ctrl+Q"),
0143:     "ヘルプ(&H)",
0144:         array(ID_ABOUT,   "バージョン情報(&A)", "", "", "")
0145: )); 
0146: 
0147: /**
0148:  * イベントハンドラ
0149:  * @param obj $window メインウィンドウ
0150:  * @param int $id     イベントID
0151: */
0152: function process_main($window$id) { 
0153:     global $edit_adr$label_result
0154: 
0155:     switch($id) {
0156:         case IDC_BUTTON_EXEC:        //ボタンが押された
0157:             $adr = wb_get_text($edit_adr);
0158:             wb_set_text($label_result, geo($adr)); 
0159:             break;
0160:         case ID_ABOUT:
0161:             wb_message_box($window, "バージョン 1.0", APPNAME, WBC_OK);
0162:             break;
0163:         case IDCLOSE: 
0164:             wb_destroy_window($window); //ウィンドウを破棄 
0165:             break;  
0166:     }
0167: }
0168: 
0169: //アプリケーションループ
0170: wb_main_loop();
0171: ?>