摘要:從IP位置顯示國家所在
摘要 : 
從IP位置來顯示國家的所在,
使用IP配置資料庫與國旗圖示,
在配合一小段程式,
讓你的網站多一些小功能...
前言
從IP來判斷來源或所在地,我想應該很多人都知道怎麼做了,
如果你還不知道而且想要在你的網站上加上顯示網友所在地的功能的話,那就繼續往下看吧!
要達到的功能
- 顯示網友的國家
 - 顯示該國家的國旗
 
相關網站
http://ip-to-country.webhosting.info/1.IP-to-Country資料庫
在上面這個網站,已經有整理好的ip位置資料庫,當然,除了這個外,有些論壇程式中或是流量統計的程式中也有附類似的資料庫,而在這我們是使用這個網站所提供的資料庫.
而它的
下載區可以下載到資料庫,不過它是CSV的格式,所以要先將他匯入mdb中.
2.國旗圖片
同樣的,在上面這個網站中也有提供一些國旗的圖片,
你可以在他的
resources - flags找個你覺得不錯的壓縮檔下載.
開始寫程式
要從IP顯示國家所在的話,第一步當然是取得IP,
strIP = Request.ServerVariables("REMOTE_ADDR")
當然,如果你還要考慮說使用者是不是有使用proxy的話,
你可以在修改一下上面這段,
不過因為抓取proxy後的真實IP並不是我們現在要討論的課題,
所以我們就很單純的使用上面這個方式抓取IP.
而我們抓到IP後,就是要判斷這個IP在哪個IP區段間,
如果你已經看過資料庫內容的話,
你會發現,它的資料長的像是下面這樣996671488
   | 996802559 | TW | TWN | TAIWAN 
這時你會發現並沒有看到像是 xxx.xxx.xxx.xxx 的IP資料欄位,
所以我們必須將IP位址轉換成"數值",
而轉換的公式如下A
   * (256*256*256) + B * (256*256) + C * 256 + D
   以 A.B.C.D 的IP位址為例 
所以用ASP作轉換的函數如下
   Private Function ipAd2ipNum(ipA)
   strO = ipA
   pos1 = InStr(strO, ".")
   intA = CInt(Left(strO, (pos1-1)))
   strO2 = Mid(strO, pos1+1, len(strO))
   pos2 = InStr(strO2, ".")
   intB = CInt(Left(strO2, (pos2-1)))
   strO3 = Mid(strO2, pos2+1, len(strO2))
   pos3 = InStr(strO3, ".")
   intC = CInt(Left(strO3, (pos3-1)))
   intD = CInt(Mid(strO3, pos3+1, len(strO3))) 
   
   intConvert = (intA*(256*256*256)) + (intB*(256*256)) + (intC*256) + intD
   ipAd2ipNum = Trim(intConvert)
   End Function
 
而呼叫的程式如下
   strIP = Request.ServerVariables("REMOTE_ADDR")
   strIPN = ipAd2ipNum(strIP)
到這,我們已經作抓取IP並將它轉換成IP數值了,
在來就是查詢資料庫判斷看看這個IP是在哪個區段,
然後抓取該區段所在的國家資訊.
而SQL的查詢語法如下strSQL
   = "select country_code2,country_name from ip2country where ip_from<=" & strIPN
   strSQL = strSQL & " and ip_to>=" & strIPN 
其中的country_code2是取得國家的簡碼(2碼)用來取得國旗圖片用,因為我所抓取的圖示名稱是用國家簡碼來命名.
country_name 是取得國家的名稱,
所以顯示的程式如下
   If NOT rs.eof Then
   strCounrtyCode = rs.Fields("country_code2")
   strCountry = rs.Fields("country_name")
   
   response.write "你的IP為 : " & strIP 
   response.write "你的國家為 : " & strCountry & "<IMG src="" temp_src=""images/" & strCounrtyCode & ".png"">"
   Else
   response.write "你的IP為 : " & strIP
   response.write "你的國家為 : 不在名單中"
   End If
 
到這,大致就完成了我們的目標了,
將它改成是函數的話,就可以更方便我們在各個程式的套用了!!
完整的程式,晚點有人要的話,在上傳上來...
程式的部份作了一點修改,現在提供範例程式下載!
下載 : 範例程式與資料庫
相關網址 
Extracting the Country from the IP Address