最近遇到要读取QQ相册的问题,所以自己诼磨了下,把读取相册的思路和代码写下来。
很多网站到图片链接都做了盗链处理。意思是如果你想在不是他的网站上引用图片就不会正确显示图片,而是一张其它的版权说明之类的图片。实现防盗链的一般做好是通过判断Request的Headers中的Referer属性。该属性保存着客户端在访问该链接之前的地址。又如我访问/,该网站中有一张图片<img src=''http://www.qq.com/logo.gif''> ,该图片请求的Referer属性就应该是/ 表示是从该地址转过来的。
要突破这种防盗链,你可以在发请求之前修改Referer属性,不过这有点难度。因为这个属性是只读的。另外一种做法是用程序的方式(在ASP.NET中即HttpWebRequest)来新建一个请求,些时Referer是空的,所以防盗链也就不起作用。
QQ相册取图片的方式隐藏得很好,是用Ajax方式读取的,js脚本文件也进行了压缩,所以很难看清它是怎么取图片的。看了很久之后才发现它读相册以及相册中图片的地址:
相册地址:http://p{0}.photo.qq.com/{1}/16 //{0} = {1} % 13 + 1 {1}为qq号
图片地址:http://sz.photo.store.qq.com/http_staload.cgi?{0}/{1} ; //{0}qq号 {1}相册号
这两个地址只是返回一个XML文件,文件中才标识着真正的图片地址。
程序的思路是先通过QQ号得到相册相关信息的xml文件,从文件中得到相册号和相册封面图片地址,用HttpWebRequest得到该封面图片并显示出来。当用户点击该图片时再根据相册号得到该相册下图片信息的xml文件,再次用HttpWebRequest的方式显示预览图片,供用户选择要导入的图片,最好根据图片的真正地址把图片保存在当前文件夹中。
把程序贴在下面,一个面页GetPhoto.aspx和后台代码GetPhoto.aspx.cs
GetPhoto.aspx
- <%@ Page language="c#" CodeFile="GetPhoto.aspx.cs" AutoEventWireup="false" InherITs="GetPhoto" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
- <HTML>
- <HEAD>
- <title>GetPhoto</title>
- <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
- <meta content="C#" name="CODE_LANGUAGE">
- <meta content="JavaScript" name="vs_defaultClientScript">
- <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
- </HEAD>
- <body>
- <form id="Form1" method="post" runat="server">
- <P>QQ号码:<asp:textbox id="txtQQ" runat="server"></asp:textbox>
  |