前提:可以访问外网,可以使用 FB 的 API
1. 授权初始化,获取权限信息,返回当前用户已经授权的 facebook 公共主页的信息
export const initsendInstagram = () => {
return new Promise((resolve, reject) => {
FB.getLoginStatus(function (response) {
if (response.status === "connected") {
// 如果当前facebook用户已经在此网页上授权成功,则不需要重新授权
var id = 0;
var accessToken = response.authResponse.accessToken;
FB.api("/me", function (response) {
id = response.id;
FB.api(
"/" + id + "/accounts",
"GET",
{
access_token: accessToken,
},
function (res) {
if (res.data == null) {
reject("您的公共主页未开通或权限未开通,请开通后再尝试");
}
if (res.data.length > 0) {
// 返回当前用户已经授权的 facebook 公共主页的信息
resolve(res.data);
}
}
);
});
} else {
// 如果当前facebook用户没有在此网页上授权成功,则需要重新授权
FB.login(
function (response) {
var id = 0;
if (response.authResponse) {
FB.api("/me", function (response) {
id = response.id;
FB.getLoginStatus(function (response) {
if (response.status === "connected") {
var accessToken = response.authResponse.accessToken;
FB.api(
"/" + id + "/accounts",
"GET",
{
access_token: accessToken,
},
function (res) {
if (res.data == null) {
reject(
"您的公共主页未开通或权限未开通,请开通后再尝试"
);
}
if (res.data.length > 0) {
// 返回当前用户已经授权的 facebook 公共主页的信息
resolve(res.data);
}
}
);
}
});
});
} else {
reject("授权登录失败");
}
},
{
// 此处为需要授权的名称
scope:
"public_profile,email,pages_show_list,pages_read_engagement,pages_manage_posts,instagram_content_publish,instagram_basic,ads_management,business_management",
}
);
}
});
});
};
返回的格式如下:两个公共主页:一个为“你的公共主页名字 1”,一个为“你的公共主页名字 2”
"data": [
{
"access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"category": "游戏/玩具",
"category_list": [
{
"id": "0000000000000000",
"name": "游戏/玩具"
}
],
"name": "你的公共主页名字1",
"id": "0000000000000000",
"tasks": [
"ADVERTISE",
"ANALYZE",
"CREATE_CONTENT",
"MESSAGING",
"MODERATE",
"MANAGE"
]
},
{
"access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"category": "商业供应服务",
"category_list": [
{
"id": "0000000000000000",
"name": "商业供应服务"
}
],
"name": "你的公共主页名字2",
"id": "0000000000000000",
"tasks": [
"ADVERTISE",
"ANALYZE",
"CREATE_CONTENT",
"MESSAGING",
"MODERATE",
"MANAGE"
]
}
],
"paging": {
"cursors": {
"before": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"after": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
2. 选择你要发布的 facebook 公共主页,如果你选择的是“你的公共主页名字 1”的公共主页,那么就把该公共主页的 id 和 access_token 保存下来。
注意:要选择绑定了 ins 的 facebook 公共主页
3. 获取 ins 的 id,其中 zhuyeid,zhuyetoken 为上文中的 id,access_token,如果你选中的 facebook 公共主页,没有绑定 ins,则没有返回结果
export const getinscountid = (zhuyeid, zhuyetoken) => {
return new Promise((resolve, reject) => {
FB.api(
"/" + zhuyeid + "?fields=instagram_business_account",
"GET",
{
access_token: zhuyetoken,
},
function (response) {
if (response.instagram_business_account) {
resolve(response.instagram_business_account.id);
} else {
reject("该公共主页没有绑定ins");
}
}
);
});
};
4. 现在你已经有了 ins主页的 ID,facebook 公共主页的 access_token,那么接下来可以发布视频到 ins 了
发布视频到 ins 一共有三步,
第一步:创建视频容器。
第二步:轮询视频已经准备完毕
第三步:发布视频容器,发布成功即为发布到 ins
第一步:创建视频容器,此函数返回结果为你的视频 resultsID
/*
InsID : 上文中的INS的ID;
videofileUrl : 视频链接;
INSaccess_token:上文中的access_token;
caption: 视频标题
*/
export const createvideotoInstagramcontainer = (
InsID,
videofileUrl,
INSaccess_token,
caption
) => {
return new Promise(function (resolve, reject) {
FB.api(
"/" + InsID + "/media",
"POST",
{
access_token: INSaccess_token,
caption: caption,
video_url: videofileUrl,
media_type: "REELS",
},
function (response) {
if (response.id) {
resolve(response.id);
} else {
reject(response);
}
}
);
});
};
第二步:轮询视频已经准备完毕
为什么视频 id 已经得到了还要轮询呢?
如果你直接使用该视频 ID 直接去发布,是不会成功的
返回结果会是这样:
{
"error": {
"message": "Media ID is not available",
"type": "OAuthException",
"code": 9007,
"error_subcode": 22097,
"is_transient": false,
"error_user_title": "无法发布",
"error_user_msg": "影音内容还未就绪,无法发布,请稍等",
"fbtrace_id": "AH5iCwcS8CNf71xxxx"
}
}
这种错误官方文档是这样解释
视频上传是异步操作,因此收到容器编号并不能确保上传成功。如需验证视频是否已经上传,请在 Instagram 容器中请求 status_code 字段。如果值为 FINISHED,则视频已成功上传。
于是我先查询视频是否准备完毕,准备完毕了,我再发布。
1:先写一个轮询函数
// 轮询函数
/*
func: 为获取视频状态的方法
times:轮询次数
delay:每隔多少秒执行一次单位(毫秒)
resultsID:视频的id
zhuyetoken:上文中的token
*/
Polling(func, times, delay, resultsID, zhuyetoken) {
return new Promise((resolve, reject) => {
function inner() {
setTimeout(() => {
if (times-- > 0) {
func(resultsID, zhuyetoken)
.then((res) => {
if (res == "FINISHED") {
resolve(res);
} else {
console.log(res);
inner();
}
})
.catch((err) => {
console.log(err);
inner();
});
} else {
reject("失败");
}
}, delay);
}
inner();
});
},
2:写获取视频 ID 当前状态的函数
// 获取视频 ID 当前状态
/*
videoID:视频ID
INSaccess_token:主页access_token
*/
export const getvideoIDstatus = (videoID, INSaccess_token) => {
return new Promise(function (resolve, reject) {
FB.api(
"/" + videoID,
"GET",
{
access_token: INSaccess_token,
fields: "status_code",
},
function (response) {
if (response.status_code) {
resolve(response.status_code);
} else {
reject(response);
}
}
);
});
};
3:轮询获取视频 ID 当前状态
Polling(getvideoIDstatus, 120, 1500, resultsID, zhuyetoken)
.then((ressss) => {
console.log(ressss);
// 去发布
})
.catch((errrrr) => {
console.log(errrrr, "超时或出错");
that.$message({
message: errrrr,
type: "warning",
});
});
第三步:发布视频容器,发布成功即为发布到 ins
当视频 ID 的状态为"FINISHED",就可以发布了
// 最终发布
/*
InsID : INS的主页ID;
creation_id : 视频上传之后的ID,且状态为"FINISHED";
INSaccess_token:主页的access_token;
*/
export const finishpublishvideotoInstagram = (
InsID,
creation_id,
INSaccess_token
) => {
return new Promise(function (resolve, reject) {
FB.api(
"/" + InsID + "/media_publish",
"POST",
{
access_token: INSaccess_token,
creation_id: creation_id,
},
function (response) {
if (response.id) {
// 发布成功
resolve(response.id);
} else {
reject(response);
}
}
);
});
};