Shoptet API bez API a automatizace procesu objednávek

Úvodní povzdech nad Shoptetem zvoleným modelem API se pokusím zkrátit na minimum. Sám jsem zvědavý, jak se provozovateli podaří v budoucnu ze situace vybruslit a přiblížit se běžnému fungování API u cloudových služeb.

Nyní k podstatě článku. V této a této referenci jsem zmínil, že používám automatizaci některých kroků v administraci Shoptetu. Níže popíši, jak je po technické stránce řeším.

Situaci vysvětlím na reálné zakázce, kterou jsem v poslední době řešil. Nejedná se o první případ, kdy je s Shoptet platformou zákazník spokojený a nechce odcházet. Proto se snaží najít alternativní cestu, která by mu absenci API vyřešila.

Zadání zákazníka

Moc se mi líbila podstata zadání. Zákazník mi sdělil, že chce s manželkou cestovat a obsluhu e-shopu omezit pouze na ovládání přes mobil. Klient využívá služeb externí logistiky a musí na ni směřovat podklady pro odbavení zásilek. Jakou opakující se činnost má robot automatizovat?

  • Stáhnout nové objednávky v konkrétním stavu
  • Vytvořit štítek přes Balíkobot
  • Stáhnout štítek z Balíkobotu
  • Stáhnout dodací list
  • Vygenerovat datový soubor pro logistiku
  • Štítek, dodací list a datový soubor odeslat na logistiku
  • Změnit stav objednávky

Řešení

Upozornění! Níže popisovanou techniku využívám s maximální ohleduplností k provozovatelům serverů a požádal bych vás, abyste k ní přistupovali stejně. Pokud nebudeme dělat prasárny typu – neustálého spouštění XML importu, nebo snad editaci produkt po produktu ve velkém množství, neměli bychom být Shoptetu nijak na obtíž.

Jako nástroj pro webovou automatizaci využívám knihovnu Nightmare.Js, která slouží hlavně k automatickému testování webových aplikací při jejich vývoji. Nejlepší volbou je nějaký asynchronní jazyk a tomuto požadavku vyhovuje např. Node.Js, ve kterém je knihovna napsaná. Pokud dáváte přednost C#, v jednom větším projektu jsem použil CefSharp. Nicméně vývoj s Nightmare.Js je mnohem přímočařejší a vede rychleji k cíli.

Určitě existuje i cesta použití jazyka jako např. PHP, ve  kterém pracujete na úrovni requestů. Tato varianta má ale velký nedostatek v nemožnosti spouštění JavaScriptu a přicházíme o funkčnost, která je prováděna na frontendu.

Pro představu ukáži kód pro změnu stavu objednávky. Začnu přihlášením do administrace:

nightmare
  .goto('https://www.shoptet.cz/admin/')
  .wait('input[name="email"]')
  .insert('input[name="email"]', process.env.ESHOP_USERNAME)
  .insert('input[name="password"]', process.env.ESHOP_PASSWORD)
  .click('a[title=Přihlášení]')
  .wait(".user-bar-section-user")
  ...

Načtu detail objednávky:

  .goto('https://' + process.env.ESHOP_URL + '/admin/objednavky-detail/?id=' + shoptetId)

V roletce v detailu objednávky vyberu nový stav:

  .select('select[name="statusId"]#status-id', 'Vyřízena')
  .wait('div.system-message-success .system-message-outer .system-message-inner .system-message-content')
  .evaluate(() => $('div.system-message-success .system-message-outer .system-message-inner .system-message-content:contains("Status objednávky byl úspěšně změněn.")').text())

Kód byl vytažen z kontextu komplexního workflow a v případě že budete mít zájem, mohu připravit funkční spustitelnou ukázku.

Napsat komentář

Vaše emailová adresa nebude zveřejněna.

This site uses Akismet to reduce spam. Learn how your comment data is processed.