解决方案一、利用脚本迁移到本地
使用LOC论坛大佬coldwinds编写的一键迁移脚本(扫描网站目录提取所有WB图床并下载下来的代码)进行迁移。
- extract.php - 扫描网站目录提取WB图片地址
- backup.php - 根据提取的地址下载图片
- config.php - 配置文件
- 下载好的图片存放在 images
- 文件命名规则
- https://wx1.sinaimg.cn/large/dn5lj20xc02iq162.jpg
- https://wx4.sinaimg.cn/large/4sj20e20p01mye.jpg
- https://ws1.sinaimg.cn/large/wfj2074074t18m.jpg
- 下载后变为
- 本地/wx1.dn5lj20xc02iq162.jpg
- 本地/wx4.4sj20e20p01mye.jpg
- 本地/ws1.wfj2074074t18m.jpg
下载下来后当然要把旧的WB图床地址批量替换成本地图片地址:
- 编辑器搜索替换正则规则
- 搜索:https?://([a-z0-9]+?\.)sinaimg\.cn/large/
- 替换:本地路径/$1
解决方案二、微博图床一键迁移到阿里云 OSS
近期博客上大量图片显示不出来了,打开Chrome
控制台一看出现了大量的 403 图片
这就是薅微博图床的羊毛的后果,应该是微博图床这边升级了访问策略,幸运的是直接打开图片地址还是可以访问的,不然就有得ಥ_ಥ了,这么多图片丢失了那就坑爹了,怎么办?迁移呗~~
怎么迁移?把图片一张一张的下载下来,然后换一个存放图片的服务?这未免太麻烦了吧,这么多图片~~~,真是应了那句话:微博图床一时爽,迁移火葬场[奸笑]
于是花了一点点时间写了个小程序来一键将微博图床里面的图片一键迁移到阿里云OSS
上面。这个程序使用起来很简单,提供几个阿里云OSS
的一些参数即可,比如 bucket、accessKey、accessSecret:
基于 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.
示例:
- $ mover oss --bucket=bxdc-static --key=xxxx --secret=xxxx --post=/Users/ych/devs/workspace/www.qikqiak.com/content/page
- 成功替换了图片:https://ws3.sinaimg.cn/large/006tKfTcgy1g1o2gcoqs2j30u021fe81.jpg
- 成功替换了图片:https://ws3.sinaimg.cn/large/006tKfTcgy1g1o2gcoqs2j30u0212233.jpg
- ......
利用开源脚本进行图片一键迁移到来运OSS,可以根据自己需要扩展迁移至其他云服务......
解决方案三、利用代码直接替换连接(比保存本地好一些)
下面说几种方法吧
1. 修改引用地址
将ws1/2/3/4
的s
替换成x
以后就可以访问
或者引用http
地址
2. 保存到本地
既然新浪图床不能引用了,最好的容灾的方式就是将图片保存到自己的服务器中
我这里以WordPress
为例,将WordPress
文章中引用的图片全部更换为本地链接
先来一个Sql
,使用phpMyAdmin
等工具查询
- SELECT id from wp_posts WHERE post_content like '%sinaimg%'
找到包含新浪图床图片链接的文章,将此方法加入functions.php
中
- function get_post_sinaimgs() {
- global $post;
- $content = $post->post_content;
- preg_match_all('/<img .*?src=[\"|\'](.+?)[\"|\'].*?>/', $content, $strResult, PREG_PATTERN_ORDER);
- var_dump($strResult[1]);
- }
此方法为了获取到文章中所有的图片链接,如果你引用的新浪图片文件比较多,建议直接将$post
改为写Sql
查询全部,然后正则匹配直接打印出来图片地址
在静态资源目录中新建一个PHP
文件,推荐在当前月的/wp-content/uploads
目录下新建,比如/wp-content/uploads/2019/04/
将图片链接定义为数组
- $data = [
- "https://ws1.sinaimg.cn/large/006tKfTcgy1g12lp87my3j30ow0780sz.jpg",
- "https://ws2.sinaimg.cn/large/0072Lfvtly1fymh07hzkkj30dq0dqagc.jpg",
- "https://ws3.sinaimg.cn/large/006tNc79gy1g2cj78h6x5j31gf0itwhj.jpg",
- "https://ws4.sinaimg.cn/large/0072Lfvtly1fzmelgwrkkj30el09taag.jpg",
- ];
然后开始循环处理将图片保存到本地
- foreach ($data as $item) {
- preg_match('/\/(?P<name>\w+\.(?:png|jpg|gif))$/i', $item,$matches);
- $content = file_get_contents($item);
- file_put_contents('./'.$matches['name'], $content);
- }
- echo 'Done!!!';
在/wp-content/uploads/2019/04/
目录下的命令行中执行
- php sinaimg.php
等待执行完毕,查看当前目录下的文件,应该就会有对应的图片文件
我们可以修改对应的权限和对应等所属组等
- chmod 755 ./* && chown www ./* && chgrp www ./*
以上对应的操作完成后,少不了的就是替换数据库中已经写入的地址,还是之前熟悉的操作
备份数据库,然后执行命令(将后面的地址替换为你自己的)
- UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://ws1.sinaimg.cn/large', 'https://qq52o.me/wp-content/uploads/2019/04');
- UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://ws2.sinaimg.cn/large', 'https://qq52o.me/wp-content/uploads/2019/04');
- UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://ws3.sinaimg.cn/large', 'https://qq52o.me/wp-content/uploads/2019/04');
- 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
2019年4月29日 00:39 沙发
这个最近的确比较困扰,感谢博主的精彩教程
2019年4月29日 00:41 1层
@ixianzong 我暂时用的还是之前的方法,观望一段时间
2019年4月29日 00:48 2层
@仙踪小栈 的确之前的方法非常简单,易操作
2019年4月29日 00:50 3层
@自留地 是的,目前效果还不错
2019年8月8日 17:54 2层
@仙踪小栈 之前的方法是什么意思?还是用的微博图床吗?