网络爬虫天地

java版实现今日头条AS,CP算法生成

2019-02-27  本文已影响0人  探索者_逗你玩儿

最近在做今日头条的爬虫项目,在涉及到频道,搜索和爬取用户发的所有文章时候需要进行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获取摘要的,这就会出现不一致的情况,当然了,不一定所有的环境都会出现这个问题。

上一篇下一篇

猜你喜欢

热点阅读