如何将图像从 firebase 存储传递到 Facebook Marketing API?
How can I pass an image from firebase storage to Facebook Marketing API?
谁能帮助我理解如何从 Node/Express/Cloud Functions for Firebase 下载图像。
所以现在写我只能在 firebase 存储中获得一个包含我的图像信息的对象(通过 getMetadata();
)
let imageInformation = await getImage(domain, thumbID)
imageInformation
的控制台日志为
[ { kind: 'storage#object',
id: 'functions-firebase-43a59.appspot.com/outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e/1551322039811693',
selfLink: 'https://www.googleapis.com/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e',
name: 'outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e',
bucket: 'functions-firebase-43a59.appspot.com',
generation: '1551322039811693',
metageneration: '1',
contentType: 'image/png',
timeCreated: '2019-02-28T02:47:19.811Z',
updated: '2019-02-28T02:47:19.811Z',
storageClass: 'STANDARD',
timeStorageClassUpdated: '2019-02-28T02:47:19.811Z',
size: '162416',
md5Hash: '0nES96sSLfY+8nvoLAdjXQ==',
mediaLink: 'https://www.googleapis.com/download/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e?generation=1551322039811693&alt=media',
contentDisposition: 'inline; filename*=utf-8\'\'d547b001-f5bf-b601-c8b1-4bdeb850995e',
metadata:
{ firebaseStorageDownloadTokens: '78cc9227-a8e7-4797-9929-37983390ad86' },
crc32c: 'c5GAZw==',
etag: 'CO389fi03eACEAE=' },
{ kind: 'storage#object',
id: 'functions-firebase-43a59.appspot.com/outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e/1551322039811693',
selfLink: 'https://www.googleapis.com/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e',
name: 'outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e',
bucket: 'functions-firebase-43a59.appspot.com',
generation: '1551322039811693',
metageneration: '1',
contentType: 'image/png',
timeCreated: '2019-02-28T02:47:19.811Z',
updated: '2019-02-28T02:47:19.811Z',
storageClass: 'STANDARD',
timeStorageClassUpdated: '2019-02-28T02:47:19.811Z',
size: '162416',
md5Hash: '0nES96sSLfY+8nvoLAdjXQ==',
mediaLink: 'https://www.googleapis.com/download/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e?generation=1551322039811693&alt=media',
contentDisposition: 'inline; filename*=utf-8\'\'d547b001-f5bf-b601-c8b1-4bdeb850995e',
metadata:
{ firebaseStorageDownloadTokens: '78cc9227-a8e7-4797-9929-37983390ad86' },
crc32c: 'c5GAZw==',
etag: 'CO389fi03eACEAE=' } ]
我想达到什么目的?
在 facebook Marketing Api 中,为了 create an Ad with image,我们需要为其提供图片路径
curl \
-F 'filename=@<IMAGE_PATH>' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adimages
有人可以帮我弄清楚如何下载或将图像路径传递到 facebook 吗?
我不确定我是否理解正确,如果可以的话我会发表评论。我了解到您正在尝试使用 Facebook 的 cURL api 从您从 Firebase 存储中下载的图像创建广告,如果我错了请纠正我。您是否尝试传递图像的 mediaLink?
使用提供的信息 domain
和 thumbID
实现一个 HTTPS 云函数来处理请求,如下所示。
HTTPS 云功能只不过是一个 API 端点,它必须像网络服务器那样响应内容数据。因此,要提供图像,您需要发送原始数据并设置适当的 HTTP headers(例如 Content-Type
)。
如果您经常请求同一图像资源,那么您可以避免过多的云存储请求,并通过设置 Cache-Control
缓存 header 来缩短响应时间( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control)
Firebase 云存储的管理员 API 使用 GCP API,您可以在此处找到有关如何下载或查询文件的文档:https://cloud.google.com/nodejs/docs/reference/storage/2.3.x/File#download
代码示例
在您的云函数 index.ts
声明中尝试这样的事情。
import * as admin from 'firebase-admin';
// ...
// Set up your cloud functions etc
// ...
const app = express();
export const tanam = functions.https.onRequest(app);
app.get('/thumb/:domain/:thumbID', async (request, response) => {
const domain = request.params.domain;
const thumbID = request.params.thumbID;
const imageInformation = await getImage(domain, thumbID);
const contentFile = await admin.storage().bucket().file(imageInformation.name);
const [fileContent] = await contentFile.download();
response.setHeader('Content-Type', imageInformation.contentType);
response.send(fileContent);
return null;
});
谁能帮助我理解如何从 Node/Express/Cloud Functions for Firebase 下载图像。
所以现在写我只能在 firebase 存储中获得一个包含我的图像信息的对象(通过 getMetadata();
)
let imageInformation = await getImage(domain, thumbID)
imageInformation
的控制台日志为
[ { kind: 'storage#object',
id: 'functions-firebase-43a59.appspot.com/outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e/1551322039811693',
selfLink: 'https://www.googleapis.com/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e',
name: 'outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e',
bucket: 'functions-firebase-43a59.appspot.com',
generation: '1551322039811693',
metageneration: '1',
contentType: 'image/png',
timeCreated: '2019-02-28T02:47:19.811Z',
updated: '2019-02-28T02:47:19.811Z',
storageClass: 'STANDARD',
timeStorageClassUpdated: '2019-02-28T02:47:19.811Z',
size: '162416',
md5Hash: '0nES96sSLfY+8nvoLAdjXQ==',
mediaLink: 'https://www.googleapis.com/download/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e?generation=1551322039811693&alt=media',
contentDisposition: 'inline; filename*=utf-8\'\'d547b001-f5bf-b601-c8b1-4bdeb850995e',
metadata:
{ firebaseStorageDownloadTokens: '78cc9227-a8e7-4797-9929-37983390ad86' },
crc32c: 'c5GAZw==',
etag: 'CO389fi03eACEAE=' },
{ kind: 'storage#object',
id: 'functions-firebase-43a59.appspot.com/outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e/1551322039811693',
selfLink: 'https://www.googleapis.com/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e',
name: 'outlook.com/assets/d547b001-f5bf-b601-c8b1-4bdeb850995e',
bucket: 'functions-firebase-43a59.appspot.com',
generation: '1551322039811693',
metageneration: '1',
contentType: 'image/png',
timeCreated: '2019-02-28T02:47:19.811Z',
updated: '2019-02-28T02:47:19.811Z',
storageClass: 'STANDARD',
timeStorageClassUpdated: '2019-02-28T02:47:19.811Z',
size: '162416',
md5Hash: '0nES96sSLfY+8nvoLAdjXQ==',
mediaLink: 'https://www.googleapis.com/download/storage/v1/b/functions-firebase-43a59.appspot.com/o/outlook.com%2Fassets%2Fd547b001-f5bf-b601-c8b1-4bdeb850995e?generation=1551322039811693&alt=media',
contentDisposition: 'inline; filename*=utf-8\'\'d547b001-f5bf-b601-c8b1-4bdeb850995e',
metadata:
{ firebaseStorageDownloadTokens: '78cc9227-a8e7-4797-9929-37983390ad86' },
crc32c: 'c5GAZw==',
etag: 'CO389fi03eACEAE=' } ]
我想达到什么目的?
在 facebook Marketing Api 中,为了 create an Ad with image,我们需要为其提供图片路径
curl \
-F 'filename=@<IMAGE_PATH>' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adimages
有人可以帮我弄清楚如何下载或将图像路径传递到 facebook 吗?
我不确定我是否理解正确,如果可以的话我会发表评论。我了解到您正在尝试使用 Facebook 的 cURL api 从您从 Firebase 存储中下载的图像创建广告,如果我错了请纠正我。您是否尝试传递图像的 mediaLink?
使用提供的信息 domain
和 thumbID
实现一个 HTTPS 云函数来处理请求,如下所示。
HTTPS 云功能只不过是一个 API 端点,它必须像网络服务器那样响应内容数据。因此,要提供图像,您需要发送原始数据并设置适当的 HTTP headers(例如 Content-Type
)。
如果您经常请求同一图像资源,那么您可以避免过多的云存储请求,并通过设置 Cache-Control
缓存 header 来缩短响应时间( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control)
Firebase 云存储的管理员 API 使用 GCP API,您可以在此处找到有关如何下载或查询文件的文档:https://cloud.google.com/nodejs/docs/reference/storage/2.3.x/File#download
代码示例
在您的云函数 index.ts
声明中尝试这样的事情。
import * as admin from 'firebase-admin';
// ...
// Set up your cloud functions etc
// ...
const app = express();
export const tanam = functions.https.onRequest(app);
app.get('/thumb/:domain/:thumbID', async (request, response) => {
const domain = request.params.domain;
const thumbID = request.params.thumbID;
const imageInformation = await getImage(domain, thumbID);
const contentFile = await admin.storage().bucket().file(imageInformation.name);
const [fileContent] = await contentFile.download();
response.setHeader('Content-Type', imageInformation.contentType);
response.send(fileContent);
return null;
});