视频发布到 Facebook 绑定的 Instagram 中

前提:可以访问外网,可以使用 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);
        }
      }
    );
  });
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值