Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#应用程序中获取Yahoo联系人列表_C#_Yahoo Api - Fatal编程技术网

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

在C#应用程序中获取Yahoo联系人列表,c#,yahoo-api,C#,Yahoo Api,以下是我使用OAuth获得Yahoo联系人列表的指导: 向…发出GET请求 为了获得oauth_令牌和oauth_令牌密钥,我成功地获得了它们 示例url: OAuthBase oath = new OAuthBase(); string url = "https://api.login.yahoo.com/oauth/v2/get_request_token?" + "oauth_nonce=" + oath.GenerateNonce() + "&

以下是我使用OAuth获得Yahoo联系人列表的指导:

  • 向…发出GET请求 为了获得oauth_令牌和oauth_令牌密钥,我成功地获得了它们
  • 示例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";
    
    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的oauth_令牌。为了向{token}发出GET请求,它返回了oauth_验证器

  • 使用步骤1和2的参数向发出GET请求,它返回了新的oauth_令牌、oauth_令牌、oauth_会话句柄、xoauth_yahoo_guid

  • 示例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";
    
    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;
    
  • 最后一步是获取联系人列表: 我向{xoauth\u yahoo\u guid}/contacts?format=json发出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);
    
    函数生成器签名:

    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)个未经授权的回复,你能告诉我哪里错了吗?

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

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

    :/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停止工作。

    我也有同样的问题,但仍然找不到解决方案。请回复某人。