twitter - TweetBot Retweeter 授权失败

标签 twitter google-apps-script

在 Twitter 上,您只能发布适合 140 个字符的帖子。这包括您在推特上的句柄:@handle .当试图在更大的群体中发推文时,这会产生问题。为了为我的篮球队创建一个解决方法,我正在尝试创建一个推特机器人,当它在推特上发送时,它会从推文中获取文本,然后发送一系列推文@团队中每个人的句柄。

我从 this tutorial 的代码开始.然后我编辑了 Wolfram Alpha 的东西并想出了这个代码开始:( key 和 secret 真的不是 xxxxx)

/**     ScotsTeamRetweeter                               **/
/**     =======================================          **/
/**     Written by John Holland    
/**     Taken from: Amit Agarwal @labnol on 10/09/2013   **/  
/**     Tutorial link: http://www.labnol.org/?p=27902    **/

function start() {      
  Logger.log("Did actually start"); 

  // REPLACE THESE DUMMY VALUES     
  var TWITTER_CONSUMER_KEY     = "XXXXXX";
  var TWITTER_CONSUMER_SECRET  = "XXXXXX";
  var TWITTER_HANDLE           = "ScotsTeam";  

  // Store variables
  ScriptProperties.setProperty("TWITTER_CONSUMER_KEY",    TWITTER_CONSUMER_KEY);
  ScriptProperties.setProperty("TWITTER_CONSUMER_SECRET", TWITTER_CONSUMER_SECRET);
  ScriptProperties.setProperty("TWITTER_HANDLE",          TWITTER_HANDLE);
  ScriptProperties.setProperty("MAX_TWITTER_ID",          0);

  // Delete exiting triggers, if any
  var triggers = ScriptApp.getScriptTriggers();
  for(var i=0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  // Setup trigger to read Tweets every five minutes
  ScriptApp.newTrigger("fetchTweets")
           .timeBased()
           .everyMinutes(1)
           .create();
}

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

function fetchTweets() {
  oAuth();
  var twitter_handle = ScriptProperties.getProperty("TWITTER_HANDLE");

  var phrase = "lang:en+to:" + twitter_handle; 
  var search = "https://api.twitter.com/1.1/search/tweets.json?count=5&include_entities=false&result_type=recent&q="; 
  search = search + encodeString(phrase) + "&since_id=" + ScriptProperties.getProperty("MAX_TWITTER_ID");    

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

  try {

    var result = UrlFetchApp.fetch(search, options);    
    if (result.getResponseCode() === 200) {
      var data = Utilities.jsonParse(result.getContentText());
      if (data) {
        var tweets = data.statuses;
        for (var i=tweets.length-1; i>=0; i--) {
          var question = tweets[i].text.replace(new RegExp("\@" + twitter_handle, "ig"), "");              
          var answer   = "Looks Like it worked"
          sendTweet(tweets[i].user.screen_name, tweets[i].id_str, answer);
          Logger.log("Tweet should have sent");          
        }
      }
    }
  } catch (e) {
    Logger.log(e.toString());
  }
}

function sendTweet(user, reply_id, tweet) {

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

  var status = "https://api.twitter.com/1.1/statuses/update.json";

  status = status + "?status=" + encodeString("@" + user + " " + tweet);
  status = status + "&in_reply_to_status_id=" + reply_id;

  try {
    var result = UrlFetchApp.fetch(status, options);
    ScriptProperties.setProperty("MAX_TWITTER_ID", reply_id);
    Logger.log(result.getContentText());    
  }  
  catch (e) {
    Logger.log(e.toString());
  }
}

function encodeString (q) {
  // Update: 09/06/2013
  // Google Apps Script is having issues storing oAuth tokens with the Twitter API 1.1 due to some encoding issues.
  // Hence this workaround to remove all the problematic characters from the status message.

  var str = q.replace(/\(/g,'{').replace(/\)/g,'}').replace(/\[/g,'{').replace(/\]/g,'}').replace(/\!/g, '|').replace(/\*/g, 'x').replace(/\'/g, '');
  return encodeURIComponent(str);

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

}

(我的理解是)这段代码应该只是让推特机器人在推特上发布一条推文,上面写着“看起来有效”。

但是我似乎有一个我不明白的授权问题。大多数晚上我都会收到这封电子邮件:
Your script, ScotsTeamRetweeter, has recently failed to finish successfully. A summary of the failure(s) is shown below. To configure the triggers for this script, or change your setting for receiving future failure notifications, click here.

Summary:

Error Message   Count
Authorization is required to perform that action.   18
Details:

Start   Function    Error Message   Trigger End
10/9/13 9:11 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:11 PM
10/9/13 9:12 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:12 PM
10/9/13 9:13 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:13 PM
10/9/13 9:14 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:14 PM
10/9/13 9:15 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:15 PM
10/9/13 9:16 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:16 PM
10/9/13 9:17 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:17 PM
10/9/13 9:18 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:18 PM
10/9/13 9:19 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:19 PM
10/9/13 9:20 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:20 PM
10/9/13 9:21 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:21 PM
10/9/13 9:22 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:22 PM
10/9/13 9:23 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:23 PM
10/9/13 9:24 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:24 PM
10/9/13 9:25 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:25 PM
10/9/13 9:26 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:26 PM
10/9/13 9:27 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:27 PM
10/9/13 9:28 PM fetchTweets Authorization is required to perform that action.   time-based  10/9/13 9:28 PM

我应该怎么做才能修复我的机器人?

最佳答案

您需要进入脚本编辑器并直接调用您的函数。 (播放按钮)。
之后,它会向您显示一个授权屏幕,之后一切都会好起来的。

关于twitter - TweetBot Retweeter 授权失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19323996/

相关文章:

google-apps-script - 如何测试私有(private) Google 工作表插件

google-apps-script - 如何使onFormSubmit自动触发?

mysql - 如何跳过 autoIncrement 列以使用 JDBC Google Apps 脚本在 mySQL 数据库上写入数据

javascript - 在 Angular 中刷新指令

google-apps-script - 使用 DriveApp 访问共享驱动器

google-apps-script - 在谷歌脚本中测试背景颜色

java - Android:使用 Twitter API 1.1 oAuth

objective-c - 在 Mac 上使用 NSJSONSerialization

iphone - 推特页面不存在, token 使用错误

android - 如何制作类似 Google IO 2011 应用程序的实时 Twitterfeed?