2013-10-11 9 views
8

Su Twitter, è possibile creare solo post di 140 caratteri. Questo include le maniglie che stai twittando a: @handle. Questo crea un problema quando si tenta di twittare su un gruppo più grande. Nel tentativo di creare una soluzione alternativa per la mia squadra di pallacanestro, sto tentando di creare un bot su Twitter che, quando viene twittato, prende il testo dal tweet e poi invia una serie di tweet alla squadra di ognuno di loro.Autorizzazione failover TweetBot

Ho iniziato con il codice da this tutorial. Poi ho modificato la roba Wolfram Alpha e si avvicinò con questo codice per iniziare con: (la chiave e segreto arent davvero 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; 

} 

(La mia comprensione è) Questo codice dovrebbe giusta causa il cinguettio bot per pubblicare un tweet che dice "sembra che funzioni" quando viene twittato su.

Tuttavia mi sembra di avere un problema di autorizzazione che non capisco. Ricevo questa email quasi tutte le sere:

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 

Cosa devo fare per riparare il mio bot?

+0

funziona dopo aver chiamato 'fetchTweets' manualmente e autorizzato come @ br-araujo suggerito? A proposito, vi consiglio di testare prima e se funziona, quindi impostare il trigger ... vedere anche il registro per gli errori ... btw. al momento hai definito un trigger in esecuzione ogni minuto, probabilmente lo vuoi cambiare ogni 5 minuti? In questa riga 'var answer =" Sembra che funzionasse "' manca un semikolon terminante ... – Taifun

risposta

1

È necessario accedere all'editor degli script e chiamare direttamente la funzione. (Tasto Play). Dopodiché visualizzerà una schermata di autorizzazione e dopo tutto ciò sarà ok.

+0

Ho fatto questo e ancora nessun progresso ... –

+0

Che cosa è successo, hai cliccato nel pulsante play? –

Problemi correlati