Автоматизируйте свою личную CRM с помощью Notion и Kelvin Data

Введение

Notion дает огромные возможности того, что мы можем делать с помощью одного приложения, и, честно говоря, это один из лучших способов управления вашей личной CRM.

Теперь, что, если есть способ попытаться получить данные из Интернета для таких полей, как идентификатор Twitter, URL-адрес Linkedin, имя и некоторые другие данные, просто указав адрес электронной почты пользователя.

Чувствует себя потрясающе, верно?

Встретиться Данные Кельвинаэто API как сервис, где разработчики могут получить доступ к данным миллионов людей с помощью API.

Предпосылки

  • Базовый JavaScript
  • Узел JS
  • Учетная запись понятия
  • Учетная запись данных Кельвина

Что мы будем строить

https://i.imgur.com/6JzIGJq.png

https://p-843661.f1.n0.cdn.getcloudapp.com/items/YEuObYbQ/7bde6b36-74d5-4e58-9768-168708b2061f.gif?v=3b53d2ff7791536114bbb7f52a3f2380

Приведенный выше GIF показывает, как работает API, он будет извлекать и заполнять данные в оставшихся полях для нас. Заполнение полей осуществляется Notion Integration.

ДАВАЙТЕ СТРОИМ

https://media4.giphy.com/media/YKLLS6ZGQsrwZVgXix/giphy.gif

Интеграция понятий

Чтобы запустить любую автоматизацию и получить доступ к Notion API, нам нужно нечто, называемое интеграцией Notion.

Вы можете создать свою интеграцию, перейдя на и создайте интеграцию Notion.

На всякий случай, если вы где-то застряли, воспользуйтесь упомянутым подробным руководством. здесь.

Это будет выглядеть примерно так, как только вы закончите создание интеграции.

https://i.imgur.com/mh0MYDh.png

KelvinData — это имя моей интеграции, нам понадобится внутренний токен интеграции для следующего раздела.

Создать базу данных понятий

Перейдите на любую страницу Notion и нажмите на / и найдите Table Full Page вариант и нажмите Enter.]

Вы можете найти шаги в сгенерированном ниже GIF.

https://p-843661.f1.n0.cdn.getcloudapp.com/items/BluxPAoq/28e0f6cd-68e2-493e-b366-632cba813db3.gif?v=071f8beb6d51f31a916503ce6e6414cd

Теперь вам нужно будет получить идентификатор вашей базы данных базы данных, которую мы создали, вы можете получить это, выполнив шаг, упомянутый здесь https://developers.notion.com/docs#step-2-share-a-database-with-your-integration.

Добавить интеграцию в созданную базу данных Notion

Теперь, когда у нас есть наша база данных, мы должны предоставить доступ к интеграции Notion, которую мы завершили на первом этапе.

Вы можете найти шаги в сгенерированном ниже GIF.

https://p-843661.f1.n0.cdn.getcloudapp.com/items/OAunvy8W/71524d66-99cc-41e7-bc1b-620ca32e1f2f.gif?v=aaf5b5a9b4705eeb13036d85af2f3b9c

Теперь вы можете добавить необходимые столбцы, для примера, который мы собираемся сделать, мы добавим

  • Имя
  • Твиттер
  • LinkedIn
  • Эл. адрес
  • Разное

Вы можете добавить множество других полей в зависимости от ваших требований.

Строки моей таблицы выглядят примерно так

https://i.imgur.com/o6ZC8t4.png

JS-приложение узла

Для этого приложения мы собираемся использовать JS для создания приложения Node JS.

Создать приложение

Выполните приведенные ниже команды, чтобы создать проект и установить необходимые зависимости и зависимости для разработчиков.

mkdir notion-crm-kelvindata 
cd notion-crm-kelvindata 

npm init -y 

npm install @notionhq/client api dotenv 
npm install --save-dev nodemon 

Редактирование файла package.json

Изменить package.json файл, добавив следующие строки

"type": "module",

Это гарантирует, что мы сможем импортировать ES6.

в scripts раздел, добавьте следующий скрипт

"dev": "nodemon index.js"

Это будет постоянно прослушивать изменения и запускать приложение.

После его завершения, package.json файл выглядит примерно так.

{
  "name": "notion-crm-kelvindata",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "dev": "nodemon index.js"
  },
  "keywords": [],
  "author": "Rohith Gilla",
  "license": "ISC",
  "dependencies": {
    "@notionhq/client": "^0.3.2",
    "api": "^3.4.0",
    "dotenv": "^10.0.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.12"
  }
}

Файл среды

Нам понадобится NOTION_DATABASE_ID, NOTION_SECRET_KEY а также KELVIN_DATA_KEY.

В первой настройке интеграции Notion мы видели, как получить идентификатор базы данных и секретный ключ.

Теперь нам нужен потрясающий ключ Kelvin Data API, его просто посетить. и нажмите на Получить ключ API кнопку и заполните необходимые данные и готово.

Сохраните это в файле среды, для простоты доступа я создал .env.example файл. Вы можете найти файл в репозитории GitHub, ссылка на который будет указана под сообщением в блоге.

Это будет выглядеть так, но вам нужно заполнить детали вместо строк.

NOTION_DATABASE_ID=""
NOTION_SECRET_KEY=""
KELVIN_DATA_KEY=""

Основной

Поскольку мы используем его как модуль для использования require ключевое слово, которое нам нужно определить, require следующим образом.

import { createRequire } from "module";
const require = createRequire(import.meta.url);

Кельвин Инициализация данных

У Kelvin Data есть хороший справочник по API, вы можете найти его здесь https://kelvin-data.readme.io/reference/searchv2_query.

Он показывает, как интегрироваться в различные среды и технологии.

Мы используем Node, поэтому первыми шагами нам нужно инициализировать sdk данных kelvin, который мы собираемся использовать для поиска в пользовательской базе данных.

const kelvinSDK = require("api")("@kelvin-data/v1.0#3bettnkt7yytde");

Эта строка получит необходимый SDK для нас, просто короткое слово пакет api принимает спецификацию OpenAPI и генерирует SDK . Это так здорово и полезно.

Концепция инициализации API

import { Client } from "@notionhq/client";

const NOTION_SECRET_KEY = process.env.NOTION_SECRET_KEY;
const NOTION_DATABASE_ID = process.env.NOTION_DATABASE_ID;

const notion = new Client({ auth: NOTION_SECRET_KEY });

Запрос

Теперь нам нужно запросить **** таблицу Notion, которую мы построили на шаге 1.

const response = await notion.databases.query({
      database_id: NOTION_DATABASE_ID,
  });

Просто, мы напрямую запрашиваем базу данных с помощью database_id параметр.

Мы можем передать несколько параметров в filter , sort и указать размеры страницы. Давайте не будем усложнять этот пример и передадим только database_id один.

Получить обязательные поля

Теперь нам нужны все объекты столбцов, а также, что более важно, текст в поле электронной почты.

const email = result.properties["Email"];
const name = result.properties["Name"];
const emailText = email[email.type][0]["plain_text"];
const isAdded = result.properties["Added"];
const isAddedBool = isAdded[isAdded.type];
const linkedIn = result.properties["LinkedIn"];
const misc = result.properties["Misc"];
const twitter = result.properties["Twitter"];

переменные email name isAdded linkedIn twitter а также misc содержит значения соответствующего поля.

Это немного сумасшедшие вложенные объекты!!

const emailText = email[email.type][0]["plain_text"];

выполнив описанную выше операцию, мы получим текст письма.

Если вы видите, что в базе данных есть поле Added, который является флажком. Это поможет нам понять, была ли строка уже обработана.

Чтобы получить значение поля, мы делаем то же самое, что и для получения значения поля.

const isAdded = result.properties["Added"];

Инициализировать переменные данными

var fullName = "Not Found";
var linkedInUrl = "Not Found";
var twitterUrl = "Not Found";
var miscData = "Not Found";

Это данные, которые мы хотим узнать о человеке в нашем случае использования, мы предварительно заполним их значением «Не найдено», и как только мы найдем, мы заменим фактическим значением.

Поиск и сохранение

if (!isAddedBool) {
  
}

Прежде всего, мы проверяем, истинно ли значение флажка, что означает, что строка уже обработана.

Нажмите Kelvin Data API и получите результаты

const searchResponse = await kelvinSDK["searchV2_query"]({
  email: emailText,
  limit: 1,
});

Поскольку SDK генерирует все за нас, нам просто нужно запросить API с помощью email

Существуют разные методы запроса API, вы можете найти их здесь.

Теперь идет самая простая часть приложения, получение необходимых полей из ответа и сохранение их в переменных, которые мы создали выше.

if (searchResponse.length !== 0) {
    fullName = searchResponse[0].name.full;
    const linkedInObj = searchResponse[0].profiles.find(
      (profile) => profile.network === "linkedin"
    );
    const twitterObj = searchResponse[0].profiles.find(
      (profile) => profile.network === "twitter"
    );
    if (linkedInObj) {
      linkedInUrl = linkedInObj.url;
    }
    if (twitterObj) {
      twitterUrl = twitterObj.url;
    }
  }

Обновление API-интерфейса Notion

То, как работает обновление Notion API, не документировано должным образом для всех случаев использования, в документах API говорится только об обновлении логического или числового значения. Они не говорят об обновлении текста или других полей.

Немного покопавшись, я нашел, как обновить его, обратите внимание, что это может измениться в будущих версиях, но в основном это будет похоже.

Нам нужно построить объект для обновления полей, что можно сделать следующим образом.

var changedResult = {
    ...result.properties,
    Twitter: {
      ...twitter,
      rich_text: [
        {
          type: "text",
          text: {
            content: twitterUrl,
            link: twitterUrl !== "Not Found" ? { url: twitterUrl } : null,
          },
          plain_text: twitterUrl,
          href: null,
        },
      ],
    },
    LinkedIn: {
      ...linkedIn,
      rich_text: [
        {
          type: "text",
          text: {
            content: linkedInUrl,
            link:
              linkedInUrl !== "Not Found" ? { url: linkedInUrl } : null,
          },
          plain_text: linkedInUrl,
          href: null,
        },
      ],
    },
    Misc: {
      ...misc,
      rich_text: [
        {
          type: "text",
          text: { content: miscData, link: null },
          plain_text: miscData,
          href: null,
        },
      ],
    },
    Added: {
      ...isAdded,
      checkbox: true,
    },
    Name: {
      ...name,
      title: [
        {
          type: "text",
          text: { content: fullName, link: null },
          plain_text: fullName,
          href: null,
        },
      ],
    },
  };

Пройдемся по объекту и проверим, что происходит

LinkedIn: {
    ...linkedIn,
    rich_text: [
      {
        type: "text",
        text: {
          content: linkedInUrl,
          link:
            linkedInUrl !== "Not Found" ? { url: linkedInUrl } : null,
        },
        plain_text: linkedInUrl,
        href: null,
      },
    ],
  },
  • ...linkedIn мы распространяем начальные значения, так как они содержат несколько полей, таких как id и другие.
  • Нам нужно переопределить rich_text поле, для этого мы делаем следующее, добавляя следующий объект к этому rich_text множество.
{
    type: "text", 
    text: {
      content: linkedInUrl,
      link:
        linkedInUrl !== "Not Found" ? { url: linkedInUrl } : null,
    },
    plain_text: linkedInUrl,
    href: null,
  },

Аналогично поступаем с остальными полями.

Последний шаг обновите объект с помощью Notion API

Это довольно просто: мы берем обновленный объект и обновляем базу данных, используя понятие API.

await notion.pages.update({
  page_id: result.id,
  properties: changedResult,
});

Обработка ошибок

Мы не будем усложнять, вся функция будет заключена в try/catch блокировать.

Запускать периодически

Функция, которую мы имеем, должна запускаться периодически, скажем, каждые 5 секунд, что больше похоже на задание cron, но не на задание cron.

Мы используем JavaScript setTimeout функцию для достижения этого.

setTimeout(main, 5000);

Сшивание всего вместе

Теперь давайте соберем все, что мы сделали вместе 👇

import { createRequire } from "module";
const require = createRequire(import.meta.url);
import { Client } from "@notionhq/client";

const kelvinSDK = require("api")("@kelvin-data/v1.0#3bettnkt7yytde");
require("dotenv").config();

const NOTION_SECRET_KEY = process.env.NOTION_SECRET_KEY;
const NOTION_DATABASE_ID = process.env.NOTION_DATABASE_ID;

kelvinSDK.auth(process.env.KELVIN_DATA_KEY);

const notion = new Client({ auth: NOTION_SECRET_KEY });

async function main() {
  try {
    const response = await notion.databases.query({
      database_id: NOTION_DATABASE_ID,
    });
    
    response.results.forEach(async (result) => {
      const email = result.properties["Email"];
      const name = result.properties["Name"];
      const emailText = email[email.type][0]["plain_text"];
      const isAdded = result.properties["Added"];
      const isAddedBool = isAdded[isAdded.type];
      const linkedIn = result.properties["LinkedIn"];
      const misc = result.properties["Misc"];
      const twitter = result.properties["Twitter"];

      var fullName = "Not Found";
      var linkedInUrl = "Not Found";
      var twitterUrl = "Not Found";
      var miscData = "Not Found";
      if (!isAddedBool) {
        const searchResponse = await kelvinSDK["searchV2_query"]({
          email: emailText,
          limit: 1,
        });
        if (searchResponse.length !== 0) {
          fullName = searchResponse[0].name.full;
          const linkedInObj = searchResponse[0].profiles.find(
            (profile) => profile.network === "linkedin"
          );
          const twitterObj = searchResponse[0].profiles.find(
            (profile) => profile.network === "twitter"
          );
          if (linkedInObj) {
            linkedInUrl = linkedInObj.url;
          }
          if (twitterObj) {
            twitterUrl = twitterObj.url;
          }
        }
        var changedResult = {
          ...result.properties,
          Twitter: {
            ...twitter,
            rich_text: [
              {
                type: "text",
                text: {
                  content: twitterUrl,
                  link: twitterUrl !== "Not Found" ? { url: twitterUrl } : null,
                },
                plain_text: twitterUrl,
                href: null,
              },
            ],
          },
          LinkedIn: {
            ...linkedIn,
            rich_text: [
              {
                type: "text",
                text: {
                  content: linkedInUrl,
                  link:
                    linkedInUrl !== "Not Found" ? { url: linkedInUrl } : null,
                },
                plain_text: linkedInUrl,
                href: null,
              },
            ],
          },
          Misc: {
            ...misc,
            rich_text: [
              {
                type: "text",
                text: { content: miscData, link: null },
                plain_text: miscData,
                href: null,
              },
            ],
          },
          Added: {
            ...isAdded,
            checkbox: true,
          },
          Name: {
            ...name,
            title: [
              {
                type: "text",
                text: { content: fullName, link: null },
                plain_text: fullName,
                href: null,
              },
            ],
          },
        };
        await notion.pages.update({
          page_id: result.id,
          properties: changedResult,
        });
      }
    });
  } catch (error) {
    console.log(error);
  }
  setTimeout(main, 5000);
}

main();

Репозиторий GitHub

Вы можете найти репозиторий здесь.

GitHub — Rohithgilla12/notion-crm-kelvindata

Пожалуйста, отметьте репозиторий, если он вам понравился.

Развертывание решений

Здесь, в этом сообщении блога, мы не будем рассказывать о развертывании, но предложим несколько бесплатных альтернатив.

Вы можете развернуть свои приложения Node JS на Deta с помощью Deta Micros, вы можете узнать о них больше здесь

Если вам удобнее герокувы можете попробовать это.

Вы можете использовать vercel для развертывания приложений NodeJS.

Время выполнения

Вы также можете оформить заказ StackBlitz

Еще один хороший ресурс для оформления заказа Повторить.

Есть огромные решения, я только что перечислил несколько.

Следующие шаги

Понятие настолько мощное, а интеграции сделали его еще более мощным.

Kelvin Data — это потрясающий API, и идеи безграничны: от личной CRM до расширений корпоративного уровня и многого другого.

Продолжайте доставку и творите чудеса.

Спасибо,

Рохит Гилла

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *