想写,然后去写

javascript代碼和瀏覽器控制臺實現的小技巧2枚

2017.01.07

1.實現多線程下載,無需多線程下載程序,只需要把代碼復制進瀏覽器開發者控制台点击运行就可以了
2.已經很常見的自定義百度分享碼
代碼很長

多線程下載代碼

按 F12 打开开发者工具,切换至控制台(Console),将以下代码复制粘贴到控制台,然后回车

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**  
 * 多线程方式文件下载  
 */
public class MulThreadDownload {
    /* 下载的URL */
    private URL downloadUrl;
    /* 用于保存的本地文件 */
    private File localFile;
    /*  每条线程下载的数据长度 */
    private int block;
    public static void main(String[] args) {
        /* 可以为网络上任意合法下载地址 */
        String downPath = "http://下載地址";
        MulThreadDownload threadDownload = new MulThreadDownload();
        /* 开 10 条线程下载,如果下載緩慢或不能下載,建議把線程數調少些 */
        try {
            threadDownload.download(downPath, 10);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    /**  
     * 多线程文件下载    
     * @param path 下载地址  
     * @param threadCount 线程数  
     */
    public void download(String path, int threadCount) throws Exception {
        downloadUrl = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) downloadUrl.openConnection();
        /* 设置 GET 请求方式 */
        conn.setRequestMethod("GET");
        /* 设置响应时间超时为 5 秒 */
        conn.setConnectTimeout(5 * 1000);
        /* 获取本地文件名 */
        String filename = parseFilename(path);
        /* 获取下载文件的总大小 */
        int dataLen = conn.getContentLength();
        if (dataLen < 0) {
            System.out.println("获取数据失败");
            return;
        }
        /* 创建本地目标文件,并设置其大小为准备下载文件的总大小 */
        localFile = new File(filename);
        RandomAccessFile accessFile = new RandomAccessFile(localFile, "rwd");
        /* 这时候,其实本地目录下,已经创建好了一个大小为下载文件的总大小的文件 */
        accessFile.setLength(dataLen);
        accessFile.close();
        /* 计算每条线程要下载的数据大小 */
        block = dataLen % threadCount == 0 ? dataLen / threadCount: dataLen / threadCount + 1;
        /* 启动线程下载文件 */
        for (int i = 0; i < threadCount; i++) {
            new DownloadThread(i).start();
        }
    }
    /**  
     * 解析文件  
     */
    private String parseFilename(String path) {
        return path.substring(path.lastIndexOf("/") + 1);
    }
    /**  
     * 内部类: 文件下载线程类  
     */
    private final class DownloadThread extends Thread {
        /* 线程 id */
        private int threadid;
        /* 开始下载的位置 */
        private int startPosition;
        /* 结束下载的位置 */
        private int endPosition;
        /**  
         * 新建一个下载线程  
         * @param threadid 线程 id  
         */
        public DownloadThread(int threadid) {
            this.threadid = threadid;
            startPosition = threadid * block;
            endPosition = (threadid + 1) * block - 1;
        }@Override public void run() {
            System.out.println("线程 '" + threadid + "'启动下载..");

            RandomAccessFile accessFile = null;
            try {
                /* 设置从本地文件的什么位置开始写入数据 ,"rwd" 表示对文件具有读写删权限 */
                accessFile = new RandomAccessFile(localFile, "rwd");
                accessFile.seek(startPosition);
                HttpURLConnection conn = (HttpURLConnection) downloadUrl.openConnection();
                conn.setRequestMethod("GET");
                conn.setReadTimeout(5 * 1000);
                /* 为 HTTP 设置 Range 属性,可以指定服务器返回数据的范围 */
                conn.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);
                /* 将数据写往本地文件 */
                writeTo(accessFile, conn);

                System.out.println("线程 '" + threadid + "'完成下载");
            } catch(IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (accessFile != null) {
                        accessFile.close();
                    }
                } catch(IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
        /**  
         * 将下载数据写往本地文件  
         */
        private void writeTo(RandomAccessFile accessFile, HttpURLConnection conn) {
            InputStream is = null;
            try {
                is = conn.getInputStream();
                byte[] buffer = new byte[1024];
                int len = -1;
                while ((len = is.read(buffer)) != -1) {
                    accessFile.write(buffer, 0, len);
                }
            } catch(IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                } catch(Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}

:实测firefox下语法错误。

自定義百度分享碼

1.在百度云盘中点击分享按钮;
2.点击分享按钮后会弹出一个提示框,不管它,按 F12 打开开发者工具,切换至控制台(Console),将以下代码复制粘贴到控制台,然后回车;

javascript:require(["function-widget-1:share/util/service/createLinkShare.js"]).prototype.makePrivatePassword=function(){return prompt("自定義百度網盤提取碼","輸入自定義分享碼")}

3.然后点击创建私密链接,会弹出输入框,这时输入你想自定义的密码,确定

盗用网上的gif:gjj

注:自定義字符時,英文和數字加起來必須爲4個,有中文字則只能一個中文字加上一個數字或字母,不支持特殊字符和其他語言的字母

Comments
Write a Comment