微信圖片防盜鏈解決方案:自建代理繞過限制。

张苹果博客發表於2024-11-01

當爬取微信裡的圖片使用的時候會發現,當我們瀏覽器位址列 訪問微信中的圖片URL是沒有問題。但當我們在自己專案中使用img標籤src引入的時候,就會出現,“此圖片來自微信公眾平臺未經允許不可引用”的問題。這是因為微信為了防止其他平臺引入,特意做了類似防盜鏈的功能。

前往原文地址檢視效果:張蘋果部落格

網上找了幾個解決方法。

一,在頁面header中新增meta標籤,設定referrer。

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

該屬性禁止了header傳送頁面相關資訊,雖然可以阻止一些攻擊以及繞過圖片防盜鏈的效果。確實解決了這個問題。但是會出現其他問題如:影響頁面跳轉和回溯,第三方統計程式碼失效(如CNZZ、百度統計),SEO和社交媒體分享影響等。

二,img標籤上新增 referrerpolicy="no-referrer"

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

正常應該能解決,但我的專案第一次開啟圖片的時候沒問題,但當我第二次訪問的時候,不知道為什麼又出現了“此圖片來自xxxxx”的問題。

三,第三方代理

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

需要自己去找一些第三方的代理,但是如果第三方地址掛了,那麼就出問題了。所以這個方法可能不太穩定。

想了想,既然別人的可能不穩定,能不能自己寫一個呢?後面自己用python簡單實現了一下。

四,Python Flask代理伺服器

透過Flask框架和requests庫實現圖片資源的獲取和轉發。該方法相對穩定(畢竟是自己弄的),但可能受到伺服器效能和網路環境的影響。

1,完整程式碼
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()

2,測試介面沒問題

3,部署到伺服器上使用。
   <img src="https://zhangpingguo.com/spider/fetchImage?url=https://mmbiz.qpic.cn/sz_mmbiz_png/3Vm2lcZKj6kibOJxU942w70J8zb6ianMzwPvEwSI5SNOzicM47GN9Bo3MvPAeHJr7pjPRVsjxDLgOYKQ3pR8jcHHA/640?wx_fmt=png&from=appmsg"/>

最後結果正常訪問。但是估計是我伺服器太廉價了,訪問速度忒慢了。不管了,反正能用就行...
如你是PC端訪問本文,進入原文張蘋果部落格,滑鼠移入上方線條,點選“摸魚日曆”可檢視效果。

相關文章