Bisiklet GPS’imi bağlayıp gravel yarışı sırasında pizza sipariş edecek şekilde ayarlamam
(steele.blue)- Nebraska Gravel Worlds Long Voyage’ta ikmal noktasındaki pizzaların tükenmesi sorunundan kaçınmak için, bisiklet GPS konumuyla Casey’s pizzasını önceden sipariş eden bir otomasyon yaptım
- Yapı, AWS Location geofence’inin GPS takip cihazının alandan çıktığını algılaması ve Lambda’nın bir sonraki durak noktası için ETA’ya göre çevrim içi siparişi yürütmesi şeklindeydi
- Casey’s’in herkese açık bir sipariş API’si olmadığı için Playwright ile React tabanlı web sitesini screen scraping yaptım; sipariş sonucu da iPhone ve Apple Watch push bildirimleriyle alınacak şekilde yapılandırıldı
- Gerçek yarışta sipariş başarı bildirimi geldi, ancak mağazada sipariş kaydı yoktu; bu da bulut tarayıcı otomasyonunun false positive ürettiğini ortaya çıkardı
- Daha sonra tarayıcı davranışının videosunu S3’te bırakacak şekilde değiştirince test siparişi başarılı oldu, ancak Lambda ortamında yalnızca yerel testlerle kararlılıktan emin olmak zor
Yarış sırasında pizzayı garantiye almak istememin nedeni
- Midwest’te hasat sezonunda Nebraska’daki Gravel Worlds Long Voyage bisiklet yarışına katıldım
- Önceki yıl hızlı sürücüler önce varıp ikmal noktasındaki tüm Casey’s pizzalarını almıştı; ben vardığımda hiç pizza kalmamıştı
- Bu yılki hedef, duraklama zamanına göre taze pizzayı önceden sipariş etmekti
- Mevcut sunucusuz bisiklet GPS takipçisinin üzerine, belirli bir geofence’ten çıkıldığında sipariş betiğini çalıştıran bir yöntem eklemek istedim
Siparişi GPS ve Lambda ile nasıl tetikledim
- Genel tasarım, AWS Location’ın geofence’inin GPS takip cihazını izlemesi yapısındaydı
- Takip cihazı geofence’ten çıktığında bir Lambda fonksiyonunu tetikler
- Lambda, bir sonraki durak noktasına kadar ETA’yı hesaplar
- Hesaplanan zamana göre Casey’s pizzasını sipariş eder
- Casey’s’in çevrim içi sipariş için herkese açık bir API’si olmadığından web sitesi screen scraping’i seçtim
- Casey’s web sitesi, istemci tarafında render edilen karmaşık bir React uygulamasıydı
- Sıradan scraper yerine Playwright kullandım
- Playwright’i Lambda’da çalıştırma süreci, ayrı bir yazıya konu olacak kadar zahmetliydi
- Sipariş durumunu kontrol etmek için başarı ya da başarısızlık halinde telefona ve saate push bildirimi gönderecek şekilde ayarladım
- iOS cihazlarda Web Push’u çalıştırma ayarı da ayrı bir yazı konusu olacak kadardı
Başarı bildiriminden farklı çıkan saha sonucu
- Sipariş tetikleme geofence’i yarışın 180. mil noktası civarına ayarlandı
- Pizzayı 200. mil noktasında almayı planlamıştım
- Geofence’ten çıkınca saate pizza siparişinin başarılı olduğuna dair push bildirimi geldi
- Durak noktasına vardığımda tezgahta sipariş yoktu ve mağazada da sipariş kaydı bulunmuyordu
- Hesabı kontrol edince gerçek bir siparişin de oluşturulmadığı görüldü; yalnızca başarı bildiriminin oluştuğu bir false positive durumuydu
- Mağazada önceden yapılmış birkaç dilim pizza vardı, onları satın aldım
- Sonrasında 300 millik yarışı bitirene kadar Lambda fonksiyonunda neyin yanlış gittiğini düşünmeye devam ettim
Loglar yerine video kaydı ipucu bıraktı
- Yarıştan sonra logları kontrol ettim, ancak hata nedenini gösteren bir bilgi yoktu
- Loglara göre sessizce başarılı olmuş gibi görünüyordu; hata ayıklama için ipucu yetersizdi
- Birkaç gün sonra Lambda’yı değiştirerek tarayıcı davranışını video olarak yakalayıp bir S3 bucket’ına yükleyecek hale getirdim
- Değiştirilen davranışla test edince sipariş gerçekten başarılı oldu ve Hawaiian pizza’yı sorunsuz şekilde teslim aldım
- Kesin neden belirlenemedi
- Lambda, embedded Playwright tarayıcısında son
form.submit()çalıştırılır çalıştırılmaz işlemi sonlandırmış olabilir - Çevrim içi sipariş sitesi, tarayıcının başarı yanıtını aldığını doğrulayamadığı için siparişi tamamen işlememiş olabilir
- Video işleme ve yükleme için geçen ek süre, tarayıcının kapanmadan önce temizlenmesi için yeterli zamanı sağlamış olabilir
- Lambda, embedded Playwright tarayıcısında son
Bir dahaki sefere yeniden yapsaydım değiştireceklerim
- Bir React istemci uygulamasını bulut tarayıcısıyla kararlı biçimde screen scraping yapmak mümkün, ancak çok zahmetli
- Yeniden yapsaydım Casey’s’in native uygulamasını reverse engineering ile inceleyip dahili API’yi doğrudan tetikleme yöntemini düşünebilirdim
- Jeo-uzamsal davranışı simüle edebilecek iyi bir workflow gerekiyor
- Başta evin çevresinde geofence oluşturup test ettim
- Gece 11’de gerçekten yürüyerek dışarı çıkıp test etmek kısa sürede yorucu hale geliyor
- Gerçek ortam testlerini azaltmamak gerekiyor
- Yarıştan önce fonksiyonu çoğunlukla yerel iş istasyonumda çalıştırarak test ettim
- Yereldeki başarı, Lambda ortamında da düzgün çalışacağına dair yanlış bir güven verdi
- Casey’s pizzasının biteceğinden endişeleniyorsanız, öndeki grupla arayı 30 dakikadan fazla açıp mağazaya yeni dilim pizza yapması için zaman tanımak da bir yöntem
- Kod GitHub’da herkese açık: https://github.com/mattdsteele/spot-tracker-tracker/…
1 yorum
Hacker News yorumları
Colin teslimat yaparken pizzayı da hazırlayabilir: https://youtu.be/YjyJRTM0knE?si=fes2lbRntUlciPSH
Kusursuz görünen planın ölümcül kusuru, kamyon yoldaki tümseklerden geçerken pizzaların havada uçuşup tüm malzemelerini kaybetmesiydi: https://gizmodo.com/zume-softbank-ai-pizza-delivery-stellar-...
Video, bu yıl YouTube’da gördüklerim arasında beni en çok güldürendi.
Bunu hâlâ çözemiyorum ve tuhaf biçimde bu yüzden izlemesi zorlaşıyor. Elbette bir şeylerin ciddi şekilde ters gittiği videoyu yayımlamazdı ama.
Bu adamın evinden kulübesine kadar tünel kazdığı videoyu 2,5 saat izledim; gerçekten eğlenceli bir kanal.
Çok iyi. pizzatoolun 21. yüzyıl yorumu gibi.
https://donhopkins.medium.com/the-story-of-sun-microsystems-...
Bu arada Tiburon’daki Waypoint Pizza adlı pizzacı, güzelce rica ederseniz San Francisco Körfezi’nin üzerinde bile teslimat yapıyor. Three Bridge Fiasco gibi çok ciddi olmayan, tuhaf yat yarışlarında epey işe yarıyor.
Dean Karnazes, teknoloji olmadan ultra koşu yarışında benzer bir şey yapmıştı.
Pizzayı burrito gibi sarıp elinde koştuğu söyleniyor: https://gffmag.com/the-raw-endurance-of-ultramarathon-man-de...
React web sitesiyse, doğrudan kullanabileceğin bir API olduğu anlamına gelme ihtimali yüksek.
Token almak için giriş yapmak gerekebilir ama bu yol çok daha sağlam olur.
Çok daha ucuz ve çok daha sağlam; acaba kaçırdığım bir şey mi var?
Bu yazıdan gerçekten çok keyif aldım.
Eğlenceli bir teknik problem, pizza, “s-tier”ın ne anlama geldiğini aratması, sadece önermesiyle bile komik olup üstüne eklenen mizah, sondaki mea culpa ve hatanın nedeniyle ilgili tahmin dahil pek çok iyi unsur vardı. O teori de makul görünüyor ama kesin değil.
Modern teknolojinin kötü yanlarının hepsi bir araya getirilmiş gibi hissettirdi.
Dürüst olmak gerekirse oldukça havalı. Deliveroo gibi servislerde de benzeri yapılabilir mi merak ediyorum.
Belirli bir X tarihinde koşullar uygunsa, örneğin mesaiye kaldığımda evden kabaca Z mesafe uzaktayken önceden belirlenmiş Y siparişini vermek gibi mümkün görünüyor.
Yemek siparişi ve ödemeyi IFTTT tarzı hack’lere kolayca entegre edilebilir hâle getirmemek için bir sebep var mı?
Casey's pizza yiyerek büyüdüğümü hatırlamak güzel.
Midwest’e her döndüğümde alıp yiyorum; tam olarak ne olduğunu söylemek zor ama kendine özgü bir cazibesi var.
Ah, demek sonunda çalışmamış.
Bunu 200 mil noktasında öğrenmek epey zor olmuştur.
Yazılım, bisiklet ve pizza; hayatta sevdiğim şeyler.
Bu projeyi ve yazıyı gerçekten keyifle okudum; benzer fikirler de aklıma getirdi.
Ben olsam muhtemelen eller serbest arama yapar ya da bir arkadaşımdan aramasını ister ve mesajla tetiklerdim.
Bir de sürekli “teslimat” diyor ama aslında bu teslim alma değil mi?