美文网首页网络爬虫天地
java版实现今日头条AS,CP算法生成

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

作者: 探索者_逗你玩儿 | 来源:发表于2019-02-27 14:17 被阅读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获取摘要的,这就会出现不一致的情况,当然了,不一定所有的环境都会出现这个问题。

    相关文章

      网友评论

        本文标题:java版实现今日头条AS,CP算法生成

        本文链接:https://www.haomeiwen.com/subject/pyxfuqtx.html