การโต้ตอบทางโปรแกรมกับ Adobe Target Activity ตามการเคลื่อนที่ของดาวพุธ

Dec 02 2022
ฉันต้องการเสนอการขายพิเศษสำหรับผลิตภัณฑ์ในเว็บสโตร์ของฉันเฉพาะเมื่อ Mercury อยู่ในช่วงถอยหลังเข้าคลอง สิ่งนี้เกิดขึ้นเพียงไม่กี่ครั้งต่อปีประมาณหนึ่งสัปดาห์ต่อครั้ง
ภาพถ่ายโดย NASA บน Unsplash

ฉันต้องการเสนอการขายพิเศษสำหรับผลิตภัณฑ์ในเว็บสโตร์ของฉันเฉพาะเมื่อMercury อยู่ในช่วงถอยหลังเข้าคลอง สิ่งนี้เกิดขึ้นเพียงไม่กี่ครั้งต่อปีประมาณหนึ่งสัปดาห์ต่อครั้ง เป็นที่ทราบกันดีว่าทำให้นักช้อปออนไลน์อ่อนไหวต่อข้อเสนอที่ร้อนแรงเป็นพิเศษ ท่ามกลางโรคภัยไข้เจ็บที่มาจากดาวเคราะห์ดวงอื่นๆ...

นักช้อปออนไลน์ซื้อรองเท้าในขณะที่ดาวพุธกำลังถอยหลังเข้าคลอง

เนื่องจากฉันใช้ Adobe Target เพื่อแสดงป้ายการขาย ฉันจึงต้องมองผ่านกล้องโทรทรรศน์ของฉันทุกคืนเพื่อดูว่าดาวพุธอยู่ในสภาวะถอยหลังเข้าคลองหรือไม่ ถ้าเป็นเช่นนั้น ฉันจะไปที่ Target สร้างเนื้อหาการขายของฉัน และเปิดใช้งานกิจกรรม ฉันจะต้องปิดกิจกรรมเมื่อ Mercury ไม่ถอยหลังเข้าคลอง อีกต่อไป ยังไงก็ตาม ฉันจะออกไปข้างนอกทุกคืน

เนื่องจากฉันไม่รู้ด้วยซ้ำว่าดาวพุธหน้าตาเป็นอย่างไร และฉันไม่ได้เป็นเจ้าของกล้องโทรทรรศน์ ฉันคิดว่าฉันควรทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ ฉันจะ เปิดใช้งาน กิจกรรมของฉันโดยอัตโนมัติ ได้อย่างไรเมื่อ Mercury อยู่ในสถานะถอยหลังเข้าคลอง และปิดใช้งานกิจกรรมโดยอัตโนมัติเมื่อ Mercury ไม่ได้ อยู่ ในสถานะถอยหลังเข้าคลอง อีกต่อไป

เว็บสโตร์ที่ยอดเยี่ยมของฉัน!

เริ่มต้นด้วยการสร้างกิจกรรม XT ใน Target ด้วยแบนเนอร์ที่แสดงเนื้อหาที่สะดุดตา:

แบนเนอร์สีแดงที่น่าดึงดูดจะช่วยเพิ่มยอดขายของฉันได้อย่างแน่นอน
ป้ายลดราคาเปิดอยู่แต่ไม่รู้สถานะเมอร์คิวรี่!
เมื่อผู้คนเยี่ยมชม myawesomewebstore.com ในขณะที่ Mercury กำลังถอยหลังเข้าคลอง พวกเขาจะได้รับแบนเนอร์ที่น่าทึ่งนี้

เนื่องจากเป็นปี 2022 (หรือที่เรียกว่าอนาคต) จึงมี API สำหรับติดตามการเคลื่อนไหวของดาวพุธ ฉันสามารถเปิดและปิดกิจกรรมนี้โดยอัตโนมัติโดยใช้ API นี้:

https://mercuryretrogradeapi.com/

      
                
The future is crazy

เมื่อฉันมีคีย์ API แล้ว ตอนนี้ฉันสามารถโต้ตอบกับ Target ผ่าน API ของมันได้แล้ว โดยปกติฉันจะทำสิ่งนี้ใน Python แต่ Adobe มีไลบรารี Node JS ที่ยอดเยี่ยมซึ่งน่าเสียดายที่คุณต้องขุดเพื่อค้นหา อย่างจริงจังดูรอบ ๆ NPM นี่คือสิ่งที่ฉันจะใช้:

  • ไลบรารี AIO Node JS เป้าหมาย
    โต้ตอบกับกิจกรรมเป้าหมาย
  • Adobe Authentication library
    รับรองความถูกต้องกับ Adobe เพื่อทำการเรียก API
  • Axios
    เรียก Retrograde 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เป็นโอเปอเรเตอร์ ternary ตามสิ่งที่ Retrograde API ให้กลับมา หาก Mercury อยู่ในสถานะถอยหลังเข้าคลอง ( จริงจาก API) กิจกรรมจะถูกตั้งค่าเป็นอนุมัติ หากการถอยหลังเข้าคลองเป็นเท็จกิจกรรมจะถูกปิดใช้ งาน สถานะเหล่านี้ค่อนข้างคลุมเครือ และไม่สะท้อนคำศัพท์ใน Target UI ซึ่งค่อนข้างน่ารำคาญ คำจำกัดความในความคิดเห็นนำมาจากเอกสารโดยตรง ฉันไม่แน่ใจว่าความแตกต่างระหว่างการบันทึกและปิดใช้งานคืออะไรกันแน่ อย่างไรก็ตามคุณได้รับประเด็น เข้าสู่ส่วนที่สนุกกันเถอะ…

มีตัวเลือกสองทางที่นี่เพื่อทำให้สิ่งนี้เป็นไปโดยอัตโนมัติ คุณสามารถใช้ AWS Lambda ได้ แต่คุณต้องเรียนรู้เกี่ยวกับการปรับใช้โครงการโหนดใน 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

โปรดทราบว่า UI เป้าหมายไม่ได้อัปเดตทันทีเพื่อสะท้อนการเปลี่ยนแปลง API แต่คุณสามารถตรวจสอบได้ว่ากิจกรรมนั้นเปิดใช้งานผ่านส่วนบันทึกการเปลี่ยนแปลง การเปลี่ยนแปลง UI จะปรากฏขึ้นหลังจากนั้นไม่กี่นาที

ตอนนี้ตัวอย่างนี้เป็นเรื่องเล็กน้อยบางคนอาจเรียกว่าโง่ ( คุณกล้าดียังไง! ) แต่การตั้งค่าเป็นเรื่องจริง จะเกิดอะไรขึ้นถ้าคุณดำเนินกิจกรรมเป้าหมายเฉพาะวันที่ทุกประเภท Black Friday, Cyber ​​Monday, Super Bowl, President's Day, Flag Day, John's birthday และอื่นๆ ฉันสามารถมีกิจกรรมเป้าหมายทุกประเภทที่เปิดและปิดโดยทางโปรแกรมตามวันที่ ด้วยการตั้งค่าเริ่มต้น ฉันสามารถวางแผนการขายแบนเนอร์ทั้งปีได้ภายในเวลาไม่กี่ชั่วโมง!