1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 利用IP地址查询接口来查询IP归属地

利用IP地址查询接口来查询IP归属地

时间:2023-10-20 16:00:34

相关推荐

利用IP地址查询接口来查询IP归属地

如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地。今儿个在网上了解了这些接口,要么返回XML,要么返回直接查询结果,要么不仅仅返回一个需要的查询结果,网页中还有其他不需要的内容。那么如何把这些分析挖掘我需要的查询结果数据呢?在这里我们一一分析吧。

方法1、针对返回XML文件的接口,进行XML文件的读取和解析并输出IP归属地节点。

例如有道(yodao)网络提供的接口就是返回一个xml文件,在IE中输入网址:/smartresult-xml/search.s?type=ip&q=60.55.46.222,得到如下的XML文件:

[html]view plaincopy <?xmlversion="1.0"encoding="gbk"?>-<smartresult>-<producttype="ip"><ip>60.55.46.222</ip><location>浙江省宁波市电信</location></product></smartresult>

可以利用.NET的DataSet对象的ReadXml方法传入XML的URL地址来读取这个XML文件,最后解析成一个DataTable,我们输出location这一列就可以了

完整代码如下:

[csharp]view plaincopy usingSystem;usingSystem.Data;publicpartialclassDefaultOne:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse){if(Page.IsPostBack==false){//获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1//stringip=Request.ServerVariables["REMOTE_ADDR"];stringip="60.55.46.222";//输出获得IP详细地址方法一Response.Write(getIpInfoOne(ip));}}///<summary>///获得IP详细地址方法一///</summary>///<paramname="ip">ip地址</param>///<returns>IP详细地址</returns>publicstringgetIpInfoOne(stringip){try{DataSetds=newDataSet();//读取XML数据到DataSetds.ReadXml("/smartresult-xml/search.s?type=ip&q="+ip);//获得location列的数据stringipInfo=ds.Tables[0].Rows[0]["location"].ToString();ipInfo=ipInfo.Replace("","");returnipInfo;}catch{return"";}}}

输出:浙江省宁波市电信

在如下的调试视图查看下就明白了,把节点product组成一个数据表,3列数据分别是ip,location,type

方法2、针对直接返回IP归属地的接口,通过URL下载网页内容并输出结果就可以了。

例如太平洋电脑网络提供的接口就是返回IP归属地的查询结果,在IE中输入网址:/ip.jsp?ip=60.55.46.222就直接看到结果这个很方便我们直接下载别人网页内容,然后把下载到的内容在自己网站里输出就可以了,而不需要过多的处理。太平洋电脑网络更多的接口请查看地址:/

详细代码如下:

[csharp]view plaincopyusingSystem; ; usingSystem.IO; usingSystem.Text; publicpartialclassDefaultTwo:System.Web.UI.Page { protectedvoidPage_Load(objectsender,EventArgse) { if(Page.IsPostBack==false) { //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1 //stringip=Request.ServerVariables["REMOTE_ADDR"]; stringip="60.55.46.222"; //输出获得IP详细地址方法二 Response.Write(getIpInfoTwo(ip)); } } ///<summary> ///获得IP详细地址方法二 ///</summary> ///<paramname="ip">ip地址</param> ///<returns>IP详细地址</returns> publicstringgetIpInfoTwo(stringip) { try { stringipInfo=GetStrByUrl("/ip.jsp?ip="+ip,Encoding.Default); ipInfo=ipInfo.Replace("",""); returnipInfo; } catch { return""; } } ///<summary> ///通过URL下载网页HTML,返回HTML代码 ///</summary> ///<paramname="url">要下载的网页的网址</param> ///<paramname="encoding">要下载的网页的编码</param> ///<returns>网页内容</returns> publicstaticstringGetStrByUrl(stringurl,Encodingencoding) { try { stringsource=""; WebClientclient=newWebClient(); Streamsr=client.OpenRead(url); if(sr!=null) { StreamReaderstreamr=newStreamReader(sr,encoding); source=streamr.ReadToEnd(); sr.Close(); streamr.Close(); } returnsource.Replace("\n","").Replace("\t","").Replace("\r",""); } catch(System.InvalidOperationExceptionex) { return""; //throwex; } } }

输出:浙江省宁波市联通

方法3、针对不仅仅返回一个需要的查询结果,网页中还有其他不需要的内容,通过URL下载网页内容并进行数据挖掘。

例如:的网站里所链接的IP查询接口,就是查询网的查询页面,在IE中输入网址:/ip/60.55.46.222,看到的查询结果发现里面有很多内容,如下图所示,

此时我们需要首先通过URL下载网页HTML内容,然后过滤掉不需要的HTML标签,最后挖掘出【所在地:】和【在这个IP上的站点】这两个字符串中的内容就可以了,详细代码如下:

[csharp]view plaincopyusingSystem; ; usingSystem.IO; usingSystem.Text; usingSystem.Text.RegularExpressions; publicpartialclassDefaultThree:System.Web.UI.Page { protectedvoidPage_Load(objectsender,EventArgse) { if(Page.IsPostBack==false) { //获得客户端IP,因为没上传到服务器,因此总是本机地址,127.0.0.1 //stringip=Request.ServerVariables["REMOTE_ADDR"]; stringip="60.55.46.222"; //输出获得IP详细地址方法三 Response.Write(getIpInfoThree(ip)); } } ///<summary> ///获得IP详细地址方法三 ///</summary> ///<paramname="ip">ip地址</param> ///<returns>IP详细地址</returns> publicstringgetIpInfoThree(stringip) { try { stringipInfo=GetStrByUrl("/ip/"+ip,Encoding.UTF8); //过滤字符串中的HTML标记 ipInfo=RepalceHTML(ipInfo); intbegin=ipInfo.LastIndexOf("所在地:"); intend=ipInfo.IndexOf("在这个IP上的站点"); //截取有用字符串,过滤无用字符串 ipInfo=ipInfo.Substring(begin,end-begin).Replace("","").Replace("所在地:",""); returnipInfo; } catch { return""; } } ///<summary> ///去掉字符串中的HTML标记 ///</summary> ///<paramname="source"></param> ///<returns></returns> publicstaticstringRepalceHTML(stringsource) { source=Regex.Replace(source,"<(\\s|\\S)+?>","",RegexOptions.IgnoreCase); returnsource; } ///<summary> ///通过URL下载网页HTML,返回HTML代码 ///</summary> ///<paramname="url">要下载的网页的网址</param> ///<paramname="encoding">要下载的网页的编码</param> ///<returns>网页内容</returns> publicstaticstringGetStrByUrl(stringurl,Encodingencoding) { try { stringsource=""; WebClientclient=newWebClient(); Streamsr=client.OpenRead(url); if(sr!=null) { StreamReaderstreamr=newStreamReader(sr,encoding); source=streamr.ReadToEnd(); sr.Close(); streamr.Close(); } returnsource.Replace("\n","").Replace("\t","").Replace("\r",""); } catch(System.InvalidOperationExceptionex) { return""; //throwex; } } }

输出:浙江省宁波市电信

通过上面三种方式查询的结果,有道网络,ip138网络都是浙江省宁波市电信,而太平洋电脑网络是浙江省宁波市联通,因此网上提供的查询结果只是作为个参考。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。