给力购

emlog新浪图床失效403 外链丢失 图片批量本地化解决方案

【摘要】前言新浪微博图床403防盗链了,我们知道这一天终究会来的,只是来得比大家预期的都要早,以为还可以安心的用几年呢。就算是当初“weibo.com这个域名我要了,你开个价,我不还价”这般财大气粗,依然经不住粗水长...

  • 前言

    新浪微博图床403防盗链了,我们知道这一天终究会来的,只是来得比大家预期的都要早,以为还可以安心的用几年呢。就算是当初“weibo.com 这个域名我要了,你开个价,我不还价”这般财大气粗,依然经不住粗水长流的流量费用。那么新浪微博图床防盗链后我们博客的图片怎么办?

u=2446139834,3154542831&fm=26&gp=0.jpg

  • 先说下临时解决方案

还是照着空白博客的风格,先来一个最简单的方法。那就是在网站配置文件里面加一行配置:

add_header Referrer-Policy “no-referrer”;

这条配置的意思是将整个 Referer 首部移除。访问来源信息不随着请求一起发送。总之就是让新浪那边认为,这张图片我是直接输入完整的图片地址打开的,而不是从他人的网站引用打开的。

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

另一种方法就是在主题文件 header.php 文件中添加相关代码,不过这终究不是长久之计,refarrer 相关的功能都失效了,有点饮鸩止渴的意思,我们还是得另辟蹊径。

  • 最有效的解决办法

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

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

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

http://ws1.sinaimg.cn/large/006tKfTcgy1g12lp87my3j30ow0780sz.jpg
https://ws2.sinaimg.cn/large/0072Lfvtly1fymh07hzkkj30dq0dqagc.png
https://ws3.sinaimg.cn/large/006tNc79gy1g2cj78h6x5j31gf0itwhj.gif
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)来匹配。

最终的正则表达式为

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

当然可能还会出现其他前缀,按照前面正确填写正则表达式匹配即可。

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

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

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

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

建议首先在网站的根目录下新建一个 large 文件夹,把数据库文件备份下来后放置在large文件内,利用SSH工具进入到large文件再去执行上面的正则。

cd /www/wwwroot

新浪图床图片本地化

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

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

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

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

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

UPDATE emlog_blog SET content = REPLACE( content, 'https://ws1.sinaimg.cn', 'http://www.52zyb.cn');
UPDATE emlog_blog SET content = REPLACE( content, 'https://ws2.sinaimg.cn', 'http://www.52zyb.cn');
UPDATE emlog_blog SET content = REPLACE( content, 'https://ws3.sinaimg.cn', 'http://www.52zyb.cn');
UPDATE emlog_blog SET content = REPLACE( content, 'https://ws4.sinaimg.cn', 'http://www.52zyb.cn');

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

如果你的网站有htts协议,可以省略https及http

了解一下数据库操作文件格式,就可以把所有程序包括wordpress的图片批量本地化。

有什么问题,或者疑问可以留言,看到会回复解答。
 


 空白
 简介:我爱资源吧(www.52zyb.cn)免费资源分享平台 - 免费QQ活动,QQ资讯共享 - 好东西不私藏!

给力购

发表评论

游客
送你一朵小花花~

帅人已评(0)