【问题标题】:How to connect to the Facebook Graph API from Google Apps Script?如何从 Google Apps 脚本连接到 Facebook Graph API?
【发布时间】:2015-02-17 06:21:22
【问题描述】:

我正在尝试通过 Google Apps 脚本连接到 Facebook Graph API,但出现错误

我试过了:

function myFunction (name) {

  FB.init({  
    appId      : '{your-app-id}',  
    status     : true,  
    xfbml      : true,  
    version    : 'v2.0'   
  });  

  var jsonData = UrlFetchApp.fetch("graph.facebook.com/"; + name);
}

我也试过了:

function myFuntion(name) {  

    window.fbAsyncInit = function() {  
        FB.init({  
          appId      : 'your-app-id',  
          xfbml      : true,  
          version    : 'v2.0'  
        });  
      };   

      var jsonData = UrlFetchApp.fetch("graph.facebook.com/"; + name);

}

但都没有工作,我总是得到一个:

"ReferenceError: "FB" 未定义。"和“ReferenceError:“窗口”不是 定义”

"(#4) 应用请求限制达到","type":"OAuthException","code":4}}

尽管将我的 facebook 应用程序 ID 放入变量中。我知道“窗口”是外部 javascript 库的一部分,所以这就是为什么我无法在 Google Apps 脚本中使用它的原因,但即使在查看其他帖子后,我仍然对为什么会得到“FB”感到困惑未定义错误。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 你能放更多的代码吗?
  • 这个答案可能对你有帮助:StackOverflow answer - Facebook with Apps Script
  • 你最终想做什么?发布到您的 FB 页面?发布到别人的页面?允许其他人发布到您的页面?取决于你想做什么,将取决于你需要什么授权。
  • 我想通过返回 FB 页面的 json 从 FB 页面获取数据。例如,从 NBA facebook 页面获取 json - graph.facebook.com/nba
  • 好的,我刚刚使用 API Explorer 来获取数据:Facebook API Explorer 现在我知道你想要什么了。

标签: google-apps-script google-sheets facebook-graph-api-v2.0


【解决方案1】:

本页底部有错误代码:

Facebook Graph API - Error codes

OAuthException”与登录状态有关。如果您收到该错误,则说明您没有登录,并且要获得所需的内容,您需要登录。

您可以使用 Server 到 Server 请求获取 App 访问令牌。有四种类型

访问令牌:

  • 用户 - 代表他们读取、修改或写入特定人员的 Facebook 数据。
  • 应用程序 - 修改和读取应用程序设置,并发布 Open Graph 操作。
  • 页面 - 读取、写入或修改属于 Facebook 页面的数据。
  • Client - 很少使用客户端令牌。对 Facebook 的访问非常有限。

访问令牌的形式

用户访问令牌有两种形式:短期令牌和长期令牌

  • 短暂的 - 大约一两个小时的生命周期 - 通过网络登录生成
  • 使用寿命长 - 使用寿命约为 60 天

您可能没有应用访问令牌。您有一个 App ID,但这与 App Token 不同。

您只能获得一次应用令牌。你需要运行一些代码来获取它。

请注意,您还必须知道您的 App Secret 才能运行此代码。如果您不知道或知道您的 App Secret,那么您需要获得它。

看看你是否可以运行这段代码:

//A Facebook App Token never changes unless you go to the Facebook Developers Console, 
//and you
//change the App Secret.  So, do NOT keep requesting a new App Token.  Just get it once, 
//then
//hard code it into a backend secret function.
// The App Token can be used to modify your App, but you can just do that 'Manually'

function getOneTimeFB_AppToken() {
  Logger.log("getOneTimeFB_AppToken ran");
  //keep this info secret
  //Generate an App Access Token

  var myApp_ID = 'Your App ID';
  var myAppSecret = 'Your App Secret';
  var optnAppTkn = {"method" : "get"};
  var getAppTknURL = "https://graph.facebook.com/oauth/access_token?client_id=" + myApp_ID + "&client_secret=" + myAppSecret + "&grant_type=client_credentials"
  var getAppTkn = UrlFetchApp.fetch(getAppTknURL, optnAppTkn);
  Logger.log("Object returned from GET: " + getAppTkn)
  var myAppTkn = getAppTkn.getContentText();
  Logger.log("myAppTkn: " + myAppTkn);
};

运行该代码,然后在脚本编辑器中,选择 VIEW 菜单和 LOGS 菜单项。阅读日志中的内容。不要一遍又一遍地运行此代码。如果成功,只需运行一次。

如果该代码有效,那么您与 Facebook 成功沟通。

您需要了解代币可以做什么,以及您的选择是什么。如果您不打算通过客户端授权从用户那里获取令牌,那么您需要了解 App Token。

应用令牌允许您代表应用而不是用户与 Facebook 进行交互。这可用于读取 YOUR 应用洞察并修改 YOUR 应用的参数。

您永远不想在客户端(浏览器)代码中使用应用令牌。这将是一个重大的安全问题。

但是,如果用户已授予您的应用程序发布权限,则您可以使用应用程序令牌代表该人将内容发布到 Facebook。因此,如果您的应用已被授予发布权限,则可以使用应用访问令牌代替用户访问令牌进行 API 调用。

但是如何获得发布权限?好吧,没有办法通过服务器获取初始的短期访问令牌。如果您从安全性的角度考虑,这才有意义。除了通过客户端登录之外,您无法以任何其他方式获得初始的短期访问令牌。所以,如果你想做一些不在 App Access Token 范围内的事情,你不能在没有用户通过客户端登录的情况下做。

可以实现客户端登录,而无需使用 JavaScript SDK。因此,对于 Apps Script Stand Alone HTML web 应用程序,您仍然可以使用 Facebook 登录,而无需链接到 Facebook JavaScript SDK。如果您需要这样做,请告诉我。

在该代码中,FB 是一个对象。需要为对象分配“键/值”对。每个“键/值”对都是对象中的一个元素(属性)。该错误与对象的工作方式直接相关。 FB 对象从链接(在 HTML 中)到 Facebook API 的分配值。如果您尝试从服务器端 (.gs) 代码使用指向 Facebook API 的 HTML 链接,它将无法正常工作。有很多事情可能会出错。为了确切知道出了什么问题,我们需要知道该代码是在gs 文件中,还是在<script> 标记内的HTML 文件中。

有几种方法可以连接到 Facebook:

  • 来自 HTML(客户端)
  • 从带有 HTTP 请求的服务器

看起来您使用的代码来自如何使用旨在从 HTML 内部运行的 Facebook JavaScript SDK 的示例。问题在于,Apps 脚本会清理发送到浏览器的 HTML。因此,如果您尝试通过 HTML 链接到 Facebook JavaScript SDK,您可能无法访问。我知道,在过去,我无法在 NATIVE 沙盒模式下使用 HTML 格式的 Facebook API 链接。我还没有尝试过新的 IFRAME 沙盒模式。

【讨论】:

  • 嗨桑迪,感谢您的回复。我的代码在 gs 文件中,我正在尝试连接到 gs 文件中的 facebook graph api(来自具有 HTTP 请求的服务器),而不是来自 html(客户端)。由于我是从服务器端而不是从客户端进行的,这意味着我将无法使用“窗口”,如果“FB”也不会,有没有办法连接到图形 API工作?或者有没有让“FB”在 gs 文件中工作?
  • 是的,但是您需要使用UrlFetchApp.fetch() 类和方法。我用过,这里解释一下:Facebook API with Apps Script
  • 我试过了,但是不行。 var jsonData = UrlFetchApp.fetch("graph.facebook.com" + name);这是说我对图形 api 发出了太多请求:达到应用程序请求限制“,”类型“:”OAuthException“,”代码“:4},所以这就是为什么我试图授权应用程序增加请求限制并希望这会起作用,但我被困在这里。我查看了类似 stackoverflow.com/questions/25282315/… 的其他帖子,他们说 Facebook 可能阻止了它。有什么解决方法吗?
  • 如果不查看所有代码,任何人都无法找出问题所在。您需要在问题中发布整个代码。删除 ID、密码。
  • 我已经用我所有的代码编辑了这个问题
猜你喜欢
  • 2012-11-06
  • 2021-06-02
  • 2022-01-15
  • 2018-11-02
  • 1970-01-01
  • 2022-11-23
  • 2021-12-10
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多