一直都是用的 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","https://aixiaoxian.oss-cn-shanghai.aliyuncs.com/blog");FileWriter.create(file).write(newMDContent);});}
复制代码

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

炸了!3年图片都没了!相关推荐

  1. 计算机保存图片找不到桌面,电脑从做系统图片都没了-为什么保存在电脑的图片,找不到?...

    电脑知识网 2021-06-21 3 次 笔记本做系统后 电脑的照片没了 如何找回?可恢复上个版本么? 题主应该是装新系统的时候把硬盘重新分区了,或者原来开不了机的系统就只有一个分区,导致所有文件被格 ...

  2. 用手机UC浏览器页面打开vue项目,图片,css,js都没加载

    用手机UC浏览器页面打开vue项目,图片,css,js都没加载 用HBuilder X创建了一个普通的vue项目,在电脑上使用浏览器看没有什么问题,然后提交到了公司的服务器上,发现用手机,除了火狐,谷 ...

  3. 过分!高校实验动物被学生私自放走,实验兔刚缝完针,连线都没拆......

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文募格学术撰写.参考资料:微博.环球网.齐鲁晚报网等 现在搞科研真 ...

  4. 互掐了半辈子的两个数学巨头,到最后连单身问题都没解决

    我居然跑不赢 一只龟 看文章前,我们先来讨论一个问题:"假设有一笔钱,先花它一半,再花它剩下的一半,这么花下去,是不是永远花不完?". 看起来这个问题无懈可击,找不到bug,但是实 ...

  5. 计算机的桌面图标都没有了怎么办,电脑桌面图标都没了怎么办 怎么恢复

    小编今天刚刚打开电脑的时候,出现了一个问题,电脑桌面上所有的图标都不见了,快捷方式图标和图片缩略图,文件夹等都无法显示,电脑桌面图标都没了怎么办?这其实是个小问题,那电脑桌面图标都没了怎么恢复呢,小编 ...

  6. 打开黑色_表哥出差带回来一箱苹果,打开后发现是黑色的,大家表示都没见过...

    说到水果我想每个人都有一种或者几种爱吃的水果吧?水果口感酸甜,深受广大食客的喜爱,而且常吃水果还可以补充人体的所需的营养物质,从而调节人体的营养均衡,尤其是到了冬季天气比较干燥多吃一些水果还可以补充更 ...

  7. 我是个程序员,每天敲敲打打,哪天电脑崩溃了会发现我这辈子啥都没留下

    2019独角兽企业重金招聘Python工程师标准>>> 我尽量用平和一点的口吻跟你说说关于程序员的那点事儿. 1. 我在一个叫XXXX的公司上班,那地方有50%的人整天干的事情就是催 ...

  8. 他,生物系毕业,刚入职连Java都没听过,却在马云的要求下,三周写出淘宝网雏形...

    生物信息学习的正确姿势 NGS系列文章包括NGS基础.高颜值在线绘图和分析.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流 ...

  9. 【夜读】输与赢,在成长的面前都没那么重要

    [夜读]输与赢,在成长的面前都没那么重要 2017-07-26 人民日报 1 子山是一位茶商,喜欢藏茶.品茶.以茶会友.作为一位近乎痴迷的爱茶之人,更多的是跑到各个茶园甚至深山之中去收取一些绝品好茶. ...

最新文章

  1. 十五、插入排序算法(两种方式)
  2. 2.let和const命令
  3. 通过Spring将AWS SQS用作JMS提供程序
  4. 有问有答 | 算法和数据结构精华问答
  5. phpcmsV9子栏目调用其父栏目名称、URL、catid等信息 - 方法总结
  6. Android开发之注解式框架ButterKnife在ADT中的设置
  7. 【转载】web.xml中的classpath和classpath*
  8. C语言指针类型和类型转换
  9. 机器学习:matlab和python实现PCA降维算法
  10. kivy制作安卓APP--简单音乐播放器
  11. 八字易经算法之用JAVA实现二十八星宿算命
  12. 布尔教育_燕十八 php,布尔教育_燕十八_HTML视频资源课件
  13. android mediaplayer播放sdcard音乐,Android 音乐播放MediaPlayer
  14. 为Visual SVN Server添加认证用户IP功能
  15. redis数据丢失及解决
  16. 全网最全最新安装nodes方式,楼主亲测好用
  17. 创始人是公关营销的关键所在
  18. 3D打印机小鲁班初使用体验
  19. IDEA设置背景为护眼(护眼绿)
  20. 宝塔数据盘满了,怎么办?linux批量压缩图片文件,2步完成压缩

热门文章

  1. 回归常态啦 2020.12.08日记
  2. 教程:实现WinUSB通信系统的最简单的方式
  3. galaxy tab p1000 升级android,三星Galaxy Tab P1000 简朴的刷机教程(附rom包下载地址)...
  4. docker部署finebi 帆软
  5. 蓝绿部署、AB测试、灰度发布、⾦丝雀发布、滚 动发布的概念与区别
  6. 中式红木装修,古雅灵动、温婉雅致、独具风情
  7. RNA-seq 详细教程:实验设计(2)
  8. C# 学习笔记:委托(5):可变性
  9. P1024 [NOIP2001 提高组] 一元三次方程求解
  10. 【MySQL】表操作和库操作