通过询问ChatGPT,不难得出:
分析两种 URL 的行为
url1 = "https://fb.fenbike.cn/api/tarzan/images/1495b81ea9efe71.png" 失败的可能原因
- URL 访问限制:这个 URL 可能需要身份验证(如 Token、Cookie 等)才能访问,而
Pictures.Insert 方法无法处理这些验证机制。
- 防盗链机制:服务器可能配置了 Referer 限制,只有特定来源(如网页浏览器)能访问,而 VBA 直接请求时被拒绝。
- 响应头问题:服务器可能返回了
Content-Disposition: attachment,导致 VBA 不能正确解析为图片。
- HTTPS 证书问题:如果服务器的 SSL 证书不受 Windows 受信任的根证书支持,VBA 可能无法下载图片。
url2 = "https://img2.baidu.com/it/u=2430257832,456548366&fm=253&fmt=auto?w=800&h=1067" 能正确返回
- URL 可公开访问:这个 URL 直接指向一个可访问的图片文件,VBA 可以正常下载。
- 无身份验证:百度图片服务器对公共访问没有身份认证要求。
- 正确的
Content-Type:百度图片服务器返回的 Content-Type 可能是 image/png 或 image/jpeg,Excel 能正确解析。
含有保存到本地,并且插入到Excel中,代码如下:
[Visual Basic] 纯文本查看 复制代码 Sub InsertImageFromUrl()
Dim url As String
Dim http As Object
Dim stream As Object
Dim filePath As String
url = "https://fb.fenbike.cn/api/tarzan/images/1495b81ea9efe71.png"
' 创建 XMLHTTP 对象
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send
' 检查请求是否成功
If http.Status = 200 Then
' 创建 ADODB.Stream 对象
Set stream = CreateObject("ADODB.Stream")
stream.Type = 1 ' 二进制数据
stream.Open
stream.Write http.responseBody
' 设置临时文件路径
filePath = ThisWorkbook.Path & "\temp_image.png"
' 保存到本地文件
stream.SaveToFile filePath, 2
stream.Close
' 在 Excel 中插入图片
ActiveSheet.Pictures.Insert filePath
Else
MsgBox "下载失败: " & http.Status, vbCritical
End If
' 清理对象
Set http = Nothing
Set stream = Nothing
End Sub
|