淘宝IP地址库采集器c#代码

采集器概貌,如下:

最近做一个项目,功能类似于CNZZ站长统计功能,要求显示Ip所在的省份市区/提供商等信息。网上的Ip纯真数据库,下载下来一看,发现没提供商内容,省市区都很少,居然有XXX网吧,哥瞬间倒了。没标准化、并且杂乱、还不连续的IP段、总体说来没达到要求。

  在百度上找啊找,找到淘宝Ip地址库,官方介绍的相当诱人,准确率高,数据质量有保障,提供国家、省、市、县、运营商全方位信息,信息维度广,格式规范,但是限制每秒10次的访问(这个比较无语)。

  淘宝IP地址库,提供API    http://ip.taobao.com/

接口说明

  1. 请求接口(GET):
      http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]
  2. 响应信息:
      (json格式的)国家 、省(自治区或直辖市)、市(县)、运营商
  3. 返回数据格式:
      {"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317",
        "region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",
        "country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",
        "county_id":"-1","isp_id":"100017"}}

      其中code的值的含义为,0:成功,1:失败。

1 :IP转换

  准备好工具,后面就好弄啦, IPHelper提供了各种,IP<->byte[]<->Long 转换


复制代码 代码如下:

public class IPHelper
        {
        /// <summary>
        /// ip转成long
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public static long Ip2Long(string ip)
        {
            byte[] bytes = Ip2Bytes(ip);
            return Bytes2Long(bytes);
        }
        /// <summary>
        /// long转成ip
        /// </summary>
        /// <param name="ipLong"></param>
        /// <returns></returns>
        public static string Long2Ip(long ipLong)
        {
            byte[] bytes = Long2Bytes(ipLong);
            return Bytes2Ip(bytes);
        }
        /// <summary>
        /// long转成byte[]
        /// </summary>
        /// <param name="ipvalue"></param>
        /// <returns></returns>
        public static byte[] Long2Bytes(long ipvalue)
        {
            byte[] b = new byte[4];
            for (int i = 0; i < 4; i++)
            {
                b[3 - i] = (byte)(ipvalue >> 8 * i & 255);
            }
            return b;
        }
        /// <summary>
        /// byte[]转成long
        /// </summary>
        /// <param name="bt"></param>
        /// <returns></returns>
        public static long Bytes2Long(byte[] bt)
        {
            int x = 3;
            long o = 0;
            foreach (byte f in bt)
            {
                o += (long)f << 8 * x--;
            }
            return o;
        }
        /// <summary>
        /// ip转成byte[]
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public static byte[] Ip2Bytes(string ip)
        {
            string[] sp = ip.Split('.');
            return new byte[] { Convert.ToByte(sp[0]), Convert.ToByte(sp[1]), Convert.ToByte(sp[2]), Convert.ToByte(sp[3]) };
        }
        /// <summary>
        /// byte[]转成ip
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static string Bytes2Ip(byte[] bytes)
        {
            return string.Format("{0}.{1}.{2}.{3}"
                                   , bytes[0]
                                   , bytes[1]
                                   , bytes[2]
                                   , bytes[3]);
        }
    }

2 :多线程疯狂获取IP


复制代码 代码如下:

/// <summary>
        /// 描述:开始采集
        /// </summary>
        private void StratCollect()
        {
            foreach (Thread thread in ThreadList)
            {
                thread.Start();
            }
        }
        /// <summary>
        /// 描述:获取要采集的ip long
        /// </summary>
        private long GetCurrentIp()
        {
            long curip = System.Threading.Interlocked.Increment(ref CurrentCollectIP);
            return curip;
        }
        /// <summary>
        /// 线程中采集的方法
        /// </summary>
        private void GetTaobaoData()
        {
            long currentipLong = GetCurrentIp();
            while (currentipLong <= EndIP)
            {
                try
                {
                    CaptureTaobaoIPData(currentipLong);
                }
                catch (Exception ex)
                {
                     TextLog.SetString(currentipLong + ex.Message);
                }
                currentipLong = GetCurrentIp();
            }
        }
        /// <summary>
        /// 描述:线程中采集并得到IP
        /// </summary>
        private void CaptureTaobaoIPData(long currentipLong)
        {
            string ip = IPHelper.Long2Ip(currentipLong);
            string url = string.Format(UrlFomat, ip);
            string js =HttpHelper. HttpRequest(url, Encoding.UTF8);
            taobaoIPdata m = Newtonsoft.Json.JsonConvert.DeserializeObject<TaobaoJsonData>(js).data;
            m.ipLong = currentipLong;
            //更新界面
            this.Invoke(new Action<taobaoIPdata>(v =>
            {
                taobaoIPdataList.Add(v);
                this.dgv.DataSource = taobaoIPdataList;
            }), m);

}

3: Http请求的Json结果,并反序列化成对象

http请求这个相当简单。网上一大把,这里主要说一下json序列化,在这里本人建议采用Newtonsoft.Json.dll 下载地址: http://json.codeplex.com/ 性能和兼容性达到最好

Http请求


复制代码 代码如下:

public class HttpHelper
    {
        public static string HttpRequest(string url, Encoding encoding)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Timeout = 6 * 1000;
                request.Method = "GET";
                //得到处理结果                             
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(myResponseStream, encoding);
                string result = myStreamReader.ReadToEnd();
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }

}

}

Json序列化


复制代码 代码如下:

taobaoIPdata m = Newtonsoft.Json.JsonConvert.DeserializeObject<TaobaoJsonData>(js).data;

序列号对象taobaoIPdata


复制代码 代码如下:

/// <summary>
    /// 淘宝数据
    /// </summary>
    public partial class taobaoIPdata
    {
        private long _ipLong;
        /// <summary>
        /// IP 长整形
        /// </summary>
        public long ipLong
        {
            get { return _ipLong; }
            set { _ipLong = value; }
        }

private string _ip;
        /// <summary>
        /// IP地址
        /// </summary>
        public string ip
        {
            get { return _ip; }
            set { _ip = value; }
        }

private string _country;
        /// <summary>
        /// 国家
        /// </summary>
        public string country
        {
            get { return _country; }
            set { _country = value; }
        }

private string _country_id;
        /// <summary>
        /// 国家编号
        /// </summary>
        public string country_id
        {
            get { return _country_id; }
            set { _country_id = value; }
        }

private string _area;
        /// <summary>
        /// 地区
        /// </summary>
        public string area
        {
            get { return _area; }
            set { _area = value; }
        }

private string _area_id;
        /// <summary>
        /// 地区编号
        /// </summary>
        public string area_id
        {
            get { return _area_id; }
            set { _area_id = value; }
        }

private string _region;
        /// <summary>
        /// 区域
        /// </summary>
        public string region
        {
            get { return _region; }
            set { _region = value; }
        }

private string _region_id;
        /// <summary>
        /// 区域编号
        /// </summary>
        public string region_id
        {
            get { return _region_id; }
            set { _region_id = value; }
        }

private string _city;
        /// <summary>
        ///城市
        /// </summary>
        public string city
        {
            get { return _city; }
            set { _city = value; }
        }

private string _city_id;
        /// <summary>
        /// 城市编号
        /// </summary>
        public string city_id
        {
            get { return _city_id; }
            set { _city_id = value; }
        }

private string _county;
        /// <summary>
        /// 县
        /// </summary>
        public string county
        {
            get { return _county; }
            set { _county = value; }
        }

private string _county_id;
        /// <summary>
        /// 县编号
        /// </summary>
        public string county_id
        {
            get { return _county_id; }
            set { _county_id = value; }
        }

private string _isp;
        /// <summary>
        /// 供应商
        /// </summary>
        public string isp
        {
            get { return _isp; }
            set { _isp = value; }
        }

private string _isp_id;
        /// <summary>
        /// 供应商ID
        /// </summary>
        public string isp_id
        {
            get { return _isp_id; }
            set { _isp_id = value; }
        }

}
    /// <summary>
    /// 淘宝api 返回的json数据
    /// </summary>
    public partial class TaobaoJsonData
    {
        public int code { get; set; }
        public taobaoIPdata data { get; set; }
    }

序列号对象taobaoIPdata

4:插入到数据库中。。。剩下的自己随便搞啦

源码下载:淘宝IP获取器.rar

时间: 2013-12-19

C#获取真实IP地址实现方法

本文实例讲述了C#获取真实IP地址实现方法,分享给大家供大家参考.具体实现方法如下: 通常来说,大家获取用户IP地址常用的方法是: 复制代码 代码如下: string IpAddress = ""; if((HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null && HttpContext.Current.Request.ServerVariables[&q

C#实现生成mac地址与IP地址注册码的两种方法

本文实例讲述了C#实现生成mac地址与IP地址注册码的两种方法,分享给大家供大家参考之用.具体方法如下: 方法一: using System; using System.Management; using System.Security.Cryptography; using System.IO; using System.Collections.Generic; using System.Text; namespace xingming_reg { class Program { static

C#之IP地址和整数互转的小例子

源码: 复制代码 代码如下: [StructLayout(LayoutKind.Explicit)] public struct IP {     public IP(UInt32 value)     {         this._text1 = 0;         this._text2 = 0;         this._text3 = 0;         this._text4 = 0;         this._value = value;     }     public

C#判断给定IP地址是否在指定范围内的方法

本文实例讲述了C#判断给定IP地址是否在指定范围内的方法.分享给大家供大家参考.具体分析如下: 比如给定一个ip段:127.0.0.1 ~ 127.0.0.255,我们想判断一个给定的ip地址是否在此段内,可以先将ip地址转换成整数,然后整数比较大小就很容易了. 例如: 127.0.0.1 = 2130706433 127.0.0.255 = 2130706687 判断: 127.0.1.253 = 2130706941 是否在此范围内,直接比较整数大小即可 将ip地址转换成整数: public

C#使用有道ip地址查询接口方法实例详解

本文实例讲述了C#使用有道ip地址查询接口方法.分享给大家供大家参考.具体实现方法如下: #region 读取http://www.yodao.com接口IP地址 /// <summary> /// 读取http://www.yodao.com接口IP地址 /// </summary> public static string GetstringIpAddress(string strIP)//strIP为IP { string sURL = "http://www.yo

C#通过域名获得IP地址的方法

本文实例讲述了C#通过域名获得IP地址的方法.分享给大家供大家参考.具体实现方法如下: using System.Net; string web = txtWeb.Text; IPHostEntry host = Dns.GetHostByName(web); IPAddress ip = host.AddressList[0]; txtIp.Text = ip.ToString(); 希望本文所述对大家的C#程序设计有所帮助.

c#获取本机在局域网ip地址的二种方法

复制代码 代码如下: /// <summary>/// 获取本机在局域网的IP地址/// </summary>/// <returns></returns>private string GetLocalIPAddress(){    System.Net.IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;    string strNativeIP = &quo

C#获取本机IP地址和Mac地址的方法

本文实例讲述了C#获取本机IP地址和Mac地址的方法.分享给大家供大家参考.具体分析如下: 查找了几个方法,经过调试修改,下面这个方法能很好的获取到本地的IP和MAC地址.可以用于这方面的功能实现.主要是要添加System.Management的引用. using System; using System.Management; using System.Net; public class Program { static void Main(string[] args) { try { str

C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)

今天查看登录日志,发现http_x_forwarded_for获取到的ip地址有些是内网ip地址,有些则是公网和内网ip地址一起获取到,用逗号分隔开,日志截图如下: 之前获取ip地址的C#代码如下: 复制代码 代码如下: /// <summary>     /// C#获取客户端真实IP地址     /// </summary>     /// <returns></returns>     public static string GetIP()    

Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例

在进行Android应用开发过程中,有时候会遇到获取当前Android设备所使用的网络IP地址的场景,有时候需要本地的网络IP地址,即局域网地址,更多的时候是需要当前网络的真实的对外IP地址,即真实的网络地址,如大数据分析时往往需要Android设备上传本地的外网地址.本文对各种IP地址的获取进行了总结. 首先用大家比较熟悉的电脑端局域网地址和外网地址的获取方式对比一下:(1).电脑端局域网地址获取方式,可以通过在终端命令行输入ipconfig进行查看,如下图IPv地址标识的就是本机的局域网地址

JS绕过代理、VPN获取真实IP及内网IP,逆向追踪的实现方法

Firefox 跟 Chrome支持WebRTC可以向STUN服务器请求,返回内外网IP,不同于XMLHttpRequest请求,STUN请求开发者工具当中看不到网络请求的. //get the IP addresses associated with an account function getIPs(callback) { var ip_dups = {}; //compatibility for firefox and chrome var RTCPeerConnection = win

Java判断IP地址为内网IP还是公网IP的方法

本文实例讲述了Java判断IP地址为内网IP还是公网IP的方法.分享给大家供大家参考.具体分析如下: tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255 172.16.0.0/12:172.16.0.0-172.31.255.255 192.168.0.0/16:192.168.0.0-192.168.255.255 那么,直接上代码吧: 复制代码 代码如下: public static boolea

bat脚本显示本机IP地址的两种方法(内网ip)

实现代码一: 通过 route print 实现 @echo off for /f "tokens=4" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do ( set IP=%%a ) echo %IP% 实现代码二: @echo off for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do (echo %%i) p

python批量生成本地ip地址的方法

本文实例讲述了python批量生成本地ip地址的方法.分享给大家供大家参考.具体分析如下: 这段代码用于在本地计算机上生成本地ip地址绑定到网卡,生成的是一个bat的批处理文件,运行此批处理文件,可以通过ipconfig查看 #!/usr/bin/python2.7 # -*- coding: utf-8 -*- # Filename: AddIPAliases.py import re,sys,socket,struct # 1. 判断IP地址是否合法: 2. 判断用户输入的IP是否在Clas

JAVA如何获取客户端IP地址和MAC地址

本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下: 1.获取客户端IP地址 public String getIp(HttpServletRequest request) throws Exception { String ip = request.getHeader("X-Forwarded-For"); if (ip != null) { if (!ip.isEmpty() && !"unKnown".equalsIg

基于Nginx 反向代理获取真实IP的问题详解

一.前言 前文Nginx 解决WebApi跨域二次请求以及Vue单页面问题 当中虽然解决了跨域问题带来的二次请求,但也产生了一个新的问题,就是如果需要获取用户IP的时候,获取的IP地址总是本机地址. 二.原因 由于Nginx反向代理后,在应用中取得的IP都是反向代理服务器的IP,取得的域名也是反向代理配置的Url的域名. 三.解决方案 解决该问题,需要在Nginx反向代理配置中添加一些配置信息,目的将客户端的真实IP和域名传递到应用程序中.同时,也要修改获取IP地址的方法. 但是需要注意的是,通

JS获取客户端IP地址、MAC和主机名的7个方法汇总

今天在搞JS(javascript)获取客户端IP的小程序,上网搜了下,好多在现在的系统和浏览器中的都无效,很无奈,在Chrome.FireFox中很少搞到直接利用ActiveX获取IP等的JS脚本.下面的代码是我在所有windowsNT5.0及以上的系统上都测试通过的,给出代码: 一.使用JS获取客户端IP的几个方法 方法一(只针对IE且客户端的IE允许AcitiveX运行,通过平台:XP,SERVER03,2000). 获取客户端IP代码: 复制代码 代码如下: <HTML> <HE

基于PHP实现通过照片获取ip地址

在本教程中,我们将学习如何用一张照片来盗取ip地址.我的想法是通过修改.htaccess文件,将jpg文件当作php文件来解析. 下面就是我们需要向.htaccess中添加的代码: AddHandler application/x-httpd-php5 .jpg 然后将下面的代码复制到记事本中,命名为grabber.jpg <?php $fh = fopen('ip_list.txt', 'a'); fwrite($fh, $_SERVER['REMOTE_ADDR']." ")