1 pontos por GN⁺ 2023-09-11 | 1 comentários | Compartilhar no WhatsApp
  • 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

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

 
GN⁺ 2023-09-11
Comentários no Hacker News
  • Colin consegue fazer a pizza enquanto faz a entrega: https://youtu.be/YjyJRTM0knE?si=fes2lbRntUlciPSH

    • É engraçado, mas o conceito desse vídeo do YouTube foi, de fato, o modelo de negócios de uma startup investida pelo SoftBank, que recebeu US$ 500 milhões em investimento
      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-...
    • Então é isso que acontece quando removem o GIL
      Foi o vídeo do YouTube que mais me fez rir este ano
    • Não sei se a imprudência do Colin é atuação, como a do Electroboom, ou se ele é realmente imprudente do jeito que parece
      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
    • Meu Deus, meu domingo à noite inteiro sumiu
      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

    • Uma entrega normal de pizza já pode custar US$ 5 a US$ 10 a mais; fico curioso para saber quanto sairia uma entrega na água pedindo com jeitinho
  • 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...

    • Corrida de resistência é, na prática, quase um ato de comer
  • 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

    • Concordo. Sempre fico confuso sobre por que as pessoas não monitoram e reproduzem as requisições de rede em vez de fazer scraping da tela
      É 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

    • Para mim foi totalmente ruim. Parecia um dispositivo de Rube Goldberg que não funciona, feito com 100 camadas de abstração, cola de cloud e gambiarras
      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

    • Por que alguém mentiria dizendo que isso é bem legal? Soa um pouco estranho fazer questão de esclarecer isso
    • Basta conectar a um fitness tracker para que só sejam entregues pizzas suficientes para manter um déficit calórico e perder peso
    • Serviços de pedido de comida deveriam ter uma boa API para esse tipo de uso
      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

    • Será que é porque tem mais gordura? A pizza de café da manhã é a melhor. Especialmente no dia seguinte a tomar Busch Light
  • 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

    • Essas também são coisas de que eu gosto. O OP, você e eu deveríamos criar um clube
  • 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?