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")); } } }