• 微博图床被防盗链不加载响应403完美解决


    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    使用一些MarkDown软件写博客时大都会设置图片自动上传,这样只需要复制一遍MarkDown文本即可粘贴到多个平台发布,很多免费的图床插件都是将图片上传至微博图床,毕竟免费。但微博并不会那么大方,在请求微博图片时会检测request头部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 +"
    ");
                    }
                    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;
        }
    
    }
    

    版权声明

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

  • 相关阅读:
    git使用介绍
    Core Foundation框架介绍
    masonry使用介绍
    markdown学习笔记
    xcode中的第三方库配置问题总结
    js,jquery概念理解
    少侠
    PHP中的null类型
    php表单中如何获取单选按钮与复选按钮的值
    案例:批量删除
  • 原文地址:https://www.cnblogs.com/onblog/p/13036277.html
Copyright © 2020-2023  润新知