完美解决微博图床防盗链

在用一些MarkDown软件写博客的时候,会设置自动上传图片,这样你只需要复制一次MarkDown文字,粘贴到多个平台发布即可。很多免费的图床插件会把图片上传到微博图片床上,毕竟是免费的

然而微博就没那么大方了。当请求微博图片时,将检测请求头中 “Referer” 字段的值,以识别请求的来源。

解决方案是禁止Referer,例如,您可以在html中添加meta标签,代码:

<meta name="referrer" content="never">

之前银狐也发过这种方法:《绕过防盗链教程 一句代码突破网站防盗链

另一种方法是在每个img的标签设置referrerpolicy属性:

<img src="" referrerpolicy="no-referrer">

如果你的图片引用比较少还好,如果引用图片多了,一张一张地改那就太麻烦了,交给程序去帮我们完成就十分方便。 

设计一个jar包,只需要执行一次java -jar,就可以自动扫描jar包所在目录下的所有md文件,并自动将 ![]() 替换为 <img> 标签的形式,且支持以追加参数的形式指定扫描目录。

贴一下Java代码:

/**
 * 使用方法:
 * java -jar 的形式执行jar包
 * 默认扫描jar包所在路径,不会递归扫描
 * 可以追加参数 path=xxx 指定扫描xxx目录
 */
public class App {

    public static void main(String[] args) throws IOException {
        String path = null;
        for (int i = 0; i < args.length; i++) {
            String arg = args[i];
            if (arg.startsWith("path=")){
                path = arg.substring(5);
                break;
            }
        }
        if (path==null){
            path = System.getProperty("user.dir");
        }
        System.out.println("--开始扫描目录:"+path);
        File file = new File(path);
        File[] list = file.listFiles();
        if (list == null) {
            System.out.println("--空目录");
            return;
        }
        //创建输出目录
        String out = path + "/out/";
        new File(out).mkdir();
        for (int i = 0; i < list.length; i++) {
            String name = list[i].getName();
            if (!(list[i].isFile() && (name.endsWith(".md") || name.endsWith(".MD")))) {
                continue;
            }
            System.out.println("--"+list[i].getName());
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(list[i])));
                 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(out+name))))
            ) {
                String line;
                while ((line = reader.readLine()) != null) {
                    String src = src(line);
                    writer.write(src +"\n");
                }
                writer.flush();
            }
        }
        System.out.println("--结束");
    }

    /**
     * 提取img的src
     */
    private static String src(String s){
        String[] split = s.split("!");
        for (int i = 0; i < split.length; i++) {
            if (split[i].length()>4&&split[i].contains("[")&&split[i].contains("]")&&split[i].contains("(")&&split[i].contains(")")){
                int start = split[i].lastIndexOf("(");
                int end = split[i].lastIndexOf(")");
                String s1 = split[i].substring(start + 1, end);
                s = s.replace("!" + split[i], "<img src=\"" + s1 + "\" referrerPolicy=\"no-referrer\"/>");
            }
        }
        return s;
    }

}

文章转载 ,原作者: 程序员薛师兄   来自:代码艺术.