使用Automa实现自动化采集网页信息同步至飞书多维表格

901 阅读2分钟

1.创建飞书多维表格

2.创建飞书自建应用

image.png

  • 将自建应用添加至相应多维表格协作者(注意:多维表格不要开启高级权限设置,否则自建应用会无权限)

image.png

3.获取tenant_access_token

image.png

const app_id = "xxx";
const app_secret = "xxx";
let tenant_access_token = "";
const getToken = () => {
  return new Promise((resolve, reject) => {
    fetch(
      "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal",
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          app_id,
          app_secret,
        }),
      }
    )
      .then((response) => {
        return response.json();
      })
      .then((data) => {
        console.log(data);
        if (data.msg === "ok") {
          console.log("tenant_access_token 获取成功");
          tenant_access_token = data.tenant_access_token;
        }
        resolve();
      })
      .catch((error) => {
        console.log("tenant_access_token 获取失败");
        reject();
      });
  });
};
await getToken();

4.获取多维表格app_token与app_id

https://xxx.feishu.cn/base/app_token?table=table_id&view=vewFz2HIhn

5.调用多维表格新增记录接口新增数据

多维表格新增记录接口文档:open.feishu.cn/document/se…

const app_id = "xxx";
const app_secret = "xxx";
let tenant_access_token = "";
const getToken = () => {
  return new Promise((resolve, reject) => {
    fetch(
      "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal",
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          app_id,
          app_secret,
        }),
      }
    )
      .then((response) => {
        return response.json();
      })
      .then((data) => {
        console.log(data);
        if (data.msg === "ok") {
          console.log("tenant_access_token 获取成功");
          tenant_access_token = data.tenant_access_token;
        }
        resolve();
      })
      .catch((error) => {
        console.log("tenant_access_token 获取失败");
        reject();
      });
  });
};

const table_token = "xxx";
const table_id = "xxx";
const syncPm = async () => {
  await getToken();
  const data = {
    fields: {
      xxx: xxx,
    },
  };
  fetch(
    `https://open.feishu.cn/open-apis/bitable/v1/apps/${table_token}/tables/${table_id}/records`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${tenant_access_token}`,
      },
      body: JSON.stringify(data),
    }
  )
    .then((response) => {
      return response.json();
    })
    .then((data) => {
      console.log("新增成功");
    })
    .catch((error) => {
      console.log("新增失败");
    });
};

6.编写Automa脚本任务流

image.png

任务流步骤:① 使用js采集获取目标网页信息并将获取的数据拼接在url中跳转飞书开放平台(非飞书开放平台调用新获取tenant_access_token和新增记录接口会跨域)-> ② 使用js获取url中拼接的采集信息调用新增记录接口同步至多维表格,然后跳转回原页面

采集信息代码

const data = {
  xxx: document.querySelector("xxx")?.innerText || "",
  url: window.location.href || "",
};
window.location.href = `https://open.feishu.cn?params=${encodeURIComponent(
  JSON.stringify(data)
)}`;

同步新增代码

const app_id = "xxx";
const app_secret = "xxx";
let tenant_access_token = "";
const getToken = () => {
  return new Promise((resolve, reject) => {
    fetch(
      "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal",
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          app_id,
          app_secret,
        }),
      }
    )
      .then((response) => {
        return response.json();
      })
      .then((data) => {
        console.log(data);
        if (data.msg === "ok") {
          console.log("tenant_access_token 获取成功");
          tenant_access_token = data.tenant_access_token;
        }
        resolve();
      })
      .catch((error) => {
        console.log("tenant_access_token 获取失败");
        reject();
      });
  });
};

const showMask = (text) => {
  const maskDom = document.querySelector(".sync-add");
  if (maskDom) {
    document.body.removeChild(maskDom);
  }
  const divDom = document.createElement("div");
  divDom.className = "cx-pm-sync";
  divDom.style.position = "fixed";
  divDom.style.top = "0";
  divDom.style.left = "0";
  divDom.style.right = "0";
  divDom.style.bottom = "0";
  divDom.style.background = "#fff";
  divDom.style.zIndex = 99999;
  divDom.style.width = "100%";
  divDom.style.height = "100vh";
  divDom.style.padding = "20px";
  divDom.innerHTML = text;
  document.body.appendChild(divDom);
};

const table_token = "xxx";
const table_id = "xxx";
const syncPm = async () => {
  showMask("同步新增中...");
  await getToken();
  const collectData = JSON.parse(
    decodeURIComponent(window.location.search.replace("?params=", ""))
  );
  if (!collectData) {
    console.log("获取采集数据失败,同步已终止");
    showMask("获取采集数据失败,同步已终止");
    return;
  }
  const data = {
    fields: {
      xxx: collectData.xxx,
    },
  };
  fetch(
    `https://open.feishu.cn/open-apis/bitable/v1/apps/${table_token}/tables/${table_id}/records`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${tenant_access_token}`,
      },
      body: JSON.stringify(data),
    }
  )
    .then((response) => {
      return response.json();
    })
    .then((data) => {
      console.log("同步新增成功");
      showMask("同步新增成功");
      window.location.href = pmInfo.url;
    })
    .catch((error) => {
      showMask("同步新增失败");
      console.log("同步新增失败");
      window.location.href = collectData.url; // 跳转回原页面
    });
};
syncPm();