新浪微博图床防盗链后个人博客上的图片如何本地化?

新浪博客已正式宣布“相册”功能下线( 点此了解详情),相册导出功能开放到 2019 年 7 月 31 日 24 时,建议大家要及时将新浪相册的图片导出,若想批量导出新浪博客相册的图片到本地的可以参考『 新浪微博图床防盗链后个人博客上的图片如何本地化?』和『 批量将新浪博客相册图片导入 WordPress 本地教程

最有效的临时解决办法

还是照着笛声博客的风格,先来一个最简单的方法。那就是在网站配置文件里面加一行配置:add_header Referrer-Policy "no-referrer"; 这条配置的意思是将整个 Referer 首部移除。访问来源信息不随着请求一起发送。总之就是让新浪那边认为,这张图片我是直接输入完整的图片地址打开的,而不是从他人的网站引用打开的。

  1. server {
  2. listen 443 http2 fastopen=3 reuseport;
  3. server_name hqidi.com www.hqidi.com;
  4. root /www/blog;
  5. add_header Referrer-Policy "no-referrer";

另一种方法就是在主题文件 header.php 文件中添加相关代码,详见『新浪微博开启防盗链导致博客引用图片失效怎么办?』。不过这终究不是长久之计,refarrer 相关的功能都失效了,有点饮鸩止渴的意思,我们还是得另辟蹊径。

最有效的解决办法

我们还是以尽量简单的方法来搞定这个问题。首先我们要把网站中所有放在新浪图床上的图片都找出来,然后下载到我们的网站服务器上。

找出所有新浪图床上的照片

如果你是打开你网站的每一个页面,然后一个个去找的话,请打开窗户,确认下面没人,然后把电脑丢下去。笛声这里提供一个非常快速的方法找出所有新浪图床上的图片,我们先来看看新浪图床图片 URL 的特点:

  1. http://ws1.sinaimg.cn/large/006tKfTcgy1g12lp87my3j30ow0780sz.jpg
  2. https://ws2.sinaimg.cn/large/0072Lfvtly1fymh07hzkkj30dq0dqagc.png
  3. https://ws3.sinaimg.cn/large/006tNc79gy1g2cj78h6x5j31gf0itwhj.gif
  4. https://ws4.sinaimg.cn/large/0072Lfvtly1fzmelgwrkkj30el09taag.jpg

我们需要一个正则表达式把上面的链接都匹配出来

  • 最前面的协议有两种情况 http 和 https,所以我们用 https?来匹配(问号表示前面的‘s’要么出现 0 次,要么出现 1 次)
  • 后面的 ws 开头的主机好像有 4 台,然后我就算他 10 台,所以对应的正则为 ws[0-9]
  • ‘/large/491ea66cgy1g26kbwkrgpj22001hs7wh’这一段杂七杂八的用[a-Z0-9/]+?来匹配,‘[a-Z0-9/]’这里表示不管你是字母还是数字,还是/都给你匹配上,后面的+表示前面的数字、字母会出现一次或者多次,最后的问号是用来防止过渡匹配的,在这不加问号也没问题。
  • 最后面的图片格式用.(jpg|png|gif)来匹配。

最终的正则表达式为

  1. https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)

当然,如果你的网站数据库非常大的话,你需要把这条正则写的尽量的精确,免得半天都跑不出来结果,比方说你全站 https 就可以这样写:

  1. https://ws[1-4].sinaimg.cn/large/[a-Z0-9/]+?.(jpg|png|gif)

正则有了,我们现在去网站的数据库文件里面把所有新浪图床上的图片捞出来,执行下面的命令,最后的 190425.sql 是网站数据库备份文件。

  1. grep -Eo 'https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' 190425.sql


新浪图床图片本地化

刚刚我们把所有新浪图床上图片 URL 全都找了出来,我们现在用一个 for 循环把新浪上的图片全下载下来,建议在网站根目录新建一个 large 目录,把你网站数据库备份文件 190425.sql 也放到这里,然后把图片全下载到这里,在 large 目录里面执行:

  1. for i in `grep -Eo 'https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' 190425.sql`;do wget $i;done

此时,你已经把所有新浪图床上的图片都下载到服务器上,你只要修改下链接就行了。

现在要动数据库了,一定得先备份数据库,一定得先备份数据库,一定得先备份数据库,然后动手。

登录进 MySQL,use 切换到你网站数据库,然后执行下面命令:

  1. UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws1.sinaimg.cn', 'hqidi.com');
  2. UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws2.sinaimg.cn', 'hqidi.com');
  3. UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws3.sinaimg.cn', 'hqidi.com');
  4. UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws4.sinaimg.cn', 'hqidi.com');

注意自行替换最后面的“hqidi.com”,此时,大功告成,新浪图床图片本地化完成,记得一定要把 large 目录里面的数据库备份文件删除。

相关推荐

发表评论

路人甲

网友评论(0)