获取ngrok分配的IP端口

83163452 2017-12-06

ngrok

一句话描述:免费,暂时还不知道是否限制流量的,国外版本的---花生壳

主要的作用是内网穿透,将你指定的端口映射到互联网上访问

客户端下载地址

https://ngrok.com/download

支持WindowLinuxArmMacOS

代理区域默认US,可选亚洲、欧洲等

举例,我设置了web和ssh2种模式,分别是http地址https地址,ssh的tcp端口

因为免费用户,给的都是随机数(暂时用xxxx代替),第二列是你客户端的出口IP地址,第三列是调用服务所在区域,我选择的是新加坡(ap,这个距离总比us要好)

引用

http://xxxxx.ap.ngrok.io111.164.xx.xxap

https://xxxx.ap.ngrok.io111.164.xx.xxap

tcp://0.tcp.ap.ngrok.io:xxxx111.164.xx.xxap

原理就是客户端与远程提供服务的服务器创建了一个长连接,ngrok会开放接口对外可以访问,当有http或者tcp请求的时候他会转发相应的请求到你的客户端并返回结果(比如访问网站)这种方式可以很容易本地调试需要互联网应用的程序(如微信服务)

因为网上教程已经很多了,下面只是通过java登录网站,通过用户名密码获取当前自动分配的域名和端口信息,输出的结果如上所示

依赖jar文件

主要是jsoup用来解析html,阿里的fastjson用来解析json结果

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class JoupPost {	
	/**
	 * https网站登录并获取里面的json信息中的ip地址
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		//网站登录元素有用户名、密码、还有隐藏的token
		Map<String,String> map = new HashMap<String, String>();
		map.put("email", "[email protected]");
		map.put("password", "xxxx");
		//1获取token
		Connection con1 = Jsoup.connect("https://dashboard.ngrok.com/user/login");
		Response rs1 = con1.execute();
		Map<String,String> cookies = rs1.cookies();
		Document doc1 = rs1.parse();
		Elements es1 = doc1.getElementsByAttributeValue("name","csrf_token");
		if(!es1.isEmpty()){
			map.put("csrf_token",es1.get(0).attr("value"));
//			System.out.println(es1.get(0).attr("value"));
		}
		
		//通过token和cookie登录网站
		Connection con2 = Jsoup.connect("https://dashboard.ngrok.com/user/login");
		con2.referrer("https://dashboard.ngrok.com/user/login");
		con2.cookies(cookies);
		con2.timeout(60*1000);
		con2.data(map);
		con2.method(Method.POST);
		Response rs2 = con2.execute();
		cookies = rs2.cookies();
//		System.out.println("cookie2:"+cookies);
//		Document doc2 = rs2.parse();
//		System.out.println(doc2.body());
		
		//调用状态查询页面获取网页数据
		Connection con3 = Jsoup.connect("https://dashboard.ngrok.com/status");
		con3.referrer("https://dashboard.ngrok.com/status");
		con3.cookies(cookies);
		con3.timeout(30*1000);
		Document doc3 = con3.get();
//		System.out.println(doc3.body());
		
		//获取div标签、再获取标签内的json数据、再解析json
		Element e = doc3.getElementById("preloaded");
		JSONObject jo = JSONObject.parseObject(e.attr("data-value"));
		JSONArray ja = jo.getJSONArray("online_tunnels");
//		System.out.println(ja.toJSONString());
		
		for(Object j:ja){
			JSONObject o = (JSONObject)j;
			System.out.println(o.getString("url")+"\t "+o.getString("remote_addr")+"\t "+o.getString("region"));
		}
	}
}

相关推荐