在C#应用程序中获取Yahoo联系人列表

时间:2015-07-14 02:03:47

标签: c# yahoo-api

作为https://developer.yahoo.com/oauth/guide/oauth-requesttoken.html的指导,以下是我使用OAuth获取雅虎联系人列表的内容:

  1. https://api.login.yahoo.com/oauth/v2/get_request_token发出GET请求 得到oauth_token和oauth_token_secret,我成功地得到了它们。
  2. 示例网址:

    OAuthBase oath = new OAuthBase();
    
    string url = "https://api.login.yahoo.com/oauth/v2/get_request_token?" +
    
              "oauth_nonce=" + oath.GenerateNonce() +
              "&oauth_timestamp=" + oath.GenerateTimeStamp() +
              "&oauth_consumer_key=" + consumerKey+
              "&oauth_signature_method=plaintext" +
              "&oauth_signature=" + consumerSecret + "%26" + //%26 if plaintext
              "&oauth_version=1.0" +
              "&oauth_callback=" + "oob";
    
    1. 使用步骤1的oauth_token向https://api.login.yahoo.com/oauth/v2/request_auth?oauth_token= {token}发出GET请求,它返回给我oauth_verifier

    2. 使用步骤1和2的参数向https://api.login.yahoo.com/oauth/v2/get_token发出GET请求,它返回给我新的oauth_token,oauth_token_secret,oauth_session_handle,xoauth_yahoo_guid。

    3. 示例网址:

      string sig = consumerSecret + "%26" + OauthTokenSecret;
      string url = "https://api.login.yahoo.com/oauth/v2/get_token?" +
      
                "oauth_consumer_key=" + consumerKey+
                "&oauth_signature_method=plaintext" +
                "&oauth_signature=" + sig +
                "&oauth_timestamp=" + oath.GenerateTimeStamp() +
                "&oauth_version=1.0" +
                "&oauth_token=" + OAuthToken +
                "&oauth_nonce=" + oath.GenerateNonce() +
                "&oauth_verifier=" + oauth_verifier;
      
      1. 最后一步是获取联系人列表: 我向https://social.yahooapis.com/v1/user/ {xoauth_yahoo_guid} / contacts?格式= json
      2. 发出GET请求

        示例

        Uri uri = new Uri(url);
        string nonce = oath.GenerateNonce();
        string timeStamp = oath.GenerateTimeStamp();
        string normalizedUrl;
        string normalizedRequestParameters;
        string sig = oath.GenerateSignature(uri, clientId, clientSecret, yahooToken.OAuthToken,
            yahooToken.OauthTokenSecret, "GET", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1,
            out normalizedUrl, out normalizedRequestParameters);
        

        功能GenerateSignature:

        public string GenerateSignature(Uri url, string consumerKey, string consumerSecret, string token, string tokenSecret, string httpMethod, string timeStamp, string nonce, SignatureTypes signatureType, out string normalizedUrl, out string normalizedRequestParameters)
        {
            normalizedUrl = null;
            normalizedRequestParameters = null;
        
            switch (signatureType)
            {
                case SignatureTypes.PLAINTEXT:
                    return HttpUtility.UrlEncode(string.Format("{0}&{1}", consumerSecret, tokenSecret));
                case SignatureTypes.HMACSHA1:
                    string signatureBase = GenerateSignatureBase(url, consumerKey, token, tokenSecret, httpMethod, timeStamp, nonce, HMACSHA1SignatureType, out normalizedUrl, out normalizedRequestParameters);
        
                    HMACSHA1 hmacsha1 = new HMACSHA1();
                    hmacsha1.Key = Encoding.ASCII.GetBytes(string.Format("{0}&{1}", UrlEncode(consumerSecret), string.IsNullOrEmpty(tokenSecret) ? "" : UrlEncode(tokenSecret)));
        
                    return GenerateSignatureUsingHash(signatureBase, hmacsha1);
                case SignatureTypes.RSASHA1:
                    throw new NotImplementedException();
                default:
                    throw new ArgumentException("Unknown signature type", "signatureType");
            }
        }
        

        提出请求:

        using (var client = new WebClient())
        {
            string authenHeader = "OAuth " +
                "realm=\"yahooapis.com\"" +
                ",oauth_consumer_key=\"" + consumerKey+ "\"" +
                ",oauth_nonce=\"" + nonce + "\"" +
                ",oauth_signature_method=\"HMAC-SHA1\"" +
                ",oauth_timestamp=\"" + timeStamp + "\"" +
                ",oauth_token=\"" + OAuthToken + "\"" +
                ",oauth_version=\"1.0\"" +
                ",oauth_signature=\"" + HttpUtility.UrlEncode(sig) + "\"";
        
            client.Headers.Set("Authorization", authenHeader);
            string responseString = client.DownloadString(url);
        }
        

        但雅虎发给我(401)未经授权的回复,你能告诉我我错在哪里吗?

1 个答案:

答案 0 :(得分:2)

我意识到我被困在同一个地方

System.Net.WebException:远程服务器返回错误:(401)未经授权。 at ..GetEmailContacts()in ...

  private ArrayList GetEmailContacts() {
    OAuthBase oauth = new OAuthBase();

    Uri uri = new Uri("https://social.yahooapis.com/v1/user/" + OauthYahooGuid + "/contacts?format=XML");
    string nonce = oauth.GenerateNonce();
    string timeStamp = oauth.GenerateTimeStamp();
    string normalizedUrl;
    string normalizedRequestParameters;
    string sig = oauth.GenerateSignature(uri, this.sConsumerKey, this.sConsumerSecret, OauthToken, OauthTokenSecret, "GET", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, out normalizedUrl, out normalizedRequestParameters);

    StringBuilder sbGetContacts = new StringBuilder(uri.ToString());

    try {
    string returnStr = string.Empty;
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sbGetContacts.ToString());
    req.Accept = "application/xml";
    req.Method = "GET";
    ArrayList emails = new ArrayList();

    string authHeader = "Authorization: OAuth " +
    "realm=\"yahooapis.com\"" +
    ",oauth_consumer_key=\"" + this.sConsumerKey + "\"" +
    ",oauth_nonce=\"" + nonce + "\"" +
    ",oauth_signature_method=\"HMAC-SHA1\"" +
    ",oauth_timestamp=\"" + timeStamp + "\"" +
    ",oauth_token=\"" + OauthToken + "\"" +
    ",oauth_version=\"1.0\"" +
    ",oauth_signature=\"" + HttpUtility.UrlEncode(sig) + "\"";

    req.Headers.Add(authHeader);

    using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) {

:/ sighz

所以我发现了这个问题。我已将内容格式从XML更改为JSON

更改了以下内容:

private ArrayList GetEmailContacts() {
    OAuthBase oauth = new OAuthBase();

    Uri uri = new Uri("https://social.yahooapis.com/v1/user/" + OauthYahooGuid + "/contacts?format=json");
    string nonce = oauth.GenerateNonce();
    string timeStamp = oauth.GenerateTimeStamp();
    string normalizedUrl;
    string normalizedRequestParameters;
    string sig = oauth.GenerateSignature(uri, this.sConsumerKey, this.sConsumerSecret, OauthToken, OauthTokenSecret, "GET", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, out normalizedUrl, out normalizedRequestParameters);

    StringBuilder sbGetContacts = new StringBuilder(uri.ToString());

    try {
        string returnStr = string.Empty;
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sbGetContacts.ToString());
        req.Accept = "application/json";
        req.ContentType = "application/json";
        req.Method = "GET";
        ArrayList emails = new ArrayList();

        string authHeader = "Authorization: OAuth " +
        "realm=\"yahooapis.com\"" +
        ",oauth_consumer_key=\"" + this.sConsumerKey + "\"" +
        ",oauth_nonce=\"" + nonce + "\"" +
        ",oauth_signature_method=\"HMAC-SHA1\"" +
        ",oauth_timestamp=\"" + timeStamp + "\"" +
        ",oauth_token=\"" + OauthToken + "\"" +
        ",oauth_version=\"1.0\"" +
        ",oauth_signature=\"" + HttpUtility.UrlEncode(sig) + "\"";

        req.Headers.Add(authHeader);

        using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) {

当我进行更改时,它突然返回了电子邮件,而且没有更多406错误代码。

我希望这有助于某人......不知道为什么xml会停止工作。