上个月做了一个关于人人网api数据的小东西。发现人人网的api做的不是一般的烂啊,前几天又看了一下,似乎更新了文档,又开放了些接口。现在就说一个在其中遇到的问题和大家分享一下。

问题是,在取用户数据的时候要求传一个session_key,这个session_key是根据access_token的值得到的,而且有过期时间。(具体方法点这里)。

access_token格式是这样的:

 "access_token": "127089|5.a24b8385f555445d3898cae50b65f3ef.86400.1295031600-222209506",

 "expires_in": 88913//过期时间

}
      根据人人网OAuth2.0的要求是,必须通过access_token才能得到session_key,但在实际应用过程中发现access_token中红色的部分就是session_key。那事情就简单了。
解决问题的方法是我们只要模拟人人网的登录就能够得到传说中新的session_key了。

先通过Firebug检测一下这个登录过程如下图:

 

Fiddler:

POST的表单内容:

整个过程经历了1次POST和3次GET的webrequest,所以我们只要模拟这些操作就可以刷新我们的session_key了。据体的方法在下面,自己应该能看懂。

        /// <summary>
        /// 刷新access_token
        /// </summary>
        /// <returns></returns>
        public static string RefreshToken()
        {
            HttpWebRequest httpRequest = null;
            HttpWebResponse httpResponse = null;
            string gethost = string.Empty;
            string Cookiesstr = string.Empty;
            CookieContainer cookie = new CookieContainer();

            //第一次POST
            try
            {
                byte[] data = Encoding.UTF8.GetBytes("email={你的邮箱}&password={你的密码}&domain=renren.com&origURL=http%3A%2F%2Fgraph.renren.com%2Foauth%2Fauthorize%3Fclient_id%3Dd743d5f993e34a30ac933d972b1e88df%26response_type%3Dtoken%26redirect_uri%3Dhttp%3A%2F%2Fgraph.renren.com%2Foauth%2Flogin_success.html%26pp%3D1%26https%3Dhttps%3A%2F%2Fgraph.renren.com");

                Uri code = new Uri("http://passport.renren.com/RL.do?P3P=1");

                httpRequest = (HttpWebRequest)WebRequest.Create(code);
                httpRequest.Method = "POST";
                httpRequest.ContentType = "application/x-www-form-urlencoded";
                httpRequest.ContentLength = data.Length;
                httpRequest.KeepAlive = true;
                httpRequest.AllowAutoRedirect = false;
                httpRequest.CookieContainer = cookie;
                using (Stream newStream = httpRequest.GetRequestStream())
                    newStream.Write(data, 0, data.Length);

                httpResponse = (HttpWebResponse)httpRequest.GetResponse();
                httpResponse.Cookies = httpRequest.CookieContainer.GetCookies(httpRequest.RequestUri);
                CookieCollection cook = httpResponse.Cookies;
                Cookiesstr = httpRequest.CookieContainer.GetCookieHeader(httpRequest.RequestUri);

                string backstr = string.Empty;
                using (StreamReader sr = new StreamReader(httpResponse.GetResponseStream(), System.Text.Encoding.UTF8))
                    backstr = sr.ReadToEnd();
                string[] substr = backstr.Split(new char[] { '"' });
                gethost = substr[1];

                httpRequest.Abort();
                httpResponse.Close();
            }
            catch (Exception)
            { }

            //第一次GET

            try
            {
                string ss;
                httpRequest = (HttpWebRequest)WebRequest.Create(gethost);
                httpRequest.Method = "GET";
                httpRequest.KeepAlive = true;
                httpRequest.Headers.Add("Cookie:" + Cookiesstr);
                httpRequest.CookieContainer = cookie;
                httpRequest.AllowAutoRedirect = false;
                httpResponse = (HttpWebResponse)httpRequest.GetResponse();
                Cookiesstr = httpRequest.CookieContainer.GetCookieHeader(httpRequest.RequestUri);
                using (StreamReader sr = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))
                    ss = sr.ReadToEnd();
                string[] substr = ss.Split(new char[] { '"' });
                gethost = substr[1];
                httpRequest.Abort();
                httpResponse.Close();
            }
            catch (Exception)
            { }

            //第二次GET
            try
            {
                string ss;
                httpRequest = (HttpWebRequest)WebRequest.Create(gethost);
                httpRequest.Method = "GET";
                httpRequest.KeepAlive = true;
                httpRequest.Headers.Add("Cookie:" + Cookiesstr);
                httpRequest.CookieContainer = cookie;
                httpRequest.AllowAutoRedirect = false;
                httpResponse = (HttpWebResponse)httpRequest.GetResponse();
                Cookiesstr = httpRequest.CookieContainer.GetCookieHeader(httpRequest.RequestUri);
                using (StreamReader sr = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))
                    ss = sr.ReadToEnd();
                string[] substr = ss.Split(new char[] { '"' });
                gethost = substr[1];
                httpRequest.Abort();
                httpResponse.Close();
            }
            catch (Exception)
            { }

            //第三次GET
            try
            {
                string ss;
                httpRequest = (HttpWebRequest)WebRequest.Create(gethost);
                httpRequest.Method = "GET";
                httpRequest.KeepAlive = true;
                httpRequest.Headers.Add("Cookie:" + Cookiesstr);
                httpRequest.CookieContainer = cookie;
                httpRequest.AllowAutoRedirect = false;
                httpResponse = (HttpWebResponse)httpRequest.GetResponse();
                Cookiesstr = httpRequest.CookieContainer.GetCookieHeader(httpRequest.RequestUri);
                using (StreamReader sr = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))
                    ss = sr.ReadToEnd();
                string[] substr = ss.Split(new char[] { '"' });
                gethost = substr[1];
                httpRequest.Abort();
                httpResponse.Close();
            }
            catch (Exception)
            { }

            return gethost.Substring(71, 61);
        }

     希望对大家有所帮助。

作者: leslie_ 发表于 2011-03-25 17:01 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架