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

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

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



Поскольку сейчас 2022 год (он же будущее), существует API для отслеживания движения Меркурия. Я могу автоматизировать включение и выключение этой активности с помощью этого API:
https://mercuryretrogradeapi.com/
The future is crazy
Получив ключи API, я могу взаимодействовать с Target через его API. Обычно я бы сделал это на Python, но у Adobe есть несколько отличных библиотек Node JS, которые, к сожалению, вам придется искать, чтобы найти. Серьезно, оглянитесь на NPM. Вот что я буду использовать:
- JS-библиотека Target AIO Node
взаимодействует с целевыми действиями - Библиотека Adobe Authentication
Аутентификация с помощью Adobe для выполнения вызовов API - Axios
вызывает ретроградный API - dotenv
считывает файл .env с переменными среды (учетные данные API)
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/`);
return response.data.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(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()
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. Если Меркурий находится в ретроградном движении ( верно из API), действие будет одобрено . Если ретроградность ложна, активность будет деактивирована. Эти статусы довольно расплывчаты и не отражают терминологию в целевом пользовательском интерфейсе, что немного раздражает. Определения в комментариях взяты непосредственно из документов. Я не уверен, в чем именно разница между сохраненным и деактивированным . В любом случае, вы поняли. Приступим к веселой части…
Здесь есть пара вариантов, чтобы автоматизировать это. Вы можете использовать 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 будет иметь это внизу:
# etc
# etc
# m h dom mon dow
0 8 * * * cd /somepath/mercury && node mercury.js

Небольшое примечание: целевой пользовательский интерфейс не всегда обновляется немедленно, чтобы отразить изменения API, но вы можете убедиться, что действие активировано в разделе «Журнал изменений». Изменения пользовательского интерфейса появятся через несколько минут.
Сейчас этот пример тривиален , некоторые могут даже назвать его глупым ( да как вы смеете! ), но установка реальна. Что, если вы запустите все типы целевых действий, специфичных для даты? Черная пятница, Киберпонедельник, Суперкубок, День президента, День флага, день рождения Джона и так далее. У меня могут быть всевозможные целевые действия, которые программно включаются и выключаются в зависимости от даты. С некоторой первоначальной настройкой я мог бы за несколько часов спланировать рекламные баннеры на целый год!