前言:必应提供了“Bing Search API”,免费版的一个月可以查询5000次,我们可以通过调用这个API方便的使用必应的查询服务。其中“K8_C段旁注查询工具V2.0”就使用到了这个API,接下来我将详细说明在Java中如何使用这个API
一 API申请
申请地址:https://datamarket.azure.com/dataset/bing/search
当然首先要进行登陆,没有账号的话就注册一个,但是需要注意的是“国家/地区”这个地方最好别填中国大陆,填香港,台湾或者其他国家都行。
订阅的时候选择第一个就行,因为一般情况下1个月查询5000次已经够用了
订阅完成后,点击“我的账户”,把“主帐户密钥”给记下来,待会要用
二 使用之前需要了解的简单概念
这里我推荐一个官网提供的调试页面:https://datamarket.azure.com/dataset/explore/bing/search
使用这个API主要需要注意以下几点:
(1)请求URL:https://api.datamarket.azure.com/Bing/Search/v1/Web
(2)几个常用参数:
i)Query 表示需要查询的内容,这里由于我们是要查一个IP上的网站,因此应该是:ip:IPName,比如:Query=’ip:180.97.161.184′
ii)$format=json 表示返回的数据格式是json
iii)$top=100 每页最多显示100条记录
iiii)$skip 表示从第几条记录开始查询,相当于翻页,查询第几页,需要和$top结合起来使用
(3)调用这个API需要使用“主帐户密钥”进行认证
Java中是这样设置的:
private String sAuth = ""; //认证
this.sAuth = "Basic " + Base64.encodeBase64String((":" + AppId).getBytes()); //认证信息connection.setRequestProperty("Authorization", sAuth);注:这里进行Base64加密用到了commons-codec-1.9.jar,可以去官网下载,也可以使用我这个
百度云盘链接:http://pan.baidu.com/s/1kUcGPQB
三 测试代码
package whois;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.codec.binary.Base64;
public class BingDemo {
private String sAuth = ""; //认证
private String query = ""; //查询旁站
public BingDemo(String AppId,String ip) {
this.sAuth = "Basic " + Base64.encodeBase64String((":" + AppId).getBytes()); //认证信息
this.query = "Query=‘ip:" + ip + "‘";
}
public static void main(String[] args) {
String AppId = "你的主账户秘钥"; //API Key
BingDemo bingDemo = new BingDemo(AppId, "180.97.161.184");
Set<String> set = new LinkedHashSet<String>();
set = bingDemo.searchDomainByBing();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
/**
* 通过必应的接口查询一个IP的旁站(已去重)
*
* @return LinkedHashSet<String>类型的集合
*
* */
public Set<String> searchDomainByBing(){
Set<String> set = new LinkedHashSet<String>(); //查到的域名的有序集合
String domains = searchDomains(0);
String[] domainsByBing = domains.split(" ");
for(String s : domainsByBing){
if(!"".equals(s)){
set.add(s);
}
}
return set;
}
/**
* 通过必应的接口查询一个IP的旁站的一页结果
*
* @param skip 页数标志,每增加100相当于翻一页
*
* @return 查到的所有结果的字符串合集(未去重)
* */
public String searchDomains(int skip){
String displayUrl = ""; //最后的域名合集
try {
URL url = new URL("https://api.datamarket.azure.com/Bing/Search/v1/Web?" + query
+ "&$format=json" + "&$top=100" + "&$skip=" + skip);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(10000); //毫秒
connection.setReadTimeout(10000);
connection.setRequestProperty("Authorization", sAuth);
InputStream inputStream = new BufferedInputStream(connection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
String reg = "\"DisplayUrl\":\"(([a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+)/?.*?)?\",\"Url\":";
Pattern pattern = Pattern.compile(reg);
Matcher matcher;
while((line = reader.readLine()) != null){
matcher = pattern.matcher(line);
while(matcher.find()){
displayUrl = displayUrl + matcher.group(2) + " ";
// System.out.println(displayUrl);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//说明上一页就已经结束了
if("".equals(displayUrl))
return displayUrl;
//继续查询下一页
else{
return displayUrl + searchDomains(skip + 100);
}
}
}四 测试结果
本文出自 “zifangsky的个人博客” 博客,请务必保留此出处http://983836259.blog.51cto.com/7311475/1726670
原文地址:http://983836259.blog.51cto.com/7311475/1726670