使用freegeoip获取IP列表

时间:2017-08-03 22:33:52

标签: javascript geolocation freegeoip

请给我一个简单的提示,在哪里挖!

我有多个IP,需要在每个IP旁边显示位置。

我通过

列出了数组中的IPS
struct LinkedListNode *head = linkedList.head;

我可以通过输入框

获取每个位置
var table = document.createElement('table');
table.innerHTML = forext;
var ips = [].slice.call(table.querySelectorAll('a[href*="?ip="]')).map(anchor => anchor.textContent).join("\n");

8.8.8.8
8.8.4.4 
...

但我需要的是打印IP及其旁边的位置:

所以,我有这个:

$('.send').on('click', function(){

  $.getJSON('https://ipapi.co/'+$('.ip').val()+'/json', function(data){
      $('.city').text(data.city);
      $('.country').text(data.country);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input class="ip" value="8.8.8.8">
<button class="send">Go</button>
<br><br>
<span class="city"></span>, 
<span class="country"></span>

但我需要这个

8.8.8.8
8.8.8.8

如何通过http://freegeoip.net/json/继续整个阵列?谢谢。

更新1:尝试使用:ips [i]

8.8.8.8 -Mountain View, US
8.8.8.8 -Mountain View, US
...

1 个答案:

答案 0 :(得分:0)

首先,你真的希望你的IP是一个字符串数组,而不是一个字符串。因此,您应该更改var ips = ...的声明并从最后删除.join("\n") - 这会将您方便的IP字符串列表转换为单个字符串,其中IP由换行符分隔,您不需要不想要。

然后,如果您有一个类似ips = ['8.8.8.8', '8.8.4.4', ... ];

的表单的IP地址数组

...然后您可以通过以下方式获得您描述的输出:

var ipLocations = [];
for (var ip of ips) {
  $.getJSON('https://freegeoip.net/json/' + ip, function(data) {
    // could also use data.country_name, or any other property in the returned JSON
    var outputString = data.ip + ' - ' + data.city + ', ' + data.country_code; 
    ipLocations.push(outputString);
  });
}

现在您有一个包含IP地址+位置的字符串数组,如您所述。如果您现在想要将 THAT 转换为单个字符串,则可以执行ipText = ipLocations.join('\n');以使换行字符分隔输出行。

如果您要将此文本输出到HTML文档中,您可能希望加入<br>而非\n,有许多上下文字符如{{1}将被忽略,你最终将所有输出都放在一行上。

<强>更新

我的原始答案中有一些非常愚蠢的错误,其中主要是我混合了Python和JavaScript语法(facepalm)。修复它们后,此代码可以正常工作。话虽如此,有一些需要注意的警告,以及你应该真正尝试理解的Update 1代码中的一些错误。

首先,代码中的问题:

  • 你永远不会从你定义\n的第4行中删除.join("\n"),所以它仍然只是一个字符串而不是一个字符串数组。这意味着你的for循环实际上是在ips字符串中的每个字符上循环,而不是完整的IP地址。
  • 您尝试在循环内部访问ipsdata.ips[i]变量包含对您的AJAX请求的JSON响应,但是通过jQuery自动从JSON字符串转换为实际的JavaScript对象。它只包含响应中包含的属性。在这种情况下,响应始终具有data属性,因此您可以访问ip。但是,data.ip是您创建的变量 - ips不存在,因此您无法访问其索引。
    • 作为旁注,如果您使用data.ips语法,您还可以使用名为for...of的循环变量来代替。但是,您需要了解ipip不是同一个变量,即使它们在这种情况下总是具有相同的值。
  • 网址以“https:/”开头,而不是“https://”。这个实际上是我的错,我在原来的答案&gt; _&gt;;
  • 中输入了它

有了这个,你在评论中提出了一个非常重要的观点 - 函数data.ip是异步的,所以(忽略其他问题)代码就像你一样在Update 1中写下它可能不会达到预期效果。调用$.getJSON()后的代码将继续运行,即使您的AJAX请求还没有响应,所以如果您立即访问getJSON数组,它可能只有一些输出字符串,甚至是空的。

我不会解释如何等待非阻塞代码,因为这是一个完全不同的问题。考虑到你对JavaScript的熟悉程度,我也担心它会让事情变得更加混乱。但是,如果您只想要一个快速的解决方案,为您提供您期望的结果,即使它不是最佳实践,那么您可以使用ipLocs函数而不是ajax。这允许您明确告诉jQuery同步发送您的AJAX请求,这意味着它将在继续运行您的代码之前等待响应。但是,您需要注意同步请求可能会暂时锁定您的浏览器,在请求完成之前阻止任何其他操作。那个版本看起来像这样:

getJSON