新浪微博图床图片本地化的方法

盼望着 盼望着 春天来了,新浪图床防盗链了。我们知道这一天早晚会来,只是来得比大家预期的都要早,以为还可以安心的用几年呢。
就算是当初“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正则

新浪图床图片本地化

刚刚我们把所有新浪图床上图片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目录里面的数据库备份文件删除。

原创文章,转载请注明: 转载自笛声

本文链接地址: 新浪微博图床图片本地化的方法

13 条评论

  • 西枫里博客 2019年4月28日 回复

    连正则都会,循环也会,sql语句也会,干嘛不学门语言了,分分钟的事~

  • boke112导航 2019年4月28日 回复

    确实不错,很多站长都还想等着有其他办法,不想本地化

    • dige 2019年4月28日 回复 作者

      有人建立了反代,但你敢用吗?说不定没几天就撤掉了,都不通知你一声。

  • 红嘴鸭 2019年4月28日 回复

    不错不错,感谢博主的分享

  • 知识共享网 2019年5月2日 回复

    已经全部转移了

  • 姜辰 2019年5月5日 回复

    666

    还好我都是本地化的。不过想吐槽一件事,为啥我正常挂代理带你博客打不开,用源IP就可以。因为教育系统的网相当于明的,所以几乎都是挂着国内代理来的。

    • dige 2019年5月6日 回复 作者

      我也不清楚为什么打不开,大概是我用的CDN——verycloud的问题吧。

  • emorsl 2019年5月10日 回复

    新浪一炸大佬们就都出来了,果然免费的才是最贵的。

  • 橘子君 2019年5月24日 回复

    有多少人被新浪图床给坑了...

  • 石樱灯笼 2019年6月1日 回复

    15年前我还用百度空间做图床,后来有了反盗链之后还用了好长时间的第三方反代,但最终没想到百度会把整个百度空间项目关停,不仅是图片,好多文章和好友也从此消失。
    所以我现在完全不使用第三方服务,清一色自建服务,还能简单容易的定期备份。

    • dige 2019年6月2日 回复 作者

      数据还是在自己手里踏实。

  • kailiuwang 2019年6月5日 回复

    你好!grep -Eo 'https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' 190425.sql 这个命令是在什么地方执行呀?

    • dige 2019年6月7日 回复 作者

      通过ssh登录到网站服务器上去执行,宝塔面板上好像可以执行linux命令,你找找。

发表评论

电子邮件地址不会被公开。 必填项已用*标注