- Para evitar o problema de a pizza acabar no ponto de apoio da Gravel Worlds Long Voyage, em Nebraska, criei uma automação que faz um pedido antecipado na Casey's com base na localização do GPS da bicicleta
- A estrutura funciona com uma geofence do AWS Location detectando a saída do rastreador GPS, e uma Lambda executando o pedido online de acordo com o ETA da próxima parada
- Como a Casey's não tem uma API pública de pedidos, usei Playwright para fazer scraping do site em React, e configurei o resultado do pedido para chegar como notificação push no iPhone e no Apple Watch
- Na corrida real, chegou uma notificação de sucesso do pedido, mas a loja não tinha nenhum registro, revelando um false positive na automação do navegador em nuvem
- Depois, ao mudar para salvar um vídeo da ação do navegador no S3, os pedidos de teste passaram a funcionar, mas no ambiente Lambda era difícil confiar na estabilidade apenas com testes locais
Por que eu queria garantir pizza durante a corrida
- Participei da corrida de bicicleta Gravel Worlds Long Voyage, em Nebraska, durante a época de colheita no Meio-Oeste
- No ano anterior, os ciclistas mais rápidos chegaram primeiro e pegaram toda a pizza da Casey's no ponto de apoio, então quando cheguei já não havia mais pizza
- Neste ano, o objetivo era fazer o pedido de uma pizza fresca antecipadamente para coincidir com o horário da parada
- A ideia era acrescentar ao rastreador GPS serverless da bicicleta um mecanismo que executasse o script de pedido ao sair de uma geofence específica
Como o pedido era disparado com GPS e Lambda
- O desenho geral usava geofences do AWS Location para monitorar o rastreador GPS
- Quando o rastreador saía da geofence, uma função Lambda era acionada
- A Lambda calculava o ETA até o próximo ponto de parada
- Com base nesse horário calculado, fazia o pedido da pizza da Casey's
- Como a Casey's não oferece uma API pública para pedidos online, optei por fazer scraping do site
- O site da Casey's era um app React complexo renderizado no cliente
- Em vez de um scraper comum, usei Playwright
- Fazer o Playwright rodar na Lambda foi tão trabalhoso que renderizou um texto separado
- Para verificar o status do pedido, configurei notificações push no celular e no relógio em caso de sucesso ou falha
- Configurar Web Push para funcionar em dispositivos iOS também daria facilmente outro texto à parte
O resultado no local foi diferente da notificação de sucesso
- A geofence que disparava o pedido foi configurada perto da marca de 180 milhas da corrida
- A ideia era receber a pizza na marca de 200 milhas
- Assim que saí da geofence, chegou ao relógio uma notificação push dizendo que o pedido de pizza tinha sido feito com sucesso
- Quando cheguei ao ponto de parada, não havia nenhum pedido no balcão, e a loja também não tinha registro algum
- Ao verificar a conta, confirmou-se que nenhum pedido real havia sido criado; foi apenas um false positive com notificação de sucesso
- Havia algumas fatias prontas no local, então comprei aquilo mesmo
- Depois disso, até terminar a corrida de 300 milhas, continuei pensando no que tinha dado errado na função Lambda
Captura de vídeo, e não logs, deixou uma pista
- Depois da corrida, conferi os logs, mas não havia nenhuma informação que mostrasse a causa da falha
- Pelos logs, tudo parecia ter dado certo silenciosamente, então faltavam pistas para depuração
- Alguns dias depois, alterei a Lambda para capturar em vídeo a ação do navegador e enviar o arquivo para um bucket S3
- Ao testar com esse comportamento modificado, o pedido realmente funcionou, e consegui retirar normalmente uma Hawaiian pizza
- A causa exata não foi confirmada
- É possível que a Lambda tenha encerrado o processamento assim que o
form.submit()final foi executado no navegador Playwright embutido - É possível que o site de pedidos online não tenha concluído o processamento do pedido por não ter confirmado o recebimento da resposta de sucesso no navegador
- O tempo extra gasto com o processamento e upload do vídeo pode ter dado tempo suficiente para a finalização do navegador
- É possível que a Lambda tenha encerrado o processamento assim que o
O que eu mudaria se fosse fazer de novo
- Fazer scraping com confiabilidade de um app cliente em React por meio de um navegador em nuvem é possível, mas muito complicado
- Se eu fosse refazer isso, poderia considerar fazer engenharia reversa do app nativo da Casey's para acionar diretamente a API interna
- É preciso um bom fluxo de trabalho para simular comportamentos geoespaciais
- No começo, testei criando geofences perto de casa
- Sair andando às 23h para testar na prática rapidamente ficou cansativo
- Não dá para reduzir demais os testes em ambiente real
- Antes da corrida, a maior parte dos testes foi feita executando a função na workstation local
- Isso deu uma falsa confiança de que, se funcionava localmente, também funcionaria direito no ambiente Lambda
- Se a preocupação for a pizza da Casey's acabar, outra opção é abrir mais de 30 minutos de vantagem para o grupo da frente, dando tempo de a loja preparar novas fatias
- O código está público no GitHub: https://github.com/mattdsteele/spot-tracker-tracker/…
1 comentários
Comentários no Hacker News
Colin consegue fazer a pizza enquanto faz a entrega: https://youtu.be/YjyJRTM0knE?si=fes2lbRntUlciPSH
A falha fatal do plano, que parecia impecável, era que quando o caminhão passava por irregularidades na estrada, as pizzas saíam voando e perdiam todos os toppings: https://gizmodo.com/zume-softbank-ai-pizza-delivery-stellar-...
Foi o vídeo do YouTube que mais me fez rir este ano
Ainda não consigo decidir, e estranhamente isso tornou difícil assistir. Claro que ele provavelmente não publicaria um vídeo em que algo desse muito errado
Passei duas horas e meia vendo o vídeo desse cara cavando um túnel da casa até o galpão; é um canal realmente divertido
Muito bom. Parece uma interpretação do pizzatool para o século XXI
https://donhopkins.medium.com/the-story-of-sun-microsystems-...
Aliás, a pizzaria Waypoint Pizza, em Tiburon, também entrega na água da San Francisco Bay se você pedir com jeitinho. É bem útil em corridas de veleiros peculiares e menos sérias, como a Three Bridge Fiasco
Dean Karnazes fez algo parecido em uma prova de ultrarunning, sem tecnologia
Dizem que ele carregou a pizza enrolada como um burrito enquanto corria: https://gffmag.com/the-raw-endurance-of-ultramarathon-man-de...
Se for um site em React, provavelmente significa que existe uma API que dá para usar diretamente
Talvez seja preciso fazer login para obter um token, mas isso seria muito mais robusto
É muito mais barato e muito mais robusto; será que tem algo que estou deixando passar?
Gostei muito deste texto
Um problema técnico divertido, pizza, o fato de ter me feito pesquisar o que significa “s-tier”, uma premissa que já é engraçada por si só e ainda ganha mais humor, além do mea culpa no fim e da hipótese sobre a causa do bug — tinha muita coisa boa. A teoria também parece plausível, mas não dá para ter certeza
Pareceu reunir tudo de ruim da tecnologia moderna
Sinceramente, é bem legal. Fico imaginando se daria para fazer algo parecido com serviços como o Deliveroo
Em uma data X específica, se as condições forem atendidas — por exemplo, quando eu estiver fazendo hora extra e estiver a aproximadamente uma distância Z de casa —, fazer um pedido Y pré-definido parece possível
Não vejo motivo para não facilitar a integração de pedidos de comida e pagamentos em hacks no estilo IFTTT
Tenho boas lembranças de crescer comendo pizza da Casey's
Sempre compro quando volto ao Meio-Oeste; não sei explicar exatamente o quê, mas ela tem um charme próprio
Ah, então no fim não funcionou
Descobrir isso no marco de 200 milhas deve ter sido bem duro
Software, bicicleta e pizza: coisas que adoro na vida
Gostei muito deste projeto e do texto, e ele me fez pensar em ideias parecidas
Eu provavelmente teria feito uma ligação hands-free ou pedido a um amigo para ligar, acionando por mensagem
E ele continua chamando de “entrega”, mas na verdade não é retirada?