所需檔案
相關網站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=""images/" & strCounrtyCode & ".png"">"
Else
response.write "你的IP為 : " & strIP
response.write "你的國家為 : 不在名單中"
End If


到這,大致就完成了我們的目標了, 將它改成是函數的話,就可以更方便我們在各個程式的套用了!!
完整的程式,晚點有人要的話,在上傳上來...

程式的部份作了一點修改,現在提供範例程式下載!
下載 : 範例程式與資料庫
相關網址
Extracting the Country from the IP Address
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 icejuly 的頭像
    icejuly

    七月的筆記本

    icejuly 發表在 痞客邦 留言(0) 人氣()