如何从 Google Apps 脚本连接到 Facebook Graph API?
How to connect to the Facebook Graph API from Google Apps Script?
我正在尝试通过 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" is not defined." and a "ReferenceError: "window" is not
defined"
and
"(#4) Application request limit reached","type":"OAuthException","code":4}}
尽管将我的 Facebook 应用程序 ID 放入变量中。我知道 "window" 是外部 javascript 库的一部分,所以我无法在 Google Apps 脚本中使用它,但即使看了其他帖子,我仍然对为什么我得到 "FB" is not defined 错误感到困惑。
关于如何解决这个问题有什么想法吗?
本页底部有错误代码:
Facebook Graph API - Error codes
“OAuthException”与登录状态有关。如果您遇到该错误,那么您还没有登录,要获得您想要的内容,您需要登录。
您可以使用 Server to Server 请求获取 App Access Token。有四种
访问令牌:
- 用户 - 代表他们阅读、修改或写入特定人的 Facebook 数据。
- App - 修改和读取应用程序设置,并发布 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 菜单项。阅读日志中的内容。不要一遍又一遍地 运行ning 这段代码。如果成功就运行一次。
如果该代码有效,那么您刚刚成功与 Facebook 通信。
您需要了解代币可以做什么,以及您有哪些选择。如果您不打算通过客户端授权从用户那里获取令牌,那么您需要了解 App Token。
应用程序令牌允许您代表应用程序而不是用户与 Facebook 进行交互。这可用于读取 YOUR 应用见解并修改 YOUR 应用的参数。
您永远不想在客户端(浏览器)代码中使用 App Token。那将是一个主要的安全问题。
但是,如果用户已授予您的应用程序发布权限,则您可以使用 App Token 代表该用户向 Facebook 发布内容。因此,如果您的应用已获得发布权限,则可以使用应用访问令牌代替用户访问令牌进行 API 调用。
但是你如何获得发布权限?好吧,没有办法通过服务器获得初始的短期访问令牌。如果您从安全的角度考虑它,那才有意义。除了通过客户端登录之外,您无法通过任何其他方式获得初始的短期访问令牌。所以,如果你想做一些不在应用程序访问令牌范围内的事情,你不能在没有用户通过客户端登录的情况下做。
您可以实现客户端登录,而无需使用JavaScript SDK。因此,对于 Apps 脚本独立 HTML 网络应用程序,您仍然可以使用 Facebook 登录,而无需 link 到 Facebook JavaScript SDK。如果您需要这样做,请告诉我。
在该代码中,FB
是一个对象。该对象需要分配 "key/value" 对。每个 "key/value" 对是对象中的一个元素 (属性)。该错误与对象的工作方式直接相关。 FB
对象从 link(在 HTML 内)获取分配给 Facebook API 的值。如果您尝试从服务器端 (.gs) 代码使用 HTML link 到 Facebook API,它将不起作用。有很多事情可能会出错。为了确切地知道出了什么问题,我们需要知道该代码是在 gs
文件中,还是在 <script>
标签内的 HTML 文件中。
有几种连接到 Facebook 的方法:
- 来自 HTML(客户端)
- 来自带有 HTTP 请求的服务器
看起来您正在使用的代码来自如何使用 Facebook JavaScript SDK 的示例,该示例旨在从 HTML 内部 运行。问题在于 Apps 脚本会清理发送到浏览器的 HTML。因此,如果您尝试通过 HTML link 访问 Facebook JavaScript SDK,您可能无法访问。我知道,在过去,我无法在 NATIVE 沙盒模式下使用 link 到 HTML 中的 Facebook API。我还没有尝试过新的 IFRAME 沙盒模式。
我正在尝试通过 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" is not defined." and a "ReferenceError: "window" is not defined"
and
"(#4) Application request limit reached","type":"OAuthException","code":4}}
尽管将我的 Facebook 应用程序 ID 放入变量中。我知道 "window" 是外部 javascript 库的一部分,所以我无法在 Google Apps 脚本中使用它,但即使看了其他帖子,我仍然对为什么我得到 "FB" is not defined 错误感到困惑。
关于如何解决这个问题有什么想法吗?
本页底部有错误代码:
Facebook Graph API - Error codes
“OAuthException”与登录状态有关。如果您遇到该错误,那么您还没有登录,要获得您想要的内容,您需要登录。
您可以使用 Server to Server 请求获取 App Access Token。有四种
访问令牌:
- 用户 - 代表他们阅读、修改或写入特定人的 Facebook 数据。
- App - 修改和读取应用程序设置,并发布 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 菜单项。阅读日志中的内容。不要一遍又一遍地 运行ning 这段代码。如果成功就运行一次。
如果该代码有效,那么您刚刚成功与 Facebook 通信。
您需要了解代币可以做什么,以及您有哪些选择。如果您不打算通过客户端授权从用户那里获取令牌,那么您需要了解 App Token。
应用程序令牌允许您代表应用程序而不是用户与 Facebook 进行交互。这可用于读取 YOUR 应用见解并修改 YOUR 应用的参数。
您永远不想在客户端(浏览器)代码中使用 App Token。那将是一个主要的安全问题。
但是,如果用户已授予您的应用程序发布权限,则您可以使用 App Token 代表该用户向 Facebook 发布内容。因此,如果您的应用已获得发布权限,则可以使用应用访问令牌代替用户访问令牌进行 API 调用。
但是你如何获得发布权限?好吧,没有办法通过服务器获得初始的短期访问令牌。如果您从安全的角度考虑它,那才有意义。除了通过客户端登录之外,您无法通过任何其他方式获得初始的短期访问令牌。所以,如果你想做一些不在应用程序访问令牌范围内的事情,你不能在没有用户通过客户端登录的情况下做。
您可以实现客户端登录,而无需使用JavaScript SDK。因此,对于 Apps 脚本独立 HTML 网络应用程序,您仍然可以使用 Facebook 登录,而无需 link 到 Facebook JavaScript SDK。如果您需要这样做,请告诉我。
在该代码中,FB
是一个对象。该对象需要分配 "key/value" 对。每个 "key/value" 对是对象中的一个元素 (属性)。该错误与对象的工作方式直接相关。 FB
对象从 link(在 HTML 内)获取分配给 Facebook API 的值。如果您尝试从服务器端 (.gs) 代码使用 HTML link 到 Facebook API,它将不起作用。有很多事情可能会出错。为了确切地知道出了什么问题,我们需要知道该代码是在 gs
文件中,还是在 <script>
标签内的 HTML 文件中。
有几种连接到 Facebook 的方法:
- 来自 HTML(客户端)
- 来自带有 HTTP 请求的服务器
看起来您正在使用的代码来自如何使用 Facebook JavaScript SDK 的示例,该示例旨在从 HTML 内部 运行。问题在于 Apps 脚本会清理发送到浏览器的 HTML。因此,如果您尝试通过 HTML link 访问 Facebook JavaScript SDK,您可能无法访问。我知道,在过去,我无法在 NATIVE 沙盒模式下使用 link 到 HTML 中的 Facebook API。我还没有尝试过新的 IFRAME 沙盒模式。