使用 freegeoip 获取 IP 列表

Posted

技术标签:

【中文标题】使用 freegeoip 获取 IP 列表【英文标题】:Using freegeoip for a list of IPs 【发布时间】:2017-08-03 22:33:52 【问题描述】:

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

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

我有一个数组中的 IPS 列表,通过

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

我可以通过输入框得到他们每个人的位置

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

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

所以,我有这个:

8.8.8.8
8.8.8.8

但我需要这个

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

如何通过http://freegeoip.net/json/ 处理整个数组?谢谢。

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

var ipText='Lookup...';
var table = document.createElement('table');
table.innerHTML = forext;
var ips = [].slice.call(table.querySelectorAll('a[href*="?ip="]')).map(anchor => anchor.textContent).join("\n");

var ipLocations = [];

for(i=0;i<ips.length;i++)

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

  );



ipText = ipLocations.join('\n');
message.innerText = ipText;

【问题讨论】:

您是否尝试过使用$('.ip').val()+' - '+data.city 或只是猜测但data.ip 如果它包含在json 中...... 示例: $('.city').text(data.ip+" - "+data.city); 或者创建另一个跨度并将data.ip+" - " 附加到那个... “打印 IP”是什么意思?您是指将它们插入 HTML,还是将它们记录在浏览器控制台中? 无论哪种方式,听起来您都想研究 javascript for...of loops。如果您在将结果插入页面内容时遇到问题,您应该查看 jQuery 文档以了解如何创建和插入新元素,并在循环中执行此操作 你需要什么“继续整个数组”?阵列将来自哪里?几个文本输入字段? '.ip' 文本字段,用逗号分隔?如果您想在现有 IP 旁边添加 IP,只需在“.city”跨度之前添加一个跨度,例如 &lt;span class="theIP"&gt;&lt;/span&gt; - 并在您的 onclick 函数中添加 $('.theIP').text(data.ip); after the $('.country')... @JessicaRay 啊,所以你有多个 IP ......你不认为从一开始就在你的问题中说这个是相关的吗?您还添加了更多相关的源代码......还有什么与您的问题相关的吗?如果是这样,那么我建议您添加它而不是让人们猜测。 【参考方案1】:

首先,您确实希望您的 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 文档中,您可能希望加入 &lt;br&gt; 而不是 \n,在许多情况下,\n 等空白字符将被忽略,你最终会在一行中得到所有输出。

更新:

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

首先,代码中的问题:

您从未从定义ips 的第4 行中删除.join("\n"),因此它仍然只是一个字符串而不是字符串数组。这意味着您的 for 循环实际上是循环遍历 ips 字符串中的每个单独字符,而不是完整的 IP 地址。 您尝试访问循环内的data.ips[i]data 变量包含对您的 AJAX 请求的 JSON 响应,但由 jQuery 自动从 JSON 字符串转换为实际的 JavaScript 对象。它仅具有响应中包含的属性。在这种情况下,响应始终具有ip 属性,因此您可以访问data.ip。但是,ips 是您创建的变量——data.ips 不存在,因此您无法访问其索引。 附带说明,如果您使用for...of 语法,您还可以使用一个名为ip 的循环变量。但是,您需要了解ipdata.ip 不是同一个变量,即使在这种情况下它们总是具有相同的值。 URL 以“https://”而不是“https://”开头。这实际上是我的错,我在原来的答案中打错了>_>;

除此之外,您在评论中提出了一个非常重要的观点 - 函数$.getJSON() 是异步的,因此(忽略其他问题)您编写的代码在更新 1 中可能不会像您期望的那样。即使您的 AJAX 请求还没有响应,调用 getJSON 之后的代码也会继续运行,因此如果您立即访问 ipLocs 数组,它可能只有一些输出字符串,甚至是空的.

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

var ipLocations = [];
for (var ip of ips) 
  $.ajax(
    url: 'https://freegeoip.net/json/' + ip,
    async: false,
    success: function(data) 
      var outputString = data.ip + ' - ' + data.city + ', ' + data.country_code; 
      ipLocations.push(outputString);
    
  );

【讨论】:

谢谢!我很接近但这里出了点问题:code var table = document.createElement('table'); table.innerHTML = forext; var ips = [].slice.call(table.querySelectorAll('a[href*="?ip="]')).map(anchor => anchor.textContent).join("\n"); ipText = ''; for(i=0;icode 呃...您复制了代码,但您遇到的实际问题是什么? 另外,我完全忘了把var放在我的变量声明前面,使它们成为全局变量,这实际上不应该在这里造成任何明显的问题,但很愚蠢,所以我已经编辑了。跨度> 抱歉……我的意思是 for(i=0;i 哦,等等,我想我确实看到了问题所在。我将编辑我的答案。

以上是关于使用 freegeoip 获取 IP 列表的主要内容,如果未能解决你的问题,请参考以下文章

php没有从freegeoip.net获取邮政编码

使用freegeoip从shell获取经纬度

如何使用 Java 获取连接在同一网络(子网)中的 IP 列表

python获取ip代理列表爬虫

FreeGeoIP.net Webservice - 服务值得信赖吗?

公网IP查看网址