技术 django
Python ...

Python 突破图片的防盗链功能

晓之以理,然后灭之

其实不管要突破什么只要知道其原理,就很容易想到绕过的突破办法。

我们以百度的图片为例在本文中写入如下的编码

<img src='http://g.hiphotos.bdimg.com/album/pic/item/8694a4c27d1ed21bf874c087af6eddc451da3f17.jpg'>

我们来看一下效果,果然提示仅限百度内部使用!

enter image description here

由于一个正常的img标签,是需要一次http请求的。

首先,我们猜测是服务器端对Referer做了限制,通过抓包和几次试错分析就可以知道确实如此。而在我们直接访问图片链接的时候,图片是可以正常显示的,这说明了什么呢?是的说明了在Referer为空的时候是可以正常显示图片的。这样就很简单了,我们实现一次不带Referer的请求图片即可以。

其次,我们用我们的服务器来控制不带Referer的访问图片资源。如何实现呢。以我们的Python为例。代码如下,

#coding:utf-8

import urllib2
import sys
import socket

class GetPic():
    def __init__(self, url):
        self.picurl = url
    def get_pic(self):
        socket.setdefaulttimeout(2)
        url = self.picurl
        if not url.startswith('http://'):
            url = 'http://'+url
        try:
            req = urllib2.urlopen(url)
            return req
        except:
            return false

部署在Django的站点中也是如此简单。修改如下几点

  1. 添加urls.py
    url(r'^picture/(?P<url>.*)$', get_pic, name='get_pic'),
  2. 在views中添加调用函数

    from antipic.antipic import GetPic
    def get_pic(request, url):
        url = url[4:]
        url = urllib.urldecode(url)
        print url
        getpic = GetPic(url)
        req = getpic.get_pic()
        pic = req.read()
        return HttpResponse(pic)
    
  3. 在模板中调用即可,例如原本代码如下 <img src='http://www.baidu.com/123.jpg'>

    在模板中修改为, <img src='/picture/url=www.baidu.com/123.jpg'>

以上即可以实现。

我们可以我们修改之后的效果,就可以正常显示图片了。

enter image description here

具体代码见github下载

"文章为作者独立观点, 不代表老订阅立场"

本站作者

每日荐书

在不完美的世界力求正常——读《公司的坏话》

书名:《公司的坏话》

作者:李天田(脱不花妹妹)

出版社:北京大学出版社

赞助商

广告