Получить список контактов Yahoo в приложении С#

Как указано в https://developer.yahoo.com/oauth/guide/oauth-requesttoken.html, ниже показано, что я сделал с OAuth, чтобы получить список контактов Yahoo:

  1. Отправьте запрос GET на https://api.login.yahoo.com/oauth/v2/get_request_token, чтобы получить oauth_token и oauth_token_secret, я их успешно получил.

Пример URL:

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. Используя oauth_token шага 1., чтобы сделать запрос GET к https://api.login.yahoo.com/oauth/v2/request_auth?oauth_token={token}, он вернул мне oauth_verifier

  2. Использование параметров шага 1 и 2 для отправки GET-запроса к https://api.login.yahoo.com/oauth/v2/get_token, он вернул мне новые oauth_token, oauth_token_secret, oauth_session_handle, xoauth_yahoo_guid.

Пример URL:

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. Последний шаг — получить список контактов: я делаю запрос GET на https://social.yahooapis.com/v1/user/{xoauth_yahoo_guid}/contacts?format=json

Пример

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);

Функция ГенерироватьПодпись:

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);
}

Но Yahoo присылает мне (401) неавторизованный ответ. Не могли бы вы сказать мне, где я ошибаюсь?


person kairen    schedule 14.07.2015    source источник
comment
У меня такая же проблема, так и не нашел решения. Пожалуйста, ответьте кто-нибудь.   -  person AjmeraInfo    schedule 19.07.2015


Ответы (1)


Я понял, что застрял на том же месте

System.Net.WebException: Удаленный сервер возвратил ошибку: (401) Неавторизованный. в ..GetEmailContacts() в...

  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()) {

:/ Вздох


Итак, я нашел проблему. Я изменил формат контента с 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 перестал работать.

person meepm33p    schedule 15.12.2015