前端小白,分享经验为辅,做记录为主。

1:前言

现在我所在的公司为一家做外贸的公司,于是对国外的软件需要一些了解,而且做外贸,所以要将商品推广到国外宣传,所以就将Facebook作为一个用于宣传商品的平台,而且Facebook用户是真的多啊。

2:准备

首先根据Facebook开发文档一步一步来,下面为官方文档,根据提示一步一步来,看不懂就用Google浏览器,直接翻译一下就可。

https://developers.facebook.com/docs/development

注意事项:

(1)电脑要能翻墙,并且有Facebook账户 (2)在我的应用中,在产品那一栏有Facebook登录,点击设置,打开使用 JavaScript SDK 登录,这些创建应用的具体配置可以在官方文档上查看 (3)我现在还是在测试阶段,所以如果别人想在你的网站上发布东西到Facebook公共主页,别人就要注册成功开发者,然后你还要拉ta进你的应用当测试者,这样才能使用 (4)有些接口是必须放到服务器上才能调用的,具体看你在哪里碰到,Facebook会提示 (5)不能在短时间内发布多个帖子,且帖子直接图片尽量不要重复,重复可能发布不了那个重复的图片

接入Facebook,这里就放在你所需要的vue文件里面,这一步是基础性工作,

<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>
<script>
  window.fbAsyncInit = function() {
    // 上面和这里就相当于跟Facebook建立链接一样,这里建立了链接才能发送Facebook
    // 注意:这里建立链接的前提条件是需要你的电脑能访问外网
    FB.init({
      appId            : 'xxxxxxxxxx',
      autoLogAppEvents : true,
      xfbml            : true,
      version          : 'v18.0'
    });
  };
</script>

3:Facebook分享到个人主页

3-1:不带图片

3-1-1:调官网接口

直接接入Facebook的api接口就可,根据官网上讲解

shareToFB() {
FB.ui({
method: 'share',
href: 'https://example.com/',
}, function(response){});
}

3-1-2:直接用链接

直接将内容和链接传入http://www.facebook.com/sharer.php?u=,如果只想传内容,只要调这个就行,其他上面的内容都可以不看,都不会用到。

window.open(
            "http://www.facebook.com/sharer.php?u=" +
              encodeURIComponent(url),
            "_blank",
            "toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, width=600, height=450,top=100,left=350"
);

3-2:带图片

3-2-1:用静态HTML页面“欺骗”Facebook爬虫

由于我的项目是由vue创建的,所以在进行分享Facebook和Twitter时,它们获取不到我的图谱元素,所以,我就要求后端给我返回一个静态HTML页面,其中的head元素包含了标题,描述,还有图片,链接等,在js代码中就写一个跳转到我们公司的详情页面函数,其中有一定时间延迟,但不会影响使用,这样Facebook爬虫就是能读到我们的图片等元素,但是却会跳转到我们的商品详情页面。

// 发送到个人主页
facebookgerenzhuye(data){
      let imgcover = data.cover // 封面
      let title = data.name // 标题
      let description = data.brief // 简介描述
      let goodsid = data.id // 商品的ID,后面可用来进行拼接地址来访问商品详情信息
      // share_goods_html这个接口具体功能为将我传入的值传到后端,然后让后端通过这些值返回我个静态的HTML页面,这样facebook就能抓取到我的图谱信息,而这个HTML页面的js代码就执行跳转到商品详情页即可
      share_goods_html({
        image:imgcover,
        title:title,
        goods_id:goodsid,
        url:"https://www.xxxxx.com/detail/"+goodsid,
        description:description,
      }).then((res)=>{
        // 返回静态页面成功,就将这个静态页面的链接放入至Facebook接口中,Facebook就能读取到图谱元素了
        function popupwindow(url) {
          return window.open(
            "http://www.facebook.com/sharer.php?u=" +
              encodeURIComponent(url),
            "_blank",
            "toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, width=600, height=450,top=100,left=350"
          );
        }
        popupwindow(res.data);
      })
    },

3-2-1:服务器优化

这个正在弄,还没弄好。。。。

4:Facebook分享到公共主页

这个部分,需要自己摸索一下,可以在postman上试试接口啥的,在Facebook上有个工具可以获取权限的,可以试试那个。

我这次就把全部代码放下面了。注意区分,公共主页分享可能有些不够详细,但是应该花点时间,结合官网的文档就能理解,个人感觉,Twitter的文档比Facebook要难

html部分

<template>
  <div id="listTable">
    <el-button
      type="success"
      icon="el-icon-s-promotion"
      size="mini"
      @click="copyfacebook(scope.row)"
    >复制至Facebook公共主页</el-button>
    <el-button
      type="success"
      icon="el-icon-s-promotion"
      size="mini"
      @click="copyfacebookgerenzhuye(scope.row)"
    >复制至Facebook个人主页</el-button>
    <!-- 发布至第几个公共主页 -->
    <el-dialog title="提示" :visible.sync="openAssembleVisible789" :before-close="handleClose" width="30%">
      <div>一次只能发布到1个Facebook公共主页。</div>
      <div style="margin-top: 10px">请选择你要发布的Facebook公共主页:</div>
      <el-radio-group v-model="ggzhuyedizhi" style="margin-top: 20px">
        <el-radio v-for="(item,index) in gongongzhuyeid" :label=item.index :key="index">{{item.name}}</el-radio>
      </el-radio-group>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="quedingggzhuye" :loading="fabuflag">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

js部分

这里还要加上准备部分接入Facebook的代码,然后把后面接上

<script>
export default {
  data() {
    return {
      ggzhuyedizhi:0,
      // 只是一个样式的标识
      fabuflag:false,
      openAssembleVisible789:false,
      // 公共主页初始数据(随便写的)
      gongongzhuyeid:[{
        name:'原神启动',
        index:0
      },{
        name:'王者荣耀',
        index:1
      },{
        name:'和平精英',
        index:2
      }],
      zhuyedshuju:{},
      item:{},
      imglist:[],
    };
  },
  methods: {
    // 关闭对话框时的操作
    handleClose(){
      // 使按钮上的样式不生效
      this.fabuflag=false
      // 关闭对话框
      this.openAssembleVisible789=false
    },
    // 发送到个人主页
    copyfacebookgerenzhuye(data){
      let imgcover = data.cover // 封面
      let title = data.name // 标题
      let description = data.brief // 简介描述
      let goodsid = data.id // 商品的ID,后面可用来进行拼接地址来访问商品详情信息
      // share_goods_html这个接口具体功能为将我传入的值传到后端,然后让后端通过这些值返回我一个静态的HTML页面,这样facebook就能抓取
      // 到我的图谱信息,而这个HTML页面的js代码就执行跳转到商品详情页即可
      share_goods_html({
        image:imgcover,
        title:title,
        goods_id:goodsid,
        url:"https://www.xxxxx.com/detail/"+goodsid,
        description:description,
      }).then((res)=>{
        // 返回静态页面成功,就将这个静态页面的链接放入至Facebook接口中,Facebook就能读取到图谱元素了
        function popupwindow(url) {
          return window.open(
            "http://www.facebook.com/sharer.php?u=" +
              encodeURIComponent(url),
            "_blank",
            "toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, width=600, height=450,top=100,left=350"
          );
        }
        popupwindow(res.data);
      })
    },
    quedingggzhuye(){
      let that= this
      // 点击确定后fabuflag为true,确认按钮上转圈圈的样式开启
      that.fabuflag=true
      // ggzhuyedizhi为你选择的公共主页的地址即下标,分别赋值
      let zhuyeid = that.zhuyedshuju[that.ggzhuyedizhi].id
      let zhuyetoken = that.zhuyedshuju[that.ggzhuyedizhi].access_token
      // 初始化上传后图片的ID列表,由于我找到的Facebook上传图片只能一张一张传,所以将每一次上传成功返回的ID存进列表中
      let imgidlist=[]
      // item为你选择的要发布到Facebook上的商品的详细数据
      let item = that.item
      // imglist为你选择的要发布到Facebook上的商品的图片加上封面
      let imglist=that.imglist
      // b为计数器
      let b=0
      // flag为定时器的标识
      let flag=false
      for(let i=0;i<imglist.length&&b<5;i++){
        FB.api('/'+zhuyeid+'/photos','POST',{
          access_token:zhuyetoken,
          url:imglist[i].image,
          published:false // 这个字段一定不能少
        },function(response){
          // 成功一次计数加一
          b++
          if(response.id){
            imgidlist.push({'media_fbid':response.id})//media_fbid字段也一定不能少
          }
          if(b==imglist.length){
            // flag为true就去发帖
            flag=true
          }
          if(b==5){
            // 我要求最多上传5张
            flag=true
          }
        })
      }
      var a = setInterval(() => {
        if(flag){
          // 发帖
            FB.api('/'+zhuyeid+'/feed','POST',{
            access_token:zhuyetoken, //访问令牌
            message:item.brief  //帖子文本
            attached_media: imgidlist,//已经初始上传过的图片ID列表,格式{'media_fbid':id}这样才可以
          },function(response){
            if(response.error){
              if(response.error.code==368){
                that.fabuflag=false
                that.openAssembleVisible789=false
                that.$message({
                  message: "你短时间内发送了太多帖子,请稍后再试",
                  type: "error"
                });
              }
              console.log(response.error.message)
            }else{
              that.fabuflag=false
              that.openAssembleVisible789=false
              that.$message({
                message: "已成功发布至Facebook公共主页",
                type: "success"
              });
            }
            clearInterval(a)
          })
        }
      }, 500);
    },
    copyfacebook(data){
      let that = this
      FB.getLoginStatus(function(response) {
        // 获取facebook登录状态
        if (response.status === 'connected') {
          // 登录成功就会有accessToken
          var id =0
          var accessToken = response.authResponse.accessToken;
          FB.api('/me', function(response) {
            id=response.id
            // 获取自己的个人ID
            FB.api('/'+id+'/accounts','GET',{
              access_token:accessToken
            },function(response){
              // 获取授权的公共主页的id
              if(response.data==null){
                that.$message({
                  message: '您的公共主页未开通或权限未开通,请开通后再尝试',
                  type: "error"
                });
                return
              }
              if(response.data.length>0){
                // 初始化公共主页ID列表
                that.gongongzhuyeid=[]
                // 公共主页数据
                that.zhuyedshuju=response.data
                // 初始化要上传的图片列表
                that.imgidlist=[]
                // 将商品数据赋值给item
                that.item = data
                // 将商品图片赋值给图片列表
                that.imglist=that.item.images
                // 将商品封面图片加入到图片列表中
                that.imglist.unshift({'image':that.item.cover})
                console.log(that.imglist,99999999)
                // 将授权的公共主页导入到公共主页选项对话框中,
                // 这一步是你要选择你要发布到哪一个公共主页
                for(let j=0;j<response.data.length;j++){
                  that.gongongzhuyeid.push({'name':response.data[j].name,'index':j})
                }
                that.openAssembleVisible789=true
              }
            })
          });
        }else{
          // 没登录成功就让他登录
          FB.login(function(response) {
            var id =0
            if (response.authResponse) {
              FB.api('/me', function(response) {
                id=response.id
                // 获取我的个人ID
                FB.getLoginStatus(function(response) {
                  if (response.status === 'connected') {
                    var accessToken = response.authResponse.accessToken;
                    // 获取我的公共主页的ID ,这里的公共主页ID,你授权了多少就有多少
                    FB.api('/'+id+'/accounts','GET',{
                      access_token:accessToken
                    },function(response){
                      if(response.data==null){
                        that.$message({
                          message: '您的公共主页未开通或权限未开通,请开通后再尝试',
                          type: "error"
                        });
                        return
                      }
                      if(response.data.length>0){
                        // 初始化公共主页ID列表
                        that.gongongzhuyeid=[]
                        // 公共主页数据
                        that.zhuyedshuju=response.data
                        // 初始化要上传的图片列表
                        that.imgidlist=[]
                        // 将商品数据赋值给item
                        that.item = data
                        // 将商品图片赋值给图片列表
                        that.imglist=that.item.images
                        // 将商品封面图片加入到图片列表中
                        that.imglist.unshift({'image':that.item.cover})
                        console.log(that.imglist,99999999)
                        // 将授权的公共主页导入到公共主页选项对话框中,
                        // 这一步是你要选择你要发布到哪一个公共主页
                        for(let j=0;j<response.data.length;j++){
                          that.gongongzhuyeid.push({'name':response.data[j].name,'index':j})
                        }
                        that.openAssembleVisible789=true
                      }
                    })
                  } 
                });
              });
            } else {
              that.$message({
                message: "授权登录失败",
                type: "error"
              });
            }
          },{scope: 'public_profile,email,pages_show_list,pages_read_engagement,pages_manage_posts'});//登录时要获取的权限,很重要
        } 
      });
    },
  }
};
</script>

5:总结

总的来说,比较潦草和不够详细,希望读者可以理解,可以作为借鉴,根据自己实际情况在copy,不然绝对跑不了的。

记录

2023-11-6 23:32