最近在做今日头条的爬虫项目,在涉及到频道,搜索和爬取用户发的所有文章时候需要进行AS,CP和_signature 的验证,今天先说说AS,CP的破解,_signature的算法还在摸索中等破解后在跟大家分享。
AS,CP的生成策略都是和时间有关,拿到当前的时间戳然后转化成16进制备用,然后对时间戳进行md5一次拿到hash值,然后就是hash值和16进制的时间戳进行字符串的拼接了,我们来看看源码
package com.unicorn.crawler.util;
import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Maps;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
/**
* Created by apple on 2019/2/27.
*/
public class ToutiaoUtil {
private static String getHash(String source, String hashType) {
StringBuilder sb = new StringBuilder();
MessageDigest md5;
try {
md5 = MessageDigest.getInstance(hashType);
md5.update(source.getBytes("UTF-8"));
for (byte b : md5.digest()) {
sb.append(String.format("%02X", b)); // 10进制转16进制,X 表示以十六进制形式输出,02 表示不足两位前面补0输出
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static Map<String,String> generateASCP(){
Map<String,String> ascpMap = Maps.newHashMap();
int time = (int)(System.currentTimeMillis() /1000);
String timeHex = Integer.toHexString(time).toUpperCase();
String timeHash = getHash(String.valueOf(time),"MD5");
if(timeHex.length() != 8){
ascpMap.put("as","479BB4B7254C150");
ascpMap.put("cp","7E0AC8874BB0985");
}
String asT = timeHash.substring(0,5);
String cpT = timeHash.substring(timeHash.length() - 5, timeHash.length());
String asTemp = "";
String cpTemp = "";
String[] alphaASList = StrUtil.split(asT,1);
String[] alphaCPList = StrUtil.split(cpT,1);
String[] alphaHexList = StrUtil.split(timeHex,1);
for(int i=0; i<5; i++){
asTemp += alphaASList[i] + alphaHexList[i];
cpTemp += alphaHexList[i+3] + alphaCPList[i];
}
String as = "A1" + asTemp + timeHex.substring(timeHex.length() - 3,timeHex.length());
String cp = timeHex.substring(0,3) + cpTemp + "E1";
ascpMap.put("as",as);
ascpMap.put("cp",cp);
return ascpMap;
}
}
代码中需要注意的是md5的hash稍微要注意一点,在进行md5的时候没有问题,但是在获取摘要的时候要注意将byte转换成16进制,这是为了防止python和java在获取md5摘要的时候出现不一致。主要原因是 python中没有byte类型,而java是直接通过byte数组进行md5获取摘要的,这就会出现不一致的情况,当然了,不一定所有的环境都会出现这个问题。
网友评论