Простое приложение LiveChat.com Nodejs

Отправляйте сообщения от клиента и агента легко!

Прежде чем приступить к работе с этим руководством, установите все соответствующие пакеты npm.

npm install @livechat/chat-sdk express open

Кроме того, убедитесь, что вы настроили приложение консоли разработчика для LiveChat. Следуйте началу этого гайда (не обращайте внимания на просьбы почтальона и ниже), чтобы узнать, как это сделать.

Настройка ChatSDK

Используйте ChatSDK, чтобы получить легкий доступ к методам API агента LiveChat RTM (обратите внимание, что вы можете захотеть иметь задержку, так как для подключения требуется некоторое время).

import ChatSDK from '@livechat/chat-sdk';
// Personal access token needs to be in Base64
const personal_access_token = '********************************************************************************************';

const chatSDK = new ChatSDK({
  apiVersion: '3.5'
})

chatSDK.init({
  personal_access_token
});

Создание клиента

Затем создайте клиента с помощью метода methodFactory из chatSDK (вы можете пропустить этот шаг, если у вас уже есть клиент).

const { customer_id } = await chatSDK.methodFactory({
 action: 'create_customer',
 payload: {}
})

Начало чата

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

const { chat_id, thread_id } = await chatSDK.methodFactory({
  action: 'start_chat',
  payload: {
    chat: {
      users: [
        {
          id: customer_id,
          type: 'customer'
        }
      ]
    },
    active: true
  }
})

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

Отправка сообщений чата в качестве агента

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

await chatSDK.sendMessage(chat_id, "Hello Customer!")

Перенос чата

Этот шаг необязателен, но вам, вероятно, следует перевести агента в общую группу, у которой id равен 0.

await chatSDK.methodFactory({
  action: 'transfer_chat',
  payload: {
    id: chat_id,
    target: {
      type: 'group',
      ids: [0]
    },
    ignore_agents_availability: true,
    ignore_requester_presence: true
  }
});

Отправка сообщения чата от имени клиента

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

С этого момента в руководстве определите следующие переменные

LIVECHAT_CLIENT_ID     = "********************************"
LIVECHAT_CLIENT_SECRET = "********************************"
LIVECHAT_REDIRECT_URI  = "http://localhost:3000/"
# Get this license id from the url at https://my.livechatinc.com/settings/chat-page
LIVECHAT_LICENSE_ID    = 15419754

VERIFICATION_PORT      = 3000

Получение токена обновления агента

Я избавлю вас от утомительного чтения руководства по авторизации LiveChat и просто дам вам функцию, которую вы должны вызывать с помощью nodejs, которая вернет токен обновления. Обязательно скопируйте этот токен обновления, скажем, в переменную среды, для постоянного использования. Не используйте эту функцию повторно после получения токена обновления.

import express from 'express';
import open from 'open';
import EventEmitter from 'events';

/**
 * Use this function to get the first refresh token for the agent needed to run the rest of the program.
 * Notice this will open your web browser so that you can sign in with your livechat account!
 * 
 * Run this locally.
 * */ 
export const getInitialAuthTokenLivechat = async () => {
  return new Promise(async (resolve, reject) => {
    const app = express()
    const ee = new EventEmitter();

    app.get('/', async (req, res) => {
      try {
        const { code, state } = req.query;

        const response = await fetch('https://accounts.livechat.com/v2/token', {
          method: 'POST',
          body: JSON.stringify({
            grant_type: 'authorization_code',
            code,
            client_id: LIVECHAT_CLIENT_ID,
            client_secret: LIVECHAT_CLIENT_SECRET,
            redirect_uri: LIVECHAT_REDIRECT_URI
          })
        })

        const data = await response.json();

        ee.emit('authed', data)

        res.status(200).send()
      } catch (error) {
        console.error(error);
        res.status(500).send()
      }
    })

    const server = app.listen(VERIFICATION_PORT, () => {
      console.log(`Listening for response for LiveChat OAuth on port ${VERIFICATION_PORT}`);

      const url = `https://accounts.livechat.com/?response_type=code&client_id=${LIVECHAT_CLIENT_ID}&redirect_uri=${LIVECHAT_REDIRECT_URI}`;
      console.log('Opening the browser to:', url);
      open(url);

      ee.once('authed', (data) => {
        resolve(data);
        server.close();
      });
    })
  })
}
LIVECHAT_REFRESH_TOKEN = "dal:***************************"

Получение токена доступа агента

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

/**
 * Before using this function make sure that a correct refresh token is provided.
 * To get the initial refresh token, run the function getInitialAuthTokenLivechat
 * */
export const getAuthTokenLivechat = async () => {
  const response = await fetch('https://accounts.livechat.com/v2/token', {
    method: 'POST',
    body: JSON.stringify({
      grant_type: 'refresh_token',
      LIVECHAT_REFRESH_TOKEN,
      LIVECHAT_CLIENT_ID,
      LIVECHAT_CLIENT_SECRET
    })
  })

  const data = await response.json();

  return data;
}

Получение токена доступа клиента

У вас есть все, теперь все, что нам нужно сделать, это сделать запрос API, чтобы получить токен доступа клиента, после чего мы можем начать рассылать сообщения!

const { access_token: client_access_token } = await getAuthTokenLivechat();

const response = await fetch('https://accounts.livechat.com/v2/customer/token', {
  method: 'POST',
  body: JSON.stringify({
    grant_type: 'agent_token',
    client_id: LIVECHAT_CLIENT_ID,
    response_type: 'token',
    entity_id: customer_id
  }),
  headers: {
    Authorization: `Bearer ${client_access_token}`
  }
});

const { access_token: customer_access_token } = await response.json()

Отправка сообщений от имени клиента

Сладкий, давайте начнем отправлять DM!

await fetch(`https://api.livechatinc.com/v3.3/customer/action/send_event?license_id=${LIVECHAT_LICENSE_ID}`, {
  method: 'POST',
  body: JSON.stringify({
    event: {
      text: 'Hello Agent!',
      type: 'message',
      recipients: 'all'
    },
    chat_id
  }),
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${customer_access_token}`
  }
})

Вы также можете отправить еще несколько интересных вещей, таких как файлы, формы и форматированные сообщения.

Удачи и удачного программирования! Получайте удовольствие от своих начинаний. Дайте мне знать, если это помогло вам!