2024年关于新浪图床失效的解决方法

前言

很多早期的站长基本使用新浪的图床, 新浪图床免费又稳定, 受到很多人的青睐, 我本人不怎么用新浪图床, 但是手上有一批素材, 引用的是新浪服务器中的图片, 目前这些图片无论是在浏览器还是在Markdown编辑器中都无法显示

image-20240417181012252

image-20240417181029759

这已经不是简单的防盗链了 应该是新浪服务器做了某种屏蔽处理

检测服务器和链接是否正常

首先我们要确保新浪服务器中有该图片文件, 可以通过以下几种方式检测:

  1. VScode编辑器中打开文档 然后鼠标停留在图片链接上, 如果能显示图片, 说明该链接有效

    2024-04-17 18-02-18.2024-04-17 18_02_58

  2. PostMan或者ApiPost进行请求访问
    image-20240417181652619

  3. 使用下载工具进行下载

    image-20240417181820927

值得庆幸的是 新浪服务器还没有挂 我们还有足够的时间来对图片进行转移和备份

防盗链临时解决方法

为了使图片迅速恢复访问, 我们可以使用第三方缓存服务来解决防盗链问题, 有以下四种方式可行:

  1. WordPress

    1
    https://i0.wp.com/图片地址(图片地址要掉 https://)
  2. Weserv.nl

    1
    https://images.weserv.nl/?url=图片地址
  3. 百度 1:

    1
    https://image.baidu.com/search/down?url=图片地址
  4. 百度 2

    1
    https://gimg2.baidu.com/image_search/&app=2020&src=图片地址(图片地址要去掉 https://)

使用百度的速度相对快一些

Wordpress批量替换

如果你的wordpress博客大量的图片都在新浪中, 那么可以通过以下两种方式进行批量替换:

  1. 静态替换 修改数据库

    修改数据库之前记得先备份数据库 以防止误操作无法还原

    sql命令如下:

    1
    UPDATE wp_posts SET post_content = REPLACE( post_content,  'https://tvax1.sinaimg.cn/',  'https://image.baidu.com/search/down?url=https://tvax1.sinaimg.cn/' )
  2. 动态替换 修改主题代码

    进入wordpress主题编辑器:

    image-20240417185327043

    将以下代码添加到主题页脚foot.php中:

    1
    2
    3
    4
    5
    6
    7
    <script>
    let context = Array.prototype.map.call(document.images, (event) => {
    event.src = event.src.replace("tvax1.sinaimg.cn/", "image.baidu.com/search/down?url=https://tvax1.sinaimg.cn/")

    });

    </script>

    image-20240417185632599

推荐使用动态的方式自动批量替换, 能将降低数据库操作风险, 又方便后期再次更改, 动态的方式唯一不足之处就是图片加载有延迟

如果你追求加载速度和用户体验, 那么建议采用静态替换的方式

图片批量备份

上面这种临时替换方式始终不是长久之计, 我们需要尽快对图片进行备份和迁移 防止新浪图床哪天不再提供服务了

我个人的做法是通过python批量将图片下载到本地 然后进行图床更换, 核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# -*- coding:utf-8 -*-

import os
import sys
from pyquery import PyQuery as pq
import urllib
# 当前文件路径
current_path = os.path.abspath(__file__)
# 父目录
father_path = os.path.abspath(os.path.dirname(current_path) + os.path.sep + ".")

#----- 用于图片下载------
opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36'),('Accept' , 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'),(
'Accept-Encoding' , 'gzip,deflate,sdch'),
('Accept-Language' , 'zh-CN,zh;q=0.8')]
req=urllib.request
req.install_opener(opener)
#----- 用于图片下载------

# 图片输出目录
pic_dir = 'img'
if not os.path.exists(pic_dir):
os.makedirs(pic_dir)


#将网络图片下载到本地
def download_img(url,dir,image_name):
try:
req.urlretrieve(url, dir+image_name)
except Exception as e:
raise e


#采用原图片地址的名称
def get_pic_name_by_url(url):
# 我只需要末尾xxx部分 使用正则替换
image_name = url.split('/')[-1]
return image_name

def img2url(url):
fir="https://cdn.jsdelivr.net/gh/xxx/xxx/img/"

if "sinaimg.cn" in url:
url="https://image.baidu.com/search/down?url="+url
new_name=get_pic_name_by_url(url)
try:
download_img(url,"{parent}/img/".format(parent=father_path),new_name)
except Exception as e:
print(f"图片下载异常: {e}")
return url
return fir+new_name

# 遍历每篇文章
for idx, post in enumerate(posts):
content, lastmodifytime = post

d=pq(content)
for item in d("img").items():
old_url=item.attr("src")
# 将图片下载到本地
new_url=img2url(old_url)
print(new_url)
#替换图片地址
item.attr("src",new_url)

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%