参考文章:PHP将淘宝客链接转换提取成普通淘宝链接
最近在做淘宝客网站,有个地方需要把淘宝客链接转换成正常的淘宝链接,找了很多文章都没有java的,只要按照一个php的文章自己改写了一下,文章内容有很多相同的地方。个人技术不咋滴,写的不完善的地方望大神指点。
1.先贴出主要的HttpGet方法,获取URL的handler
public static String HttpGetHeader(String url, String referer, String name) {
String value="";
CloseableHttpClient httpclient = createSSLClientDefault();
try {
// 创建httpget.
HttpGet httpget = new HttpGet(url);
HttpParams params = new BasicHttpParams();
params.setParameter("http.protocol.handle-redirects", false); // 默认不让重定向
// 这样就能拿到Location头了
httpget.setParams(params);
httpget.setHeader("Referer", referer);
// 执行get请求.
CloseableHttpResponse response = httpclient.execute(httpget);
for (Header header : response.getAllHeaders()) {
if(name.equals(header.getName())){
value=header.getValue();
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return value;
}
2.首先获取淘宝客链接
String url = "https://s.click.taobao.com/t?e=m%3D2%26s%3DvOGm3QkUYkUcQipKwQzePOeEDrYVVa64LKpWJ%2Bin0XJRAdhuF14FMahPMeAH3ua1xq3IhSJN6GRQv"+
"IOjjqrm2mHsE2aIN1SQFGN2SfoDBWWvLek%2B0zMncU%2FFqDGjYg6Gf1JQd0f50BEK2pKIe%2BSnW4UTCT8olmq1K7NVy%2F1NHQyW5RzxTPSo5MYl7w3%2FA2kb";
3,获取初步跳转后的URL:
//htteGet方法获取url的hander中的Location
String tu = HttpGetHeader(url, "","Location");
System.out.println("tu=\""+tu+"\";");
打印结果为
tu="https://s.click.taobao.com/t_js?tu=https%3A%2F%2Fs.click.taobao.com%2Ft%3Fe%3Dm%253D2%2526s%253DvOGm3QkUYkUcQipKwQzePOeEDrYVVa64LKp
WJ%252Bin0XJRAdhuF14FMahPMeAH3ua1xq3IhSJN6GRQvIOjjqrm2mHsE2aIN1SQFGN2SfoDBWWvLek%252B0zMncU%252FFqDGjYg6Gf1JQd0f50BEK2pKIe%252BSnW4UTCT
8olmq1K7NVy%252F1NHQyW5RzxTPSo5MYl7w3%252FA2kb%26ref%3D%26et%3Dyco%252B7wPMdYqpbwX7uD%252F7%252FkS7vntRnYIb";
因此链接中带有一个参数tu,后面要用到,所以将此链接取名为tu,继续下一步。
4.取得tu链接中的tu参数,也就是等号后面的内容:
String ref = tu.substring(tu.indexOf("tu=")+3,tu.length());
对编码熟悉的同学应该看出来了这其实是一条URL地址被escape编码了,我们使用java自定义一个解码函数对其进行处理一下,网上找到的unescape解码函数:
public static String unescape(String src) {
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos = 0, pos = 0;
char ch;
while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src
.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src
.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}
解码:
ref = unescape(ref);
System.out.println("ref=\""+ref+"\";");
打印结果为
ref="https://s.click.taobao.com/t?e=m%3D2%26s%3DvOGm3QkUYkUcQipKwQzePOeEDrYVVa64LKpWJ%2Bin0XJRAdhuF14FMahPMeAH3ua1xq3IhSJN6GRQvIOjjqrm2mHsE2a
IN1SQFGN2SfoDBWWvLek%2B0zMncU%2FFqDGjYg6Gf1JQd0f50BEK2pKIe%2BSnW4UTCT8olmq1K7NVy%2F1NHQyW5RzxTPSo5MYl7w3%2FA2kb&ref=&et=yco%2B7wPMdYqpbwX7uD%2
F7%2FkS7vntRnYIb";
这地址跟我们获取的淘宝客链接几乎相同,就是后面多了两个参数,一个ref,一个et,这里我们把这个地址命名为ref。
淘宝客链接的跳转其实就是一个封装的JS程序,通过JS发起带有header参数的请求从而达到跳转的,这个header参数中最重要的就是referer,下面我就用httpGet模拟请求一下这个地址:
String taobaoUrl = HttpGetHeader(ref,tu,"Location");
System.out.println(taobaoUrl);
到这里就结束了:
打印的结果为https://item.taobao.com/item.htm?id=533121982458&ali_trackid=2:mm_70406380_14258197_63486373:1480647124_2k4_617621893
这就是一个普通的淘宝商品链接了。
完整代码
public static String HttpGetHeader(String url, String referer, String name) {
String value="";
CloseableHttpClient httpclient = createSSLClientDefault();
try {
// 创建httpget.
HttpGet httpget = new HttpGet(url);
HttpParams params = new BasicHttpParams();
params.setParameter("http.protocol.handle-redirects", false); // 默认不让重定向
// 这样就能拿到Location头了
httpget.setParams(params);
httpget.setHeader("Referer", referer);
// 执行get请求.
CloseableHttpResponse response = httpclient.execute(httpget);
for (Header header : response.getAllHeaders()) {
if(name.equals(header.getName())){
value=header.getValue();
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return value;
}
public static String unescape(String src) {
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos = 0, pos = 0;
char ch;
while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src
.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src
.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}
public static void main(String[] args) {
String url = "https://s.click.taobao.com/t?e=m%3D2%26s%3DvOGm3QkUYkUcQipKwQzePOeEDrYVVa64LKpWJ%" +
"2Bin0XJRAdhuF14FMahPMeAH3ua1xq3IhSJN6GRQvIOjjqrm2mHsE2aIN1SQFGN2SfoDBWWvLek%2B0zMncU%2FF" +
"qDGjYg6Gf1JQd0f50BEK2pKIe%2BSnW4UTCT8olmq1K7NVy%2F1NHQyW5RzxTPSo5MYl7w3%2FA2kb";
String tu = HttpGetHeader(url, "","Location");
String ref = tu.substring(tu.indexOf("tu=")+3,tu.length());
ref = unescape(ref);
String taobaoUrl = HttpGetHeader(ref,tu,"Location");
System.out.println(taobaoUrl);
}