IT技术博客大学习 共学习 共进步

使用页面代理调用网易微博数据

Heero's Blog 2010-05-28 18:40:07 浏览 2,563 次

由于网易微博的数据还没有完全对外开放,像“我的首页”、“我的微博”的JSON数据都不能直接通过Javascript调用,而是必须先登录才能获取。因此,要想把微博数据调用到博客上,就得在后台做一个页面代理

页面代理的唯一工作就是带上已登录的Cookie发送一个Http请求,获取并输出回应内容。这个过程主要涉及到两个类,HttpWebRequestHttpWebResponse,它们都在System.Net名字空间内。

通过Firebug的网络面板可以看到,网易微博中“我的微博”数据地址如下:

http://t.163.com/statuses/user_timeline/用户名.json

先建立一个HttpWebRequest类的实例,并设置相应属性的值:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://t.163.com/statuses/user_timeline/heero.json"); // heero是我的用户名
request.Timeout = 15000; // 设置超时时间

接着就得加Cookie了。虽然网易通行证写入的Cookie很多,但是只需NTES_SESS这个就够了。在FireCookie里面找到这个Cookie,并把内容拷贝过来,添加到HttpWebRequest实例中:

request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(request.RequestUri, new Cookie("NTES_SESS", "...省略Cookie内容..."));

请求的属性设置完毕后,就可以发送请求并获取回应了,这个操作是通过HttpWebRequest类的GetResponse方法完成的:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet));
string content = reader.ReadToEnd();

按理说这是没问题的了,但是我把content输出后,却发现那是一堆HTML代码,而非JSON数据。仔细再看一下,那段HTML代码竟然是手机微博首页。很明显,这是因为没有设置request的UserAgent而被微博服务器识别为手机客户端了。在发送请求前补上一行模拟IE7浏览器:

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";

这下大功告成了,只是最后别忘了关闭响应流和数据流并把数据输出。为性能着想,最好给数据设个过期时间。

reader.Close();
response.Close();

context.Response.Charset = response.CharacterSet;
context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(2)); // 设置过期时间为两分钟
context.Response.Write(content);

建议继续学习

  1. 让安卓手机通过代理翻墙的方法 (阅读 8,802)
  2. 代理的加密部分 (阅读 8,245)
  3. 关于 SOCKS 代理的远端 DNS 解析 (阅读 7,744)
  4. HTTP 正向代理与反向代理 (阅读 4,980)
  5. 关于不得不在python中使用代理访问网络的方法 (阅读 4,941)
  6. nginx.conf控制指定的代理ip和ip访问的设置手记 (阅读 4,624)
  7. 关于http代理 (阅读 4,524)
  8. 使用 Perl 实现 HTTP 代理 (阅读 4,002)
  9. socks5代理服务器的配置 (阅读 3,860)
  10. 代理的本地部分 (阅读 3,782)