目标我想连接一个API(连接到一个名为Sharesight的网络服务,该服务监视股票投资组合),以便可以每小时(在工作日内)将投资组合收益返回Google表格。然后,我将每小时使用Google表格向我发送一封电子邮件。
确切的过程不一定非要那样,但是本质上,我想从帐户中提取一些数据并将其通过电子邮件发送给我。我计划使用Google表格,因为我想从JSON中选择特定的内容,因此我认为这是设置公式等的简便方法。
注意我知道API是什么,但是我之前从未与他们玩过,所以我在学习中。
[我在Google表格中尝试过的...我尝试使用Google表格编写一些代码(我认为这是Javascript)以连接到Sharesight(使用所有客户端ID,客户端机密,授权令牌URI,访问令牌URI等)。我认为失败的地方是我需要指定一个“重定向URI”,在Sharesight注释中,它表示对于本地测试,我可以使用“ urn:ietf:wg:oauth:2.0:oob”。无论如何我都尝试过,但是我认为不能,因为我没有进行本地测试。
-所以我的第一个绊脚石是...如何获取重定向URI 连接到我的Google表格吗?
然后,我尝试了邮递员我只是在API工具上搜索了一下,发现我以为可以尝试一下,因为实际上我还没有连接到API。因此,幸运的是,我通过了测试并且连接正常。我在我的投资组合URL中使用了GET工具,我不得不将昨天的日期和今天的日期作为报告的参数进行传递-效果很好!
但是我在想,我需要将其导入Google表格。这实际上可行吗?在邮递员内部,我正在使用他们的重定向URI,这就是为什么我认为我可以继续前进(https://www.getpostman.com/oauth2/callback)的原因-但是,然后我需要其他步骤来推动它前进。
但随后出现其他一些问题:
邮递员真的可以每小时运行一次并“做什么”吗?是否有调度能力?
它可以在我的计算机未打开时运行吗?如果没有,那就是对我来说毫无用处(除非我可以复制代码)
是否有一种方法可以导出“获取新访问令牌”代码,该代码似乎可以很好地显示为GUI内容,但我敢肯定,在Auth URL和访问令牌URL。如果我能够使用Google表格,这可能会很方便。
关于下一步我应该尝试什么的指针?还是这几乎不可能?
“代码”授予类型仅真正适用于基于浏览器的应用程序。
您应该能够执行不需要重定向的“密码”授予类型:
var url = 'https://portfolio.sharesight.com/oauth2/token?grant_type=password&client_id='
+ clientId
+ '&username=' + username + '&password=' + password;
var response = UrlFetchApp.fetch(url, { method: 'POST', muteHttpExceptions: true} );
Logger.log("authorize response: " + response.getResponseCode()
+ "; " + response.getContentText());
var responseMsg = JSON.parse(response.getContentText());
responseMsg.access_token
和responseMsg.refresh_token
然后应被填充。您可以使用它们在Sharesight中进行任何API调用,例如通过电子表格中用户定义的功能。
显然,您需要将凭据输入脚本中-我是通过Google表格中的对话框来完成此操作的。
或者(我尚未在Google表格中测试过),您可以授予“ client_credentials”赠款-为此,您需要先联系Sharesight支持并让您的客户ID与您的用户相关联,然后您才能与客户ID和机密。
感谢@Rich(请参阅其他答案/评论)为我指出了正确的方向。这是我最终得到的确切代码,为我提供了来自Sharesight的JSON。
我(愚蠢地)没有意识到我本打算将我的客户端ID和客户端机密首先传递给访问令牌URL以获得访问令牌,然后再将其作为标题传递给我想要的实际报告API运行。
下一步是确定如何将JSON字段转换为Google表格中的电子表格格式!
function getReport()
{
var client_id = 'XXX'
var client_secret = 'YYY'
var url = 'https://edge-api.sharesight.com/oauth2/token?'
+ '&grant_type=client_credentials'
+ '&client_id=' + client_id
+ '&client_secret=' + client_secret
var token = UrlFetchApp.fetch(url,{method:'POST',muteHttpExceptions: true});
var token_data = JSON.parse(token.getContentText());
var access_token = token_data.access_token
var url2 = 'https://edge-api.sharesight.com/api/v2/portfolios/343835/performance.json?'
var report = UrlFetchApp.fetch(url2,{method:'GET',headers:{Authorization: 'Bearer ' + access_token}});
Logger.log(report)
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(report);
}
您已经有了答案,但我想与您分享这个问题,以免对其他人有帮助。该代码获取一个令牌,并将其存储30分钟,以避免不必要地重新请求该令牌。免责声明-我的编码技能非常基本。
我将其和其余代码解析为JSON并将其输入到我的网站上的Google表格中:https://www.callofthesky.com/import-data-from-sharesight-to-google-sheets/
首先定义我们的变量
var ClientID = "CLIENT_ID_GOES_HERE";
var ClientSecret = "CLIENT_SECRET_GOES_HERE";
var PortfolioNumber = "PORTFOLIO_NUMBER_GOES_HERE"
下一个函数返回令牌。如果属性服务中的时间少于30分钟,则将其返回,否则它将从Sharesight获取新的时间。
function gettoken() {
var authdetails = {
"grant_type" : "client_credentials",
"client_id" : ClientID,
"client_secret" : ClientSecret
};
var options = {
'method' : 'post',
'payload' : authdetails
};
var scriptProperties = PropertiesService.getScriptProperties();
var issuetime = scriptProperties.getProperty('issuedtime');
if (issuetime !== null) {
var TokenExpiry = (Number(issuetime) + 1800); }
else {
var TokenExpiry = 0;
}
var d = new Date();
var timeStamp = d.getTime();
if (timeStamp > TokenExpiry) {
var response = UrlFetchApp.fetch("https://api.sharesight.com/oauth2/token" , options);
var data = JSON.parse(response.getContentText());
var token = data.access_token;
addtoproperties(token)
}
else {
var token = scriptProperties.getProperty('SStoken');
}
return token
}
以下函数由gettoken()调用。它将获取的令牌和当前时间添加到属性服务]
function addtoproperties(SStoken) {
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('SStoken', SStoken);
var d = new Date();
var timeStamp = d.getTime();
scriptProperties.setProperty('issuedtime', timeStamp);
var store = scriptProperties.getProperties();
return;
}
我正在尝试使用上面的代码从climate.com API中提取数据,但是我正在努力接收令牌。
function getReport() {
var username = xxx;
var password = xxx;
var client_id = 'xxx';
var client_secret = xxx;
var scope = encodeURIComponent("fields:read");
var url = 'https://api.climate.com/api/oauth/token?grant_type=password&client_id=' + client_id
+ '&client_secret' + client_secret
+ '&username=' + username
+ '&password=' + password
+ '&scope=' + scope;
var token = UrlFetchApp.fetch(url,{method:'POST',muteHttpExceptions: true});
var token_data = JSON.parse(token.getContentText());
var access_token = token_data.access_token
Logger.log (access_token)
var url2 = 'https://platform.climate.com/v4/fields'
var report = UrlFetchApp.fetch(url2,{method:'GET',headers:{Authorization: 'Bearer ' + access_token}});
Logger.log(report)
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(report);
}
每次运行函数时,令牌为空,并且收到授权错误。
谢谢,弗洛林