盼望着 盼望着 春天来了,新浪图床防盗链了。我们知道这一天早晚会来,只是来得比大家预期的都要早,以为还可以安心的用几年呢。
就算是当初“weibo.com这个域名我要了,你开个价,我不还价”这般财大气粗,依然经不住粗水长流的流量费用。
还是照着笛声博客的风格,先来一个最简单的方法:
在网站配置文件里面加一行配置: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";
不过这终究不是长久之计,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)
正则有了,我们现在去网站的数据库文件里面把所有新浪图床上的图片捞出来,执行下面的命令,最后的190425.sql是网站数据库备份文件。
grep -Eo 'https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' 190425.sql
新浪图床图片本地化
刚刚我们把所有新浪图床上图片URL全都找了出来,我们现在用一个for循环把新浪上的图片全下载下来,建议在网站根目录新建一个large目录,把你网站数据库备份文件190425.sql也放到这里,然后把图片全下载到这里,在large目录里面执行:
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切换到你网站数据库,然后执行下面命令:
UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws1.sinaimg.cn', 'hqidi.com'); UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws2.sinaimg.cn', 'hqidi.com'); UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws3.sinaimg.cn', 'hqidi.com'); UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws4.sinaimg.cn', 'hqidi.com');
注意自行替换最后面的“hqidi.com”,此时,大功告成,新浪图床图片本地化完成,记得一定要把large目录里面的数据库备份文件删除。
原创文章,转载请注明: 转载自笛声
本文链接地址: 新浪微博图床图片本地化的方法
17 条评论
连正则都会,循环也会,sql语句也会,干嘛不学门语言了,分分钟的事~
确实不错,很多站长都还想等着有其他办法,不想本地化
有人建立了反代,但你敢用吗?说不定没几天就撤掉了,都不通知你一声。
不错不错,感谢博主的分享
已经全部转移了
666
还好我都是本地化的。不过想吐槽一件事,为啥我正常挂代理带你博客打不开,用源IP就可以。因为教育系统的网相当于明的,所以几乎都是挂着国内代理来的。
我也不清楚为什么打不开,大概是我用的CDN——verycloud的问题吧。
新浪一炸大佬们就都出来了,果然免费的才是最贵的。
有多少人被新浪图床给坑了...
15年前我还用百度空间做图床,后来有了反盗链之后还用了好长时间的第三方反代,但最终没想到百度会把整个百度空间项目关停,不仅是图片,好多文章和好友也从此消失。
所以我现在完全不使用第三方服务,清一色自建服务,还能简单容易的定期备份。
数据还是在自己手里踏实。
你好!grep -Eo 'https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' 190425.sql 这个命令是在什么地方执行呀?
通过ssh登录到网站服务器上去执行,宝塔面板上好像可以执行linux命令,你找找。
博主你好,加那串代码到网站配置文件里还有效吗。我试了试试不知道方法不对还是怎么,加了之后没效果
有用的啊,你加了代码后重启nginx了吗?
重启了
加了之后好像还和主题冲突了,我用的是typecho,也可能是我加在配置文件加错地方了,小白不太懂,我再琢磨琢磨