在尝试从微信公众号文章中获取图片并在项目中使用时,我们会注意到,尽管直接在浏览器地址栏输入微信图片的URL可以正常访问,但是当我们在自己的项目中通过img标签的src属性引入这些图片时,却会遇到“此图片来自微信公众平台未经允许不可引用”的提示。这是因为微信实施了类似防盗链的措施,以防止其他平台未经授权地使用这些图片。

示例代码

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
</head>
<body class="bg-light">
 <img src="https://mmbiz.qpic.cn/sz_mmbiz_png/DrGSIyo1qeq1FtIYCpHpic48Bmg9rXcqFOMTBaJ7Xxt8JiamgcLMC4YXNYVGAhqJvcB9jQibxhElgqxcmk7e18gVA/640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" /> 
</body>
</html>

测试访问:

方案一

在页面header中添加meta标签,设置referrer。

<meta name="referrer" content="never">

这一属性会阻止header发送页面相关的信息,如此一来,虽然能够防范某些攻击,并且达到绕过图片防盗链的目的,确实解决了图片防盗链方面的问题。不过,这也引发了其他的状况,例如对页面跳转和回溯产生影响,致使第三方统计代码(像CNZZ、百度统计等)失效,还会给SEO(搜索引擎优化)以及社交媒体分享带来不利影响等。

方案二

img标签上添加 referrerpolicy=”no-referrer”

<img src="微信图片url" referrerPolicy="no-referrer" />

方案三

<img src="https://xxx代理地址/?url=微信图片url"/>

需要自己去找一些第三方的代理,但是如果第三方地址挂了,那么就出问题了。所以这个方法可能不太稳定。

Python Flask代理服务器

通过Flask框架和requests库实现图片资源的获取和转发。该方法相对稳定。

from flask import Flask, Response, request
import requests

app = Flask(__name__)

def fetch_image(image_url):
    try:
        response = requests.get(image_url)
        if response.status_code == 200:
            return response.content
        else:
            return None
    except requests.RequestException as e:
        print(f"Error fetching image: {e}")
        return None

@app.route('/fetchImage', methods = ['GET'])
def fetchImage():
    # 获取图片地址
    image_url = request.args.get('url')
    image_data = fetch_image(image_url)
    if image_data:
        mime_type = 'image/jpeg'  # 这里需要替换为实际的MIME类型
        return Response(image_data, mimetype=mime_type)
    else:
        return "Failed to fetch image", 404



if __name__ == '__main__':
    # 使用WSGI服务器运行应用程序
    from gevent.pywsgi import WSGIServer
    http_server = WSGIServer(('127.0.0.1', 5000), app)
    http_server.serve_forever()