Shoptet API bez API a automatizace procesu objednávek

Jistě jste si všimli, že Shoptet dává k API přístup jen vybraným partnerům a zatím nemá sloužit k individuálním napojením. Setkávám se s provozovateli e–shopů, kteří potřebují zvládat svůj růst. Tedy hlavně šetřit práci, zrychlovat provoz a automatizovat.

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.

Proč robot?

Protože některé úkony jako např. změna stavu objednávky, nebo vytvoření štítku pro dopravu, nelze řešit automaticky. Robot se chová stejně jako člověk – přihlásí se do administrace, najde konkrétní objednávku a v roletce změní stav.

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.