今天闲着没事,写了这个简单的工具。由于是闲着没事,所以代码质量非常差。也没有加入任何容错的代码,也没有考虑到各种数据,也没有处理需要密码才能访问的qq空间。
但是这个可以给大家提供一个非常好的思路:
view plaincopy to clipboardprint?
using System;
using System.Collections.Generic;
using System.Net;
using System.Text.RegularExpressions;
namespace QQ
{
class QZone
{
private List<long> BlogList = null;
public long QNumber;
public Dictionary<long, QBlogData> BlogDataDictionary = null;
#region 正则匹配表达式
private Regex RgxItem = new Regex("<p class=/"list_tit/">.*?</p>", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxID = new Regex("(?<=Blog//().*?(?=//))", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxTitle = new Regex("(?<=<span >).*?(?=</span>)", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxCategory = new Regex("(?<=Category//(')个人日记(?='//))", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxContext = new Regex("(?<=<div id=/"blogDetailDiv/".*?>).*?(?=</div>)", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxTime = new Regex("(?<=(发表|转载)于).*?(?=<)", RegexOptions.Singleline | RegexOptions.Compiled);
#endregion
public QZone(long QNumber)
{
this.QNumber = QNumber;
}
public List<long> GetBlogList()
{
if(BlogList == null)
{
WebClient wc = new WebClient();
string RecData = wc.DownloadString(string.Format(@"http://b.qzone.qq.com/cgi-bin/blognew/blog_output_toppage?uin={0}&property=GoRE&numperpage=1000&maxlen=1000&direct=1", QNumber));
MatchCollection mc = RgxItem.Matches(RecData);
BlogList = new List<long>();
foreach(Match match in mc)
{
string item = match.Value;
string id = RgxID.Match(item).Value;
BlogList.Add(long.Parse(id));
}
}
return BlogList;
}
public Dictionary<long, QBlogData> GetBlogDataDictionary()
{
if(BlogList == null)
{
GetBlogList();
}
if(BlogDataDictionary == null)
{
WebClient wc = new WebClient();
BlogDataDictionary = new Dictionary<long, QBlogData>();
foreach(long BlogID in BlogList)
{
string RecData = wc.DownloadString(string.Format(@"http://b.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin={0}&blogid={1}&numperpage=1000&property=GoRE", QNumber, BlogID));
QBlogData data = new QBlogData();
data.BlogID = BlogID;
data.Title = RgxTitle.Match(RecData).Value;
data.Context = RgxContext.Match(RecData).Value;
data.Category = RgxCategory.Match(RecData).Value;
data.Time = DateTime.Parse(RgxTime.Match(RecData).Value);
BlogDataDictionary.Add(BlogID, data);
}
}
return BlogDataDictionary;
}
public QBlogData GetBlogData(long BlogID)
{
if(BlogDataDictionary == null)
{
GetBlogDataDictionary();
}
return BlogDataDictionary[BlogID];
}
}
struct QBlogData
{
public long BlogID;
public string Title;
public string Context;
public string Category;
public DateTime Time;
}
}
using System;
using System.Collections.Generic;
using System.Net;
using System.Text.RegularExpressions;
namespace QQ
{
class QZone
{
private List<long> BlogList = null;
public long QNumber;
public Dictionary<long, QBlogData> BlogDataDictionary = null;
#region 正则匹配表达式
private Regex RgxItem = new Regex("<p class=/"list_tit/">.*?</p>", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxID = new Regex("(?<=Blog//().*?(?=//))", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxTitle = new Regex("(?<=<span >).*?(?=</span>)", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxCategory = new Regex("(?<=Category//(')个人日记(?='//))", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxContext = new Regex("(?<=<div id=/"blogDetailDiv/".*?>).*?(?=</div>)", RegexOptions.Singleline | RegexOptions.Compiled);
private Regex RgxTime = new Regex("(?<=(发表|转载)于).*?(?=<)", RegexOptions.Singleline | RegexOptions.Compiled);
#endregion
public QZone(long QNumber)
{
this.QNumber = QNumber;
}
public List<long> GetBlogList()
{
if(BlogList == null)
{
WebClient wc = new WebClient();
string RecData = wc.DownloadString(string.Format(@"http://b.qzone.qq.com/cgi-bin/blognew/blog_output_toppage?uin={0}&property=GoRE&numperpage=1000&maxlen=1000&direct=1", QNumber));
MatchCollection mc = RgxItem.Matches(RecData);
BlogList = new List<long>();
foreach(Match match in mc)
{
string item = match.Value;
string id = RgxID.Match(item).Value;
BlogList.Add(long.Parse(id));
}
}
return BlogList;
}
public Dictionary<long, QBlogData> GetBlogDataDictionary()
{
if(BlogList == null)
{
GetBlogList();
}
if(BlogDataDictionary == null)
{
WebClient wc = new WebClient();
BlogDataDictionary = new Dictionary<long, QBlogData>();
foreach(long BlogID in BlogList)
{
string RecData = wc.DownloadString(string.Format(@"http://b.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin={0}&blogid={1}&numperpage=1000&property=GoRE", QNumber, BlogID));
QBlogData data = new QBlogData();
data.BlogID = BlogID;
data.Title = RgxTitle.Match(RecData).Value;
data.Context = RgxContext.Match(RecData).Value;
data.Category = RgxCategory.Match(RecData).Value;
data.Time = DateTime.Parse(RgxTime.Match(RecData).Value);
BlogDataDictionary.Add(BlogID, data);
}
}
return BlogDataDictionary;
}
public QBlogData GetBlogData(long BlogID)
{
if(BlogDataDictionary == null)
{
GetBlogDataDictionary();
}
return BlogDataDictionary[BlogID];
}
}
struct QBlogData
{
public long BlogID;
public string Title;
public string Context;
public string Category;
public DateTime Time;
}
}
使用的时候直接调用就OK:
view plaincopy to clipboardprint?
static void Main(string[] args)
{
QZone qz = new QZone(qq号);
qz.GetBlogList();
qz.GetBlogDataDictionary();
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aimeast/archive/2009/05/23/4211676.aspx