Làm cách nào để lấy địa chỉ IP của khách hàng bằng JavaScript?


560

Tôi cần lấy lại địa chỉ IP của khách hàng bằng cách nào đó bằng JavaScript; không có mã phía máy chủ, thậm chí không có SSI.

Tuy nhiên, tôi không chống lại việc sử dụng tập lệnh / dịch vụ miễn phí của bên thứ 3.

Câu trả lời:


773

Tôi sẽ sử dụng một dịch vụ web có thể trả về JSON (cùng với jQuery để làm cho mọi thứ đơn giản hơn). Dưới đây là tất cả các dịch vụ tra cứu IP hoạt động miễn phí mà tôi có thể tìm thấy và thông tin họ trả về. Nếu bạn biết thêm bất cứ điều gì, xin vui lòng thêm một nhận xét và tôi sẽ cập nhật câu trả lời này.


Đám mây

Hãy dùng thử: 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)
})

Trả về:

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

Hạn chế:

  • Trả về văn bản thuần túy

DB-IP

Hãy dùng thử: http://api.db-ip.com/addrinfo?api_key= < khóa api của bạn > & addr = < địa chỉ ip >

Trả về:

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

Hạn chế:

  • 2.500 yêu cầu mỗi ngày
  • Không hỗ trợ gọi lại JSONP
  • Yêu cầu tham số địa chỉ IP
  • Yêu cầu một địa chỉ email để lấy khóa API của bạn
  • Không có SSL (https) với gói miễn phí

Geobytes

Hãy dùng thử: http://gd.geobytes.com/GetCityDetails

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

Trả về:

{
  "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"
}

Hạn chế:

  • 16.384 yêu cầu mỗi giờ
  • Không có SSL (https) với gói miễn phí
  • Có thể trả lại vị trí sai (Tôi đang ở Singapore, không phải Ả Rập Saudi)

GeoIPLookup.io

Hãy dùng thử: https://json.geoiplookup.io/api

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

Trả về:

{
    "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
}

Hạn chế:

  • 10.000 yêu cầu mỗi giờ
  • API miễn phí chỉ cho phép sử dụng phi thương mại

GeoPlugin

Hãy dùng thử: http://www.geoplugin.net/json.gp

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

Trả về:

{
  "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
}

Hạn chế:

  • 120 yêu cầu mỗi phút
  • Không có SSL (https) với gói miễn phí

Mục tiêu của hacker

Hãy dùng thử: https://api.hackertarget.com/geoip/?q= < địa chỉ ip >

Trả về:

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

Hạn chế:

  • 50 yêu cầu mỗi ngày
  • Không hỗ trợ gọi lại JSONP
  • Yêu cầu tham số địa chỉ IP
  • Trả về văn bản thuần túy

ipapi.co

Hãy dùng thử: https://ipapi.co/json/

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

Trả về:

{
  "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"
}

Hạn chế:

  • 1.000 yêu cầu mỗi ngày
  • Yêu cầu SSL (https)

IP-API.com

Hãy dùng thử: http://ip-api.com/json

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

Trả về:

{
  "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": ""
}

Hạn chế:

  • 150 yêu cầu mỗi phút
  • Không có SSL (https) với gói miễn phí

Ipdata.co

Hãy dùng thử: https://api.ipdata.co

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

Trả về:

{
  "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
  }
}

Hạn chế:

  • 1.500 yêu cầu mỗi ngày
  • Yêu cầu một địa chỉ email để lấy khóa API của bạn
  • Yêu cầu SSL (https)

Tìm IP

Hãy dùng thử: https://ipfind.co/me?auth= < khóa api của bạn >

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

Trả về:

{
  "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"
  ]
}

Hạn chế:

  • 300 yêu cầu mỗi ngày
  • Yêu cầu đăng ký để lấy khóa API của bạn

định vị

Hãy dùng thử: https://api.ipgeolocation.io/ipgeo?apiKey= < khóa api của bạn >

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

Trả về:

{
  "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"
  }
}

Hạn chế:

  • 50.000 yêu cầu mỗi tháng
  • Yêu cầu đăng ký để lấy khóa API của bạn

ipify

Hãy dùng thử: https://api.ipify.org/?format=json

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

Trả về:

{
  "ip": "116.12.250.1"
}

Hạn chế:

  • không ai

IPInfoDB

Hãy dùng thử: https://api.ipinfodb.com/v3/ip-city/?key= < khóa api của bạn > & 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));
});

Trả về:

{
  "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"
}

Hạn chế:

  • Hai yêu cầu mỗi giây
  • Yêu cầu đăng ký để lấy khóa API của bạn

ipinfo.io

Hãy dùng thử: https://ipinfo.io/json

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

Trả về:

{
  "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"
}

Hạn chế:

  • 1.000 yêu cầu mỗi ngày

Địa lý học

Hãy dùng thử: https://api.ipregistry.co/?key= < khóa api của bạn >

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

Trả về:

{
  "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
  }
}

Hạn chế:

  • Gói miễn phí bao gồm 100.000 yêu cầu
  • Yêu cầu đăng ký để lấy khóa API của bạn

ipstack (trước đây là freegeoip.net)

Hãy dùng thử: http://api.ipstack.com/ < địa chỉ ip >? Access_key = <khóa api của bạn>

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

Trả về:

{
    "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
    }
}

Hạn chế:

  • 10.000 yêu cầu mỗi tháng
  • Yêu cầu tham số địa chỉ IP
  • Yêu cầu đăng ký để lấy khóa API của bạn
  • Không có SSL (https) với gói miễn phí

jsonip.com

Hãy dùng thử: https://jsonip.com

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

Trả về:

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

Hạn chế:

  • Phản hồi bao gồm upell

Kiểm tra JSON

Hãy dùng thử: http://ip.jsontest.com/

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

Trả về:

{
  "ip": "116.12.250.1"
}

Hạn chế:

  • Không có SSL (https)
  • Giảm nhiều (vượt quá hạn ngạch), vì vậy tôi sẽ không sử dụng nó cho sản xuất
  • Trả về địa chỉ IPv6 nếu bạn có, đây có thể không phải là địa chỉ bạn muốn

Thần kinh

Hãy dùng thử: https://geoip.nekudo.com/api

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

Trả về:

{
  "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"
}

Hạn chế:

  • Bị chặn bởi các trình chặn quảng cáo bằng danh sách EasyPrivacy

Hãy nhớ rằng vì đây là tất cả các dịch vụ miễn phí, số dặm của bạn có thể khác nhau về việc vượt quá hạn ngạch và thời gian hoạt động, và ai biết khi nào / nếu chúng sẽ được đưa ra ngoại tuyến (triển lãm A: Telize ). Hầu hết các dịch vụ này cũng cung cấp một tầng trả phí trong trường hợp bạn muốn có nhiều tính năng hơn như hỗ trợ SSL.

Ngoài ra, như skobaljic đã lưu ý trong các bình luận bên dưới, hạn ngạch yêu cầu chủ yếu mang tính học thuật vì điều này xảy ra ở phía khách hàng và hầu hết người dùng cuối sẽ không bao giờ vượt quá hạn ngạch.

CẬP NHẬT


3
@AreasabiOlaoluwaAkinwumi bạn có thể thử một cái gì đó như thế này: $.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });
thdoan

1
@skobaljic Re. những hạn chế thường không có nghĩa gì: Điểm tốt và có lẽ là một lý do để tránh xa những người cần khóa api, bởi vì việc sử dụng khóa có thể được tính.
Nick Rice

2
@Johnweisz Đúng, nhưng nếu OP chỉ đơn giản là họ chỉ có thể cập nhật trang và không làm gì phía máy chủ (không rõ ràng từ câu hỏi) thì các tùy chọn này trả lời tốt câu hỏi.
Nick Rice

1
@RobWaa cảm ơn, tôi đã thêm giới hạn chặn quảng cáo trong bản cập nhật 4/14. Tôi sẽ sớm thêm Geoiplookup.io.
thdoan

1
Tất cả các câu trả lời này đều dựa vào dịch vụ của bên thứ ba, đó là một nhược điểm lớn, không chỉ bởi vì bạn phụ thuộc vào dịch vụ đó đáp ứng kịp thời, mà bởi vì nếu không và bạn sẽ không đặt thời gian chờ thích hợp (sẽ luôn luôn xảy ra sonner muộn hơn), bạn sẽ trì hoãn thời gian tải trang của mình, điều này không tốt chút nào. Vì vậy, tại sao không sử dụng máy chủ của riêng bạn để trả về IP của khách hàng?, Đó là một nhiệm vụ tầm thường với bất kỳ ngôn ngữ lập trình nào.
Daniel J.

280

Cập nhật cuối cùng

Giải pháp này sẽ không còn hoạt động vì các trình duyệt đang sửa lỗi rò rỉ webrtc: để biết thêm thông tin về việc đọc câu hỏi khác này: RTCIceCandidate không còn trả lại IP


Cập nhật : Tôi luôn muốn tạo một phiên bản mã tối thiểu / xấu xí, vì vậy đây là mã Promise 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))

Lưu ý: Mã rút gọn mới này sẽ chỉ trả về một IP duy nhất nếu bạn muốn tất cả IP của người dùng (có thể phụ thuộc nhiều hơn vào mạng của anh ấy), sử dụng mã gốc ...


nhờ có WebRTC , rất dễ dàng để có được IP cục bộ trong các trình duyệt được hỗ trợ WebRTC (ít nhất là bây giờ). Tôi đã sửa đổi mã nguồn, giảm các dòng, không thực hiện bất kỳ yêu cầu gây choáng nào vì bạn chỉ muốn IP cục bộ, không phải IP công cộng, mã dưới đây hoạt động trong Firefox và Chrome mới nhất, chỉ cần chạy đoạn trích và tự kiểm tra:

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>

những gì đang xảy ra ở đây là, chúng tôi đang tạo ra một kết nối ngang hàng giả, và để các đồng nghiệp từ xa liên hệ với chúng tôi, chúng tôi thường trao đổi các ứng cử viên băng với nhau. Và đọc các ứng cử viên băng (từ mô tả phiên địa phương và onIceCandidateEvent), chúng tôi có thể cho biết IP của người dùng.

nơi tôi lấy mã từ -> Nguồn


12
Upvote vì trả lời tốt nhất ở đây, cũng cảm ơn vì repo GitHub tuyệt vời!
kano

28
Cảnh báo: Điều này không hiển thị IP công cộng của bạn, chỉ là mạng cục bộ. Chẳng hạn, bạn không thể sử dụng nó để phát hiện quốc gia người dùng, nếu họ ở trên mạng LAN
FloatingRock

1
@FloatingRock bạn cũng có thể truy xuất IP công cộng, sử dụng máy chủ STUN (và định cấu hình nó trong khi tạo ngang hàng), sau đó, một lần nữa, sẽ yêu cầu bạn duy trì / sử dụng máy chủ STUN, đưa mã máy chủ vào hình ảnh.
mido

10
Điều này được gọi là Rò rỉ WebRTC. Nên được sửa bởi tất cả các trình duyệt thị trưởng, nhưng không phải. Thêm thông tin ở đây: Privacytools.io/webrtc.html Có thể liên quan đến trình duyệt Tor rò rỉ ip thực của bạn.
Kapitein Witbaard

1
Mặc dù, tôi đã thích câu trả lời, khách hàng có thể vượt qua quá trình này bằng cách vô hiệu hóa WebRTC - restoreprivacy.com/webrtc-leaks
ni8mr

175

Bạn có thể, chuyển tiếp nó qua phía máy chủ với JSONP

Và trong khi tìm kiếm một cái, tìm thấy nó ở đây trên SO Tôi có thể thực hiện tra cứu DNS (tên máy chủ thành địa chỉ IP) bằng Javascript phía máy khách không?

<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>

Lưu ý: API telize.com đã ngừng hoạt động vĩnh viễn kể từ ngày 15 tháng 11 năm 2015 .


45
Mặc dù tôi đánh giá cao đoạn trích này, tôi nghĩ rằng việc tải nội dung văn bản JavaScript và đánh giá rằng thông qua một chức năng là một rủi ro bảo mật nghiêm trọng. Điều gì sẽ xảy ra nếu nội dung của phản hồi thay đổi và tất cả hơn 100 người ở đây đã bỏ phiếu cho câu trả lời này và có thể đã sử dụng đoạn trích đó kết thúc việc gọi một hàm có nội dung không an toàn có thể. Tôi sẽ chỉ sử dụng điều này nếu nó là một chuỗi JSON.
auco

32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Brad M

28
Đây không phải là một câu trả lời tốt vì nó liên quan đến yêu cầu phía máy chủ. Câu hỏi nêu rõ "javascript thuần túy".
Mi-chê

2
Micah, không có cách nào có thể để có được một địa chỉ IP với javascript thuần túy. Tôi đề nghị bạn đọc một số bài về NAT và cách thức hoạt động. Bạn cần một máy chủ để gửi lại địa chỉ IP internet của bạn cho bạn
Chad Grant

11
Dịch vụ hiện đã ngừng hoạt động.
Cyril N.

109

Hầu hết các câu trả lời ở đây "giải quyết" nhu cầu về mã phía máy chủ bằng cách ... Đánh vào máy chủ của người khác. Đây là một kỹ thuật hoàn toàn hợp lệ, trừ khi bạn thực sự cần lấy địa chỉ IP mà không cần nhấn máy chủ.

Theo truyền thống, điều này là không thể nếu không có một số plugin (và thậm chí sau đó, bạn có thể nhận được địa chỉ IP sai nếu bạn đứng sau bộ định tuyến NAT), nhưng với sự ra đời của WebRTC, thực sự có thể làm điều này .. . Nếu bạn đang nhắm mục tiêu các trình duyệt hỗ trợ WebRTC (hiện tại: Firefox, Chrome và Opera).

Vui lòng đọc câu trả lời của mid để biết chi tiết về cách bạn có thể truy xuất các địa chỉ IP khách hàng hữu ích bằng WebRTC.


23
@oscar: dường như là cùng một kỹ thuật (IP hiển thị máy chủ trả về JSONP) mà đã đề cập trong câu trả lời của anh ấy. Điều này không phù hợp với yêu cầu của OP về "không có mã phía máy chủ". Nhưng vâng, đó là một cách để thực hiện nó nếu bạn bỏ qua yêu cầu đó.
Shog9

Câu trả lời này đã lỗi thời vì WebRTC: stackoverflow.com/questions/20194722/ cấp
Akam

1
Đã cập nhật, @Akam. Bạn nên cung cấp cho mido một số đạo cụ để chỉ ra điều này một vài tháng trước (sau NĂM của những người đăng câu trả lời sai đáng xấu hổ mà vẫn cần hỗ trợ máy chủ).
Shog9

WebRTC có được hỗ trợ rộng rãi hơn bây giờ không?!
oldboy

1
Theo liên kết "CanIUse", đó là, @BugWhisperer. Trừ khi bạn cần IE.
Shog9

81

Bạn có thể thực hiện cuộc gọi ajax đến hostip.info hoặc một dịch vụ tương tự ...

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;
}

Như một phần thưởng, thông tin định vị địa lý được trả lại trong cùng một cuộc gọi.


6
Bạn cũng có thể nhận được biểu diễn JSON bằng api.hostip.info/get_json.php , sau đó phân tích JSON bằng hàm trình duyệt, jQuery hoặc Prototype.
Brad Dân gian

2
Có giới hạn yêu cầu nào đối với " api.hostip.info/get_html.php " không? Tôi có thể xem chi tiết api này ở đâu
Navin Leon

Nó trả về IP của Tường lửa mạng. không phải IP khách hàng thực tế. Có cách nào để chúng tôi có được IP khách hàng thực tế không?
Leela Addagulla

76
Thử cái này
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

HOẶC LÀ

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

Vĩ cầm


cái này hoạt động $ .get (" ipinfo.io ", hàm (hồi đáp) {alert ( respons.ip );}, "jsonp"); nhưng làm thế nào để tôi lưu trữ giá trị vào một biến? nó dường như biến mất bên ngoài vòng lặp yêu cầu này

1
Để biết danh sách tất cả các dịch vụ tra cứu IP miễn phí, bạn có thể tham khảo câu trả lời của tôi cho stackoverflow.com/questions/391979/
mẹo

Làm thế nào để tôi gửi chức năng này để trả về giá trị của ip?
Neftali Acosta

67

Bạn không thể. Bạn sẽ phải hỏi một máy chủ.


5
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
Himanshu

28
Nhưng nó hơi giống, phải không? Ý tôi là, nếu câu trả lời chỉ là "không, bạn không thể" thì tôi sẽ cho rằng đây là một câu trả lời đúng hơn so với câu trả lời hiện tại "ở đây, hãy sử dụng ứng dụng appspot ngẫu nhiên này", có vẻ như là một câu trả lời nguy hiểm đứng đầu danh sách
SteveShaffer

16
IMO Đây là câu trả lời đúng và nên được chấp nhận. Câu hỏi đặc biệt nói "không có mã phía máy chủ."
matthewwithanm


2
@matthewwithanm Tôi không thể đồng ý nhiều hơn. Tôi đã cuộn qua tất cả các câu trả lời để xem có ai đã nói chính xác điều này không - và tôi đã sẵn sàng cung cấp nó như một câu trả lời. Tất cả các câu trả lời được đánh giá cao, trong khi thông tin, tất cả trả lời một câu hỏi khác nhau. Trích dẫn câu hỏi: "Tôi cần bằng cách nào đó lấy địa chỉ IP của khách hàng bằng cách sử dụng JavaScript thuần túy; không có mã phía máy chủ, thậm chí không phải là SSI." Câu trả lời này, trên thực tế, câu trả lời chính xác. Javascript trình duyệt hộp cát không thể làm điều này (bất kể NAT hay proxy). Câu hỏi nên được thay đổi nếu một trong những câu trả lời khác được chấp nhận.
wally

64

Không tìm đâu xa

Hãy xem http://www.ipify.org/

Theo họ:

  • Bạn có thể sử dụng nó không giới hạn (ngay cả khi bạn đang thực hiện hàng triệu yêu cầu mỗi phút).
  • ipify là nguồn mở hoàn toàn (kiểm tra kho GitHub ).

Đây là một ví dụ về JS hoạt động (thay vì tự hỏi tại sao câu trả lời này có quá ít phiếu bầu, hãy tự mình thử xem nó hoạt động):

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

Quá lười để sao chép / dán? Tôi thích nó. Đây là bản demo

Quá lười để nhấp? :O

Lưu ý : Tắt Adblock Plus / uBlock & co trước khi chạy bản demo .. nếu không, nó sẽ không hoạt động.

Tôi không có gì để làm với nhóm IPify. Tôi chỉ nghĩ rằng thật tuyệt vời khi ai đó sẽ cung cấp một dịch vụ như vậy vì lợi ích chung.


4
Phần tốt nhất là điều này xuất phát từ "https" trong khi các cuộc gọi của tôi tới người trợ giúp http IP sẽ bị chặn vì chúng "không an toàn".
Tessa

này, nó cho tôi thấy lỗi CORS, tôi phải làm sao?
saberprashant

@saberprashant bạn đang sử dụng "HTTPS"?
FloatingRock

@FloatingRock, không tôi đang sử dụng HTTP
saberprashant

26

Bạn có thể sử dụng dịch vụ của tôi http://ipinfo.io cho việc này, dịch vụ này sẽ cung cấp cho bạn IP khách, tên máy chủ, thông tin định vị địa lý và chủ sở hữu mạng. Đây là một ví dụ đơn giản ghi nhật ký IP:

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

Dưới đây là một ví dụ JSFiddle chi tiết hơn cũng in ra thông tin phản hồi đầy đủ, vì vậy bạn có thể thấy tất cả các chi tiết có sẵn: http://jsfiddle.net/zK5FN/2/


Để tránh các vấn đề về Chính sách nội dung hỗn hợp, hãy đổi http://ipinfo.iothành //ipinfo.iohoặc https
Samuel Elh

Chúng tôi muốn sử dụng dịch vụ của bạn, bạn có bất kỳ ưu đãi giảm giá nào cho người dùng Stackoverflow không?
Mehdi Dehghani

@MehdiDehghani chúng tôi miễn phí tối đa 50 nghìn req / tháng, với 100 nghìn với một liên kết ngược - xem ipinfo.io/contact/creditlink
Ben Dowling

19

Bao gồm mã này trong trang của bạn: <script type="text/javascript" src="http://l2.io/ip.js"></script>

thêm tài liệu ở đây


1
Hừm. Trông thật thú vị ... Họ có giới hạn nào không?
khai

1
thư viện ngoại tuyến
riccardo.tasso

Có một số mức độ pop up spam liên quan đến l2.io ref: hybrid-analysis.com/sample/ cho phép nhúng các liên kết như trong mẫu 117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ? ip.js var = MYIP " "host": "l2.io", "giới thiệu":" website.com/... } "& screenheight = 768 & screenwidth = 1366 & tm = 1557565256073 & lib = true & vân tay = c2VwLW5vLXJlZGlyZWN0
Wayne DSouza

16

Tôi muốn nói Chad và Malta có câu trả lời tuyệt vời. Tuy nhiên, chúng rất phức tạp. Vì vậy, tôi đề xuất mã này mà tôi tìm thấy từ quảng cáo của plugin quốc gia

<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>

Không có ajax. Chỉ cần javascripts. : D

Nếu bạn truy cập http://j.maxmind.com/app/geoip.js bạn sẽ thấy nó chứa

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 ''; }

Nó không thực sự trả lời câu hỏi vì

http://j.maxmind.com/app/geoip.js không chứa IP (mặc dù tôi cá là nó sử dụng IP để lấy quốc gia).

Nhưng thật dễ dàng để tạo một tập lệnh PhP nổi bật như

function visitorsIP()   { return '123.123.123.123'; }

Làm điều đó Đặt trên http://yourdomain.com/yourip.php .

Sau đó làm

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

Câu hỏi đề cập cụ thể KHÔNG sử dụng tập lệnh của bên thứ ba. Không có cách nào khác. Javascript không thể biết IP của bạn. Nhưng các máy chủ khác có thể được truy cập thông qua javascript có thể hoạt động tốt mà không có vấn đề gì.


7
tải JavaScript từ máy chủ từ xa và gọi các hàm có nội dung không xác định có vẻ như là một rủi ro bảo mật rất lớn đối với tôi (nếu nội dung hàm thay đổi thì sao?). Tôi thích phân tích một phản hồi JSON hơn.
auco

3
Lỗi 404: Không tìm thấy đối tượng
trejder

Đó là một thời gian rất dài., Câu trả lời thực sự khá sai. Tôi không biết javascript không thể biết IP.
dùng4951

ồ đúng rồi, hàm visitorIP không có nghĩa là mã php. Đó là mã javacript được tạo bởi mã php
user4951

bạn chỉ có thể sử dụng máy chủ của riêng mình sau đó để in mã javascript chỉ định ip của khách truy cập.
dùng4951

15

Có hai cách giải thích cho câu hỏi này. Hầu hết mọi người giải thích "IP khách hàng" có nghĩa là Địa chỉ IP công cộng mà máy chủ Web nhìn thấy bên ngoài mạng LAN và trên Internet. Tuy nhiên, đây không phải là địa chỉ IP của máy khách

Tôi cần địa chỉ IP thực của máy tính đang chạy trình duyệt đang lưu trữ phần mềm JavaScript của tôi (gần như luôn luôn là địa chỉ IP cục bộ trên mạng LAN nằm sau lớp NAT).

Mido đã đăng một câu trả lời FANTASTIC, ở trên, đó dường như là câu trả lời duy nhất thực sự cung cấp địa chỉ IP của khách hàng.

Cảm ơn vì điều đó, Mido!

Tuy nhiên, chức năng được trình bày chạy không đồng bộ. Tôi thực sự cần phải sử dụng địa chỉ IP trong mã của mình và với giải pháp không đồng bộ, tôi có thể thử sử dụng địa chỉ IP trước khi lấy / học / lưu trữ. Tôi đã phải chờ kết quả để đến trước khi sử dụng chúng.

Đây là phiên bản "Chờ" của chức năng Mido. Tôi hy vọng nó sẽ giúp người khác:

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

Có một cách tiếp cận dễ dàng và miễn phí hơn sẽ không yêu cầu khách truy cập của bạn cho phép.

Nó bao gồm việc gửi một yêu cầu POST POST rất đơn giản tới http://freegeoip.net/json . Khi bạn nhận được thông tin vị trí của mình, trong JSON, bạn sẽ phản ứng tương ứng bằng cách cập nhật trang hoặc chuyển hướng đến một trang mới.

Đây là cách bạn gửi yêu cầu của bạn cho thông tin vị trí:

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

Có vẻ như họ đã tắt máy vào ngày 1 tháng 7 năm 2018
Nithin PH

13

Vâng, tôi đang lạc đề từ câu hỏi, nhưng tôi có một nhu cầu tương tự ngày hôm nay và mặc dù tôi không thể tìm thấy ID từ khách hàng bằng Javascript, tôi đã làm như sau.

Về phía máy chủ: -

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

Sử dụng Javascript

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

Tôi đang sử dụng ASP.Net Ajax, nhưng bạn có thể sử dụng getEuityById thay vì $ get ().

Điều gì đang xảy ra là, tôi đã có một yếu tố div ẩn trên trang với IP của người dùng được hiển thị từ máy chủ. Hơn trong Javascript tôi chỉ tải giá trị đó.

Điều này có thể hữu ích cho một số người có yêu cầu tương tự như của bạn (như tôi trong khi tôi chưa tìm ra điều này).

Chúc mừng!


20
-1: OP đặc biệt đề cập "không có mã phía máy chủ", nhưng bạn sử dụng một số C #.
Bruno Reis

8
Sẽ không tốt hơn nếu chỉ xuất ra <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines

ngoài việc sử dụng mã phía máy chủ, không bao giờ nên sử dụng DOM để lưu trữ dữ liệu. Đây chỉ là xấu tất cả. Hainesy có một ý tưởng tốt hơn là chỉ gán cho var var.
coblr

13

Với việc sử dụng API Geo-IP Smart-IP.net . Ví dụ: bằng cách sử dụng jQuery:

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

15
"Dịch vụ tạm thời không khả dụng".
Iago

đã viết một api đơn giản [ Geoip.immanuel.co/myip] để nhận địa chỉ IP của máy khách, bật ssl và không giới hạn
Immanuel

12

Nói chung là không thể trừ khi bạn sử dụng một số loại dịch vụ bên ngoài.


Thật vậy, điều này có thể sử dụng Javascript bằng cách dựa vào dịch vụ của bên thứ ba như Ipregology (từ chối trách nhiệm: Tôi chạy dịch vụ): ipregistry.co/docs/getting-location-from-ip-address#javascript Bạn có thể nhận địa chỉ IP và nhiều thông tin liên quan bao gồm dữ liệu về mối đe dọa, tất cả chỉ trong một cuộc gọi.
Laurent

9

Nhận IP của bạn với jQuery

bạn có thể lấy địa chỉ IP công cộng của mình bằng một dòng JS không? Có một dịch vụ miễn phí cung cấp dịch vụ này cho bạn và yêu cầu nhận là tất cả những gì bạn cần làm:

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

Để đoạn mã trên hoạt động, trình duyệt của bạn sẽ phải hỗ trợ CORS (chia sẻ yêu cầu nguồn gốc chéo). Nếu không, một ngoại lệ bảo mật sẽ được ném. Trong các trình duyệt cũ hơn, bạn có thể sử dụng phiên bản này, sử dụng yêu cầu JSON-P:

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

9

Bạn có thể sử dụng thư viện 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
});

Bạn cũng có thể sử dụng các yêu cầu để tải tập lệnh.

Nó sẽ cung cấp cho bạn địa chỉ IP của khách truy cập của bạn, cũng như một vài dữ liệu về vị trí của nó (quốc gia, thành phố, v.v.). Nó dựa trên cơ sở dữ liệu maxmind Geoip.

Tuyên bố miễn trừ trách nhiệm: Tôi đã viết thư viện này


8

Javascript / jQuery nhận Địa chỉ & Địa chỉ IP của Khách hàng (Quốc gia, Thành phố)

Bạn chỉ cần nhúng một thẻ với liên kết "src" đến máy chủ. Máy chủ sẽ trả về "codehelper_ip" dưới dạng Object / JSON và bạn có thể sử dụng nó ngay lập tức.

// 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>

Thêm thông tin tại Javascript Phát hiện địa chỉ IP thực cộng với quốc gia

Nếu bạn đang sử dụng jQUery, bạn có thể thử:

console.log(codehelper_ip); 

Nó sẽ cho bạn thấy nhiều thông tin hơn về đối tượng trả lại.

Nếu bạn muốn chức năng gọi lại, vui lòng thử điều này:

// 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
không sử dụng languagethuộc tính, type="text/javascript"thay vào đó , sử dụng nhiều hơn trên MDN
Alex K

như @Alex đã đề cập, ngôn ngữ không được dùng nữa và chỉ được sử dụng trong mã kế thừa. Thay vào đó, hãy sử dụng 'type = "text / javascript"' để tương thích tối đa.
Gautham C.

1
chỉ FYI - trường loại không cần thiết cho HTML5 (JS là mặc định). w3schools.com/tags/att_script_type.asp
pmont

Chỉ trong trường hợp bạn bỏ lỡ những bình luận khác, bạn nên sử dụng loại thay vì ngôn ngữ
Mike

8

Dịch vụ gọi lại của Appspot.com không khả dụng. ipinfo.io dường như đang làm việc.

Tôi đã làm thêm một bước và lấy tất cả thông tin địa lý bằng AngularJS. (Cảm ơn Ricardo) Hãy xem thử.

<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>

Trang làm việc tại đây: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html


8

Nếu bạn đang bao gồm một anways tệp, bạn có thể thực hiện ajax đơn giản:

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

ajax.getIp.phpsẽ là thế này:

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

8

Tôi thật sự thích api.ipify.org vì nó hỗ trợ cả HTTP và HTTPS.

Dưới đây là một số ví dụ về việc sử dụng địa chỉ IP api.ipify.org cách sử dụng jQuery.

Định dạng JSON trên 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>

Định dạng JSON qua 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>

Định dạng văn bản qua HTTPS

Nếu bạn không muốn nó trong JSON, thì cũng có một phản hồi rõ ràng trên HTTPS

https://api.ipify.org

Định dạng văn bản qua HTTP

Và cũng có một phản hồi rõ ràng qua HTTP

http://api.ipify.org

8

sử dụng ipdata.co .

API cũng cung cấp dữ liệu định vị địa lý và có 10 điểm cuối toàn cầu, mỗi điểm có thể xử lý> 800 triệu yêu cầu mỗi ngày!

Câu trả lời này sử dụng Khóa API 'kiểm tra' rất hạn chế và chỉ có nghĩa là để thử nghiệm một vài cuộc gọi. Đăng ký Khóa API miễn phí của riêng bạn và nhận tới 1500 yêu cầu hàng ngày để phát triển.

$.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

Thực sự không có cách nào đáng tin cậy để lấy địa chỉ IP của máy khách.

Điều này đi qua một số khả năng. Mã sử ​​dụng Java sẽ bị hỏng nếu người dùng có nhiều giao diện.

http://nanoagent.blogspot.com/2006/09/how-to-find-evalu-remoteaddrclents.html

Nhìn vào các câu trả lời khác ở đây, có vẻ như bạn có thể muốn lấy địa chỉ IP công khai của khách hàng, có lẽ là địa chỉ của bộ định tuyến họ đang sử dụng để kết nối với internet. Rất nhiều câu trả lời khác ở đây nói về điều đó. Tôi sẽ khuyên bạn nên tạo và lưu trữ trang bên máy chủ của riêng bạn để nhận yêu cầu và trả lời bằng địa chỉ IP thay vì phụ thuộc vào dịch vụ của người khác có thể tiếp tục hoạt động.


7

Tôi sẽ cung cấp một phương pháp mà tôi sử dụng rất nhiều khi tôi muốn lưu trữ thông tin trong trang html và muốn javascript của tôi đọc thông tin mà không thực sự phải truyền tham số cho javascript. Điều này đặc biệt hữu ích khi tập lệnh của bạn được tham chiếu bên ngoài, thay vì nội tuyến.

Tuy nhiên, nó không đáp ứng tiêu chí "không có kịch bản phía máy chủ". Nhưng nếu bạn có thể bao gồm kịch bản phía máy chủ trong html của mình, hãy làm điều này:

Tạo các thành phần nhãn ẩn ở cuối trang html của bạn, ngay phía trên thẻ thân cuối.

Nhãn của bạn sẽ trông như thế này:

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

Hãy chắc chắn để tạo một lớp được gọi hiddenlabelvà thiết lậpvisibility:hidden để không ai thực sự nhìn thấy nhãn. Bạn có thể lưu trữ nhiều thứ theo cách này, trong các nhãn ẩn.

Bây giờ, trong javascript của bạn, để lấy thông tin được lưu trong nhãn (trong trường hợp này là địa chỉ IP của khách hàng), bạn có thể làm điều này:

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

Bây giờ biến "ip" của bạn bằng địa chỉ ip. Bây giờ bạn có thể chuyển ip cho yêu cầu API của bạn.

* CHỈNH SỬA 2 NĂM Hai sàng lọc nhỏ:

Tôi thường xuyên sử dụng phương pháp này, nhưng gọi nhãn class="data" , bởi vì, trên thực tế, đó là một cách để lưu trữ dữ liệu. Tên lớp "hiddenlabel" là một loại tên ngu ngốc.

Sửa đổi thứ hai là trong biểu định kiểu, thay vì visibility:hidden:

.data{
    display:none;
}

... là cách tốt hơn để làm điều đó.


3
Không lưu trữ dữ liệu trong DOM. Tại sao mọi người sẽ đề nghị rằng, thậm chí 2 năm sau? Nếu bạn có thể tiêm bất cứ thứ gì vào tệp HTML, chỉ cần đưa giá trị đó vào một biến JS như vậy. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </ script>. Ít nhất thì trình đọc màn hình sẽ bỏ lỡ nó và không yêu cầu getEuityById hoặc $ ('# ngu ngốc').
coblr

@fractalspawn, Vì lý do bạn không thể chèn mã php vào tệp .js. Không nghĩ đến điều đó, bạn có quần thông minh không! ;)
TARKUS

Chà, bạn có thể nếu bạn đã làm <script type = "text / javascript" src = "path / to / Fancy / javascript.php"> </ script> mặc dù tôi không chắc tại sao bạn lại làm vậy. Quan điểm của tôi là nếu PHP có thể chèn bất cứ thứ gì vào HTML mà nó hiển thị, thì cách tốt nhất là sử dụng nó để chèn một giá trị vào biến JS trong thẻ script nội tuyến, thay vì vào phần tử DOM mà sau đó bạn phải phân tích cú pháp để sử dụng và có khả năng có thể được đọc bởi trình đọc màn hình trừ khi bạn thực hiện các biện pháp bổ sung để ngăn chặn nó.
coblr 23/2/2015

Hoàn toàn không có lý do chính đáng tại sao bạn không thể hoặc không nên thêm các yếu tố giữ dữ liệu vào DOM và có rất nhiều lý do chính đáng để thực hiện. Trong thực tế, những lý do đó là trong câu trả lời của tôi, nếu bạn muốn đọc lại nó. Nó đáng tin cậy, dễ kiểm soát và đặc biệt hữu ích khi tệp javascript của bạn xảy ra trên một trang web từ xa. Nói về kịch bản từ xa, ví dụ về "javascript.php" của bạn là một ý tưởng khủng khiếp và dù sao thì có lẽ sẽ không hoạt động. Hãy suy nghĩ về các kịch bản từ xa, chẳng hạn như DISQUS.
TARKUS 24/2/2015

3
Đối với nhận xét khác của bạn về lý do tại sao lưu trữ dữ liệu DOM là xấu .. tốt, bạn vẫn có thể dừng xe bằng cách nhẹ nhàng đâm vào tường tại điểm đến của mình, nhưng hiện tại có nhiều công cụ tốt hơn cho công việc. Bây giờ chúng ta biết rõ hơn và có những khuôn khổ tuyệt vời để giảm bớt điều này. Tôi đã làm việc tại một nơi mà DOM chỉ là một tệp cấu hình khổng lồ cho JS và đó là một cơn ác mộng khi được thiết kế lại. Nếu bạn cảm thấy rằng việc sử dụng <script src = "Something.php"> là một "hack thô", nhưng việc lưu trữ dữ liệu trong DOM chỉ có giá trị bên trong Javascript thì không, tôi thực sự rất vui vì chúng tôi không làm việc cùng nhau và sẽ một lần nữa, vui vẻ đồng ý không đồng ý. :)
coblr

6
    $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });


6

Trước hết câu trả lời thực tế : Không thể sử dụng mã thực thi hoàn toàn phía máy khách để tìm ra địa chỉ IP của riêng bạn.

Tuy nhiên, bạn chỉ có thể thực hiện NHẬN về https://api.muctool.de/whois và nhận được một cái gì đó như để có được địa chỉ IP của khách hàng

{
"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

Bạn có thể thực hiện điều này hoàn toàn phía máy khách và chủ yếu bằng JavaScript bằng cách sử dụng đối tượng Flash mà js có thể gọi. Flash có thể truy cập địa chỉ IP của máy cục bộ có thể không hữu ích lắm.


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

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

data.hostlà địa chỉ IP. Đơn giản chỉ cần gọi đây từ trình duyệt của bạn.

http://smart-ip.net/geoip-json?callback=? [Không có dấu ngoặc kép] và nhận được ip.


xin lỗi, $ có nghĩa là gì trong javascript?
GHOST
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.