“Google Scripts中无需授权即可授权执行该操作”

时间:2013-09-16 19:34:27

标签: twitter oauth google-apps-script

我正在尝试创建一种中间件,因此我正在使用的一些遗留软件可以使用Twitter提要。

由于Twitter已经使API 1.0过时,1.1需要OAuth,因为对于这个项目我只能使用客户端脚本,我选择使用Google脚本来执行OAuth协商:

来源:http://www.labnol.org/internet/twitter-rss-feeds/27931/

function start() {
    // Get your Twitter keys from dev.twitter.com
    var CONSUMER_KEY = "-----";
    var CONSUMER_SECRET = "----";

  // Ignore everything after this line
    initialize(CONSUMER_KEY, CONSUMER_SECRET);
}



function initialize(key, secret) {

    ScriptProperties.setProperty("TWITTER_CONSUMER_KEY", key);
    ScriptProperties.setProperty("TWITTER_CONSUMER_SECRET", secret);

    var url = ScriptApp.getService().getUrl();
    if (url) {
        connectTwitter();
        var msg = "";

        msg += "Sample RSS Feeds for Twitter\n";
        msg += "============================";
        msg += "\n\nTwitter Timeline of user @labnol";
        msg += "\n" + url + "?action=timeline&q=labnol";
        msg += "\n\nTwitter Favorites of user @labnol";
        msg += "\n" + url + "?action=favorites&q=labnol";
        msg += "\n\nTwitter List labnol/friends-in-india";
        msg += "\n" + url + "?action=list&q=labnol/friends-in-india";
        msg += "\n\nTwitter Search for New York";
        msg += "\n" + url + "?action=search&q=new+york";
        msg += "\n\nYou should replace the value of 'q' parameter in the URLs as per requirement.";
        msg += "\n\nFor help, please refer to http://www.labnol.org/?p=27931";

        MailApp.sendEmail(Session.getActiveUser().getEmail(), "Twitter RSS Feeds", msg);

    }

}

function doGet(e) {

    var a = e.parameter.action;
    var q = e.parameter.q;
    var feed;

  switch (a) {
    case "timeline":
        feed = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" + q;
        break;
    case "search":
        feed = "https://api.twitter.com/1.1/search/tweets.json?q=" + encodeString(q);
        break;
    case "favorites":
        feed = "https://api.twitter.com/1.1/favorites/list.json?screen_name=" + q;
        break;
    case "list":
        var i = q.split("/");
        feed = "https://api.twitter.com/1.1/lists/statuses.json?slug=" + i[1] + "&owner_screen_name=" + i[0];
        break;
    default:
        feed = "https://api.twitter.com/1.1/statuses/user_timeline.json";
        break;
    }

    var id = Utilities.base64Encode(feed);
    var cache = CacheService.getPublicCache();
    var rss = cache.get(id);

    if ((!rss) || (rss == "undefined")) {
        rss = JSONtoRSS(feed, a, q);
        cache.put(id, rss, 3600);
    }

    return ContentService.createTextOutput(rss)
        .setMimeType(ContentService.MimeType.RSS);
}


function JSONtoRSS(json, type, key) {
    oAuth();
    var options = {
        "method": "get",
        "oAuthServiceName": "twitter",
        "oAuthUseToken": "always"
    };

  try {
        var result = UrlFetchApp.fetch(json, options);
        if (result.getResponseCode() === 200) {
            var tweets = Utilities.jsonParse(result.getContentText());

          if (type == "search")
                tweets = tweets.statuses;

          if (tweets) {
                var len = tweets.length;
                var rss = "";

              if (len) {

                    rss = '<?xml version="1.0"?><rss version="2.0">';
                    rss += ' <channel><title>Twitter ' + type + ': ' + key + '</title>';
                    rss += ' <link>' + htmlentities(json) + '</link>';
                    rss += ' <pubDate>' + new Date() + '</pubDate>';

                    for (var i = 0; i < len; i++) {

                        var sender = tweets[i].user.screen_name;
                        var tweet = htmlentities(tweets[i].text);

                        rss += "<item><title>" + sender + ": " + tweet + "</title>";
                        rss += " <author>" + tweets[i].user.name + " (@" + sender + ")</author>";
                        rss += " <pubDate>" + tweets[i].created_at + "</pubDate>";
                        rss += " <guid isPermaLink='false'>" + tweets[i].id_str + "</guid>";
                        rss += " <link>https://twitter.com/" + sender + "/statuses/" + tweets[i].id_str + "</link>";
                        rss += " <description>" + tweet + "</description>";
                        rss += "</item>";

                    }

                    rss += "</channel></rss>";

                    return rss;

                }

            }

        }

    } catch (e) {
        Logger.log(e.toString());
    }

}

function connectTwitter() {

    oAuth();

    var search = "https://api.twitter.com/1.1/application/rate_limit_status.json";

    var options = {
        "method": "get",
        "oAuthServiceName": "twitter",
        "oAuthUseToken": "always"
    };

    try {

        var result = UrlFetchApp.fetch(search, options);

    } catch (e) {
        Logger.log(e.toString());
    }
}


function encodeString(q) {

    var str = encodeURIComponent(q);
    str = str.replace(/!/g, '%21');
    str = str.replace(/\*/g, '%2A');
    str = str.replace(/\(/g, '%28');
    str = str.replace(/\)/g, '%29');
    str = str.replace(/'/g, '%27');
    return str;

}

function htmlentities(str) {

    str = str.replace(/&/g, "&amp;");
    str = str.replace(/>/g, "&gt;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/"/g, "&quot;");
    str = str.replace(/'/g, "&#039;");
    return str;

}

function oAuth() {

    var oauthConfig = UrlFetchApp.addOAuthService("twitter");
    oauthConfig.setAccessTokenUrl("https://api.twitter.com/oauth/access_token");
    oauthConfig.setRequestTokenUrl("https://api.twitter.com/oauth/request_token");
    oauthConfig.setAuthorizationUrl("https://api.twitter.com/oauth/authorize");
    oauthConfig.setConsumerKey(ScriptProperties.getProperty("TWITTER_CONSUMER_KEY"));
    oauthConfig.setConsumerSecret(ScriptProperties.getProperty("TWITTER_CONSUMER_SECRET"));

}

我已按照指南中规定的所有说明进行操作,包括两次运行“开始”......所有操作都是向我的电子邮件帐户发送包含各种网址的电子邮件。当我尝试访问电子邮件中提供的URL(并且计划将该URL放入我们当前指向Twitter 1.0 API的旧版javascript)时,我收到错误“执行该操作需要授权”

我已经无数次确认它被设置为“以[我]”执行应用程序和“任何人,甚至匿名者都可以访问应用程序”

我不确定我错过了什么或搞砸了什么。

1 个答案:

答案 0 :(得分:1)

事实证明,我忘了在源指令中指定的Twitter应用设置中设置回调URL。糟糕!

这可以解释为什么即使Google方面的所有内容都是正确的,它也无法正常工作。