经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 网络安全 » 查看文章
炸了!3年图片都没了
来源:cnblogs  作者:艾小仙  时间:2023/2/17 10:01:04  对本文有异议

一直都是用的 Typora+微博免费图床写作,前段时间突然发现图片全都裂了,打开一看都是 403 。

开始我以为图片微博都给我删了,找了一堆平台去翻我的历史文章看图片是不是都在,找了半天发现图片要么不够清晰,要么就是文章不全,要么呢就是有水印,所有的原图基本上是找不回来了,跟不用说还有一些文章是没有在任何平台发表过的。

这就很难受了,所以这件事情就拖了好几个月都没处理,最近突然看到一篇文章才发现,哦,原来 403 是限制了Referrer,写代码还是可以下载下来的,试了试果然是可以的,那问题就简单了。

那我只要:扫描我的所有 md 文件=>找到所有的微博图床的图片链接=>下载所有图片=>上传到新图床=>替换图片链接,不就搞定了嘛。

扫描文件

首先找到我的文章的目录,扫描所有的文件,把 md 文件全部找出来。

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

获取链接

根据参考文章里大佬写的正则,根据正则匹配到每篇文章里的链接地址,然后根据微博图床的名称过滤得到所有使用微博图床的图片地址,扫描最终得到的图片有大概 2000 张。

  1. private static Set<String> getUrls(List<File> files)throws Exception{
  2. Set<String> urlList = new HashSet<>();
  3. Pattern pattern = Pattern.compile(
  4. "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov"
  5. + "|mil|biz|info|mobi|name|aero|jobs|museum" + "|travel|[a-z]{2}))(:[\\d]{1,5})?"
  6. + "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?"
  7. + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?"
  8. + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b");
  9. files.forEach(file->{
  10. String mdContent = FileReader.create(file).readString();
  11. Matcher matcher = pattern.matcher(mdContent);
  12. while(matcher.find()){
  13. urlList.add(matcher.group());
  14. }
  15. });
  16. return urlList.stream().filter(url->url.contains("sinaimg.cn")).collect(Collectors.toSet());
  17. }

下载|上传图片

得到所有图片地址后,直接把图片下载到本地,这里为了方便,直接截取出图片中的图片名称保存,那么之后就可以直接把图片上传到其他的图床了。

  1. private static void download(Set<String> urls) throws Exception{
  2. for (String str : urls) {
  3. OutputStream os = null;
  4. InputStream is = null;
  5. try {
  6. URL url = new URL(str);
  7. URLConnection con = url.openConnection();
  8. is = con.getInputStream();
  9. byte[] bs = new byte[1024];
  10. int len;
  11. String fileName = str.substring(str.lastIndexOf("/")+1);
  12. os = Files.newOutputStream(Paths.get("/Users/user/Desktop/" + fileName));
  13. // 开始读取
  14. while ((len = is.read(bs)) != -1) {
  15. os.write(bs, 0, len);
  16. }
  17. } finally {
  18. if (os != null) {
  19. os.close();
  20. }
  21. if (is != null) {
  22. is.close();
  23. }
  24. }
  25. }
  26. }

这里我选择用的是阿里云 OSS,直接手动全丢进去就行了。

替换链接

现在我的图片名称都是一样的,只要替换掉域名那部分就行了,最后写回文件。

  1. private static void replace(List<File> files){
  2. //替换 md 文件中的微博图床文件
  3. files.forEach(file->{
  4. String mdContent = FileReader.create(file).readString();
  5. String newMDContent = mdContent.replaceAll("https://tva1.sinaimg.cn/large","http://cdn.aixiaoxian.vip/blog");
  6. FileWriter.create(file).write(newMDContent);
  7. });
  8. }

另外一方面就是关于费用的问题,目前因为基本都是我自己在用,一天都花了 7 分,一个月岂不是 2 块钱,有点太贵了!!!后面再看看有没有跟便宜点的。

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

原文链接:https://www.cnblogs.com/ilovejaney/p/17125810.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号