2016-01-29 44 views
3

twitter登录由我的应用程序使用ionic framework,我想从twitter获取电子邮件地址,我已经要求twitter和app现在可以获取电子邮件地址。如何从twitter获取电子邮件地址

但以某种方式下面的代码无法获得电子邮件地址。

为此,我创建了一个名为getTwitterProfileManual的新函数,但它仍然无效。

我也阅读了由twitter提供的文档Doc,并建议我也通过include_email params作为请求查询。但仍然没有回复邮件地址。

serviceModule.factory('TwitterService', function ($cordovaOauth, $cordovaOauthUtility, $http, $resource, $q, AUTH_ID) 
{ 

    var twitterKey = "STORAGE.TWITTER.KEY"; 
    var clientId = AUTH_ID.TWITTER_APP_ID; 
    var clientSecret = AUTH_ID.TWITTER_APP_SEC; 

    function storeUserToken(data) 
    { 
     window.localStorage.setItem(twitterKey, JSON.stringify(data)); 
    } 

    function getStoredToken() 
    { 
     return window.localStorage.getItem(twitterKey); 
    } 

    function createTwitterSignature(method, url, params) 
    { 
     if (!params) { 
      params = {}; 
     } 
     var token = angular.fromJson(getStoredToken()); 

     var oauthObject = { 
      oauth_consumer_key: clientId, 
      oauth_nonce: $cordovaOauthUtility.createNonce(10), 
      oauth_signature_method: "HMAC-SHA1", 
      oauth_token: token.oauth_token, 
      oauth_timestamp: Math.round((new Date()).getTime()/1000.0), 
      oauth_version: "1.0" 
     }; 
     console.log(JSON.stringify(oauthObject)); 
     var signatureObj = $cordovaOauthUtility.createSignature(method, url, oauthObject, params, clientSecret, token.oauth_token_secret); 
     $http.defaults.headers.common.Authorization = signatureObj.authorization_header; 
     console.log(JSON.stringify(signatureObj.authorization_header)); 
    } 

    return { 
     initialize: function() 
     { 
      var deferred = $q.defer(); 
      var token = getStoredToken(); 

      if (token !== null) 
      { 
       deferred.resolve(true); 
      } 
      else 
      { 
       $cordovaOauth.twitter(clientId, clientSecret).then(function (result) 
       { 
        storeUserToken(result); 
        deferred.resolve(true); 
       }, function (error) 
       { 
        deferred.reject(false); 
       }); 
      } 
      return deferred.promise; 
     }, 
     isAuthenticated: function() 
     { 
      return getStoredToken() !== null; 
     }, 
     getHomeTimeline: function() 
     { 
      var home_tl_url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'; 
      createTwitterSignature('GET', home_tl_url); 
      return $resource(home_tl_url).query(); 
     }, 
     getTwitterProfile: function() 
     { 
      var tl_url = 'https://api.twitter.com/1.1/account/verify_credentials.json'; 
      createTwitterSignature('GET', tl_url); 
      return $resource(tl_url, {'include_email': true}).query(); 
     }, 
     getTwitterProfileManual: function() { 

      var deferred = $q.defer(); 
      var token = angular.fromJson(getStoredToken()); 

      createTwitterSignature('GET', 'https://api.twitter.com/1.1/account/verify_credentials.json'); 

      //   $http.get("https://api.twitter.com/1.1/account/verify_credentials.json") 

      $http({ 
       method: 'GET', 
       url: "https://api.twitter.com/1.1/account/verify_credentials.json", 
       params : { 'include_email': true } 
      }).success(function (result) 
      { 
       console.log(result); 
       alert('USER TIMELINE: ' + JSON.stringify(result)); 
       deferred.resolve(result); 
      }).error(function (error) 
      { 
       alert("Error: " + JSON.stringify(error)); 
       deferred.reject(false); 
      }); 
      return deferred.promise; 
     }, 
     storeUserToken: storeUserToken, 
     getStoredToken: getStoredToken, 
     createTwitterSignature: createTwitterSignature 
    }; 
}); 

有没有人遇到过这样的问题并解决了它,如果是的话请提供一些提示。

+0

任何人有任何想法? –

+1

您为了获得twitter电子邮件认证而遵循的过程是什么? – Webruster

+0

@Webruster感谢您首先发表评论,我所做的只是在https://support.twitter.com/forms/platform上向twitter发送请求,并检查了我需要访问特殊权限复选框,并在第二天我的应用程序是允许获得电子邮件地址 –

回答

3

经过几天的工作,我终于使它工作。

以下是任何面对此类问题的人的代码。

代码:

serviceModule.factory('$twitterHelpers', ['$q', '$http', function ($q, $http) { 

    function createSignature(method, endPoint, headerParameters, bodyParameters, secretKey, tokenSecret) { 
     if (typeof jsSHA !== "undefined") { 
      var headerAndBodyParameters = angular.copy(headerParameters); 
      var bodyParameterKeys = Object.keys(bodyParameters); 
      for (var i = 0; i < bodyParameterKeys.length; i++) { 
       headerAndBodyParameters[bodyParameterKeys[i]] = escapeSpecialCharacters(bodyParameters[bodyParameterKeys[i]]); 
      } 
      var signatureBaseString = method + "&" + encodeURIComponent(endPoint) + "&"; 
      var headerAndBodyParameterKeys = (Object.keys(headerAndBodyParameters)).sort(); 
      for (i = 0; i < headerAndBodyParameterKeys.length; i++) { 
       if (i == headerAndBodyParameterKeys.length - 1) { 
        signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]]); 
       } else { 
        signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]] + "&"); 
       } 
      } 
      var oauthSignatureObject = new jsSHA(signatureBaseString, "TEXT"); 

      var encodedTokenSecret = ''; 
      if (tokenSecret) { 
       encodedTokenSecret = encodeURIComponent(tokenSecret); 
      } 

      headerParameters.oauth_signature = encodeURIComponent(oauthSignatureObject.getHMAC(encodeURIComponent(secretKey) + "&" + encodedTokenSecret, "TEXT", "SHA-1", "B64")); 
      var headerParameterKeys = Object.keys(headerParameters); 
      var authorizationHeader = 'OAuth '; 
      for (i = 0; i < headerParameterKeys.length; i++) { 
       if (i == headerParameterKeys.length - 1) { 
        authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '"'; 
       } else { 
        authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '",'; 
       } 
      } 
      return {signature_base_string: signatureBaseString, authorization_header: authorizationHeader, signature: headerParameters.oauth_signature}; 
     } else { 
      return "Missing jsSHA JavaScript library"; 
     } 
    } 

    function createNonce(length) { 
     var text = ""; 
     var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
     for (var i = 0; i < length; i++) { 
      text += possible.charAt(Math.floor(Math.random() * possible.length)); 
     } 
     return text; 
    } 

    function escapeSpecialCharacters(string) { 
     var tmp = encodeURIComponent(string); 
     tmp = tmp.replace(/\!/g, "%21"); 
     tmp = tmp.replace(/\'/g, "%27"); 
     tmp = tmp.replace(/\(/g, "%28"); 
     tmp = tmp.replace(/\)/g, "%29"); 
     tmp = tmp.replace(/\*/g, "%2A"); 
     return tmp; 
    } 

    function transformRequest(obj) { 
     var str = []; 
     for (var p in obj) 
      str.push(encodeURIComponent(p) + "=" + escapeSpecialCharacters(obj[p])); 
     console.log(str.join('&')); 
     return str.join('&'); 
    } 

    return { 
     createTwitterSignature: function (method, url, bodyParameters, clientId, clientSecret, token) { 
      var oauthObject = { 
       oauth_consumer_key: clientId, 
       oauth_nonce: createNonce(10), 
       oauth_signature_method: "HMAC-SHA1", 
       oauth_token: token.oauth_token, 
       oauth_timestamp: Math.round((new Date()).getTime()/1000.0), 
       oauth_version: "1.0" 
      }; 
      var signatureObj = createSignature(method, url, oauthObject, bodyParameters, clientSecret, token.oauth_token_secret); 
      $http.defaults.headers.common.Authorization = signatureObj.authorization_header; 
      return signatureObj; 
     }, 
     transformRequest: transformRequest 
    }; 
}]); 

serviceModule.factory('TwitterService', function ($cordovaOauth, $cordovaOauthUtility, $http, $resource, $q, AUTH_ID, $twitterHelpers) 
{ 

    var twitterKey = "STORAGE.TWITTER.KEY"; 
    var clientId = AUTH_ID.TWITTER_APP_ID; 
    var clientSecret = AUTH_ID.TWITTER_APP_SEC; 

    function storeUserToken(data) 
    { 
     window.localStorage.setItem(twitterKey, JSON.stringify(data)); 
    } 

    function getStoredToken() 
    { 
     return window.localStorage.getItem(twitterKey); 
    } 

    return { 
     initialize: function() 
     { 
      var deferred = $q.defer(); 
      var token = getStoredToken(); 

      if (token !== null) 
      { 
       deferred.resolve(true); 
      } 
      else 
      { 
       $cordovaOauth.twitter(clientId, clientSecret).then(function (result) 
       { 
        storeUserToken(result); 
        deferred.resolve(true); 
       }, function (error) 
       { 
        deferred.reject(false); 
       }); 
      } 
      return deferred.promise; 
     }, 
     isAuthenticated: function() 
     { 
      return getStoredToken() !== null; 
     }, 
     getHomeTimeline: function() 
     { 
      var home_tl_url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'; 
      createTwitterSignature('GET', home_tl_url); 
      return $resource(home_tl_url).query(); 
     }, 
     getTwitterProfileManual: function() { 

      var deferred = $q.defer(); 
      var token = angular.fromJson(getStoredToken()); 

      $twitterHelpers.createTwitterSignature('GET', 'https://api.twitter.com/1.1/account/verify_credentials.json', { 'include_email' : 'true' }, clientId, clientSecret, token); 

      $http({ 
       method: 'GET', 
       url: "https://api.twitter.com/1.1/account/verify_credentials.json", 
       params: {'include_email': 'true'}, 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).success(function (result) 
      { 
       console.log(result); 
       alert('USER TIMELINE: ' + JSON.stringify(result)); 
       deferred.resolve(result); 
      }).error(function (error) 
      { 
       alert("Error: " + JSON.stringify(error)); 
       deferred.reject(false); 
      }); 
      return deferred.promise; 
     }, 
     storeUserToken: storeUserToken, 
     getStoredToken: getStoredToken 
    }; 
}); 

从上面的代码使用getTwitterProfileManual这个函数来获取Twitter的用户对象回复的电子邮件地址。

注意:要获取电子邮件地址,您的twitter应用必须列入白名单才能访问用户的电子邮件地址。

相关问题