Main /
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'])
}