使用必应查询接口开发搜索工具:反查一个IP上的旁站

简介:

一 API申请

申请地址:https://datamarket.azure.com/dataset/bing/search

当然首先要进行登陆,没有账号的话就注册一个,但是需要注意的是“国家/地区”这个地方最好别填中国大陆,填香港,台湾或者其他国家都行。

wKiom1Z3SGnAWdW6AAB81VwqqxQ954.png

订阅的时候选择第一个就行,因为一般情况下1个月查询5000次已经够用了

wKiom1Z3SKjC5ejkAACQXEvwDHA807.png

订阅完成后,点击“我的账户”,把“主帐户密钥”给记下来,待会要用

wKioL1Z3SPmRtn8AAACsvjEOr_Y180.png

wKioL1Z3SPuB9TZ0AACWJA8JRqU064.png

二 使用之前需要了解的简单概念

这里我推荐一个官网提供的调试页面:https://datamarket.azure.com/dataset/explore/bing/search

wKiom1Z3STWjDeWiAADtOrokaj0880.png

使用这个API主要需要注意以下几点:

(1请求URLhttps://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);
		}
	
	}

}

四 测试结果

wKioL1Z3SgSBcCcdAACKr87Av3s789.png



本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1726670,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
LLM 系列 | 18:如何基于LangChain打造联网版ChatGPT?
今天这篇小作文是LangChain实践专题的第2篇,简单介绍LangChain的用途及如何利用LangChain将ChatGPT和搜索引擎(Google)结合起来,从而实现一个极简的联网版ChatGPT。
|
安全 网络架构
锐捷NBR路由器存在弱口令漏洞
锐捷NBR路由器存在弱口令漏洞
锐捷NBR路由器存在弱口令漏洞
|
9月前
|
NoSQL 测试技术 MongoDB
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧
273 0
|
存储 SQL Oracle
云原生分布式数据库PolarDB技术深度解密
无论是部署量还是规模上,开源生态正在超越商业数据库的生态。目前不断涌现的数据库,通常都会兼容开源生态或者自己开源。 数据库的发展演进从最初在云下,后来慢慢到了云上,如今又有走向云下的趋势。我们发现,原来商业数据库的一些东西又回来了,如很多大客户喜欢的特性,是开源数据库不具备,而商业数据库所擅长的。如何在开源数据库上做好企业级特性,我们在这上面做了大量的工作。
1662 0
云原生分布式数据库PolarDB技术深度解密
|
弹性计算 Kubernetes 负载均衡
阿里云ACK产品安全组配置管理
这篇文章会以ACK产品安全组的配置管理为核心,深入讨论安全组在集群中扮演的角色,安全组在网络链路中所处的位置,以及非法修改安全组会产生的各类问题。文章内容适用于专有集群和托管集群。
阿里云ACK产品安全组配置管理
|
Web App开发 前端开发 JavaScript
Selenium 如何定位 JavaScript 动态生成的页面元素
Selenium 是一个自动化测试工具,可以用来模拟浏览器的操作,如点击、输入、滚动等。但是有时候,我们需要定位的页面元素并不是一开始就存在的,而是由 JavaScript 动态生成的。这时候,如果我们直接用 Selenium 的 find_element 方法去定位元素,可能会出现找不到元素的错误,因为页面还没有加载完成。为了解决这个问题,我们需要使用一些特定的定位技巧,让 Selenium 等待元素出现后再进行操作。
616 0
|
监控 Unix Linux
Flask项目能打包为单个exe文件运行?知道原理后简直不要太简单!
Python打包工具主要有三种:py2exe、PyInstaller和cx_Freeze。虽然是三种工具,但是实现打包的方式都是大同小异。无非将Python运行所需的基础dll文件和源码依赖的模块筛选后聚合在一起,从而达到脱离环境单独运行的目的。但其中比较新奇的是它们居然可以将最终代码打包成单个文件去运行,简直不要太神奇。 清风常用的打包工具为pyinstaller,安装下载简单,网上的文档也很齐全。
1396 0