- Untuk menghindari kehabisan pizza di titik suplai pada Gravel Worlds Long Voyage di Nebraska, saya membuat otomatisasi yang memesan pizza Casey's lebih dulu berdasarkan lokasi GPS sepeda
- Strukturnya menggunakan AWS Location geofence untuk mendeteksi keluarnya pelacak GPS, lalu Lambda menjalankan pemesanan online sesuai ETA ke titik berhenti berikutnya
- Karena Casey's tidak memiliki API pemesanan publik, saya melakukan screen scraping pada situs berbasis React dengan Playwright, dan hasil pesanan dikirim melalui notifikasi push ke iPhone dan Apple Watch
- Dalam balapan sebenarnya, notifikasi sukses pemesanan datang, tetapi toko tidak memiliki catatan pesanan, yang menunjukkan adanya false positive pada otomatisasi browser cloud
- Setelah diubah agar video aktivitas browser disimpan ke S3, pesanan uji berhasil, tetapi di lingkungan Lambda sulit merasa yakin akan keandalannya hanya dari pengujian lokal
Alasan saya ingin mengamankan pizza saat balapan
- Saya mengikuti balapan sepeda Gravel Worlds Long Voyage di Nebraska pada musim panen di Midwest
- Pada tahun sebelumnya, para rider yang lebih cepat tiba lebih dulu dan mengambil semua pizza Casey's di titik suplai, sehingga saat saya sampai tidak ada pizza yang tersisa
- Target tahun ini adalah memesan pizza segar lebih dulu agar pas dengan waktu berhenti saya
- Di atas pelacak GPS sepeda serverless yang sudah ada, saya ingin menambahkan cara untuk menjalankan skrip pemesanan saat keluar dari geofence tertentu
Cara memicu pemesanan dengan GPS dan Lambda
- Desain keseluruhannya adalah geofence dari AWS Location memantau pelacak GPS
- Saat pelacak keluar dari geofence, sebuah fungsi Lambda dipicu
- Lambda menghitung ETA ke titik berhenti berikutnya
- Sesuai waktu yang dihitung, Lambda memesan pizza Casey's
- Karena Casey's tidak memiliki API publik untuk pemesanan online, saya memilih screen scraping situs web
- Situs Casey's adalah aplikasi React kompleks yang dirender di sisi klien
- Saya menggunakan Playwright alih-alih scraper biasa
- Menjalankan Playwright di Lambda cukup rumit sampai layak ditulis di artikel terpisah
- Untuk memeriksa status pesanan, saya mengatur agar notifikasi push dikirim ke ponsel dan jam tangan saat berhasil atau gagal
- Menyiapkan Web Push agar berjalan di perangkat iOS juga cukup rumit hingga bisa jadi bahan tulisan tersendiri
Hasil di lapangan yang berbeda dari notifikasi sukses
- Geofence untuk memicu pesanan dipasang di sekitar titik 180 mil balapan
- Pizza rencananya akan diambil di titik 200 mil
- Begitu keluar dari geofence, notifikasi push sukses pemesanan pizza muncul di jam tangan saya
- Saat tiba di titik berhenti, tidak ada pesanan di meja kasir dan toko juga tidak memiliki catatan pesanan
- Setelah memeriksa akun, ternyata pesanan memang tidak pernah dibuat, jadi itu adalah false positive yang hanya memunculkan notifikasi sukses
- Di lokasi masih ada beberapa potong pizza siap saji, jadi saya membeli itu
- Setelahnya, sepanjang menyelesaikan balapan 300 mil, saya terus memikirkan apa yang salah pada fungsi Lambda
Petunjuk datang dari tangkapan video, bukan log
- Setelah balapan saya memeriksa log, tetapi tidak ada informasi yang menunjukkan penyebab kegagalan
- Dari log, semuanya tampak seolah berhasil secara diam-diam sehingga hampir tidak ada petunjuk untuk debugging
- Beberapa hari kemudian saya mengubah Lambda agar merekam video aktivitas browser dan mengunggahnya ke bucket S3
- Saat diuji dengan perubahan itu, pesanan benar-benar berhasil dan saya bisa mengambil Hawaiian pizza seperti semestinya
- Penyebab pastinya belum dipastikan
- Ada kemungkinan Lambda mengakhiri proses tepat setelah
form.submit()terakhir dijalankan di browser Playwright tersemat - Ada kemungkinan situs pemesanan online tidak sepenuhnya memproses pesanan karena tidak sempat mengonfirmasi bahwa browser menerima respons sukses
- Waktu tambahan yang dibutuhkan untuk pemrosesan dan pengunggahan video mungkin memberi cukup waktu untuk pembersihan browser
- Ada kemungkinan Lambda mengakhiri proses tepat setelah
Hal yang akan saya ubah jika membuatnya lagi
- Melakukan screen scraping aplikasi klien React secara andal dengan browser cloud itu memungkinkan, tetapi sangat rumit
- Jika membuatnya lagi, saya mungkin akan mempertimbangkan reverse engineering aplikasi native Casey's dan memicu API internalnya secara langsung
- Diperlukan workflow yang baik untuk mensimulasikan perilaku geospasial
- Awalnya saya membuat geofence di sekitar rumah untuk pengujian
- Keluar berjalan kaki pada pukul 11 malam untuk menguji secara nyata cepat terasa merepotkan
- Pengujian di lingkungan nyata tidak boleh dikurangi
- Sebelum balapan, sebagian besar pengujian dilakukan dengan menjalankan fungsi di workstation lokal
- Itu memberi rasa percaya diri yang keliru bahwa keberhasilan lokal berarti akan berjalan benar juga di lingkungan Lambda
- Jika Anda khawatir pizza Casey's akan habis, ada juga cara dengan memberi jarak lebih dari 30 menit dari grup depan agar toko punya waktu membuat pizza potong baru
- Kodenya tersedia publik di GitHub: https://github.com/mattdsteele/spot-tracker-tracker/…
1 komentar
Komentar Hacker News
Colin bisa membuat pizza juga sambil mengantarkannya: https://youtu.be/YjyJRTM0knE?si=fes2lbRntUlciPSH
Cacat fatal dari rencana yang tampak sempurna itu adalah ketika truk melewati jalan bergelombang, pizzanya beterbangan dan kehilangan semua topping: https://gizmodo.com/zume-softbank-ai-pizza-delivery-stellar-...
Video itu membuat saya tertawa paling keras dari semua yang saya tonton di YouTube tahun ini
Saya masih belum bisa menilainya, dan anehnya itu membuatnya jadi sulit ditonton. Tentu saja ia mungkin tidak akan merilis video saat ada sesuatu yang benar-benar kacau
Saya menonton video orang ini menggali terowongan dari rumahnya ke gudang selama dua setengah jam; kanalnya benar-benar menghibur
Bagus sekali. Rasanya seperti interpretasi abad ke-21 dari pizzatool
https://donhopkins.medium.com/the-story-of-sun-microsystems-...
Sebagai catatan, kedai pizza bernama Waypoint Pizza di Tiburon bisa mengantar sampai ke atas perairan San Francisco Bay kalau diminta baik-baik. Ini cukup berguna untuk lomba yacht unik yang tidak terlalu serius seperti Three Bridge Fiasco
Dean Karnazes pernah melakukan hal serupa dalam lomba ultra running tanpa teknologi
Katanya ia membawa pizza sambil berlari dengan menggulungnya seperti burrito: https://gffmag.com/the-raw-endurance-of-ultramarathon-man-de...
Kalau itu situs web React, besar kemungkinan ada API yang bisa dipakai langsung
Mungkin perlu login untuk mendapatkan token, tetapi pendekatan itu jauh lebih kokoh
Itu jauh lebih murah dan jauh lebih kokoh; apakah ada yang saya lewatkan?
Saya sangat menikmati tulisan ini
Banyak unsur bagus: masalah teknis yang menarik, pizza, membuat saya mencari tahu apa arti “s-tier”, premisnya saja sudah lucu lalu ditambah humor lagi, sampai mea culpa di akhir dan dugaan penyebab bug. Teorinya juga terlihat masuk akal, meski belum pasti
Rasanya seperti semua sisi buruk teknologi modern dikumpulkan jadi satu
Jujur, ini cukup keren. Saya penasaran apakah hal serupa bisa dilakukan di layanan seperti Deliveroo
Jika pada tanggal tertentu X kondisinya terpenuhi, misalnya saat lembur dan sudah tersisa kira-kira jarak Z dari rumah, tampaknya bisa memesan pesanan Y yang sudah ditentukan sebelumnya
Kenapa tidak membuat pemesanan makanan hingga pembayaran mudah diintegrasikan ke hack bergaya IFTTT?
Saya punya kenangan indah tumbuh besar sambil makan Casey's pizza
Setiap kali kembali ke Midwest saya membelinya; sulit menjelaskan secara persis, tapi ada daya tarik khas tersendiri
Ah, ternyata akhirnya tidak berfungsi
Kalau baru tahu di titik 200 mil, pasti lumayan berat
Software, sepeda, dan pizza—semua hal yang saya suka dalam hidup
Saya sangat menikmati proyek dan tulisan ini, dan itu juga membuat saya memikirkan ide serupa
Kalau saya, mungkin saya akan menelepon hands-free, atau meminta teman menelepon dan memicunya lewat pesan
Dan mereka terus menyebutnya “pengantaran”, padahal sebenarnya itu pickup, bukan?