วิธีรับที่อยู่ IP ของลูกค้าโดยใช้ JavaScript


560

ฉันต้องการดึงที่อยู่ IP ของลูกค้าโดยใช้ JavaScript ไม่มีรหัสฝั่งเซิร์ฟเวอร์หรือแม้แต่ SSI

อย่างไรก็ตามฉันไม่ได้ใช้สคริปต์ / บริการของบุคคลที่สามฟรี

คำตอบ:


772

ฉันจะใช้บริการเว็บที่สามารถส่งคืน JSON (พร้อมกับ jQuery เพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น) ด้านล่างนี้เป็นบริการค้นหา IP ที่ใช้งานฟรีที่ฉันสามารถค้นหาได้และข้อมูลที่พวกเขาส่งคืน หากคุณรู้ว่ามีอะไรเพิ่มเติมโปรดเพิ่มความคิดเห็นและฉันจะอัปเดตคำตอบนี้


Cloudflare

ทดลองใช้: https://www.cloudflare.com/cdn-cgi/trace

// If your site is on Cloudflare, then you can use '/cdn-cgi/trace' instead
$.get('https://www.cloudflare.com/cdn-cgi/trace', function(data) {
    console.log(data)
})

ผลตอบแทน:

fl=4f422
h=www.cloudflare.com
ip=54.193.27.106
ts=1575967108.245
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 Hypothesis-Via
colo=SJC
http=http/1.1
loc=US
tls=TLSv1.3
sni=plaintext
warp=off

ข้อ จำกัด :

  • ส่งคืนข้อความธรรมดา

DB-IP

ลองใช้: http://api.db-ip.com/addrinfo?api_key= < คีย์ api ของคุณ > & addr = < ที่อยู่ IP >

ผลตอบแทน:

{
  "address": "116.12.250.1",
  "country": "SG",
  "stateprov": "Central Singapore",
  "city": "Singapore"
}

ข้อ จำกัด :

  • 2,500 คำขอต่อวัน
  • ไม่รองรับการเรียกกลับ JSONP
  • ต้องใช้พารามิเตอร์ที่อยู่ IP
  • ต้องมีที่อยู่อีเมลเพื่อรับรหัส API ของคุณ
  • ไม่มี SSL (https) พร้อมแผนบริการฟรี

Geobytes

ลองทำดู: http://gd.geobytes.com/GetCityDetails

$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "geobytesforwarderfor": "",
  "geobytesremoteip": "116.12.250.1",
  "geobytesipaddress": "116.12.250.1",
  "geobytescertainty": "99",
  "geobytesinternet": "SA",
  "geobytescountry": "Saudi Arabia",
  "geobytesregionlocationcode": "SASH",
  "geobytesregion": "Ash Sharqiyah",
  "geobytescode": "SH",
  "geobyteslocationcode": "SASHJUBA",
  "geobytescity": "Jubail",
  "geobytescityid": "13793",
  "geobytesfqcn": "Jubail, SH, Saudi Arabia",
  "geobyteslatitude": "27.004999",
  "geobyteslongitude": "49.660999",
  "geobytescapital": "Riyadh ",
  "geobytestimezone": "+03:00",
  "geobytesnationalitysingular": "Saudi Arabian ",
  "geobytespopulation": "22757092",
  "geobytesnationalityplural": "Saudis",
  "geobytesmapreference": "Middle East ",
  "geobytescurrency": "Saudi Riyal",
  "geobytescurrencycode": "SAR",
  "geobytestitle": "Saudi Arabia"
}

ข้อ จำกัด :

  • 16,384 คำขอต่อชั่วโมง
  • ไม่มี SSL (https) พร้อมแผนบริการฟรี
  • สามารถส่งคืนตำแหน่งที่ผิด (ฉันอยู่ในสิงคโปร์ไม่ใช่ซาอุดิอาระเบีย)

GeoIPLookup.io

ลองทำดู: https://json.geoiplookup.io/api

$.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
    "ip": "116.12.250.1",
    "isp": "SGPOST",
    "org": "Singapore Post Ltd",
    "hostname": "116.12.250.1",
    "longitude": "103.807",
    "latitude": "1.29209",
    "postal_code": "",
    "city": "Singapore",
    "country_code": "SG",
    "country_name": "Singapore",
    "continent_code": "AS",
    "region": "Central Singapore",
    "district": "",
    "timezone_name": "Asia\/Singapore",
    "connection_type": "",
    "asn": "AS3758 SingNet",
    "currency_code": "SGD",
    "currency_name": "Singapore Dollar",
    "success": true
}

ข้อ จำกัด :

  • 10,000 คำขอต่อชั่วโมง
  • API ฟรีอนุญาตให้ใช้ที่ไม่ใช่เชิงพาณิชย์เท่านั้น

geoPlugin

ลองดู: http://www.geoplugin.net/json.gp

$.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "geoplugin_request": "116.12.250.1",
  "geoplugin_status": 200,
  "geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http://www.maxmind.com\\'>http://www.maxmind.com</a>.",
  "geoplugin_city": "Singapore",
  "geoplugin_region": "Singapore (general)",
  "geoplugin_areaCode": "0",
  "geoplugin_dmaCode": "0",
  "geoplugin_countryCode": "SG",
  "geoplugin_countryName": "Singapore",
  "geoplugin_continentCode": "AS",
  "geoplugin_latitude": "1.2931",
  "geoplugin_longitude": "103.855797",
  "geoplugin_regionCode": "00",
  "geoplugin_regionName": "Singapore (general)",
  "geoplugin_currencyCode": "SGD",
  "geoplugin_currencySymbol": "&#36;",
  "geoplugin_currencySymbol_UTF8": "$",
  "geoplugin_currencyConverter": 1.4239
}

ข้อ จำกัด :

  • 120 คำขอต่อนาที
  • ไม่มี SSL (https) พร้อมแผนบริการฟรี

เป้าหมายของ Hacker

ลองใช้: https://api.hackertarget.com/geoip/?q= < ที่อยู่ IP >

ผลตอบแทน:

IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797

ข้อ จำกัด :

  • 50 คำขอต่อวัน
  • ไม่รองรับการเรียกกลับ JSONP
  • ต้องใช้พารามิเตอร์ที่อยู่ IP
  • ส่งคืนข้อความธรรมดา

ipapi.co

ลองใช้: https://ipapi.co/json/

$.getJSON('https://ipapi.co/json/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip": "116.12.250.1",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "country": "SG",
  "country_name": "Singapore",
  "postal": null,
  "latitude": 1.2855,
  "longitude": 103.8565,
  "timezone": "Asia/Singapore"
}

ข้อ จำกัด :

  • 1,000 คำขอต่อวัน
  • ต้องการ SSL (https)

IP-API.com

ลองทำดู: http://ip-api.com/json

$.getJSON('http://ip-api.com/json?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "as": "AS3758 SingNet",
  "city": "Singapore",
  "country": "Singapore",
  "countryCode": "SG",
  "isp": "SingNet Pte Ltd",
  "lat": 1.2931,
  "lon": 103.8558,
  "org": "Singapore Telecommunications",
  "query": "116.12.250.1",
  "region": "01",
  "regionName": "Central Singapore Community Development Council",
  "status": "success",
  "timezone": "Asia/Singapore",
  "zip": ""
}

ข้อ จำกัด :

  • 150 คำขอต่อนาที
  • ไม่มี SSL (https) พร้อมแผนบริการฟรี

Ipdata.co

ลองใช้: https://api.ipdata.co

$.getJSON('https://api.ipdata.co', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip": "116.12.250.1",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "region_code": "01",
  "country_name": "Singapore",
  "country_code": "SG",
  "continent_name": "Asia",
  "continent_code": "AS",
  "latitude": 1.2931,
  "longitude": 103.8558,
  "asn": "AS3758",
  "organisation": "SingNet",
  "postal": "",
  "calling_code": "65",
  "flag": "https://ipdata.co/flags/sg.png",
  "emoji_flag": "\ud83c\uddf8\ud83c\uddec",
  "emoji_unicode": "U+1F1F8 U+1F1EC",
  "is_eu": false,
  "languages": [
    {
      "name": "English",
      "native": "English"
    },
    {
      "name": "Malay",
      "native": "Bahasa Melayu"
    },
    {
      "name": "Tamil",
      "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
    },
    {
      "name": "Chinese",
      "native": "\u4e2d\u6587"
    }
  ],
  "currency": {
    "name": "Singapore Dollar",
    "code": "SGD",
    "symbol": "S$",
    "native": "$",
    "plural": "Singapore dollars"
  },
  "time_zone": {
    "name": "Asia/Singapore",
    "abbr": "+08",
    "offset": "+0800",
    "is_dst": false,
    "current_time": "2018-05-09T12:28:49.183674+08:00"
  },
  "threat": {
    "is_tor": false,
    "is_proxy": false,
    "is_anonymous": false,
    "is_known_attacker": false,
    "is_known_abuser": false,
    "is_threat": false,
    "is_bogon": false
  }
}

ข้อ จำกัด :

  • 1,500 คำขอต่อวัน
  • ต้องมีที่อยู่อีเมลเพื่อรับรหัส API ของคุณ
  • ต้องการ SSL (https)

ค้นหา IP

ลองใช้: https://ipfind.co/me?auth= < รหัส API ของคุณ >

$.getJSON('https://ipfind.co/me?auth=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip_address": "116.12.250.1",
  "country": "Singapore",
  "country_code": "SG",
  "continent": "Asia",
  "continent_code": "AS",
  "city": "Singapore",
  "county": null,
  "region": "Central Singapore",
  "region_code": "01",
  "timezone": "Asia/Singapore",
  "owner": null,
  "longitude": 103.8565,
  "latitude": 1.2855,
  "currency": "SGD",
  "languages": [
    "cmn",
    "en-SG",
    "ms-SG",
    "ta-SG",
    "zh-SG"
  ]
}

ข้อ จำกัด :

  • 300 คำขอต่อวัน
  • ต้องลงทะเบียนเพื่อรับรหัส API ของคุณ

IPGeolocation

ลองใช้: https://api.ipgeolocation.io/ipgeo?apiKey= < รหัส api ของคุณ >

$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip": "116.12.250.1",
  "continent_code": "AS",
  "continent_name": "Asia",
  "country_code2": "SG",
  "country_code3": "SGP",
  "country_name": "Singapore",
  "country_capital": "Singapore",
  "state_prov": "Central Singapore",
  "district": "",
  "city": "Singapore",
  "zipcode": "",
  "latitude": "1.29209",
  "longitude": "103.807",
  "is_eu": false,
  "calling_code": "+65",
  "country_tld": ".sg",
  "languages": "cmn,en-SG,ms-SG,ta-SG,zh-SG",
  "country_flag": "https://ipgeolocation.io/static/flags/sg_64.png",
  "isp": "SGPOST",
  "connection_type": "",
  "organization": "Singapore Post Ltd",
  "geoname_id": "1880252",
  "currency": {
    "name": "Dollar",
    "code": "SGD"
  },
  "time_zone": {
    "name": "Asia/Singapore",
    "offset": 8,
    "is_dst": false,
    "current_time": "2018-06-12 09:06:49.028+0800"
  }
}

ข้อ จำกัด :

  • 50,000 คำขอต่อเดือน
  • ต้องลงทะเบียนเพื่อรับรหัส API ของคุณ

ipify

ลองใช้: https://api.ipify.org/?format=json

$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip": "116.12.250.1"
}

ข้อ จำกัด :

  • ไม่มี

IPInfoDB

ลองใช้: https://api.ipinfodb.com/v3/ip-city/?key= < คีย์ api ของคุณ > & format = json

$.getJSON('https://api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&format=json&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "statusCode": "OK",
  "statusMessage": "",
  "ipAddress": "116.12.250.1",
  "countryCode": "SG",
  "countryName": "Singapore",
  "regionName": "Singapore",
  "cityName": "Singapore",
  "zipCode": "048941",
  "latitude": "1.28967",
  "longitude": "103.85",
  "timeZone": "+08:00"
}

ข้อ จำกัด :

  • สองคำขอต่อวินาที
  • ต้องลงทะเบียนเพื่อรับรหัส API ของคุณ

ipinfo.io

ลองใช้: https://ipinfo.io/json

$.getJSON('https://ipinfo.io/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip": "116.12.250.1",
  "hostname": "No Hostname",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "country": "SG",
  "loc": "1.2931,103.8558",
  "org": "AS3758 SingNet"
}

ข้อ จำกัด :

  • 1,000 คำขอต่อวัน

Ipregistry

ลองใช้: https://api.ipregistry.co/?key= < รหัส API ของคุณ >

$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip" : "116.12.250.1",
  "type" : "IPv4",
  "hostname" : null,
  "carrier" : {
    "name" : null,
    "mcc" : null,
    "mnc" : null
  },
  "connection" : {
    "asn" : 3758,
    "domain" : "singnet.com.sg",
    "organization" : "SingNet Pte Ltd",
    "type" : "isp"
  },
  "currency" : {
    "code" : "SGD",
    "name" : "Singapore Dollar",
    "plural" : "Singapore dollars",
    "symbol" : "SGD",
    "symbol_native" : "SGD",
    "format" : {
      "negative" : {
        "prefix" : "-SGD",
        "suffix" : ""
      },
      "positive" : {
        "prefix" : "SGD",
        "suffix" : ""
      }
    }
  },
  "location" : {
    "continent" : {
      "code" : "AS",
      "name" : "Asia"
    },
    "country" : {
      "area" : 692.0,
      "borders" : [ ],
      "calling_code" : "65",
      "capital" : "Singapore",
      "code" : "SG",
      "name" : "Singapore",
      "population" : 5638676,
      "population_density" : 8148.38,
      "flag" : {
        "emoji" : "🇸🇬",
        "emoji_unicode" : "U+1F1F8 U+1F1EC",
        "emojitwo" : "https://cdn.ipregistry.co/flags/emojitwo/sg.svg",
        "noto" : "https://cdn.ipregistry.co/flags/noto/sg.png",
        "twemoji" : "https://cdn.ipregistry.co/flags/twemoji/sg.svg",
        "wikimedia" : "https://cdn.ipregistry.co/flags/wikimedia/sg.svg"
      },
      "languages" : [ {
        "code" : "cmn",
        "name" : "cmn",
        "native" : "cmn"
      }, {
        "code" : "en",
        "name" : "English",
        "native" : "English"
      }, {
        "code" : "ms",
        "name" : "Malay",
        "native" : "Melayu"
      }, {
        "code" : "ta",
        "name" : "Tamil",
        "native" : "தமிழ்"
      }, {
        "code" : "zh",
        "name" : "Chinese",
        "native" : "中文"
      } ],
      "tld" : ".sg"
    },
    "region" : {
      "code" : null,
      "name" : "Singapore"
    },
    "city" : "Singapore",
    "postal" : "96534",
    "latitude" : 1.28967,
    "longitude" : 103.85007,
    "language" : {
      "code" : "cmn",
      "name" : "cmn",
      "native" : "cmn"
    },
    "in_eu" : false
  },
  "security" : {
    "is_bogon" : false,
    "is_cloud_provider" : false,
    "is_tor" : false,
    "is_tor_exit" : false,
    "is_proxy" : false,
    "is_anonymous" : false,
    "is_abuser" : false,
    "is_attacker" : false,
    "is_threat" : false
  },
  "time_zone" : {
    "id" : "Asia/Singapore",
    "abbreviation" : "SGT",
    "current_time" : "2019-09-29T23:13:32+08:00",
    "name" : "Singapore Standard Time",
    "offset" : 28800,
    "in_daylight_saving" : false
  }
}

ข้อ จำกัด :

  • แผนฟรีรวม 100,000 คำขอ
  • ต้องลงทะเบียนเพื่อรับรหัส API ของคุณ

ipstack (ก่อนหน้านี้ freegeoip.net)

ลองใช้: http://api.ipstack.com/ <ที่อยู่ ip >? access_key = <คีย์ api ของคุณ>

$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
    "ip": "116.12.250.1",
    "type": "ipv4",
    "continent_code": "AS",
    "continent_name": "Asia",
    "country_code": "SG",
    "country_name": "Singapore",
    "region_code": "01",
    "region_name": "Central Singapore Community Development Council",
    "city": "Singapore",
    "zip": null,
    "latitude": 1.2931,
    "longitude": 103.8558,
    "location": {
        "geoname_id": 1880252,
        "capital": "Singapore",
        "languages": [{
            "code": "en",
            "name": "English",
            "native": "English"
        },
        {
            "code": "ms",
            "name": "Malay",
            "native": "Bahasa Melayu"
        },
        {
            "code": "ta",
            "name": "Tamil",
            "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
        },
        {
            "code": "zh",
            "name": "Chinese",
            "native": "\u4e2d\u6587"
        }],
        "country_flag": "http:\/\/assets.ipstack.com\/flags\/sg.svg",
        "country_flag_emoji": "\ud83c\uddf8\ud83c\uddec",
        "country_flag_emoji_unicode": "U+1F1F8 U+1F1EC",
        "calling_code": "65",
        "is_eu": false
    }
}

ข้อ จำกัด :

  • 10,000 คำขอต่อเดือน
  • ต้องใช้พารามิเตอร์ที่อยู่ IP
  • ต้องลงทะเบียนเพื่อรับรหัส API ของคุณ
  • ไม่มี SSL (https) พร้อมแผนบริการฟรี

jsonip.com

ลองใช้: https://jsonip.com

$.getJSON('https://jsonip.com/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip": "116.12.250.1",
  "about": "https://jsonip.com/about",
  "Pro!": "http://getjsonip.com",
  "Get Notifications": "https://jsonip.com/notify"
}

ข้อ จำกัด :

  • การตอบสนองรวมถึงการเพิ่มยอดขาย

ทดสอบ JSON

ลองดู: http://ip.jsontest.com/

$.getJSON('http://ip.jsontest.com/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "ip": "116.12.250.1"
}

ข้อ จำกัด :

  • ไม่มี SSL (https)
  • ลดลงมาก (เกินโควต้า) ดังนั้นฉันจะไม่ใช้มันเพื่อการผลิต
  • ส่งคืนที่อยู่ IPv6 หากคุณมีที่อยู่ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ

Nekudo

ลองทำดู: https://geoip.nekudo.com/api

$.getJSON('https://geoip.nekudo.com/api', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

ผลตอบแทน:

{
  "city": "Singapore",
  "country": {
    "name": "Singapore",
    "code": "SG"
  },
  "location": {
    "accuracy_radius": 50,
    "latitude": 1.2855,
    "longitude": 103.8565,
    "time_zone": "Asia/Singapore"
  },
  "ip": "116.12.250.1"
}

ข้อ จำกัด :

  • บล็อกโดยตัวบล็อกโฆษณาโดยใช้รายการ EasyPrivacy

โปรดทราบว่าเนื่องจากบริการเหล่านี้เป็นบริการฟรีระยะทางของคุณอาจแตกต่างกันไปในแง่ของโควต้าและเวลาที่เกินและใครจะรู้ว่าเมื่อใดที่พวกเขาจะถูกพาไปที่ออฟไลน์ (แสดง A: Telize ) บริการเหล่านี้ส่วนใหญ่มีระดับแบบชำระเงินในกรณีที่คุณต้องการคุณสมบัติเพิ่มเติมเช่นการสนับสนุน SSL

นอกจากนี้ตามที่ skobaljic ระบุไว้ในความคิดเห็นด้านล่างโควต้าคำขอส่วนใหญ่เป็นข้อมูลเชิงวิชาการเนื่องจากสิ่งนี้เกิดขึ้นกับลูกค้าและผู้ใช้ส่วนใหญ่จะไม่เกินโควต้า

การปรับปรุง


3
@AfolabiOlaoluwaAkinwumi คุณสามารถลองสิ่งนี้: $.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });
thdoan

1
@skobaljic เรื่อง ข้อ จำกัด มักจะไม่มีความหมาย: จุดดีและอาจเป็นเหตุผลให้อยู่ห่างจากคนที่ต้องการคีย์ api เนื่องจากการนับจำนวนการใช้คีย์สามารถนับได้
นิคไรซ์

2
@JohnWeisz True แต่ถ้า OP หมายถึงเพียงแค่พวกเขาสามารถอัปเดตหน้าเว็บและไม่ทำสิ่งใดฝั่งเซิร์ฟเวอร์ (ไม่ชัดเจนจากคำถาม) ตัวเลือกเหล่านี้จะตอบคำถามได้ดี
นิคไรซ์

1
@RobWaa ขอบคุณฉันได้เพิ่มข้อ จำกัด ad blocker ในการปรับปรุง 4/14 ฉันจะเพิ่ม geoiplookup.io ในไม่ช้า
thdoan

1
คำตอบทั้งหมดเหล่านี้ขึ้นอยู่กับบริการของบุคคลที่สามซึ่งเป็นข้อเสียเปรียบครั้งใหญ่ไม่ใช่เพียงเพราะคุณขึ้นอยู่กับบริการที่ตอบสนองในเวลาที่เหมาะสม แต่เพราะถ้าหากมันไม่ได้เกิดขึ้นและคุณไม่ได้กำหนดเวลาที่เหมาะสม เกิดขึ้น sonner กว่าในภายหลัง) คุณจะล่าช้าเวลาโหลดหน้าเว็บของคุณซึ่งไม่ดีเลย ดังนั้นทำไมไม่เพียงแค่ใช้เซิร์ฟเวอร์ของคุณเองเพื่อส่งคืน IP ของลูกค้าซึ่งเป็นงานเล็ก ๆ น้อย ๆ กับภาษาการเขียนโปรแกรมใด ๆ
Daniel J.

280

การปรับปรุงครั้งสุดท้าย

วิธีนี้จะไม่ทำงานอีกต่อไปเพราะเบราว์เซอร์กำลังแก้ไขการรั่วไหลของ webrtc: สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอ่านคำถามอื่น ๆ นี้: RTCIceCandidate ไม่ส่งคืน IP


อัปเดต : ฉันต้องการสร้างรหัสรุ่น min / uglified เสมอดังนั้นนี่คือรหัสสัญญา ES6:

var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})

/*Usage example*/
findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e))

หมายเหตุ:รหัสย่อใหม่นี้จะคืนค่า IP เดียวถ้าคุณต้องการ IP ทั้งหมดของผู้ใช้ (ซึ่งอาจจะมากกว่านั้นขึ้นอยู่กับเครือข่ายของเขา) ใช้รหัสเดิม ...


ขอบคุณWebRTCมันเป็นเรื่องง่ายมากที่จะได้รับ IP ท้องถิ่นในเบราว์เซอร์ที่รองรับ WebRTC (อย่างน้อยก็ตอนนี้) ฉันได้แก้ไขซอร์สโค้ดลดจำนวนบรรทัดไม่ทำการร้องขอใด ๆ เพราะคุณต้องการเฉพาะ Local IP ไม่ใช่ Public IP รหัสด้านล่างใช้ได้กับ Firefox และ Chrome ล่าสุดเพียงแค่เรียกใช้ตัวอย่างและตรวจสอบด้วยตัวคุณเอง:

function findIP(onNewIP) { //  onNewIp - your listener function for new IPs
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
  var pc = new myPeerConnection({iceServers: []}),
    noop = function() {},
    localIPs = {},
    ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
    key;

  function ipIterate(ip) {
    if (!localIPs[ip]) onNewIP(ip);
    localIPs[ip] = true;
  }
  pc.createDataChannel(""); //create a bogus data channel
  pc.createOffer(function(sdp) {
    sdp.sdp.split('\n').forEach(function(line) {
      if (line.indexOf('candidate') < 0) return;
      line.match(ipRegex).forEach(ipIterate);
    });
    pc.setLocalDescription(sdp, noop, noop);
  }, noop); // create offer and set local description
  pc.onicecandidate = function(ice) { //listen for candidate events
    if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
  };
}



var ul = document.createElement('ul');
ul.textContent = 'Your IPs are: '
document.body.appendChild(ul);

function addIP(ip) {
  console.log('got ip: ', ip);
  var li = document.createElement('li');
  li.textContent = ip;
  ul.appendChild(li);
}

findIP(addIP);
<h1> Demo retrieving Client IP using WebRTC </h1>

สิ่งที่เกิดขึ้นที่นี่คือเรากำลังสร้างการเชื่อมต่อกับเพื่อนหุ่นและสำหรับเพื่อนระยะไกลที่จะติดต่อเราเรามักจะแลกเปลี่ยนผู้สมัครที่เป็นน้ำแข็งกัน และการอ่านผู้สมัครรับน้ำแข็ง (จากคำอธิบายเซสชันท้องถิ่นและ onIceCandidateEvent) เราสามารถบอก IP ของผู้ใช้

ที่ฉันเอารหัสจาก -> แหล่งที่มา


12
โหวตขึ้นเพราะคำตอบที่ดีที่สุดที่นี่ต้องขอบคุณ GitHub repo!
kano

28
คำเตือน: นี่จะไม่แสดง IP สาธารณะของคุณเพียงแค่เครือข่ายท้องถิ่น คุณไม่สามารถใช้มันเพื่อตรวจจับประเทศผู้ใช้ตัวอย่างเช่นหากพวกเขาอยู่บน LAN
FloatingRock

1
@FloatingRock คุณสามารถดึง IP สาธารณะได้เช่นกันโดยใช้เซิร์ฟเวอร์ STUN (และกำหนดค่าในขณะที่สร้างเพียร์) จากนั้นอีกครั้งซึ่งจะทำให้คุณต้องดูแล / ใช้เซิร์ฟเวอร์ STUN นำรหัสเซิร์ฟเวอร์มาไว้ในรูปภาพ
mido

10
สิ่งนี้เรียกว่าการรั่วไหลของ WebRTC ควรแก้ไขโดยเบราว์เซอร์นายกเทศมนตรีทั้งหมด แต่ไม่ใช่ ข้อมูลเพิ่มเติมที่นี่: privacytools.io/webrtc.htmlอาจเกี่ยวข้องกับเบราว์เซอร์ของ Tor-ip ของคุณ
Kapitein Witbaard

1
แต่ผมชอบคำตอบของลูกค้าโดยสามารถผ่านขั้นตอนนี้โดยการปิด WebRTC - restoreprivacy.com/webrtc-leaks
ni8mr

175

คุณสามารถถ่ายทอดผ่านทางฝั่งเซิร์ฟเวอร์ด้วย JSONP

และในขณะที่ googling เพื่อค้นหาพบได้ที่นี่ใน SO ฉันสามารถทำการค้นหา DNS (ชื่อโฮสต์ไปยังที่อยู่ IP) โดยใช้ Javascript ฝั่งไคลเอ็นต์ได้หรือไม่

<script type="application/javascript">
    function getip(json){
      alert(json.ip); // alerts the ip address
    }
</script>

<script type="application/javascript" src="http://www.telize.com/jsonip?callback=getip"></script>

หมายเหตุ: telize.com API ได้อย่างถาวรปิด ณ วันที่ 15 พฤศจิกายน 2015


45
ในขณะที่ฉันชื่นชอบตัวอย่างนี้ฉันคิดว่าการโหลดเนื้อหาข้อความ JavaScript และประเมินว่าผ่านฟังก์ชั่นนั้นมีความเสี่ยงด้านความปลอดภัยขั้นรุนแรง จะเกิดอะไรขึ้นถ้าเนื้อหาของการตอบสนองเปลี่ยนแปลงไปและคนมากกว่า 100 คนที่โหวตคำตอบนี้และอาจจะใช้ข้อมูลนั้นท้ายเรียกฟังก์ชั่นด้วยเนื้อหาที่ไม่ปลอดภัยที่อาจเกิดขึ้น ฉันจะใช้สิ่งนี้ก็ต่อเมื่อมันเป็นสตริง JSON
auco

32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
แบรด M

28
นี่ไม่ใช่คำตอบที่ดีเนื่องจากเกี่ยวข้องกับคำขอฝั่งเซิร์ฟเวอร์ คำถามที่ระบุไว้อย่างชัดเจน "จาวาสคริปต์ที่บริสุทธิ์"
คา

2
มีคาห์, ไม่มีทางเป็นไปได้ที่จะได้รับที่อยู่ ip พร้อม javascript ล้วนๆ ฉันขอแนะนำให้คุณอ่าน NAT และวิธีการทำงาน คุณต้องมีเซิร์ฟเวอร์เพื่อสะท้อนที่อยู่ IP อินเทอร์เน็ตของคุณกลับมาให้คุณ
ชาดแกรนท์

11
บริการนี้หยุดทำงาน
Cyril N.

109

คำตอบส่วนใหญ่ที่นี่ "หลีกเลี่ยง" ความต้องการโค้ดฝั่งเซิร์ฟเวอร์โดย ... กดปุ่มเซิร์ฟเวอร์ของบุคคลอื่น ซึ่งเป็นเทคนิคที่ถูกต้องโดยสมบูรณ์เว้นแต่คุณจะต้องได้รับที่อยู่ IP โดยไม่ต้องกดปุ่มเซิร์ฟเวอร์

ตามเนื้อผ้านี้เป็นไปไม่ได้หากไม่มีปลั๊กอิน (และถึงตอนนั้นคุณอาจได้รับที่อยู่ IP ผิดถ้าคุณอยู่หลังเราเตอร์ NAT) แต่ด้วยการมาถึงของ WebRTC มันเป็นไปได้จริงที่จะทำ .. . ถ้าคุณกำหนดเป้าหมายเบราว์เซอร์ที่สนับสนุน WebRTC (ปัจจุบัน: Firefox, Chrome และ Opera)

โปรดอ่านคำตอบของ midoสำหรับรายละเอียดเกี่ยวกับวิธีการดึงที่อยู่ IP ของลูกค้าที่เป็นประโยชน์โดยใช้ WebRTC


23
@ Oscar: ที่ดูเหมือนจะเป็นเทคนิคเดียวกัน (JSONP - คืนเซิร์ฟเวอร์ที่มองเห็น IP) ที่แช้ดที่กล่าวถึงในคำตอบของเขา ซึ่งไม่ตรงกับข้อกำหนดของ OP ของ "ไม่มีรหัสฝั่งเซิร์ฟเวอร์" แต่ใช่ว่าเป็นวิธีหนึ่งที่จะทำให้สำเร็จหากคุณเพิกเฉยต่อข้อกำหนดนั้น
Shog9

คำตอบนี้ล้าสมัยเนื่องจาก WebRTC: stackoverflow.com/questions/20194722/…
Akam

1
อัปเดต, @Akam คุณควรให้อุปกรณ์ประกอบฉากบางอย่างเพื่อชี้ให้เห็นว่าไม่กี่เดือนหลัง (หลังจากหลายปีที่ผ่านมาโพสต์คำตอบที่ผิดอย่างน่าอับอายที่ยังต้องการการสนับสนุนเซิร์ฟเวอร์)
Shog9

WebRTC ได้รับการสนับสนุนอย่างกว้างขวางมากขึ้นตอนนี้หรือไม่!
oldboy

1
ตามลิงก์ "CanIUse" นั่นคือ @BugWhisperer ยกเว้นว่าคุณต้องการ IE
Shog9

81

คุณสามารถโทร ajax ไปที่ hostip.info หรือบริการที่คล้ายกัน ...

function myIP() {
    if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
    else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.open("GET","http://api.hostip.info/get_html.php",false);
    xmlhttp.send();

    hostipInfo = xmlhttp.responseText.split("\n");

    for (i=0; hostipInfo.length >= i; i++) {
        ipAddress = hostipInfo[i].split(":");
        if ( ipAddress[0] == "IP" ) return ipAddress[1];
    }

    return false;
}

เป็นโบนัสข้อมูลตำแหน่งทางภูมิศาสตร์จะถูกส่งกลับในการโทรเดียวกัน


6
คุณยังสามารถรับการแทน JSON โดยใช้api.hostip.info/get_json.phpจากนั้นแยก JSON ด้วยฟังก์ชันเบราว์เซอร์ jQuery หรือ Prototype
แบรด Folkens

2
มีการ จำกัด คำขอใน " api.hostip.info/get_html.php " หรือไม่ ฉันจะดูรายละเอียด API นี้ได้ที่ไหน
Navin Leon

ส่งคืน IP ของไฟร์วอลล์เครือข่าย ไม่ใช่ IP ของลูกค้าจริง มีวิธีที่เราจะได้รับ IP ของลูกค้าจริงหรือไม่?
Leela Addagulla

76
ลองสิ่งนี้
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

หรือ

$(document).ready(function () {
    $.getJSON("http://jsonip.com/?callback=?", function (data) {
        console.log(data);
        alert(data.ip);
    });
});

ซอ


สิ่งนี้ใช้งานได้ $ .get (" ipinfo.io ", ฟังก์ชั่น (ตอบกลับ) {alert (response.ip);}, "jsonp"); แต่ฉันจะเก็บค่าไว้ในตัวแปรได้อย่างไร ดูเหมือนว่าจะหายไปนอกคำขอวนซ้ำ

1
สำหรับรายการบริการค้นหา IP ฟรีทั้งหมดคุณสามารถอ้างอิงคำตอบของฉันสำหรับstackoverflow.com/questions/391979/ …
thdoan

ฉันจะส่งฟังก์ชั่นนี้เพื่อคืนค่าของ ip ได้อย่างไร?
Neftali Acosta

67

คุณทำไม่ได้ คุณต้องถามเซิร์ฟเวอร์


5
สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
Himanshu

28
แต่มันก็ใช่มั้ย ฉันหมายความว่าถ้าคำตอบคือ "ไม่คุณไม่สามารถ" ฉันจะเถียงว่านี่เป็นคำตอบที่ถูกต้องมากกว่าคำว่า upvoted "ที่นี่ให้ใช้แอพ appspot แบบสุ่ม" ซึ่งดูเหมือนจะเป็นคำตอบที่อันตราย ด้านบนของรายการ
SteveShaffer

16
IMO นี่คือคำตอบที่ถูกต้องและควรได้รับการยอมรับ คำถามนี้บอกว่า "ไม่มีรหัสฝั่งเซิร์ฟเวอร์" โดยเฉพาะ
matthewwithanm


2
@matthewwithanm ฉันไม่สามารถตกลงเพิ่มเติม ฉันเลื่อนดูคำตอบทั้งหมดเพื่อดูว่ามีใครพูดตรงนี้ - และพร้อมที่จะเสนอเป็นคำตอบด้วยตัวเอง คำตอบที่ได้รับการตอบกลับสูงในขณะที่ให้ข้อมูลทุกคนตอบคำถามต่าง ๆ ยกคำถาม: "ฉันต้องการดึงที่อยู่ IP ของลูกค้าโดยใช้ JavaScript อย่างแท้จริงไม่มีรหัสฝั่งเซิร์ฟเวอร์หรือแม้แต่ SSI" คำตอบนี้เป็นจริงคำตอบที่ถูกต้อง Javascript ที่มีเบราว์เซอร์แซนด์บ็อกซ์ไม่สามารถทำได้ (โดยไม่คำนึงถึง NAT หรือพร็อกซี) ควรเปลี่ยนคำถามหากคำตอบข้อใดข้อหนึ่งเป็นที่ยอมรับ
เก่ง

64

มองไม่เพิ่มเติม

ตรวจสอบhttp://www.ipify.org/

ตามที่พวกเขา:

  • คุณสามารถใช้ได้โดยไม่ จำกัด (แม้ว่าคุณจะทำหลายล้านคำขอต่อนาที)
  • ipify เป็นโอเพ่นซอร์สอย่างสมบูรณ์ (ตรวจสอบที่เก็บ GitHub )

ต่อไปนี้เป็นตัวอย่าง JS ที่ใช้งานได้ (แทนที่จะสงสัยว่าทำไมคำตอบนี้มีคะแนนน้อยมากลองด้วยตัวคุณเองเพื่อดูคำตอบ)

<script>
function getIP(json) {
  alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>

ขี้เกียจเกินไปที่จะคัดลอก / วาง? ฉันชอบมัน. นี่คือตัวอย่าง

ขี้เกียจเกินไปที่จะคลิก? :O

หมายเหตุ : ปิด Adblock Plus / uBlock & co ก่อนที่จะเรียกใช้การสาธิต .. มิฉะนั้นจะไม่ทำงาน

ฉันไม่มีส่วนเกี่ยวข้องกับทีม IPify ฉันแค่คิดว่ามันเจ๋งมากที่ใครบางคนจะให้บริการดังกล่าวสำหรับสินค้าทั่วไป


4
ส่วนที่ดีที่สุดคือสิ่งนี้มาจาก "https" ในขณะที่การโทรไปยังผู้ช่วย http IP ของฉันจะถูกบล็อกเพราะพวกเขา "ไม่ปลอดภัย"
Tessa

เดี๋ยวก่อนมันแสดงให้ฉันเห็นข้อผิดพลาด CORS ฉันควรทำอย่างไร
saberprashant

@saberprashant คุณใช้ "HTTPS" หรือไม่
FloatingRock

@FloatingRock ฉันไม่ได้ใช้ HTTP
saberprashant

26

คุณสามารถใช้บริการของฉันhttp://ipinfo.ioสำหรับสิ่งนี้ซึ่งจะให้ IP ลูกค้าชื่อโฮสต์ข้อมูลตำแหน่งทางภูมิศาสตร์และเจ้าของเครือข่าย นี่คือตัวอย่างง่ายๆที่บันทึก IP:

$.get("http://ipinfo.io", function(response) {
    console.log(response.ip);
}, "jsonp");

นี่คือตัวอย่างรายละเอียดเพิ่มเติมของ JSFiddle ที่พิมพ์ข้อมูลการตอบกลับแบบเต็มดังนั้นคุณสามารถดูรายละเอียดที่มีทั้งหมด: http://jsfiddle.net/zK5FN/2/


หากต้องการหลีกเลี่ยงปัญหานโยบายเนื้อหาแบบผสมให้เปลี่ยนhttp://ipinfo.ioเป็น//ipinfo.ioหรือ https
Samuel Elh

เราต้องการใช้บริการของคุณคุณมีข้อเสนอส่วนลดสำหรับผู้ใช้ Stackoverflow หรือไม่?
Mehdi Dehghani

@MehdiDehghani เราฟรีมากถึง 50k req / เดือนสำหรับ 100k ด้วยลิงก์ย้อนกลับ - ดูipinfo.io/contact/creditlink
Ben Dowling

19

รวมรหัสนี้ในหน้าของคุณ: <script type="text/javascript" src="http://l2.io/ip.js"></script>

เอกสารเพิ่มเติมที่นี่


1
ฮึ่ม มันดูน่าสนใจ ... มีข้อ จำกัด อะไรบ้าง?
indapublic


มีป๊อปอัปสแปมเมอร์จำนวนหนึ่งที่เกี่ยวข้องกับการอ้างอิง l2.io: hybrid-analysis.com/sample/…ช่วยให้สามารถฝังลิงก์เช่นในตัวอย่าง117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js? var = myip "," โฮสต์ ":" l2.io "," ผู้อ้างอิง ":" เว็บไซต์. com/…} "& screenheight = 768 & screenwidth = 1366 & tm = 1557565256073 & lib = true & ลายนิ้วมือ = c2VwLW5vLXJlZGlyZWN0
Wayne DSouza ที่

16

ฉันจะบอกว่าชาดและมอลตามีคำตอบที่ดี อย่างไรก็ตามพวกเขามีความซับซ้อน ดังนั้นฉันแนะนำรหัสนี้ที่ฉันพบจากโฆษณาตามปลั๊กอินของประเทศ

<script>
<script language="javascript" src="http://j.maxmind.com/app/geoip.js"></script>
<script language="javascript">
mmjsCountryCode = geoip_country_code();
mmjsCountryName = geoip_country_name();

</script>

ไม่มีอาแจ็กซ์ เพียงแค่จาวาสคริปต์ : D

หากคุณไปที่http://j.maxmind.com/app/geoip.jsคุณจะเห็นว่ามี

function geoip_country_code() { return 'ID'; }
function geoip_country_name() { return 'Indonesia'; }
function geoip_city()         { return 'Jakarta'; }
function geoip_region()       { return '04'; }
function geoip_region_name()  { return 'Jakarta Raya'; }
function geoip_latitude()     { return '-6.1744'; }
function geoip_longitude()    { return '106.8294'; }
function geoip_postal_code()  { return ''; }
function geoip_area_code()    { return ''; }
function geoip_metro_code()   { return ''; }

ยังไม่ตอบคำถามจริงๆเพราะ

http://j.maxmind.com/app/geoip.jsไม่มี IP (แม้ว่าฉันจะใช้ IP เพื่อรับประเทศ)

แต่มันง่ายมากที่จะสร้างสคริปต์ PhP ที่มีหน้าตาคล้ายกัน

function visitorsIP()   { return '123.123.123.123'; }

ทำที่ วางบนhttp://yourdomain.com/yourip.php

จากนั้นทำ

<script language="javascript" src="http://yourdomain.com/yourip.php"></script>

คำถามที่กล่าวถึงโดยเฉพาะอย่าใช้สคริปต์ของบุคคลที่สาม ไม่มีวิธีอื่น Javascript ไม่สามารถรู้ IP ของคุณ แต่เซิร์ฟเวอร์อื่น ๆ ที่สามารถเข้าถึงได้ผ่านทางจาวาสคริปต์สามารถทำงานได้ดีและไม่มีปัญหา


7
การโหลด JavaScript จากเซิร์ฟเวอร์ระยะไกลและฟังก์ชั่นการเรียกใช้ที่มีเนื้อหาที่ไม่รู้จักดูเหมือนจะเป็นความเสี่ยงด้านความปลอดภัยอย่างมากสำหรับฉัน (จะเกิดอะไรขึ้นถ้าเนื้อหาของฟังก์ชันเปลี่ยนไป?) ฉันต้องการแยกวิเคราะห์คำตอบของ JSON
auco

3
ข้อผิดพลาด 404: ไม่พบวัตถุ
trejder

มันนานมากแล้วคำตอบมันค่อนข้างผิดจริง ฉันไม่รู้ว่า javascript ไม่รู้จัก IP
user4951

โอ้มันถูกต้องฟังก์ชั่นผู้เข้าชม IP ไม่ได้หมายความว่าเป็นรหัส PHP มันเป็นรหัส javacript ที่สร้างขึ้นโดยรหัส PHP
user4951

คุณสามารถใช้เซิร์ฟเวอร์ของคุณเองแล้วพิมพ์รหัสจาวาสคริปต์ที่กำหนด ip ของผู้เยี่ยมชม
user4951

15

คำถามนี้มีการตีความสองแบบ คนส่วนใหญ่ตีความว่า "IP ของลูกค้า" เพื่อหมายถึงที่อยู่ IP สาธารณะที่เว็บเซิร์ฟเวอร์มองเห็นนอก LAN และบนอินเทอร์เน็ต อย่างไรก็ตามนี่ไม่ใช่ที่อยู่ IP ของคอมพิวเตอร์ไคลเอนต์ในกรณีส่วนใหญ่

ฉันต้องการที่อยู่ IP ที่แท้จริงของคอมพิวเตอร์ที่ใช้งานเบราว์เซอร์ที่โฮสต์ซอฟต์แวร์ JavaScript ของฉัน (ซึ่งมักจะเป็นที่อยู่ IP ในระบบ LAN ที่อยู่เบื้องหลังสิ่งที่เลเยอร์ NAT)

Mido โพสต์คำตอบ FANTASTIC ข้างต้นดูเหมือนจะเป็นคำตอบเดียวที่ให้ที่อยู่ IP ของลูกค้า

ขอบคุณสำหรับสิ่งนั้นมิโดะ!

อย่างไรก็ตามฟังก์ชั่นที่นำเสนอทำงานแบบอะซิงโครนัส ฉันจำเป็นต้องใช้ที่อยู่ IP ในรหัสของฉันและด้วยวิธีแก้ปัญหาแบบอะซิงโครนัสฉันอาจลองใช้ที่อยู่ IP ก่อนที่จะดึง / เรียนรู้ / เก็บไว้ ฉันต้องสามารถรอผลที่จะมาถึงก่อนที่จะใช้พวกเขา

นี่คือฟังก์ชันของ Mido เวอร์ชัน "Waitable" ฉันหวังว่ามันจะช่วยคนอื่น:

function findIP(onNewIP) { //  onNewIp - your listener function for new IPs
    var promise = new Promise(function (resolve, reject) {
        try {
            var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
            var pc = new myPeerConnection({ iceServers: [] }),
                noop = function () { },
                localIPs = {},
                ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
                key;
            function ipIterate(ip) {
                if (!localIPs[ip]) onNewIP(ip);
                localIPs[ip] = true;
            }
            pc.createDataChannel(""); //create a bogus data channel
            pc.createOffer(function (sdp) {
                sdp.sdp.split('\n').forEach(function (line) {
                    if (line.indexOf('candidate') < 0) return;
                    line.match(ipRegex).forEach(ipIterate);
                });
                pc.setLocalDescription(sdp, noop, noop);
            }, noop); // create offer and set local description

            pc.onicecandidate = function (ice) { //listen for candidate events
                if (ice && ice.candidate && ice.candidate.candidate && ice.candidate.candidate.match(ipRegex)) {
                    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
                }
                resolve("FindIPsDone");
                return;
            };
        }
        catch (ex) {
            reject(Error(ex));
        }
    });// New Promise(...{ ... });
    return promise;
};

//This is the callback that gets run for each IP address found
function foundNewIP(ip) {
    if (typeof window.ipAddress === 'undefined')
    {
        window.ipAddress = ip;
    }
    else
    {
        window.ipAddress += " - " + ip;
    }
}

//This is How to use the Waitable findIP function, and react to the
//results arriving
var ipWaitObject = findIP(foundNewIP);        // Puts found IP(s) in window.ipAddress
ipWaitObject.then(
    function (result) {
        alert ("IP(s) Found.  Result: '" + result + "'. You can use them now: " + window.ipAddress)
    },
    function (err) {
        alert ("IP(s) NOT Found.  FAILED!  " + err)
    }
);


 

   
<h1>Demo "Waitable" Client IP Retrieval using WebRTC </h1>


14

มีวิธีการที่ง่ายและฟรีที่จะไม่ขออนุญาตจากผู้เยี่ยมชมของคุณ

มันประกอบในการส่งคำขออาแจ็กซ์ POST ง่ายมากที่จะhttp://freegeoip.net/json เมื่อคุณได้รับข้อมูลตำแหน่งของคุณใน JSON คุณจะตอบสนองตามนั้นโดยอัพเดทหน้าเว็บหรือเปลี่ยนเส้นทางไปยังหน้าใหม่

นี่คือวิธีที่คุณส่งคำขอข้อมูลตำแหน่งที่ตั้ง:

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );

ดูเหมือนว่าพวกเขาจะปิดตัวลงในวันที่ 1 กรกฎาคม 2018
Nithin PH

13

ดีฉันกำลังพูดนอกเรื่องจากคำถาม แต่ฉันมีความต้องการที่คล้ายกันในวันนี้และแม้ว่าฉันไม่พบ ID จากไคลเอนต์ที่ใช้ Javascript แต่ฉันทำดังต่อไปนี้

ทางฝั่งเซิร์ฟเวอร์: -

<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>

ใช้ Javascript

var ip = $get("uip").innerHTML;

ฉันใช้ ASP.Net Ajax แต่คุณสามารถใช้ getElementById แทน $ get ()

สิ่งที่เกิดขึ้นคือฉันมีองค์ประกอบ div ที่ซ่อนอยู่ในหน้าเว็บที่มีการแสดง IP ของผู้ใช้จากเซิร์ฟเวอร์ กว่าใน Javascript ฉันเพิ่งโหลดค่านั้น

สิ่งนี้อาจเป็นประโยชน์กับบางคนที่มีความต้องการคล้ายกันเช่นคุณ (เช่นฉันในขณะที่ฉันไม่ได้เข้าใจสิ่งนี้)

ไชโย!


20
-1: OP กล่าวถึงโดยเฉพาะ "ไม่มีโค้ดด้านเซิร์ฟเวอร์" แต่คุณใช้ C # บางอย่าง
Bruno Reis

8
มันจะดีกว่า<script>var uip='<%= Request.UserHostAddress %>';</script>ไหมถ้าแค่เอาท์พุท?
Chris Haines

นอกเหนือจากการใช้รหัสฝั่งเซิร์ฟเวอร์เราไม่ควรใช้ DOM เพื่อเก็บข้อมูล นี่มันแย่ไปหมด Hainesy มีความคิดที่ดีกว่าที่จะกำหนดให้กับ JS var
coblr

13

กับการใช้ Smart-IP.net Geo-IP API ตัวอย่างเช่นโดยใช้ jQuery:

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});

15
"บริการไม่พร้อมใช้งานชั่วคราว"
Iago

เขียน api ง่าย ๆ [ geoip.immanuel.co/myip]เพื่อรับที่อยู่ IP ของลูกค้าเปิดใช้งาน ssl และไม่ จำกัด
Immanuel

12

ไม่สามารถทำได้โดยทั่วไปเว้นแต่คุณจะใช้บริการภายนอกบางประเภท


อันที่จริงมันเป็นไปได้ที่จะใช้ Javascript โดยอาศัยบริการของบุคคลที่สามเช่นIpregistry (ข้อจำกัดความรับผิดชอบ: ฉันใช้บริการ): ipregistry.co/docs/getting-location-from-ip-address#javascript คุณสามารถรับที่อยู่ IP ได้ และข้อมูลที่เกี่ยวข้องมากมายรวมถึงข้อมูลภัยคุกคามทั้งหมดในการโทรครั้งเดียว
Laurent

9

รับ IP ของคุณด้วย jQuery

คุณสามารถรับที่อยู่สาธารณะของคุณด้วย JS หนึ่งบรรทัด? มีบริการฟรีที่ให้สิ่งนี้สำหรับคุณและรับคำขอเป็นสิ่งที่คุณต้องทำ:

   $.get('http://jsonip.com/', function(r){ console.log(r.ip); });

เพื่อให้ข้อมูลข้างต้นทำงานได้เบราว์เซอร์ของคุณจะต้องรองรับ CORS (การแชร์คำขอข้ามที่มา) มิฉะนั้นจะเกิดความผิดพลาดด้านความปลอดภัย ในเบราว์เซอร์รุ่นเก่าคุณสามารถใช้เวอร์ชันนี้ซึ่งใช้คำขอ JSON-P:

   $.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });

9

คุณสามารถใช้ไลบรารี Javascript ของuserinfo.io

<script type="text/javascript" src="userinfo.0.0.1.min.js"></script>

UserInfo.getInfo(function(data) {
  alert(data.ip_address);
}, function(err) {
  // Do something with the error
});

คุณยังสามารถใช้ requirejs เพื่อโหลดสคริปต์

มันจะให้ที่อยู่ IP ของผู้เข้าชมของคุณเช่นเดียวกับข้อมูลบางอย่างเกี่ยวกับที่ตั้งของมัน (ประเทศเมือง ฯลฯ ) มันขึ้นอยู่กับฐานข้อมูล maxmind geoip

คำเตือน: ฉันเขียนห้องสมุดนี้


8

Javascript / jQuery รับที่อยู่ IP ของลูกค้า & ที่ตั้ง (ประเทศเมือง)

คุณจะต้องฝังแท็กที่มีลิงก์ "src" ไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะส่งคืน "codehelper_ip" เป็น Object / JSON และคุณสามารถใช้งานได้ทันที

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?js"></script>
// You can use it
<script language="Javascript">
    alert(codehelper_ip.IP);
    alert(codehelper_ip.Country);
</script>

ข้อมูลเพิ่มเติมที่Javascript Detect Real IP Address Plus Country

หากคุณกำลังใช้ jQUery คุณสามารถลอง:

console.log(codehelper_ip); 

มันจะแสดงข้อมูลเพิ่มเติมเกี่ยวกับวัตถุที่ส่งคืน

หากคุณต้องการฟังก์ชั่นการโทรกลับโปรดลองทำสิ่งนี้:

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?callback=yourcallback"></script>
// You can use it
<script language="Javascript">
    function yourcallback(json) {
       alert(json.IP);
     }
</script>

1
อย่าใช้แอlanguageททริบิวใช้type="text/javascript"แทนMDN
Alex K

ดังที่ @Alex ได้กล่าวถึงแล้วภาษาเลิกใช้แล้วและถูกใช้ในรหัสดั้งเดิมเท่านั้น ใช้ 'type = "text / javascript"' เพื่อความเข้ากันได้สูงสุดแทน
Gautham C.

1
just FYI - ฟิลด์ประเภทไม่จำเป็นสำหรับ HTML5 (JS เป็นค่าเริ่มต้น) w3schools.com/tags/att_script_type.asp
pmont

ในกรณีที่คุณพลาดความคิดเห็นอื่น ๆ เหล่านี้คุณควรใช้ type แทนภาษา
Mike

8

บริการของ Appspot.com ไม่มีการติดต่อกลับ ipinfo.io ดูเหมือนว่าจะใช้งานได้

ฉันทำขั้นตอนพิเศษและดึงข้อมูลทางภูมิศาสตร์ทั้งหมดโดยใช้ AngularJS (ขอบคุณ Ricardo) ลองดูสิ

<div ng-controller="geoCtrl">
  <p ng-bind="ip"></p>
  <p ng-bind="hostname"></p>
  <p ng-bind="loc"></p>
  <p ng-bind="org"></p>
  <p ng-bind="city"></p>
  <p ng-bind="region"></p>
  <p ng-bind="country"></p>
  <p ng-bind="phone"></p>
</div>
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular-route.min.js"></script>
<script>
'use strict';
var geo = angular.module('geo', [])
.controller('geoCtrl', ['$scope', '$http', function($scope, $http) {
  $http.jsonp('http://ipinfo.io/?callback=JSON_CALLBACK')
    .success(function(data) {
    $scope.ip = data.ip;
    $scope.hostname = data.hostname;
    $scope.loc = data.loc; //Latitude and Longitude
    $scope.org = data.org; //organization
    $scope.city = data.city;
    $scope.region = data.region; //state
    $scope.country = data.country;
    $scope.phone = data.phone; //city area code
  });
}]);
</script>

หน้าการทำงานที่นี่: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html


8

หากคุณรวมไฟล์ anways คุณสามารถทำ ajax ง่ายๆ

function ip_callback() {
    $.get("ajax.getIp.php",function(data){ return data; }
}

และajax.getIp.phpจะเป็นเช่นนี้:

<?=$_SERVER['REMOTE_ADDR']?>

8

ฉันชอบapi.ipify.orgเพราะมันรองรับทั้ง HTTP และ HTTPS

นี่คือตัวอย่างของการรับ IP โดยapi.ipify.orgใช้ jQuery

รูปแบบ JSON ผ่าน HTTPS

https://api.ipify.org?format=json

$.getJSON("https://api.ipify.org/?format=json", function(e) {
    alert(e.ip);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

รูปแบบ JSON ผ่าน HTTP

http://api.ipify.org?format=json

$.getJSON("http://api.ipify.org/?format=json", function(e) {
    alert(e.ip);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

รูปแบบข้อความบน HTTPS

หากคุณไม่ต้องการใน JSON ก็จะมีการตอบกลับธรรมดาผ่าน HTTPS

https://api.ipify.org

รูปแบบข้อความบน HTTP

และยังมีการตอบสนองแบบธรรมดาผ่าน HTTP

http://api.ipify.org

8

ใช้ipdata.co

API ยังให้ข้อมูลตำแหน่งทางภูมิศาสตร์และมีจุดปลาย 10 จุดทั่วโลกแต่ละแห่งสามารถจัดการ> คำขอ 800M ต่อวัน!

คำตอบนี้ใช้คีย์ 'ทดสอบ' API ที่มี จำกัด มากและใช้สำหรับการทดสอบการโทรไม่กี่ครั้งเท่านั้น ลงทะเบียนสำหรับรหัส API ฟรีของคุณเองและรับคำขอได้มากถึง 1,500 คำขอต่อวันเพื่อการพัฒนา

$.get("https://api.ipdata.co?api-key=test", function (response) {
    $("#response").html(response.ip);
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="response"></pre>


7

ไม่มีวิธีที่เชื่อถือได้จริง ๆ ในการรับที่อยู่ IP ของคอมพิวเตอร์ไคลเอนต์

สิ่งนี้ต้องผ่านความเป็นไปได้บางอย่าง รหัสที่ใช้ Java จะแตกหากผู้ใช้มีหลายอินเตอร์เฟส

http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html

จากการดูคำตอบอื่น ๆ ที่นี่ดูเหมือนว่าคุณอาจต้องการรับที่อยู่ IP สาธารณะของลูกค้าซึ่งอาจเป็นที่อยู่ของเราเตอร์ที่ใช้เพื่อเชื่อมต่ออินเทอร์เน็ต คำตอบอื่น ๆ มากมายที่นี่พูดคุยเกี่ยวกับที่ ฉันขอแนะนำให้สร้างและโฮสต์หน้าเซิร์ฟเวอร์ของคุณเองเพื่อรับคำขอและตอบกลับด้วยที่อยู่ IP แทนที่จะขึ้นอยู่กับบริการของบุคคลอื่นที่อาจหรือไม่อาจทำงานต่อไปได้


7

ฉันจะเสนอวิธีการที่ฉันใช้บ่อยๆเมื่อฉันต้องการเก็บข้อมูลในหน้า html และต้องการให้จาวาสคริปต์ของฉันอ่านข้อมูลโดยไม่ต้องผ่านพารามิเตอร์ไปยังจาวาสคริปต์ สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อสคริปต์ของคุณถูกอ้างอิงจากภายนอกแทนที่จะเป็นแบบอินไลน์

อย่างไรก็ตามไม่เป็นไปตามเกณฑ์ของ "ไม่มีสคริปต์ฝั่งเซิร์ฟเวอร์" แต่ถ้าคุณสามารถรวมสคริปต์ฝั่งเซิร์ฟเวอร์ไว้ใน html ของคุณให้ทำดังนี้:

สร้างองค์ประกอบป้ายกำกับที่ซ่อนอยู่ที่ด้านล่างของหน้า html ของคุณเหนือแท็กส่วนท้าย

ป้ายกำกับของคุณจะมีลักษณะดังนี้:

<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>

ตรวจสอบให้แน่ใจว่าได้เรียกคลาสhiddenlabelแล้วตั้งค่าvisibility:hiddenให้ไม่มีใครเห็นป้ายกำกับจริง คุณสามารถจัดเก็บสิ่งต่าง ๆ มากมายด้วยวิธีนี้ในป้ายกำกับที่ซ่อนอยู่

ตอนนี้ในจาวาสคริปต์ของคุณเพื่อดึงข้อมูลที่เก็บไว้ในฉลาก (ในกรณีนี้คือที่อยู่ IP ของลูกค้า) คุณสามารถทำได้:

var ip = document.getElementById("ip").innerHTML;

ตอนนี้ตัวแปร "ip" ของคุณเท่ากับที่อยู่ IP ตอนนี้คุณสามารถส่งไอพีไปยังคำขอ API ของคุณ

* แก้ไข 2 ปีต่อมา * การปรับแต่งเล็กน้อยสองรายการ:

ฉันใช้วิธีนี้เป็นประจำ แต่เรียกฉลากclass="data"เพราะที่จริงแล้วมันเป็นวิธีการเก็บข้อมูล ชื่อคลาส "hiddenlabel" เป็นชื่อที่โง่

การแก้ไขที่สองอยู่ในสไตล์ชีทแทนที่จะเป็นvisibility:hidden:

.data{
    display:none;
}

... เป็นวิธีที่ดีกว่าในการทำมัน


3
อย่าเก็บข้อมูลใน DOM ทำไมทุกคนแนะนำว่าแม้ 2 ปีต่อมา? หากคุณสามารถแทรกสิ่งใด ๆ ลงในไฟล์ HTML เพียงแค่ฉีดค่านั้นลงในตัวแปร JS เช่นนั้น <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </ script> อย่างน้อยที่สุดโปรแกรมอ่านหน้าจอจะพลาดและไม่ต้องใช้ getElementById หรือ $ ('# stupidname')
coblr

@fractalspawn ด้วยเหตุผลที่คุณไม่สามารถแทรกโค้ด php ลงในไฟล์. js ไม่คิดอย่างนั้นคุณใส่กางเกงเก่งหรือเปล่า! ;)
TARKUS

ถ้าคุณทำ <script type = "text / javascript" src = "path / to / fancy / javascript.php"> </script> ถึงแม้ว่าฉันไม่แน่ใจว่าทำไมคุณถึงทำเช่นนั้น ประเด็นของฉันคือถ้า PHP สามารถแทรกสิ่งใดก็ได้ลงใน HTML ที่แสดงผลวิธีปฏิบัติที่ดีที่สุดคือให้แทรกค่าลงในตัวแปร JS ภายในแท็กสคริปต์แบบอินไลน์แทนที่จะเป็นองค์ประกอบ DOM ที่คุณจะต้องแยกวิเคราะห์ เพื่อให้สามารถใช้งานได้และสามารถอ่านได้โดยโปรแกรมอ่านหน้าจอเว้นแต่ว่าคุณจะใช้มาตรการเพิ่มเติมเพื่อป้องกัน
coblr

ไม่มีเหตุผลที่ดีว่าทำไมคุณไม่สามารถหรือไม่ควรเพิ่มองค์ประกอบการเก็บข้อมูลลงใน DOM และมีเหตุผลดีๆมากมายที่ควรทำ ในความเป็นจริงเหตุผลเหล่านั้นเป็นคำตอบของฉันถ้าคุณอยากอ่านอีกครั้ง มีความน่าเชื่อถือควบคุมง่ายและมีประโยชน์เป็นพิเศษเมื่อไฟล์จาวาสคริปต์ของคุณเกิดขึ้นในไซต์ระยะไกล การพูดถึงสคริปต์ระยะไกลตัวอย่างของคุณ "javascript.php" เป็นความคิดที่น่ากลัวและอาจไม่สามารถใช้งานได้ คิดในแง่ของสคริปต์ระยะไกลเช่น DISQUS
TARKUS

3
ความคิดเห็นอื่นของคุณเกี่ยวกับสาเหตุที่ทำให้การจัดเก็บข้อมูล DOM ไม่ดี .. คุณยังสามารถหยุดรถได้ด้วยการกดกำแพงเบา ๆ ที่ปลายทางของคุณ แต่มีเครื่องมือที่ดีกว่าสำหรับงานนี้ ตอนนี้เรารู้ดีขึ้นแล้วและมีกรอบการทำงานที่ยอดเยี่ยมในการบรรเทาปัญหานี้ ฉันทำงานในสถานที่ที่ DOM เป็นเพียงไฟล์กำหนดค่าขนาดใหญ่สำหรับ JS และมันก็เป็นฝันร้ายเมื่อต้องพัก หากคุณรู้สึกว่าการใช้ <script src = "something.php"> นั้นเป็น "แฮ็คที่หยาบคาย" แต่การจัดเก็บข้อมูลใน DOM ที่มีค่าภายใน Javascript เท่านั้นไม่ใช่ฉันดีใจจริงๆที่เราไม่ทำงาน ด้วยกันและจะอีกครั้งยินดีที่จะไม่เห็นด้วย :)
coblr



6

ก่อนอื่นคำตอบที่แท้จริง :ไม่สามารถใช้รหัสที่ดำเนินการโดยฝั่งไคลเอ็นต์เพื่อค้นหาที่อยู่ IP ของคุณเอง

อย่างไรก็ตามคุณสามารถทำ GET ไปที่https://api.muctool.de/whoisและรับบางสิ่งที่ต้องการรับที่อยู่ IP ของลูกค้า

{
"ip": "88.217.152.15",
"city": "Munich",
"isp": "M-net Telekommunikations GmbH",
"country": "Germany",
"countryIso": "DE",
"postalCode": "80469",
"subdivisionIso": "BY",
"timeZone": "Europe/Berlin",
"cityGeonameId": 2867714,
"countryGeonameId": 2921044,
"subdivisionGeonameId": 2951839,
"ispId": 8767,
"latitude": 48.1299,
"longitude": 11.5732,
"fingerprint": "61c5880ee234d66bded68be14c0f44236f024cc12efb6db56e4031795f5dc4c4",
"session": "69c2c032a88fcd5e9d02d0dd6a5080e27d5aafc374a06e51a86fec101508dfd3",
"fraud": 0.024,
"tor": false
}

5

คุณสามารถทำได้ทั้งฝั่งไคลเอ็นต์และส่วนใหญ่ใน JavaScript โดยใช้วัตถุ Flash ที่ js สามารถโทรได้ Flash สามารถเข้าถึงที่อยู่ IP ของเครื่องในพื้นที่ซึ่งอาจไม่มีประโยชน์มาก


4
var call_to = "http://smart-ip.net/geoip-json?callback=?";

$.getJSON(call_to, function(data){
   alert(data.host);
});

data.hostเป็นที่อยู่ IP เพียงเรียกสิ่งนี้จากเบราว์เซอร์ของคุณ

http://smart-ip.net/geoip-json?callback=? [ไม่มีเครื่องหมายคำพูด] และรับ IP


ขออภัย $ ใน javascript มีความหมายว่าอย่างไร?
GHOST
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.