我可以使用Google表格连接到API(使用OAuth2),还是可以每小时从邮递员向Google表格发送预定的回复?

问题描述 投票:1回答:4

目标我想连接一个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表格,这可能会很方便。

关于下一步我应该尝试什么的指针?还是这几乎不可能?

api oauth-2.0 postman
4个回答
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_tokenresponseMsg.refresh_token然后应被填充。您可以使用它们在Sharesight中进行任何API调用,例如通过电子表格中用户定义的功能。

显然,您需要将凭据输入脚本中-我是通过Google表格中的对话框来完成此操作的。

或者(我尚未在Google表格中测试过),您可以授予“ client_credentials”赠款-为此,您需要先联系Sharesight支持并让您的客户ID与您的用户相关联,然后您才能与客户ID和机密。

(请参阅https://alexbilbie.com/guide-to-oauth-2-grants/


1
投票

感谢@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); 
}

0
投票

您已经有了答案,但我想与您分享这个问题,以免对其他人有帮助。该代码获取一个令牌,并将其存储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;
}

0
投票

我正在尝试使用上面的代码从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); 
    }  

每次运行函数时,令牌为空,并且收到授权错误。

谢谢,弗洛林

© www.soinside.com 2019 - 2024. All rights reserved.