快手分享链接,实战解析无水印视频源码

2023-11-13

这个是我发现的源码解析,快手,

 

package blog.rs1314.cn.test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import javax.script.ScriptException;


import blog.rs1314.cn.kuaishou.*;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class KuaiShouTest {
    public static void main(String[] args) throws IOException, ScriptException {
        long time = new Date().getTime();
        long nextPageTime = KuaiShouNextPage.getNextPageTime(time);
        KuaishouUserVo inputClientUrl = inputClientUrl("http://www.gifshow.com/s/6vyyITXo",0,time,nextPageTime);
       List<KuaiShou> userVideoList = inputClientUrl.getUserVideoList();
       System.out.println(userVideoList.size());
      ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 4, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10000), Executors.defaultThreadFactory());

        for(int j=0;j<userVideoList.size();j++){
                KuaiShou kuaiShou = userVideoList.get(j);
                executor.execute(new ThreadLoadKuaiShouData(kuaiShou));

        }

     executor.shutdown();

    }


    /**
     * 解析json得到该用户的List
     *
     * @param kuaishouUserVo
     */
    private static List<KuaiShou> getVideoList(KuaishouUserVo kuaishouUserVo) {

        KuaiShou kuaiShou = null;
        String readVideoPlayUrl = kuaishouUserVo.getReadVideoPlayUrl();
        JSONObject jsonObject = new JSONObject(readVideoPlayUrl);
        System.out.println(jsonObject);
        JSONArray feeds = jsonObject.getJSONArray("feeds");

        int length = feeds.length();
        List<KuaiShou> kuaiShouList = new ArrayList<KuaiShou>(length);
        for (int j = 0; j < length; j++) {
            kuaiShou = new blog.rs1314.cn.kuaishou.KuaiShou();
            try {
                JSONObject jsonObject1 = feeds.getJSONObject(j);


                //无水印频地址
                JSONArray main_mv_urls = jsonObject1.getJSONArray("main_mv_urls");
                JSONObject jsonObject2 = main_mv_urls.getJSONObject(0);
                String videoUrl = jsonObject2.getString("url");
                kuaiShou.setVideoUrl(videoUrl);
                //share_info  ("userId=3xwvjr74prbhz9s&photoId=3xfvvjb92hqpgdq",)
                String share_info = jsonObject1.getString("share_info");
                kuaiShou.setShare_info(share_info);

                String photoId = String.valueOf(jsonObject1.get("photo_id"));
                kuaiShou.setPhotoId(photoId);

                //视频名称
                String videoName = jsonObject1.getString("caption");
                videoName = videoName.replaceAll("\n", "").replaceAll(" ", "");
                kuaiShou.setVideoName(videoName);
            }catch (Exception e){}
            kuaiShouList.add(kuaiShou);
        }
        return kuaiShouList;
    }


    /**
     * 获取真实无水印视频地址json
     *
     * @param kuaishouUserVo
     * @return
     */
    private static String getReadVideoPlayUrl(KuaishouUserVo kuaishouUserVo) {
        Map<String, String> sigUrlamap = kuaishouUserVo.getSigUrl();
        String queryStringUrl = sigUrlamap.get(QUERYSTRING);
        String bodyString = sigUrlamap.get(BODYSTRING);


        OkHttpClient okHttpClient = new OkHttpClient();

        FormBody.Builder requestBody = new FormBody.Builder();
        Map<String, String> params = getMapFromStr(bodyString);
        Set<String> keySet = params.keySet();
        for (String key : keySet) {
            String value = params.get(key);
            requestBody.add(key, value);
        }
        FormBody formBody = requestBody.build();


        Request request = new Request.Builder()
                .url(READURL + queryStringUrl)
                .post(formBody)
                .addHeader("Cookie", "token=988045ae46624450873917df582dfd43-1355462031")
                .addHeader("User-Agent", "kwai-android")
                .addHeader("Connection", "keep-alive")
                .addHeader("Accept-Language", "zh-cn")
                .addHeader("X-REQUESTID", randomRequestId())
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .addHeader("Host", "api.ksapisrv.com")
                .build();
        Call call = okHttpClient.newCall(request);

        try {
            Response response = call.execute();
            return response.body().string();

        } catch (IOException e) {
            throw new RuntimeException("地址错误或者获取失败,联系Q群号414572608");
        }

    }


    /**
     * 第二步
     * 1. 用户输入的分享地址 ,获取重定向后的地址
     * 2. 获取用户加密id和加密后作品id
     * 3. 获取真实的用户id
     * 4. 得到sig后的请求连接,post请求
     * 5.获取真实无水印视频地址json
     * 6.获取List
     */
    private static KuaishouUserVo inputClientUrl(String url,int temp,long time,long nexttime) {
        KuaishouUserVo kuaishouUserVo = new KuaishouUserVo();

        try {
            //用户输入的分享地址 ,获取重定向后的地址
            String redirectUrl = new OkHttpClient().newCall(new Request.Builder().url(url).build()).execute().request().url().toString();
            redirectUrl = redirectUrl.substring(0, redirectUrl.indexOf("?"));
            //获取用户加密id和加密后作品id
            String regex = "https://live.kuaishou.com/u/";
            redirectUrl = redirectUrl.substring(redirectUrl.indexOf(regex) + regex.length());
            String[] split = redirectUrl.split("/");
            kuaishouUserVo.setUserIdJiaMi(split[0]);
            kuaishouUserVo.setPhotoId(split[1]);
            //获取真实的用户id
            kuaishouUserVo.setUserId(getUserId(split[0]));
            if(temp ==0){
                //得到sig后的请求连接,post请求
                Map<String, String> sigUrl = getSigUrl(kuaishouUserVo.getUserId());
                kuaishouUserVo.setSigUrl(sigUrl);
            }else{

                Map<String, String> sigUrl = getSigUrl(kuaishouUserVo.getUserId(),time,1,nexttime);
                kuaishouUserVo.setSigUrl(sigUrl);
            }

            //获取真实无水印视频地址json
            String readVideoPlayUrl = getReadVideoPlayUrl(kuaishouUserVo);
            kuaishouUserVo.setReadVideoPlayUrl(readVideoPlayUrl);
            //获取list
            List<KuaiShou> videoList = getVideoList(kuaishouUserVo);
            kuaishouUserVo.setUserVideoList(videoList);


            return kuaishouUserVo;
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("地址错误或者获取失败,联系Q群号414572608");
        }
    }


    /**
     * 第一步:: 设置存活时间   token   建议60分钟请求一次
     *
     * @throws IOException
     */
    private static void setttingLiveTime() {

        String url = "http://api.ksapisrv.com/rest/n/hybrid/version?mod=HUAWEI%28COL-AL10%29&appver=6.4.1.9151&isp=CMCC&lon=0&language=zh-cn&sys=ANDROID_9&__NStokensig=30384a09fe4d364d48a9be9f182f80e76e964f870fedbd537a7a009ecd5dd60d&max_memory=384&ud=1355462031&sig=9c303bd81cc2c0575cecb7bc385c89c5&client_key=3c2cd3f3&oc=HUAWEI_KWAI&net=WIFI&lat=0&app=0&kpf=ANDROID_PHONE&ver=6.4&c=HUAWEI_KWAI&os=android&ftt=&kpn=KUAISHOU&token=988045ae46624450873917df582dfd43-1355462031&country_code=cn&hotfix_ver=&did_gt=1557994638922&iuid=&did=ANDROID_03c600e64ee0e3a7";
        Request build = new Request.Builder().url(url).addHeader("Cookie", "token=988045ae46624450873917df582dfd43-1355462031")
                .addHeader("User-Agent", "kwai-android")
                .addHeader("Connection", "keep-alive")
                .addHeader("Accept-Language", "zh-cn")
                .addHeader("X-REQUESTID", randomRequestId())
                .addHeader("Host", "api.ksapisrv.com")
                .build();

        String html = "";
        try {
            html = new OkHttpClient().newCall(build).execute().body().string();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(html);


    }

    /**
     * 随机请求id  //范围是   436650000 - 436669999
     *
     * @return
     */
    private static String randomRequestId() {

        int temp = 436669999 - 436650000;

        int nextInt = new Random().nextInt(temp) + 436650000;
        return String.valueOf(nextInt);
    }


    /**
     * https://live.kuaishou.com/u/3xwvjr74prbhz9s
     * 获取真实的用户id
     *
     * @param userIdjiaMi 3xwvjr74prbhz9s
     * @return
     */
    public static String getUserId(String userIdjiaMi) {
        String url = "https://live.kuaishou.com/u/" + userIdjiaMi;
        String temp = "";
        try {
            String html = new OkHttpClient().newCall(new Request.Builder().url(url).build()).execute().body().string();
            Document parse = Jsoup.parse(html);

            Elements eles = parse.getElementsByTag("script");
            for (Element ele : eles) {  //configModel
                String script = ele.toString();
                if (script.indexOf("configModel") > -1) {
                    script = script.substring(script.indexOf("liveDetailModel") + 18, script.lastIndexOf("webSocketInfo") + 18);
                    JSONObject jsonObject = new JSONObject(script);

                    jsonObject = jsonObject.getJSONObject("user");
                    Object object = jsonObject.get("userId");

                    temp = String.valueOf(object);
                }
            }

            return temp;
        } catch (IOException e) {
            throw new RuntimeException("地址错误或者获取失败,联系Q群号414572608");
        }


    }


    /**
     * 获取签名后的请求连接
     *
     * @param userid 真实的用户id    post请求
     * @return
     */
    public static Map<String, String> getSigUrl(String userid) {
        long time = new Date().getTime();

        return getSigUrl(userid,time,0,0);
    }


    public static Map<String, String> getSigUrl(String userid,long time,int temp,long nexttime) {
       if(temp == 0){
           Map<String, String> sig = getSig(userid, time, 30);

           String genSignature = genSignature(getMapFromStr(sig.get(SIGSTRING)), FANS_SALT);
           sig = getSigUrlT(userid, time, 30, genSignature);
           return sig;
       }else{
           Map<String, String> sig = getSignextPage(userid, time, 30,nexttime);

           String genSignature = genSignature(getMapFromStr(sig.get(SIGSTRING)), FANS_SALT);
           sig = getSigUrlT(userid, time, 30, genSignature);
           return sig;
       }
    }




    /**
     * Post请求 异步
     * 使用 Callback 回调可返回子线程中获得的网络数据
     *
     * @param url
     * @param params 参数
     */
    public static void httpPost(final String url, final Map<String, String> params, final Callback callback) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                FormBody.Builder formBodyBuilder = new FormBody.Builder();
                Set<String> keySet = params.keySet();
                for (String key : keySet) {
                    String value = params.get(key);
                    formBodyBuilder.add(key, value);
                }
                FormBody formBody = formBodyBuilder.build();
                Request request = new Request
                        .Builder()
                        .post(formBody)
                        .url(url)
                        .build();
                //Response response = null;
                okHttpClient.newCall(request).enqueue(callback);
            }
        }).start();
    }


    public static String genSignature(Map<String, String> params, String salt) {
        if (params == null) {
            return null;
        }
        String sign = "";
        StringBuffer sb = new StringBuffer();
        try {
            // 1. 字典升序排序
            SortedMap<String, String> sortedMap = new TreeMap<>(params);
            // 2. 拼按URL键值对
            Set<String> keySet = sortedMap.keySet();
            for (String key : keySet) {
                //sign不参与算法
                if (key.equals("sig") || key.equals("__NStokensig")) {
                    continue;
                }
                String value = sortedMap.get(key);
                sb.append(key + "=" + URLDecoder.decode(value, "UTF-8"));
            }
            String uriString = sb.toString();
            uriString = uriString + salt;
            //System.out.println("My String: \n" + uriString);
            // 3. MD5运算得到请求签名
            sign = MD5.md5(uriString);
            //System.out.println("My Sign:\n" +sign);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sign;
    }

    public static Map<String, String> getMapFromStr(String str) {
        if (str == null || "".equalsIgnoreCase(str)) {
            return null;
        }
        String[] arr = str.split("\\&");
        Map<String, String> map = new HashMap<>();
        for (String item : arr) {
            String[] itemArr = item.split("=", 2);
            map.put(itemArr[0], itemArr[1]);
        }
        return map;
    }

    private static Map<String, String> getSig(String userid, long time, int size) {
        return getSigUrlT(userid, time, size, "001a0805a029a8a466f8492a37d077ae");
    }
    private static Map<String, String> getSignextPage(String userid, long time, int size,long neexrtime) {
        return getSigUrlTnextPage(userid, time, size, "001a0805a029a8a466f8492a37d077ae",neexrtime);
    }


    private static Map<String, String> getSigUrlTnextPage(String userid, long time, int size, String sig,long neexrtime) {
        String queryString = "app=0&kpf=ANDROID_PHONE&ver=6.4&c=HUAWEI_KWAI&mod=HUAWEI%28COL-AL10%29&appver=6.4.1.9151&ftt=&isp=CMCC&kpn=KUAISHOU&lon=0&language=zh-cn&sys=ANDROID_9&max_memory=384&ud=1355462031&country_code=cn&oc=HUAWEI_KWAI&hotfix_ver=&did_gt=" + time + "&iuid=&net=WIFI&did=ANDROID_03c600e64ee0e3a7&lat=0";
        String bodyString = "token=988045ae46624450873917df582dfd43-1355462031&user_id=" + userid + "&lang=zh&count=" + size + "&privacy=public&pcursor="+neexrtime+"&referer=1&browseType=1&sig=" + sig + "&client_key=3c2cd3f3&os=android&__NStokensig=8581c63e468fa7829def9cf79fdebae7fc8f15dd021aa68724928c86872dc554";

        String sigString = new StringBuilder().append(queryString).append("&").append(bodyString).toString();
        Map<String, String> map = new HashMap<String, String>();

        map.put(QUERYSTRING, queryString);
        map.put(BODYSTRING, bodyString);
        map.put(SIGSTRING, sigString);

        return map;


    }



    private static Map<String, String> getSigUrlT(String userid, long time, int size, String sig) {
        String queryString = "app=0&kpf=ANDROID_PHONE&ver=6.4&c=HUAWEI_KWAI&mod=HUAWEI%28COL-AL10%29&appver=6.4.1.9151&ftt=&isp=CMCC&kpn=KUAISHOU&lon=0&language=zh-cn&sys=ANDROID_9&max_memory=384&ud=1355462031&country_code=cn&oc=HUAWEI_KWAI&hotfix_ver=&did_gt=" + time + "&iuid=&net=WIFI&did=ANDROID_03c600e64ee0e3a7&lat=0";
        String bodyString = "token=988045ae46624450873917df582dfd43-1355462031&user_id=" + userid + "&lang=zh&count=" + size + "&privacy=public&referer=1&browseType=1&sig=" + sig + "&client_key=3c2cd3f3&os=android&__NStokensig=8581c63e468fa7829def9cf79fdebae7fc8f15dd021aa68724928c86872dc554";

        String sigString = new StringBuilder().append(queryString).append("&").append(bodyString).toString();
        Map<String, String> map = new HashMap<String, String>();

        map.put(QUERYSTRING, queryString);
        map.put(BODYSTRING, bodyString);
        map.put(SIGSTRING, sigString);

        return map;


    }

    private static final String QUERYSTRING = "queryString";
    private static final String BODYSTRING = "bodyString";
    private static final String SIGSTRING = "sigString";
    private static final String FANS_SALT = "382700b563f4";
    private static final String READURL = "http://api.ksapisrv.com/rest/n/feed/profile2?";
}

 

这个原文链接   http://blog.rs1314.cn/article/detail/36

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快手分享链接,实战解析无水印视频源码 的相关文章

  • 读取文件并获取 key=value 而不使用 java.util.Properties

    我正在构建一个 RMI 游戏 客户端将加载一个包含一些键和值的文件 这些键和值将用于多个不同的对象 它是一个保存游戏文件 但我不能为此使用 java util Properties 它符合规范 我必须读取整个文件并忽略注释行和与某些类不相关
  • 如何以编程方式找出我的 PermGen 空间使用情况?

    我正在尝试诊断java lang OutOfMemoryError PermGen Space在 Sun 的 Hotspot JVM 上运行时出现错误 并且想知道我的程序在不同时刻使用了多少 PermGen 空间 有没有办法以编程方式找出这
  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • 如何在Mac上使用eclipse安装jetty

    我是一个新手 jetty 和 RESTful API 我想使用 Jetty 创建 REST 服务 并希望将嵌入式 jetty 与 eclipse 一起使用 任何人都可以建议我在 Mac OS 中使用 Eclipse 安装 Jetty Jet
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • 无法在 Mac OS X 上启动应用程序 我收到错误 LSOpenURLsWithRole() 应用程序失败,错误为 -10810

    问题 我正在尝试启动一个应用程序 遗传网络分析仪 http www genostar com category products gna 但它默默地失败了 使用时open gna app产生以下错误消息 LSOpenURLsWithRole
  • 如何在命令提示符中检查 JAVA_OPTS 值?

    我们的应用程序部署 JBoss 服务器然后抛出错误 PermGen space 然后在 jboss bat 和配置文件中设置 permgen 变量中的 java OPTS JAVA OPTs 中是否有值 assige 如何检查 如何在命令提
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • Kerberos 缓存票证

    我使用的是 Windows 7 64 位 我创建了一个简单的应用程序来对实现 PrivilegedAction 的类的 run 方法中的文件进行计数 以下是我的 jaas conf 文件 CountFiles com sun securit
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 如何将任务添加到 gradle 中的主要“构建”任务

    当我尝试使用以下代码将任务添加到主构建任务时 rootProject tasks getByName build dependsOn mytask 当我跑步时它抱怨gradle w build输出 Where Build file line
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据

随机推荐

  • PHP curl 获取返回的内容和头部信息示例

    请求示例 function curl res string url string data array header is post false is post false url 请求地址 token token 头部 header Co
  • WPA渗透-pyrit:GPU加速_Hash-table

    WPA渗透 pyrit GPU加速 Hash table 1 pyrit工具介绍 pyrit是一款开源且完全免费的软件 任何人都可以检查 复制或修改它 它在各种平台上编译和执行 包括FreeBSD MacOS X和Linux作为操作系统以及
  • 大学生数学竞赛习题精讲_陈兆斗

    大学生数学竞赛习题精讲 陈兆斗 链接 https pan baidu com s 1ctyZqmD 6VFgILBM0DiTcg 提取码 i76s 复制这段内容后打开百度网盘手机App 操作更方便哦
  • mysql用事务实现更新数据

    前言 在手动批量更新正式环境数据库时 建议使用事物进行更新 避免更错数据 造成不必要的麻烦 现表中有三条数据 使用事物批量将name字段为mgx phone字段为17837107346 所有数据中的address字段更新成河北唐山 开始事物
  • moco接口框架介绍

    moco接口框架介绍 Moco 是一个搭建模拟服务器的工具 其支持 API 和独立运行两种方式 前者通常是在 junit testng等测试框架中使用 后者则是通过运行一个 jar 包开启服务 在maven中央仓库中 moco有三个版本 分
  • <Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

    Linux开发 系统移植 之 linux内核移植过程详细记录 第二部分完结 前面 第一部分讲解了 NXP官方原厂的Linux直接编译下载到开发板的操作过程 及测试效果 以及过程中设计使用的一些辅助工具 从第一部分 可以熟悉整个Linux编译
  • JSON 语法规则详解

    JSON 的语法规则十分简单 无论用何种方法总结都只有数条而已 它参考了 C 语言家族的一些习惯 学习起来并不会感到陌生 回顾JSON 的五点语法 1 数组 Array 用方括号 表示 2 对象 Object 用大括号 表示 3 名称 值对
  • 抽象方法与抽象类

    没有方法体的方法就是抽象方法 如果一个类中有抽象方法则这个类就是抽象类 public abstract class Abs public abstract void shoot 抽象方法 public abstract void eat p
  • Scrapy 爬虫笔记

    目录 概述 开始 启动项目 爬虫初始化 处理响应 回调函数的参数 图片下载 未完待续 相关资源 概述 本文记录了个人使用 Scrapy 爬取某网站产品信息 包含图片下载 的整个过程 也可以作为一篇 Scrapy 实战教学博客 首先从 All
  • 网络安全-自学笔记

    目录 相关网站推荐 WEB 应用 安全 学习路线 推荐 书籍 网站 在线靶场 基础 XSS攻击 CSRF漏洞 劫持攻击 点击劫持 SSRF漏洞 文件包含漏洞 文件上传漏洞 XXE漏洞 WebShell 解析安全 RCE漏洞 SQL注入漏洞
  • 网络爬虫是什么?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 互联网诞生之初 是为了让人们更容易的分享数据 交流通讯 互联网是桥梁 连接了世界各地的人们 网站的点击 浏览都是人为的 与你聊天的也是活生生的人 然而 随着技术的发展 人们
  • Java 实现区块链

    Java 是一种流行的面向对象的编程语言 它可以用来实现区块链 在实现区块链时 通常需要考虑以下几个方面 区块的数据结构 区块通常包含一些数据 如交易信息 以及一些元数据 如区块的哈希值和时间戳 你可以使用 Java 中的数据结构 如类 对
  • 【C++】STL —— list的基本使用

    目录 一 list容器的简介 二 list容器常用的接口 1 list初始化操作 1 构造函数 编辑 2 析构函数 3 赋值重载函数 2 list容量相关的函数 3 list的迭代器 4 list的增删查改 一 list容器的简介 1 li
  • 使用STM32CubeMX和STM32CubeIDE的常见问题和注意事项

    STM32CubeMX和STM32CubeIDE是ST公司的STM32Cube生态系统中最重要和最常用的2个软件 使用这2个免费软件可以高效地进行STM32系统的开发 CubeMX用于对一个STM32器件进行可视化的配置 然后生成CubeI
  • git 解决冲突之 theirs & ours

    git merge 从feature分支合并到master分支 git checkout master git merge feature Auto merging Document CONFLICT content Merge confl
  • echarts--3D效果柱状图

    echarts二维柱状图做3D效果 先看下效果 废话不多说 直接上代码 div class box echart div initBarEchart 柱状图 let option bar this setOption let array n
  • 【sqli-labs】 less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)...

    POST版本的less36 uname 1 passwd 1 df or 1 转载于 https www cnblogs com omnis p 8384536 html
  • Qt

    Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 目录 Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 1 简
  • 想入门网络安全?先来看看网络安全行业人才需求!

    如果你是一个想要入门网络安全行业的小白 如果你是网络安全专业在读的大学生 如果你是正在找工作的新手 那么这篇文章你一定要仔细看 毕竟知己知彼百战百胜 知道行业的人才需求才能更好得发挥自己的优势 当你打开BOSS直聘 拉钩等招聘网站 在首页的
  • 快手分享链接,实战解析无水印视频源码

    这个是我发现的源码解析 快手 package blog rs1314 cn test import java io IOException import java io InputStream import java net URLDeco