GS-PKCE-Generator


/**
 * Generate code_verifier & code_challenge for PKCE
 */
function pkceChallengeVerifier() {
  let verifier = "";
  // https://www.oauth.com/oauth2-servers/pkce/authorization-request/
  const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
  for (let i = 0; i < 128; i++) {
    verifier += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  console.log({verifier});

  const sha256Hash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, verifier)
  const challenge = Utilities.base64Encode(sha256Hash)
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '');
  console.log({challenge});
}


update versi full/twitter


var token = "6ECn5QdYeM5vuxxxxx" //Access Token and Secret
var token_secret = "mdVDFLy4egaouqzvFbCxxxxxxxxxxxxxxxxx"

var consumer_key = "YWRJdklHWnh5M2d2bHRxxxxxxxxxxxxxxxxxxxx" //Client ID and Secret
var consumer_secret = "-raFzAUQnnRQLKMvLGRYrCqe3xxxxxxxxxxxxxxxxxxxxxxxxxx"

var callback = "https://script.google.com/macros/s/AKfycbyyUntYsIJcd6jhVTnYcELMmKXFWpRkS1jJMc6LGn4WFsigZ9RmrzIPplgPsU8IWCvEnw/exec"

function satu(){

var anu = 'https://twitter.com/i/oauth2/authorize?response_type=code&client_id='+consumer_key+'&redirect_uri='+callback+'&scope=tweet.read%20users.read%20follows.read%20offline.access&state=state&code_challenge=biston&code_challenge_method=plain'
console.log(anu)
return anu

}



function tiga(code) {

 const link = 'https://api.twitter.com/2/oauth2/token';

  let formData = {
    'grant_type': 'authorization_code',
    'redirect_uri': callback,
    'code_verifier': 'biston',
    'client_id' : consumer_key,
    'code' : code
  };
  var options =
  {
    'method': 'post',
    'contentType': 'application/x-www-form-urlencoded',
    "muteHttpExceptions": true,
    'payload': formData
  };
  options.headers = { "Authorization": "Basic " + Utilities.base64Encode(consumer_key+":"+consumer_secret) };
  var hx = UrlFetchApp.fetch(link, options);
  return hx
}





function empat(bear) {
 const link = 'https://api.twitter.com/2/users/me';
  var options =
  {
    'method': 'get',
    "muteHttpExceptions": true,
  };
  options.headers = { "Authorization": "Bearer " + bear };
  var hx = UrlFetchApp.fetch(link, options);
  return hx.getContentText()
}



function lima(bear) {
 const link = 'https://api.twitter.com/2/tweets';
  let formData = {
    'text': 'selamat pagi indonesia',
  };

  //var data = JSON.stringify({"text": "Hello World!"});
  //var data = '{"text": "Hello World!"}'

  var data =  {
    "text": "https://twitter.com/NausYohan",
  }

  var options =
  {
    'method': 'post',
    "muteHttpExceptions": true,
    'payload': JSON.stringify(data)
  };
  options.headers = { "Authorization": "Bearer " + bear };
  var hx = UrlFetchApp.fetch(link, options);
  return hx.getContentText()
}


function doGet(request) {



var js = JSON.stringify(request)
if (js.length == 85 ){
  var hx = satu()
  hx = "<a target='_blank' href='"+hx+"'>oke</a>"
  return HtmlService.createHtmlOutput(hx).setTitle('[email protected]'); 
}

  var code = request.parameter.code
  var hx = tiga(code)
  hx = JSON.parse(hx)
  hx = hx['access_token']
  //hx = lima(hx)
  //hx = empat(hx)
  return ContentService.createTextOutput(hx)

}


////////


reload token/bearer


function xbear(){

var dx = sh2.getRange("D8").getValue() //refresh_token

 var link = 'https://api.twitter.com/2/oauth2/token';

  let formData = {
    'grant_type': 'refresh_token',
    'client_id' : client_id,
    'refresh_token' : dx
  };
  var options =
  {
    'method': 'post',
    'contentType': 'application/x-www-form-urlencoded',
    "muteHttpExceptions": true,
    'payload': formData
  };


  options.headers = { "Authorization": "Basic " + Utilities.base64Encode(client_id+":"+client_secret) };
  var hx = UrlFetchApp.fetch(link, options);
  console.log(hx.getContentText())
  sh2.getRange("D9").setValue(hx.getContentText())
  hx = JSON.parse(hx)
  sh2.getRange("C8").setValue(hx['access_token'])
  sh2.getRange("D8").setValue(hx['refresh_token'])


}