目标 我想连接一个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表格,这可能会很方便。
关于接下来我应该尝试什么的任何指示?还是这几乎不可能?
答案 0 :(得分:1)
“代码”授予类型仅真正适用于基于浏览器的应用。
您应该能够执行不需要重定向的“密码”授予类型:
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和机密。
答案 1 :(得分:0)
感谢@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);
}
答案 2 :(得分:0)
您已经有了答案,但是我想我会分享这个答案,以防它对其他人有帮助。该代码获取一个令牌,并将其存储30分钟,以避免不必要地重新请求该令牌。免责声明-我的编码技能非常基础。
我将此代码和其余代码放入JSON中,以解析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;
}