Search Twitter with Google Apps Script

The Twitter Search Archiver uses the OAuth1 library for Google Apps Script to talk to the Twitter Search API. You need to include the OAuth1 library in your Google Script project, create a Callback URL and then call the authorization URL in a separate browser tab to authorize the Twitter service.

However, if you are only going to make read-only requests to Twitter – like fetching user timelines for Twitter RSS feeds or performing searches – you can do without the library as well. You won’t be able to post tweets or DMs though.

Twitter supports application-only authentication giving apps the ability to issue authenticated requests on behalf of the application itself without authenticating the specific user.

First create a new Twitter app and make a note of the Twitter consumer key and consumer secret. The Callback URL can be left blank since it is not required.


/* Based on thinkAmi-sandbox/GAS-TwitterOAuth2-sample */

function Twitter() {
  
  // Encode consumer key and secret
  var tokenUrl = "https://api.twitter.com/oauth2/token";
  var tokenCredential = Utilities.base64EncodeWebSafe(
    TWITTER_CONSUMER_KEY + ":" + TWITTER_CONSUMER_SECRET);
  
  //  Obtain a bearer token with HTTP POST request
  var tokenOptions = {
    headers : {
      Authorization: "Basic " + tokenCredential,
      "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" 
    },
    method: "post",
    payload: "grant_type=client_credentials"
  };
  
  var responseToken = UrlFetchApp.fetch(tokenUrl, tokenOptions);
  var parsedToken = JSON.parse(responseToken);
  var token = parsedToken.access_token;
  
  // Authenticate Twitter API requests with the bearer token
  var apiUrl = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=labnol";
  var apiOptions = {
    headers : {
      Authorization: 'Bearer ' + token
    },
    "method" : "get"
  };
  
  var responseApi = UrlFetchApp.fetch(apiUrl, apiOptions);
  
  var result = "";
  
  if (responseApi.getResponseCode() == 200) {
    
    // Parse the JSON encoded Twitter API response
    var tweets = JSON.parse(responseApi.getContentText());
    
    if (tweets) {
      
      for (var i = 0; i < tweets.length; i++) {
        var tweet = tweets[i].text;
        var date = new Date(tweets[i].created_at);
        result += "[" + date.toUTCString() + "]" + tweet + " / ";
      }
    }
  }
  
  Logger.log(result);
  
}