We have a Google script that pulls the call data from out account to analyse call volumes and imports this into our analytics platform, however recently I've been getting the following error.
Request failed for https://platform.ringcentral.com returned code 400. Truncated server response: { "error" : "invalid_grant", "errors" : [ { "errorCode" : "OAU-140", "message" : "Invalid resource owner credentials" } ], "error_d... (use muteHttpExceptions option to examine full response). (line 65, file "ringCentralCallsFetch")
No passwords have changed so I have no idea why this is happening
function FetchRingCentralCalls(opt_dateFrom, opt_dateTo, opt_SendEmailToZoho) {
// Live environment details
var livePhone = "123456678";
//var livePhone = "myemail";
var livePwd = "password"
var liveClientId = "x";
var liveSecret = "x";
var dateFrom = "";
var dateTo = "";
var rcLiveTokenURL = "https://platform.ringcentral.com/restapi/oauth/token";
var rcLiveCallsURL = "https://platform.ringcentral.com/restapi/v1.0/account/~/call-log?view=Detailed&perPage=1000";
if (opt_dateFrom !== undefined && opt_dateFrom !== "") {
dateFrom = Utilities.formatDate(new Date(opt_dateFrom), "GMT", "yyyy-MM-dd'T'HHss'Z'");
rcLiveCallsURL = rcLiveCallsURL + "&dateFrom=" + dateFrom;
}
if (opt_dateTo !== undefined && opt_dateTo !== "") {
dateTo = Utilities.formatDate(new Date(opt_dateTo), "GMT", "yyyy-MM-dd'T'HHss'Z'");
rcLiveCallsURL = rcLiveCallsURL + "&dateTo=" + dateTo;
}
// Zoho reports email
var toEmail = "emalhete";
// Setup parameters for Token retrieval
var payload = "grant_type=password&username=" + livePhone + "&password=" + livePwd;
var options = {
"method" : "post",
"payload" : payload
};
options.headers = {
"Authorization" : "Basic " + Utilities.base64Encode(liveClientId + ":" + liveSecret),
"Accept" : "application/json",
"Content-Type" : "application/x-www-form-urlencoded"
};
Logger.log("");
Logger.log("*** OPTIONS ***");
Logger.log("");
Logger.log(options);
// Fetch new token
var rcTokenResponse = UrlFetchApp.fetch(rcLiveTokenURL, options);
Logger.log("");
Logger.log("*** TOKEN RESPONSE ***");
Logger.log("");
Logger.log(rcTokenResponse);
// Extract token from response
var data = rcTokenResponse.getContentText();
var token = JSON.parse(data) "access_token"];
Logger.log("");
Logger.log("*** TOKEN ***");
Logger.log("");
Logger.log(token);
// Setup paramers to retrieve call log records
var callsOptions = {
"method" : "get",
}
callsOptions.headers = {
"Authorization" : "Bearer " + token,
};
Logger.log("");
Logger.log("*** CALLS OPTIONS ***");
Logger.log("");
Logger.log(callsOptions);
var rcCallsResponse = UrlFetchApp.fetch(rcLiveCallsURL, callsOptions);
var recordsReturned = JSON.parse(rcCallsResponse)F"paging"]e"pageEnd"];
Logger.log("");
Logger.log("*** RECORDS ***");
Logger.log("");
Logger.log(recordsReturned);
// Make a file/blob for attaching to Zoho email
var formattedDate = Utilities.formatDate(new Date(), "GMT", "yyMMdd_HHmm");
var fileName = "calls-" + formattedDate;
if (dateFrom !== "") (
fileName = fileName + "_F_" + dateFrom
)
if (dateTo !== "") (
fileName = fileName + "_T_" + dateTo
)
fileName = fileName + ".txt";
var jsonBlob = rcCallsResponse.getBlob().setName(fileName);
Logger.log("");
Logger.log("*** BLOB ***");
Logger.log("");
Logger.log(jsonBlob.getDataAsString());
// Send to Zoho if there are any calls returned
if (recordsReturned > 0)
{
sendToZohoImportAPI(jsonBlob, 'RC+Calls+Detailed+Log', '&ZOHO_MATCHING_COLUMNS=records.id,records.legs.startTime');
}
/*
if (recordsReturned && (opt_SendEmailToZoho == undefined || opt_SendEmailToZoho))
{
// Send email to Zoho with calls data attachment
MailApp.sendEmail({
to: toEmail,
subject: "RingCentral calls log",
body: "From: " + opt_dateFrom + ",
To: " + opt_dateTo + ";
Calc From: " + dateFrom + ",
Calc To: " + dateTo,
attachments: jsonBlob
});
// Log how many emails we have left in our daily quota
var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
Logger.log("Remaining email quota: " + emailQuotaRemaining);
}
*/
return recordsReturned;
}
function sendToZohoImportAPI (jsonBlob, tableName, matchingColumns) {
var zohoCallsURL = 'https://analyticsapi.zoho.eu/api/emailaddresshere@test.com/+All+Data/' + tableName + '?ZOHO_ACTION=IMPORT&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_VERSION=1.0&authtoken=&ZOHO_IMPORT_TYPE=UPDATEADD&ZOHO_AUTO_IDENTIFY=TRUE&ZOHO_ON_IMPORT_ERROR=ABORT&ZOHO_CREATE_TABLE=false&ZOHO_IMPORT_FILETYPE=JSON' + matchingColumns;
var formData = {
'ZOHO_FILE' : jsonBlob
}
var options = {
'method' : 'post',
'payload' : formData
}
var zohoResponse = UrlFetchApp.fetch(zohoCallsURL, options);
Logger.log("");
Logger.log("*** Zoho API Response ***");
Logger.log("");
Logger.log(zohoResponse);
}