最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

微博圖床掛了!

2023-03-16 14:16 作者:兩年半的java練習生  | 我要投稿


一直擔心的事情還是發(fā)生了。

作為hexo多年的使用者,微博圖床一直是我的默認選項,hexo+typora+iPic更是我這幾年寫文章的黃金組合。而圖床中,新浪圖床一直都是我的默認選項,速度快、穩(wěn)定同時支持大圖片批量上傳更是讓其成為了眾多圖床工具的默認選項。雖然今年早些的時候,部分如「ws1、ws2……」的域名就已經(jīng)無法使用了,但通過某些手段還是可以讓其存活的,而最近,所有調用的微博圖床圖片都無法加載并提示“403 Forbidden”了。


Tips:圖片中出現(xiàn)的Tengine是淘寶在Nginx的基礎上修改后開源的一款Web服務器,基本上,Tengine可以被看作一個更好的Nginx,或者是Nginx的超集,詳情可參考淘寶Web服務器Tengine正式開源 - The Tengine Web Server

剛得知這個消息的時候,我的第一想法其實是非常生氣的,畢竟自己這幾年上千張圖片都是用的微博圖床,如今還沒備份就被403了,可仔細一想,說到底還是把東西交在別人手里的下場,微博又不是慈善企業(yè),也要控制成本,一直睜一只眼閉一只眼讓大家免費用就算了,出了問題還是不太好怪到微博上來的。

那么有什么比較好的辦法解決這個問題呢?

查遍了網(wǎng)上一堆復制/粘貼出來的文章,不是開啟反向代理就是更改請求頭,真正愿意從根本上解決問題的沒幾個。

如果不想將自己沉淀的博客、文章托管在印象筆記、notion、語雀這些在線平臺的話,想要徹底解決這個問題最好的方式是:自建圖床!

為了更好的解決問題,我們先弄明白,403是什么,以及我們存在微博上的圖片究竟是如何被403的。

403

百度百科,對于403錯誤的解釋很簡單

403錯誤是一種在網(wǎng)站訪問過程中,常見的錯誤提示,表示資源不可用。服務器理解客戶的請求,但拒絕處理它,通常由于服務器上文件或目錄的權限設置導致的WEB訪問錯誤。

所以說到底是因為訪問者無權訪問服務器端所提供的資源。而微博圖床出現(xiàn)403的原因主要在于微博開啟了防盜鏈。

防盜鏈的原理很簡單,站點在得知有請求時,會先判斷請求頭中的信息,如果請求頭中有Referer信息,然后根據(jù)自己的規(guī)則來判斷Referer頭信息是否符合要求,Referer 信息是請求該圖片的來源地址。

如果盜用網(wǎng)站是?https?的 協(xié)議,而圖片鏈接是 http 的話,則從 https 向 http 發(fā)起的請求會因為安全性的規(guī)定,而不帶 referer,從而實現(xiàn)防盜鏈的繞過。官方輸出圖片的時候,判斷了來源(Referer),就是從哪個網(wǎng)站訪問這個圖片,如果是你的網(wǎng)站去加載這個圖片,那么 Referer 就是你的網(wǎng)站地址;你的網(wǎng)址肯定沒在官方的白名單內,(當然作為可操作性極強的瀏覽器來說 referer 是完全可以偽造一個官方的 URL 這樣也也就也可以饒過限制)所以就看不到圖片了。


解決問題

解釋完原理之后我們發(fā)現(xiàn),其實只要想辦法在自己的個人站點中設置好referer就可以解決這個問題,但說到底也只是治標不治本,真正解決這個問題就是想辦法將圖片遷移到自己的個人圖床上。

現(xiàn)在的圖床工具很多,iPic、uPic、PicGo等一堆工具既免費又開源,問題在于選擇什么云存儲服務作為自己的圖床以及如何替換自己這上千張圖片。

  1. 選擇什么云存儲服務

  2. 如何替換上千張圖片

什么是OSS以及如何選擇

「OSS」的英文全稱是Object Storage Service,翻譯成中文就是「對象存儲服務」,官方一點解釋就是對象存儲是一種使用HTTP API存儲和檢索非結構化數(shù)據(jù)和元數(shù)據(jù)對象的工具。

白話文解釋就是將系統(tǒng)所要用的文件上傳到云硬盤上,該云硬盤提供了文件下載、上傳等一列服務,這樣的服務以及技術可以統(tǒng)稱為OSS,業(yè)內提供OSS服務的廠商很多,知名常用且成規(guī)模的有阿里云、騰訊云、百度云、七牛云、又拍云等。

對于我們這些個人用戶來說,這些云廠商提供的服務都是足夠使用的,我們所要關心的便是成本。

筆者使用的是七牛云,它提供了10G的免費存儲,基本已經(jīng)夠用了。

有人會考慮將GitHub/Gitee作為圖床,并且這樣的文章在中文互聯(lián)網(wǎng)里廣泛流傳,因為很多人的個人站點都是托管在GitHub Pages上的,但是個人建議是不要這么做。

首先GitHub在國內的訪問就很受限,很多場景都需要科學上網(wǎng)才能獲得完整的瀏覽體驗。再加上GitHub官方也不推薦將Git倉庫存儲大文件,GitHub建議倉庫保持較小,理想情況下小于 1 GB,強烈建議小于 5 GB。

如何替換上千張圖片

替換文章中的圖片鏈接和“把大象放進冰箱里”步驟是差不多的

  1. 下載所有的微博圖床的圖片

  2. 上傳所有的圖片到自己的圖床(xx云)

  3. 對文本文件執(zhí)行replaceAll操作

考慮到我們需要遷移的文件數(shù)量較多,手動操作肯定是不太可行的,因此我們可以采用代碼的方式寫一個腳本完成上述操作??紤]到自己已經(jīng)是一個成熟的Java工程師了,這個功能就干脆用Java寫了。

為了減少代碼量,精簡代碼結構,我這里引入了幾個第三方庫,當然不引入也行,如果不引入有一些繁瑣而又簡單的業(yè)務邏輯需要自己實現(xiàn),有點浪費時間了。

整個腳本邏輯非常簡單,流程如下:


獲取博客文件夾下的Markdown文件

這里我們直接使用hutool這個三方庫,它內置了很多非常實用的工具類,獲取所有markdown文件也變得非常容易

/** * 篩選出所有的markdown文件 */public static List<File> listAllMDFile() { ? List<File> files = FileUtil.loopFiles(VAULT_PATH); ? return files.stream() ? ? .filter(Objects::nonNull) ? ? ?.filter(File::isFile) ? ? ?.filter(file -> StringUtils.endsWith(file.getName(), ".md")) ? ? ?.collect(Collectors.toList()); }

獲取文件中的所有包含微博圖床的域名

通過Hutools內置的FileReader我們可以直接讀取markdown文件的內容,因此我們只需要解析出文章里包含微博圖床的鏈接即可。我們可以借助正則表達式快速獲取一段文本內容里的所有url,然后做一下filter即可。

/** * 獲取一段文本內容里的所有url * * @param content 文本內容 * @return 所有的url */public static List<String> getAllUrlsFromContent(String content) { ? List<String> urls = new ArrayList<>(); ? 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"); ? Matcher matcher = pattern.matcher(content); ? while (matcher.find()) { ? ? ? urls.add(matcher.group()); ?} ? return urls; }

下載圖片

用Java下載文件的代碼在互聯(lián)網(wǎng)上屬實是重復率最高的一批檢索內容了,這里就直接貼出代碼了。

public static void download(String urlString, String fileName) throws IOException { ? File file = new File(fileName); ? if (file.exists()) { ? ? ? return; ?} ? URL url = null; ? OutputStream os = null; ? InputStream is = null; ? try { ? ? ? url = new URL(urlString); ? ? ? URLConnection con = url.openConnection(); ? ? ? // 輸入流 ? ? ? is = con.getInputStream(); ? ? ? // 1K的數(shù)據(jù)緩沖 ? ? ? byte[] bs = new byte[1024]; ? ? ? // 讀取到的數(shù)據(jù)長度 ? ? ? int len; ? ? ? // 輸出的文件流 ? ? ? os = Files.newOutputStream(Paths.get(fileName)); ? ? ? // 開始讀取 ? ? ? while ((len = is.read(bs)) != -1) { ? ? ? ? ? os.write(bs, 0, len); ? ? ?} ?} finally { ? ? ? if (os != null) { ? ? ? ? ? os.close(); ? ? ?} ? ? ? if (is != null) { ? ? ? ? ? is.close(); ? ? ?} ?} }

上傳圖片

下載完圖片后我們便要著手將下載下來的圖片上傳至我們自己的云存儲服務了,這里直接給出七牛云上傳圖片的文檔鏈接了,文檔里寫的非常詳細,我就不贅述了

Java SDK_SDK 下載_對象存儲 - 七牛開發(fā)者中心

全局處理

通過閱讀代碼的細節(jié),我們可以發(fā)現(xiàn),我們的方法粒度是單文件的,但事實上,我們可以先將所有的文件遍歷一遍,統(tǒng)一進行圖片的下載、上傳與替換,這樣可以節(jié)約點時間。

統(tǒng)一替換的邏輯也很簡單,我們申明一個全局Map,

private static final Map<String, String> URL_MAP = Maps.newHashMap();

其中,key是舊的新浪圖床的鏈接,value是新的自定義圖床的鏈接。

我們將listAllMDFile這一步中所獲取到的所有文件里的所有鏈接保存于此,下載時只需遍歷這個Map的key即可獲取到需要下載的圖片鏈接。然后將上傳后得到的新鏈接作為value存在到該Map中即可。

全文替換鏈接并更新文件

有了上述這些處理步驟,接下來一步就變的異常簡單,只需要遍歷每個文件,將匹配到全局Map中key的鏈接替換成Map中的value即可。

/** * 替換所有的圖片鏈接 */private static String replaceUrl(String content, Map<String, String> urlMap) { ? for (Map.Entry<String, String> entry : urlMap.entrySet()) { ? ? ? String oldUrl = entry.getKey(); ? ? ? String newUrl = entry.getValue(); ? ? ? if (StringUtils.isBlank(newUrl)) { ? ? ? ? ? continue; ? ? ?} content = RegExUtils.replaceAll(content, oldUrl, newUrl); ?} ? return content; }

我們借助commons-lang實現(xiàn)字符串匹配替換,借助Hutools實現(xiàn)文件的讀取和寫入。

files.forEach(file -> { ? try { ? ? ? FileReader fileReader = new FileReader(file.getPath()); ? ? ? String content = fileReader.readString(); ? ? ? String replaceContent = replaceUrl(content, URL_MAP); ? ? ? FileWriter writer = new FileWriter(file.getPath()); ? ? ? writer.write(replaceContent); ?} catch (Throwable e) { ? ? ? log.error("write file error, errorMsg:{}", e.getMessage()); ?} });

為了安全起見,最好把文件放在新的目錄中,不要直接替換掉原來的文件,否則程序出現(xiàn)意外就麻煩了。

接下來我們只需要運行程序,靜待備份結果跑完即可。

以上就是本文的全部內容了,希望對你有所幫助


微博圖床掛了!的評論 (共 條)

分享到微博請遵守國家法律
沁源县| 巧家县| 隆尧县| 亚东县| 天水市| 德江县| 本溪| 永清县| 如皋市| 江西省| 夏邑县| 台中市| 时尚| 温宿县| 长汀县| 南雄市| 安徽省| 项城市| 囊谦县| 陈巴尔虎旗| 高清| 大荔县| 漳州市| 连山| 石家庄市| 霍山县| 绍兴市| 阳城县| 白玉县| 宜兰市| 祁东县| 南陵县| 汾阳市| 普宁市| 宁波市| 疏勒县| 陆良县| 阿勒泰市| 宁强县| 洛阳市| 井研县|