如何从twitter获取电子邮件地址

时间:2016-01-29 13:48:53

标签: angularjs twitter ionic-framework

twitter 登录由我的应用程序使用ionic framework使用,我想从twitter获取电子邮件地址,我已经请求Twitter和应用程序现在能够获取电子邮件地址。< / p>

但不知何故,下面的代码无法获取电子邮件地址。

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

我还阅读了twitter在Doc提供的文件,并且建议我也将include_email参数作为请求查询传递。但仍然没有回复邮件地址。

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

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

1 个答案:

答案 0 :(得分: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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        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应用必须列入白名单才能访问用户电子邮件地址。