Я хочу предлагать специальные скидки на товары в моем интернет-магазине только, когда Меркурий находится в ретроградном движении. Это происходит всего несколько раз в год в течение примерно недели. Известно, что онлайн-покупатели особенно восприимчивы к горячим сделкам, среди других планетарных болезней…

Поскольку я использую Adobe Target для показа своих рекламных баннеров, мне нужно будет каждую ночь смотреть в свой телескоп и смотреть, не ретрограден ли Меркурий. Если это так, я войду в Target, создам свой контент для продажи и активирую Activity. Мне также нужно будет отключить действие, когда Меркурий перестанет быть ретроградным. В любом случае, я выхожу на улицу каждую ночь.

Поскольку я даже не знаю, как выглядит Меркурий, и у меня нет телескопа, я думаю, что должен автоматизировать этот процесс. Как я могу активировать мою активность автоматически, когда Меркурий находитсяв ретроградном движении, и деактивировать ее автоматически, когда Меркурий больше нев ретроградном движении? ретроградный?

Давайте начнем с создания XT-активности в Target с баннером, отображающим привлекательный контент:

Поскольку сейчас 2022 год (он же будущее), существует API для отслеживания движения Меркурия. Я могу автоматизировать включение и выключение этой активности с помощью этого API:

https://mercuryretrogradeapi.com/

Прежде чем писать какой-либо код автоматизации, первое, что нужно сделать, — это перейти в Adobe Develope Console и начать новый проект, имеющий доступ к Target API. Если вы никогда не делали этого раньше, я не буду утомлять вас этим здесь. Информация о настройке проектов API находится здесь: https://developer.adobe.com/developer-console/

Получив ключи API, я могу взаимодействовать с Target через его API. Обычно я бы сделал это на Python, но у Adobe есть несколько отличных библиотек Node JS, которые, к сожалению, вам придется искать, чтобы найти. Серьезно, оглянитесь на NPM. Вот что я буду использовать:

const auth = require('@adobe/jwt-auth');
const axios = require('axios');
const dotenv = require('dotenv');
const targetSDK = require('@adobe/aio-lib-target');

// get my env variables
dotenv.config();

// Adobe API Config vars
const config = {
  clientId: process.env.clientId,
  clientSecret: process.env.clientSecret,
  technicalAccountId: process.env.technicalAccountId,
  orgId: process.env.orgId,
  metaScopes: ['ent_marketing_sdk'],
  privateKey: process.env.privateKey.replace(/\\n/g, '\n'), // make the PK readable as a string
};

Примечание. Я храню здесь свой закрытый ключ в переменной среды, поэтому мне не нужно читать его из файла

В моем коде мне нужна функция, которая сообщала бы мне, является ли Меркурий или не ретроградным, путем вызова Mercury API. Я буду использовать эту функцию для управления активацией или деактивацией активности.

// returns boolean
const isRetrograde = async () => {
  const response = await axios.get(`https://mercuryretrogradeapi.com/`);
  return response.data.is_retrograde;
};

Теперь мне нужен только метод из Target SDK для обновления состояний активности. Обратите внимание, что я удалил свою фактическую активность в примере кода, но вы можете найти этот идентификатор на странице «Обзор активности»:

async function updateActivity() {
  let activateTest = await isRetrograde();
  let { access_token } = await auth(config);
  const targetClient = await targetSDK.init(process.env.companyID, process.env.clientId, access_token);

  const options = {
    headers: {
      'content-type': 'application/vnd.adobe.target.v1+json',
      Accept: 'application/vnd.adobe.target.v1+json',
    },
  };
  // - approved : corresponds to Live in Target UI.
  // - deactivated : corresponds to Inactive in Target UI.
  // - saved : corresponds to Inactive in Target UI.
  const updateActivityState = await targetClient.setActivityState(123456, activateTest ? 'approved' : 'saved', options);

  //   //get offer by id activity
  const activity = await targetClient.getABActivityById(123456);
  console.log(activity);
  return;
}

// call to change activity state
updateActivity()

Вот весь файл, который я назову mercury.js.

const auth = require('@adobe/jwt-auth');
const axios = require('axios');
const dotenv = require('dotenv');
const targetSDK = require('@adobe/aio-lib-target');

// get my env variables
dotenv.config();

// Adobe API Config vars
const config = {
  clientId: process.env.clientId,
  clientSecret: process.env.clientSecret,
  technicalAccountId: process.env.technicalAccountId,
  orgId: process.env.orgId,
  metaScopes: ['ent_marketing_sdk'],
  privateKey: process.env.privateKey.replace(/\\n/g, '\n'), // make the PK readable as a string
};

// returns boolean
const isRetrograde = async () => {
  const response = await axios.get(`https://mercuryretrogradeapi.com/`);
  const { is_retrograde } = response.data;
  return is_retrograde;
};

async function updateActivity() {
  let activateTest = await isRetrograde();
  let { access_token } = await auth(config);
  const targetClient = await targetSDK.init(process.env.companyID, process.env.clientId, access_token);

  const options = {
    headers: {
      'content-type': 'application/vnd.adobe.target.v1+json',
      Accept: 'application/vnd.adobe.target.v1+json',
    },
  };
  // - approved : corresponds to Live in Target UI.
  // - deactivated : corresponds to Inactive in Target UI.
  // - saved : corresponds to Inactive in Target UI.
  const updateActivityState = await targetClient.setActivityState(12345, activateTest ? 'approved' : 'saved', options);

  //   //get offer by id activity
  const activity = await targetClient.getABActivityById(12345);
  console.log(activity);
  return;
}

updateActivity();

Несколько вещей, которые следует отметить в приведенном выше коде:

Во-первых, для метода setActivityState в SDK требуются специальные заголовки типа мультимедиа, указанные в параметрах. В SDK это не встроено в методы и ничего не указывает в определениях методов, но это необходимо. Если вы получаете ошибки 415 любыми способами, перепроверьте заголовки из этого документа: https://developers.adobetarget.com/api/

Второй параметр в setActivityState — это тернарный оператор, основанный на том, что возвращает Retrograde API. Если Меркурий находится в ретроградном движении (true из API), действие будет одобрено. Если ретроградность false, активность будет деактивирована. Эти статусы довольно расплывчаты и не отражают терминологию в пользовательском интерфейсе Target, что немного раздражает. Определения в комментариях взяты непосредственно из документов. Я не уверен, в чем именно разница между сохраненным и деактивированным. В любом случае, вы поняли. Давайте перейдем к веселой части…

Здесь есть пара вариантов, чтобы автоматизировать это. Вы можете использовать AWS Lambda, но тогда вам нужно узнать о развертывании проекта узла в лямбда-выражении и о том, как планировать задания cron через AWS Event Bridge. Эти задачи на самом деле сложнее, чем кажутся, если вы никогда не делали этого раньше. Вместо того, чтобы дать Amazon больше денег. Вместо этого я дам Akamai немного денег и использую виртуальную машину Linode. Затем я смогу использовать ее для запуска множества различных заданий cron. Если вы никогда раньше не пользовались Linode, загляните на их канал на Youtube. Я могу либо запустить новую виртуальную машину с предварительно загруженным NodeJS, либо запустить пустую и установить Node вручную. Я выберу первое.

После создания моей виртуальной машины и проверки Я могу подключиться к ней через SSH, я передаю свои файлы mercury.js и файл package.json через SCP. Что касается переменных среды, я также могу передать свой .env или установить их непосредственно на виртуальной машине. Твой выбор. После передачи файлов я могу перейти в их каталог и запустить npm i, чтобы установить все необходимые мне пакеты. Я также пару раз запущу mercury.js, чтобы убедиться, что все работает:

# transfer files via scp from source machine to VM
# scp <source> <username@destination>
scp mercury.js [email protected]:/home/mercury/mercury.js

# scp other files...

#SSH into my virtual machine. (Not the real IP address :) )
ssh [email protected]

# move to mercury directory and install node libraries
cd mercury && npm i

# run the file to make sure it works!
node mercury.js

После того, как я убедился, что все работает, я теперь могу указать моей виртуальной машине запускать это так часто, как я хочу. Я думаю, что ежедневного будет достаточно, так как Меркурий не движется так быстро. Для этого мне просто нужно отредактировать файл crontab моей виртуальной машины. Задания Cron — это способ указать компьютеру Linux выполнить определенную задачу в определенное время. Пожалуйста, посмотрите это отличное видео от Linode о написании заданий cron:

В итоге мой файл crontab будет иметь это внизу:

# etc
# etc
# m h dom mon dow
0 8 * * * cd /somepath/mercury && node mercury.js

По сути, это говорит: «каждый день в 8 утра запускайте Mercury.js». Каждый день эта команда будет выполняться, и mercury.js активирует/деактивирует мои действия в зависимости от того, что сообщает API Mercury. После того, как я сохранил файл crontab, я эффективно создал действие Adobe Target, которое условно активно на основе движения планеты! Будущее сумасшедшее.

Небольшое примечание: целевой пользовательский интерфейс не всегда сразу обновляется, чтобы отразить изменения API, но вы можете убедиться, что действие активировано в разделе журнала изменений. Изменения пользовательского интерфейса появятся через несколько минут.

Этот пример тривиален, некоторые могут даже назвать его глупым (да как вы смеете!), но установка реальна. Что, если вы запустите все типы целевых действий, специфичных для даты? Черная пятница, Киберпонедельник, Суперкубок, День президента, День флага, день рождения Джона и так далее. У меня могут быть всевозможные целевые действия, которые программно включаются и выключаются в зависимости от даты. С некоторой первоначальной настройкой я мог бы за несколько часов спланировать рекламные баннеры на целый год!