新浪微博图床迁移本地和一键搬运到阿里云OSS方案

2019年4月28日23:53:24 5 0
摘要

对于许多站长而言微博图床一直都是不二选择,微博图床拥有大宽带,高速网络,不限制容量的显著优点。但是,最近微博运维团队对图床策略进行了升级,造成了引用微博图片的网站加载图片时大面积403错误,无权限访问图片资源。在前面给出了临时解决办法#修复新浪微博图床不可用返回403错误代码问题#,这个办法很好用,但No-ref会造成一些列连锁反应,且我们无法预测微博图床今后能否继续使用。

我们需要将图片迁移到本地服务,但是对于长期使用的站长而言,工作量非常大,不可能一张一张的去迁移。

 

新浪微博图床迁移本地和一键搬运到阿里云OSS方案

 

解决方案一、利用脚本迁移到本地

使用LOC论坛大佬coldwinds编写的一键迁移脚本(扫描网站目录提取所有WB图床并下载下来的代码)进行迁移。

 

  1. extract.php - 扫描网站目录提取WB图片地址
  2. backup.php - 根据提取的地址下载图片
  3. config.php - 配置文件
  4. 下载好的图片存放在 images
  5. 文件命名规则
  6. https://wx1.sinaimg.cn/large/dn5lj20xc02iq162.jpg
  7. https://wx4.sinaimg.cn/large/4sj20e20p01mye.jpg
  8. https://ws1.sinaimg.cn/large/wfj2074074t18m.jpg
  9. 下载后变为
  10. 本地/wx1.dn5lj20xc02iq162.jpg
  11. 本地/wx4.4sj20e20p01mye.jpg
  12. 本地/ws1.wfj2074074t18m.jpg

 

下载下来后当然要把旧的WB图床地址批量替换成本地图片地址:

  1. 编辑器搜索替换正则规则
  2. 搜索:https?://([a-z0-9]+?\.)sinaimg\.cn/large/
  3. 替换:本地路径/$1

 

解决方案二、微博图床一键迁移到阿里云 OSS

近期博客上大量图片显示不出来了,打开Chrome控制台一看出现了大量的 403 图片

这就是薅微博图床的羊毛的后果,应该是微博图床这边升级了访问策略,幸运的是直接打开图片地址还是可以访问的,不然就有得ಥ_ಥ了,这么多图片丢失了那就坑爹了,怎么办?迁移呗~~

怎么迁移?把图片一张一张的下载下来,然后换一个存放图片的服务?这未免太麻烦了吧,这么多图片~~~,真是应了那句话:微博图床一时爽,迁移火葬场[奸笑]

于是花了一点点时间写了个小程序来一键将微博图床里面的图片一键迁移到阿里云OSS上面。这个程序使用起来很简单,提供几个阿里云OSS的一些参数即可,比如 bucket、accessKey、accessSecret:

$ mover -h

基于 Golang 开发的一个用于将微博图床一键迁移到云服务的工具

目前只支持阿里云 OSS,文档查看:https://github.com/cnych/sinaimgmover

 

Usage:

mover [flags]

mover [command]

 

Available Commands:

help Help about any command

oss 迁移到阿里云 OSS

 

Flags:

-h, --help help for mover

-l, --length int 指定上传到OSS上面的图片名称长度,默认值:6 (default 6)

-p, --post string 指定markdown文章路径,默认值:当前目录 (default "./")

-f, --prefix string Bucket下面的文件夹目录,默认值: images (default "images")

Use "mover [command] --help" for more information about a command.

 

示例:

  1. $ mover oss --bucket=bxdc-static --key=xxxx --secret=xxxx --post=/Users/ych/devs/workspace/www.qikqiak.com/content/page
  2. 成功替换了图片:https://ws3.sinaimg.cn/large/006tKfTcgy1g1o2gcoqs2j30u021fe81.jpg
  3. 成功替换了图片:https://ws3.sinaimg.cn/large/006tKfTcgy1g1o2gcoqs2j30u0212233.jpg
  4. ......

 

利用开源脚本进行图片一键迁移到来运OSS,可以根据自己需要扩展迁移至其他云服务......

 

解决方案三、利用代码直接替换连接(比保存本地好一些)

下面说几种方法吧

1. 修改引用地址

ws1/2/3/4s替换成x以后就可以访问

或者引用http地址

2. 保存到本地

既然新浪图床不能引用了,最好的容灾的方式就是将图片保存到自己的服务器中

我这里以WordPress为例,将WordPress文章中引用的图片全部更换为本地链接

先来一个Sql,使用phpMyAdmin等工具查询

 

  1. SELECT id from wp_posts WHERE post_content like '%sinaimg%'

 

找到包含新浪图床图片链接的文章,将此方法加入functions.php

 

  1. function get_post_sinaimgs() {
  2.    global $post;
  3.    $content = $post->post_content;
  4.    preg_match_all('/<img .*?src=[\"|\'](.+?)[\"|\'].*?>/', $content$strResult, PREG_PATTERN_ORDER);
  5.    var_dump($strResult[1]);
  6. }

此方法为了获取到文章中所有的图片链接,如果你引用的新浪图片文件比较多,建议直接将$post改为写Sql查询全部,然后正则匹配直接打印出来图片地址

在静态资源目录中新建一个PHP文件,推荐在当前月的/wp-content/uploads目录下新建,比如/wp-content/uploads/2019/04/

 

将图片链接定义为数组

  1. $data = [
  2.     "https://ws1.sinaimg.cn/large/006tKfTcgy1g12lp87my3j30ow0780sz.jpg",
  3.     "https://ws2.sinaimg.cn/large/0072Lfvtly1fymh07hzkkj30dq0dqagc.jpg",
  4.     "https://ws3.sinaimg.cn/large/006tNc79gy1g2cj78h6x5j31gf0itwhj.jpg",
  5.     "https://ws4.sinaimg.cn/large/0072Lfvtly1fzmelgwrkkj30el09taag.jpg",
  6. ];

然后开始循环处理将图片保存到本地

 

  1. foreach ($data as $item) {
  2.     preg_match('/\/(?P<name>\w+\.(?:png|jpg|gif))$/i', $item,$matches);
  3.     $content = file_get_contents($item);
  4.     file_put_contents('./'.$matches['name'], $content);
  5. }
  6. echo 'Done!!!';

/wp-content/uploads/2019/04/目录下的命令行中执行

  1. php sinaimg.php

等待执行完毕,查看当前目录下的文件,应该就会有对应的图片文件

我们可以修改对应的权限和对应等所属组等

  1. chmod 755 ./* && chown www ./* && chgrp www ./*

以上对应的操作完成后,少不了的就是替换数据库中已经写入的地址,还是之前熟悉的操作

备份数据库,然后执行命令(将后面的地址替换为你自己的)

  1. UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://ws1.sinaimg.cn/large', 'https://qq52o.me/wp-content/uploads/2019/04');
  2. UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://ws2.sinaimg.cn/large', 'https://qq52o.me/wp-content/uploads/2019/04');
  3. UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://ws3.sinaimg.cn/large', 'https://qq52o.me/wp-content/uploads/2019/04');
  4. UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://ws4.sinaimg.cn/large', 'https://qq52o.me/wp-content/uploads/2019/04');

就这样,剔除文章中引用新浪微博图床的图片成功,其他地方同理即可

 

还是那句话,小伙伴们在进行任何关于数据方面的操作前一定要记得备份!一定要记得备份!一定要记得备份!数据前万条,安全第一条。这是站长运维万古不变的运维名言。

 

 

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如果喜欢,请打赏支持本站,谢谢大家!

Warning: mysqli_query(): (HY000/1194): Table 'wp_posts' is marked as crashed and should be repaired in /home/www/ixianzong.com/wp-includes/class-wpdb.php on line 2431

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:5   其中:访客  0   博主  0

    • ixianzong ixianzong 2 来自天朝的朋友 谷歌浏览器 Windows 7 江苏省苏州市 电信

      这个最近的确比较困扰,感谢博主的精彩教程 :wink:

        • 仙踪小栈 仙踪小栈 9 来自天朝的朋友 谷歌浏览器 Windows 7 江苏省苏州市 电信

          @ixianzong 我暂时用的还是之前的方法,观望一段时间

            • 自留地 自留地 2 来自天朝的朋友 谷歌浏览器 Windows 7 江苏省苏州市 电信

              @仙踪小栈 的确之前的方法非常简单,易操作

              • sean sean 0 来自天朝的朋友 谷歌浏览器 Windows 10 河南省郑州市 联通

                @仙踪小栈 之前的方法是什么意思?还是用的微博图床吗?