<script type="text/javascript" src="http://www.myfootprints.cn/jsLib/mfMessage.js"></script>      <script type="text/javascript"> 
<!--
    var oInfo = new mfMessage(); 

    // 将焦点置于第一个输入框上
    oInfo.addEventHandler(window, 'load', function () {
            oInfo.focusOnFirstFormElement();
            }); 
    
    // 生成图片链接地址
    function generateUrl() {
        var sRssUrl = document.getElementById('link').value;
        var reUrl = /^(http:\/\/)?(\w+\.)?([\w|-]+)\.\w+.*[^.]$/;
        if (sRssUrl.length <= 0) {
            return;
        }
        if (!reUrl.test(sRssUrl)) {
            return;
        }
        var sDoodleImageRSSUrl = 'http://www.myfootprints.cn/ASPAgent.asp';
        sDoodleImageRSSUrl += '?url=' + encodeURIComponent(sRssUrl) + '&contentType=image/*';
        // 由于有些地方会对链接类型做检查,后缀名不是图片格式则非法,所以多加一个参数
        sDoodleImageRSSUrl += '&imgType=.jpg';
        document.getElementById('doodleLink').value = sDoodleImageRSSUrl;

        var oImg = document.getElementById('imagePreview');
        oImg.src = sDoodleImageRSSUrl;

        return sDoodleImageRSSUrl;
    }

    // 输入框里的按键事件捕获
    function catchKeyup() {
        var oEvent = oInfo.getEvent(window.event);
        if (oEvent.keyCode == 13) {
            if (oEvent.target == document.getElementById('link')) {
                // 生成图片的链接地址
                generateUrl();
            } else if (oEvent.target == document.getElementById('doodleLink')) {
                // 复制图片的链接地址
                copyIt(oEvent.target);
            }
        }
        return false;
    }

    // 复制对象内容
    function copyIt(o) {
        try {
            if (o.value.length > 0) {
                o.select();
                window.document.execCommand('Copy');

                oInfo.showMessage('涂鸦代理链接复制成功。', true);
            }
        } catch (oError) {
            oInfo.showMessage('发生意外,请用鼠标右键->复制或者Ctrl+C复制。');
        }
    }
    
//-->
</script>

我在前面的一篇文章《自制网页代理》中,提到了网页代理的两个用处。

今天,我在上篇的网页代理代码中增加了少许几行,便又增加了网页代理的一个“邪恶”的用处,那就是用来盗链像QQ空间等使用了反盗链技术的网站中的图片。

先来分析一下防盗链的技术细节:

一般的反盗链,是在服务器端加上了这样的逻辑,如果对此资源的请求是来自以下两种情况,则允许该请求,并给予相应的响应。

① 直接输入;

② 从本站转发的请求。

如果对此资源的请求是来自其他的未经授权的网站,那么不允许该请求,并可选地给予一个提示。

以下是一个示例。

比如以下这个资源链接,就是QQ空间相册中的一个图片文件:

http://b12.photo.store.qq.com/http_imgload.cgi?/rurl4_b=26fea1a982b3b43d7e42333ceb8faeb0a2ba1ab8621187e3a05a36b67b0123b8d544bd31c983761e0359ed86fea5943ce1fb9d402da2036fe393da21799a280f08e82c7a3ee1841e3d6d1b0056183db04cbcdd84&a=23&b=12

如果你直接点击那个链接,是可以看到那个图片的。如果你在QQ空间中发表日志,在日志中引用该图片,也是可以正确地看到那个图片的。

但是,如果你在其他的地方引用该图片,就看不到那张图片了,而是看到一个提示图片,提示说:“此图片来自QQ空间,未经允许不可引用”。比如在人人网中发表的日志“http://blog.renren.com/blog/244527631/424930074”中,就引用了该图片,但是看不见。

或者我再在此篇文章中直接引用该图片如下,你将看到一个不准引用的提示:

不准引用的提示

知道了以上技术细节,就可以找到破解方法了,即在别的未经授权的网站上引用图片时,将该请求转变成直接请求,而不是从该网站转发请求。于是便可以想到网页代理可以用来做这件事情。网页代理就是,代理你发出对该资源的请求,而且是直接请求的形式,它不会告诉目标服务器,我的这个请求,是从一个你没有授权的网站中发出来的。从而使得目标服务器给予期待的响应。

我将我写的网页代理文件,命名为“涂鸦网页代理”。同样是上面那幅QQ空间中的图片,我在下面引用它,使用“涂鸦网页代理”的方式,来看看效果:

使用涂鸦网页代理来引用图片

怎么样?真是令人激动。

我不鼓励盗链,而且反对自己没有任何资源而全部盗链别人的资源的行为,那是一种偷窃的行为。然而,有时候的确需要引用别处的资源,这个时候是一种正当的引用,然而,如何区分正当与否,目标服务器实在无能为力。所以,如果你是正当引用,欢迎使用本文所提及的涂鸦网页代理。如果你想纯粹地偷窃,请走开。

如何使用“涂鸦网页代理”呢?

你只需要将你要引用的图片链接地址,套上一层“涂鸦网页代理”网址的外衣就可以了。格式如下:

http://www.myfootprints.cn/ASPAgent.asp?url=你要引用的图片网址&contentType=image/*

非常地简单,如果你不想自己输入那些字符,那么,你只要将你要引用的图片链接,粘贴到下面的文本框中,并点击“生成涂鸦代理链接”,然后复制那个“涂鸦代理链接”,粘贴到你想引用的地方就可以了。

正当破解防盗链引用步骤:

(一)输入或者粘贴你要引用的图片链接地址(以http://开头):

引用图片预览

 (二)复制涂鸦代理链接,粘贴到你要引用的地方,搞定!

 

知道了原理和使用方法,现在来看一看涂鸦网页代理的源代码,它是《自制网页代理》一文中代码的改进版。虽然你可以直接使用上述引用向导来引用你想要的图片,但是,你也可以复制以下代理,制作自己的网页代理,并使用自己的代理来引用图片。这里的代码只是一个起步,你可以改进得更好。

ASPAgent.asp源码:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Option Explicit %>
<%Session.CodePage=65001%>
<%
    Response.CharSet = "utf-8"
%>
<%    
    Dim sRSSUrl, oHTTP, charset, contentType
    sRSSUrl = Request.QueryString("url")
    charset = Request.QueryString("charset")
    contentType = Request.QueryString("contentType")
    
    If Len(contentType) <= 0 Then
        contentType = "text/html"
    End If
    Response.ContentType = contentType
    
    If Len(charset) <= 0 Then
        charset = "utf-8"
    End If
    
    If Len(sRSSUrl) > 0 Then
    
        Set oHTTP = Server.CreateObject("Microsoft.XMLHTTP")
        oHTTP.Open "GET", sRSSURL, False
        oHTTP.Send
        
        if contentType = "text/html" Then        
            If charset = "utf-8" Then
                Response.Write oHTTP.ResponseText
            Else
                Response.Write Cbns2TextStream(oHTTP.ResponseBody, charset)
            End If
        Else
            Response.AddHeader "Content-Disposition", "attachment; filename=" & "OpenItWithYourPhotoViewer.jpg"
            Response.BinaryWrite oHTTP.ResponseBody
        End If
        Set oHTTP = Nothing
    Else
        Response.Write ""
    End If
%>
<%
    '
    ' 将指定的二进制串转换成特定编码的文本
    '
    Public Function Cbns2TextStream(ByRef bns, ByRef sCharset)
        Dim stm
        
        Set stm = Server.CreateObject("ADODB.Stream")
        stm.Type = 2
        stm.Open
        stm.WriteText bns
        stm.Position = 0
        If Len(sCharset) > 0 Then stm.Charset = sCharset
        Cbns2TextStream = stm.ReadText
        stm.Close
        Set stm = Nothing
    End Function 
%>

^_^