SDK

新浪微博OAuth认证与API调用
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Net;
using System.IO;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


/*
 This file was created by Sarlmol Apple at 11.1.2011
 */
public class oAuthSina : oAuthBase
{
    public enum Method { GET, POST, PUT, DELETE };


    private const string REQUEST_TOKEN = "http://api.t.sina.com.cn/oauth/request_token";
    private const string AUTHORIZE = "http://api.t.sina.com.cn/oauth/authorize";
    private const string ACCESS_TOKEN = "http://api.t.sina.com.cn/oauth/access_token";


    private string _appKey = "";
    private string _appSecret = "";
    private string _token = "";
    private string _tokenSecret = "";


    #region Properties
    public string appKey
    {
        get
        {
            if (_appKey.Length == 0)
            {
                _appKey = ConfigurationSettings.AppSettings["app_key"];
            }
            return _appKey;
        }
        set { _appKey = value; }
    }
    public string appSecret
    {
        get
        {
            if (_appSecret.Length == 0)
            {
                _appSecret = ConfigurationSettings.AppSettings["app_secret"];
            }
            return _appSecret;
        }
        set { _appSecret = value; }
    }
    public string token { get { return _token; } set { _token = value; } }
    public string tokenSecret { get { return _tokenSecret; } set { _tokenSecret = value; } }
    #endregion
    private string _WebRequest(Method method, string url, string postData)
    {
        HttpWebRequest webRequest = null;
        StreamWriter requestWriter = null;
        string responseData = "";


        webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
        webRequest.Method = method.ToString();
        webRequest.ServicePoint.Expect100Continue = false;


        if (method == Method.POST)
        {
            webRequest.ContentType = "application/x-www-form-urlencoded";
            requestWriter = new StreamWriter(webRequest.GetRequestStream());
            try
            {
                requestWriter.Write(postData);
            }
            catch
            {
                throw;
            }
            finally
            {
                requestWriter.Close();
                requestWriter = null;
            }
        }


        responseData = _WebResponseGet(webRequest);


        webRequest = null;


        return responseData;


    }


    private string _WebResponseGet(HttpWebRequest webRequest)
    {
        StreamReader responseReader = null;
        string responseData = "";
        try
        {
            responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
            responseData = responseReader.ReadToEnd();
        }
        catch
        {
            throw;
        }
        finally
        {
            webRequest.GetResponse().GetResponseStream().Close();
            responseReader.Close();
            responseReader = null;
        }


        return responseData;
    }
    public string oAuthWebRequest(Method method, string url, string postData)
    {
        string outUrl = "";
        string querystring = "";
        string ret = "";
        postData += "&source=" + appKey;
        if (method == Method.POST)
        {
            if (postData.Length > 0)
            {
                NameValueCollection qs = HttpUtility.ParseQueryString(postData);
                postData = "";
                foreach (string key in qs.AllKeys)
                {
                    if (postData.Length > 0)
                    {
                        postData += "&";
                    }
                    qs[key] = HttpUtility.UrlEncode(qs[key]);
                    qs[key] = this.UrlEncode(qs[key]);
                    postData += (key + "=" + qs[key]);


                }
                if (url.IndexOf("?") > 0)
                {
                    url += "&";
                }
                else
                {
                    url += "?";
                }
                url += postData;
            }
        }


        Uri uri = new Uri(url);


        string nonce = this.GenerateNonce();
        string timeStamp = this.GenerateTimeStamp();


        //Generate Signature
        string sig = this.GenerateSignature(uri,
            this.appKey,
            this.appSecret,
            this.token,
            this.tokenSecret,
            method.ToString(),
            timeStamp,
            nonce,
            out outUrl,
            out querystring);




        querystring += "&oauth_signature=" + HttpUtility.UrlEncode(sig);


        if (method == Method.POST)
        {
            postData = querystring;
            querystring = "";
        }


        if (querystring.Length > 0)
        {
            outUrl += "?";
        }


        if (method == Method.POST || method == Method.GET)
            ret = _WebRequest(method, outUrl + querystring, postData);
        return ret;
    }


    /*Get request token and token secret*/
    public void RequestTokenGet()
    {
        string response = oAuthWebRequest(Method.GET, REQUEST_TOKEN, String.Empty);
        if (response.Length > 0)
        {
            NameValueCollection qs = HttpUtility.ParseQueryString(response);
            if (qs["oauth_token"] != null)
            {
                this.token = qs["oauth_token"];
                this.tokenSecret = qs["oauth_token_secret"];
            }
        }
    }


    public string AuthorizationGet()
    {
        string ret = null;
        ret = AUTHORIZE + "?oauth_token=" + this.token;
        return ret;
    }
    /*Get access token and token secret*/
    public void AccessTokenGet()
    {
        string response = oAuthWebRequest(Method.GET, ACCESS_TOKEN, string.Empty);


        if (response.Length > 0)
        {
            NameValueCollection qs = HttpUtility.ParseQueryString(response);
            if (qs["oauth_token"] != null)
            {
                this.token = qs["oauth_token"];
            }
            if (qs["oauth_token_secret"] != null)
            {
                this.tokenSecret = qs["oauth_token_secret"];
            }
        }
    }
    /*Upload a message*/
    public string oAuthWebRequestWithPic(Method method, string url, string postData, string filepath)
    {
        var UploadApiUrl = url;
        string status = postData.Split('=').GetValue(1).ToString();
        postData += "&source=" + appKey;


        if (postData.Length > 0)
        {
            NameValueCollection qs = HttpUtility.ParseQueryString(postData);
            postData = "";
            foreach (string key in qs.AllKeys)
            {
                if (postData.Length > 0)
                {
                    postData += "&";
                }
                qs[key] = HttpUtility.UrlEncode(qs[key]);
                qs[key] = this.UrlEncode(qs[key]);
                postData += (key + "=" + qs[key]);


            }
            if (url.IndexOf("?") > 0)
            {
                url += "&";
            }
            else
            {
                url += "?";
            }
            url += postData;
        }


        var oauthSignaturePattern = "OAuth oauth_consumer_key=\"{0}\", oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"{1}\", oauth_nonce=\"{2}\", oauth_version=\"1.0\", oauth_token=\"{3}\",oauth_signature=\"{4}\"";


        var contentEncoding = "iso-8859-1";


        string normalizedString, normalizedParameters;
        var timestamp = this.GenerateTimeStamp();
        var nounce = this.GenerateNonce();


        var signature = this.GenerateSignature(
                            new Uri(url),
                            this.appKey,
                            this.appSecret,
                            this.token,
                            this.tokenSecret,
                            method.ToString(),
                            timestamp,
                            nounce,
                            out normalizedString,
                            out normalizedParameters);
        signature = HttpUtility.UrlEncode(signature);


        var boundary = Guid.NewGuid().ToString();
        var request = (HttpWebRequest)System.Net.WebRequest.Create(UploadApiUrl);


        request.PreAuthenticate = true;
        request.AllowWriteStreamBuffering = true;
        request.Method = method.ToString();
        request.UserAgent = "Jakarta Commons-HttpClient/3.1";
        var authorizationHeader = string.Format(
                                    CultureInfo.InvariantCulture,
                                    oauthSignaturePattern,
                                    this.appKey,
                                    timestamp,
                                    nounce,
                                    this.token,
                                    signature);
        request.Headers.Add("Authorization", authorizationHeader);


        var header = string.Format("--{0}", boundary);
        var footer = string.Format("--{0}--", boundary);


        var contents = new StringBuilder();
        request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
        contents.AppendLine(header);
        contents.AppendLine(String.Format("Content-Disposition: form-data; name=\"{0}\"", "status"));
        contents.AppendLine("Content-Type: text/plain; charset=US-ASCII");
        contents.AppendLine("Content-Transfer-Encoding: 8bit");
        contents.AppendLine();
        contents.AppendLine(status);


        contents.AppendLine(header);
        contents.AppendLine(string.Format("Content-Disposition: form-data; name=\"{0}\"", "source"));
        contents.AppendLine("Content-Type: text/plain; charset=US-ASCII");
        contents.AppendLine("Content-Transfer-Encoding: 8bit");
        contents.AppendLine();
        contents.AppendLine(this.appKey);




        contents.AppendLine(header);
        string fileHeader = string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"", "pic", filepath);
        string fileData = System.Text.Encoding.GetEncoding(contentEncoding).GetString(File.ReadAllBytes(@filepath));


        contents.AppendLine(fileHeader);
        contents.AppendLine("Content-Type: application/octet-stream; charset=UTF-8");
        contents.AppendLine("Content-Transfer-Encoding: binary");
        contents.AppendLine();
        contents.AppendLine(fileData);
        contents.AppendLine(footer);


        byte[] bytes = Encoding.GetEncoding(contentEncoding).GetBytes(contents.ToString());
        request.ContentLength = bytes.Length;


        var requestStream = request.GetRequestStream();
        try
        {
            requestStream.Write(bytes, 0, bytes.Length);
        }
        catch
        {
            throw;
        }
        finally
        {
            requestStream.Close();
            requestStream = null;
        }
        return _WebResponseGet(request);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值