很久之前小编出过一版仿[ONE·一个]的帖子,由于接口用的是第三方开发的,目前第三方接口GG了,无奈只好自己动手搞事情。
于是有了下面的分析过程…..
在浏览官网的过程中,进行数据包拦截分析,最终分析出官方的API请求地址以及其他注意事项。
抓包分析的页面是官网:
1 |
http://m.wufazhuce.com/one |
在控制台可以看到:
API返回结果
获取token
当然,前边的请求地址中的_token
参数是必须的,也是随机的(每个浏览器中所生成的都不同)
那我们从哪获取呢?
在html源码里:
所以我们只能解析该html数据,通过正则得到我们需要的token
1 |
Pattern r = Pattern.compile(pattern).matcher(HTML); |
获取Cookie
就这么结束了吗?
不是的!我们获取到了token,但是请求的时候,会直接返回错误的数据:
这是为什么呢?
经过多次尝试,发现了问题所在:_token和Cookie是相关联的
当然上述的_token
和Cookie
获取可以在一次请求中完成,因为第一次请求,会返回一个Set-Cookie
的header:
通过尝试发现只需要用到的参数是:PHPSESSID
那么一通分析后:
上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
package com.util; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; import java.net.CookieStore; import java.net.HttpCookie; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.net.URLDecoder; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class OneDataUtil { public static void main(String[] args) throws Exception { String url="http://m.wufazhuce.com/one"; String data=null; //获取韩寒One一个网站接口Cookie PHPSESSID String cookies=getCookies(url); //获取韩寒One一个网站接口Token String token =getToken(url); System.out.println(token); System.out.println(cookies); //分页ajaxlist/0,调整这个0就可以做到分页拿数据了 url=url+"/ajaxlist/0?_token="+token; data=getData(url,cookies); System.out.println(data); } //获取最新的Cookie public static String getCookies(String requestUrl) { try{ CookieManager manager=new CookieManager(); manager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); CookieHandler.setDefault(manager); URL url=new URL(requestUrl); HttpURLConnection conn= (HttpURLConnection) url.openConnection(); url.getContent(); conn.getHeaderFields(); CookieStore store = manager.getCookieStore(); List<HttpCookie> lCookies=store.getCookies(); //System.out.printf("共%s个cookie\n",lCookies.size()); for (HttpCookie cookie: lCookies) { /* System.out.printf("原:%s 名称:%s 解码值:%s\n", cookie.toString(), cookie.getName(), URLDecoder.decode(cookie.getValue(), "UTF8")); */ return URLDecoder.decode(cookie.getValue(), "UTF8"); } }catch (Exception e){ //e.printStackTrace(); return null; } return null; } //获取token public static String getToken(String requestUrl) throws Exception { OneDataUtil cm = new OneDataUtil(); String HTML = cm.getHtml(requestUrl); String token =null; String pattern = "One.token.*"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(HTML); while(m.find()){ token= m.group(0); } return token.split("One.token = '")[1].split("'")[0]; } //获取HTML内容 private String getHtml(String url)throws Exception{ URL url1=new URL(url); URLConnection connection=url1.openConnection(); InputStream in=connection.getInputStream(); InputStreamReader isr=new InputStreamReader(in); BufferedReader br=new BufferedReader(isr); String line; StringBuffer sb=new StringBuffer(); while((line=br.readLine())!=null){ sb.append(line,0,line.length()); sb.append('\n'); } br.close(); isr.close(); in.close(); return sb.toString(); } //获取数据 public static String getData(String req_url,String Cookies) { String Parma="PHPSESSID="+Cookies; StringBuffer buffer = new StringBuffer(); try { URL url = new URL(req_url); HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); httpUrlConn.setDoOutput(false); httpUrlConn.setDoInput(true); httpUrlConn.setUseCaches(false); httpUrlConn.setRequestMethod("GET"); httpUrlConn.setUseCaches(false); // 设置该HttpURLConnection实例是否自动执行重定向 httpUrlConn.setInstanceFollowRedirects(true); httpUrlConn.setRequestProperty("Cookie", Parma); //将获取的Cookie传入 System.out.println(req_url+"=========="+Parma); httpUrlConn.connect(); // 将返回的输入流转换成字符串 InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); // 释放资源 inputStream.close(); inputStream = null; httpUrlConn.disconnect(); } catch (Exception e) { System.out.println(e.getStackTrace()); } return buffer.toString(); } } |
数据分页的情况在代码注释中有简单描述大家可以自行尝试
依旧是配上精美调整的前端页面就可以食用了,有兴趣的小伙伴可以直接拿去享用~
对外提供接口(GET):http://zzyoumei.com:8080/Blossom-Briefs/Interesting/one.do?page={做分页用}
参数:page(非必填)不传默认0
写在最后
「ONE · 一个」是韩寒先生监制、原《独唱团》主创共同制作的一款年轻人文艺阅读应用,于2012年10月8日上线,当日就获得了APP STORE总榜第一名。 至今已获得了近三千万用户,并维持每天近两百万的活跃独立访问,每一期内容分享逾万次,总阅读量十亿以上。 目前「ONE · 一个」已更新至4.0版本,集合阅读、音乐、电影内容,不仅是流行的新媒体阅读产品,也是极具价值的故事IP发表平台和储备库。
ONE·一个APP、网站内所有内容版权均属ONE·一个公司所有,受各国版权法及国际版权公约的保护。任何媒体、网站或个人未经本公司书面协议授权不得转载、链接、转贴或以其他方式复制发布、发表ONE·一个APP、网站内的内容。 对于上述版权内容,超越合理使用范畴、并未经本公司书面许可的使用行为,我公司均保留追究法律责任的权利。
表哥牛逼!