炸了!3年圖片都沒了

2023-02-16 12:00:49

一直都是用的 Typora+微博免費圖床寫作,前段時間突然發現圖片全都裂了,開啟一看都是 403 。

開始我以為圖片微博都給我刪了,找了一堆平臺去翻我的歷史文章看圖片是不是都在,找了半天發現圖片要麼不夠清晰,要麼就是文章不全,要麼呢就是有水印,所有的原圖基本上是找不回來了,跟不用說還有一些文章是沒有在任何平臺發表過的。

這就很難受了,所以這件事情就拖了好幾個月都沒處理,最近突然看到一篇文章才發現,哦,原來 403 是限制了Referrer,寫程式碼還是可以下載下來的,試了試果然是可以的,那問題就簡單了。

那我只要:掃描我的所有 md 檔案=>找到所有的微博圖床的圖片連結=>下載所有圖片=>上傳到新圖床=>替換圖片連結,不就搞定了嘛。

掃描檔案

首先找到我的文章的目錄,掃描所有的檔案,把 md 檔案全部找出來。

private static List<File> getFiles(String workUrl){
    return FileUtil.loopFiles(workUrl).stream()
    .filter(file -> file.isFile())
    .filter(file -> file.getName().endsWith(".md"))
    .collect(Collectors.toList());
}

獲取連結

根據參考文章裡大佬寫的正則,根據正則匹配到每篇文章裡的連結地址,然後根據微博圖床的名稱過濾得到所有使用微博圖床的圖片地址,掃描最終得到的圖片有大概 2000 張。

private static Set<String> getUrls(List<File> files)throws Exception{
    Set<String> urlList = new HashSet<>();
    Pattern pattern = Pattern.compile(
            "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov"
                    + "|mil|biz|info|mobi|name|aero|jobs|museum" + "|travel|[a-z]{2}))(:[\\d]{1,5})?"
                    + "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?"
                    + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?"
                    + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b");
    files.forEach(file->{
        String mdContent = FileReader.create(file).readString();
        Matcher matcher = pattern.matcher(mdContent);
        while(matcher.find()){
            urlList.add(matcher.group());
        }
    });

    return urlList.stream().filter(url->url.contains("sinaimg.cn")).collect(Collectors.toSet());
}

下載|上傳圖片

得到所有圖片地址後,直接把圖片下載到本地,這裡為了方便,直接擷取出圖片中的圖片名稱儲存,那麼之後就可以直接把圖片上傳到其他的圖床了。

private static void download(Set<String> urls) throws Exception{
    for (String str : urls) {
        OutputStream os = null;
        InputStream is = null;
        try {
            URL url = new URL(str);
            URLConnection con = url.openConnection();
            is = con.getInputStream();
            byte[] bs = new byte[1024];
            int len;
            String fileName = str.substring(str.lastIndexOf("/")+1);
            os = Files.newOutputStream(Paths.get("/Users/user/Desktop/" + fileName));
            // 開始讀取
            while ((len = is.read(bs)) != -1) {
                os.write(bs, 0, len);
            }
        } finally {
            if (os != null) {
                os.close();
            }
            if (is != null) {
                is.close();
            }
        }
    }
}

這裡我選擇用的是阿里雲 OSS,直接手動全丟進去就行了。

替換連結

現在我的圖片名稱都是一樣的,只要替換掉域名那部分就行了,最後寫回檔案。

private static void replace(List<File> files){
        //替換 md 檔案中的微博圖床檔案
        files.forEach(file->{
            String mdContent = FileReader.create(file).readString();
            String newMDContent = mdContent.replaceAll("https://tva1.sinaimg.cn/large","http://cdn.aixiaoxian.vip/blog");
            FileWriter.create(file).write(newMDContent);
        });

    }

另外一方面就是關於費用的問題,目前因為基本都是我自己在用,一天都花了 7 分,一個月豈不是 2 塊錢,有點太貴了!!!後面再看看有沒有跟便宜點的。

參考:https://juejin.cn/post/7189651446306963514