Idite Celebrity Spotting pomoću Twilio API-ja za WhatsApp, AWS Rekogservation i Ruby

Jeste li znali da možete slati i primati medije koristeći Twilio API za WhatsApp? Kad sam saznao da želim napraviti nešto zabavno s njom, pa zašto ne kombinirati to s AWS Rekogservation kako bih uspio ako izgledam kao bilo koja poznata osoba?

Na kraju ovog posta znat ćete kako napraviti aplikaciju koja omogućuje slanje slike na WhatsApp broj, preuzimanje slike, analiziranje slike pomoću AWS Rekogservation API-ja i odgovoriti na pitanje ima li poznatih ličnosti u slika.

Što će vam trebati

Za izradu ove aplikacije trebat će vam nekoliko stvari:

  • Ovdje se možete prijaviti za besplatni Twilio račun
  • AWS račun
  • Instalirani su Ruby i Bundler
  • ngrok da nam pomogne u testiranju naših web-kukica

Shvatio si sve? Počnimo tada.

Osnove primjene

Kad Twilio primi WhatsApp poruku, poslat će HTTP zahtjev, web-kuku, na URL koji dajemo. Moramo izgraditi aplikaciju koja može primiti te web-kuke, obraditi sliku pomoću AWS Rekogservation usluge, a zatim poslati odgovor natrag u odgovoru na Twilio.

Napravite sebi direktorij u koji ćete ugraditi aplikaciju i inicijalizirajte novi Gemfile s paketom:

mkdir celebrity-spotting cd snop celebrity-spotting init

Otvorite Gemfile i dodajte dragulje koje ćemo koristiti za ovu aplikaciju:

#rozen_string_literal: true source "https://rubygems.org" gem "sinatra", zahtijevaju: "sinatra / baza" gem "aws-sdk" gem "envyable" gem "down" gem "twilio-ruby"

Koristit ćemo Sinatru kao mrežni okvir za primanje dolaznih webhokova od Twilio-a. Trebat će nam AWS SDK da bismo komunicirali sa službom ponovnog paljenja. Enviyable je pohraniti naše vjerodajnice u varijable okoline u razvoju. Down je dragulj koji olakšava preuzimanje datoteka. A dragulj twilio-rubin koristit će se za generiranje TwiML-a kako bismo u odgovoru mogli komunicirati Twilio-u.

Pokrenite instalaciju paketa za instaliranje dragulja, a zatim stvorite ostale datoteke koje će nam trebati za ovu aplikaciju: app.rb, config.ru i config / env.yml. To je priprema završena, krenimo u izgradnju aplikacije.

Izrada aplikacije

Koristit ćemo config.ru za učitavanje i pokretanje aplikacije. U config.ru dodajte sljedeći kôd:

zahtijevati "bundler" Bundler.require Envyable.load ("./ config / env.yml") osim ako ENV ["RACK_ENV"] == "proizvodnja" zahtijeva "./app.rb" pokreni CelebritySpotting

To zahtijeva sve ovisnosti definirane u Gemfileu, učitava našu konfiguraciju u okoliš koristeći Envyable, a zatim učitava i pokreće aplikaciju. Zatim stvorimo aplikaciju CelebritySpotting.

Otvorite app.rb i stvorite novu klasu:

klasa CelebritySpotting 

Potreban nam je put do krajnje točke koju možemo pružiti kao URL svog web-kuka. Twilio prema zadanim postavkama postavlja POST zahtjev, tako da će naša krajnja točka odgovoriti na POST zahtjeve:

klasa CelebritySpotting 

Vraćamo TwiML, pa ćemo stvoriti novi Twilio :: TwiML :: MessagingResponse i postaviti zaglavlje vrste sadržaja na application / xml:

klasa CelebritySpotting 

Da bismo bili sigurni da ovo radi do sada, dodajmo poruku, vratimo TwiML kao XML i testiramo ga:

klasa CelebritySpotting 

Pokrenite aplikaciju u naredbenom retku sa:

snop exec stalak

Aplikacija će započeti na http: // localhost: 9292. Nema sučelja pa ga možemo testirati pomoću curl-a da vidimo djeluje li pravilno.

$ curl -d "" http: // localhost: 9292 / poruke Zdravo! Samo testiram ovdje.

Vidimo da se poruka vraća u TwiML-u, pa je priključimo na Twilio API za WhatsApp.

Spajanje na Twilio API za WhatsApp

Twilio nudi kutiju s pijeskom za testiranje vaših WhatsApp integracija bez čekanja da Twilio broj odobri WhatsApp. Prijavite se na svoju Twilio konzolu i slijedite upute za postavljanje WhatsApp sandbox-a.

Jednom kada ga postavite, morate definirati URL webhook-a kako biste mogli konfigurirati svoj broj sigurnosne kutije WhatsApp.

Naša aplikacija trenutno radi na našem vlastitom stroju, tako da se trebamo tunelizirati s javnog interneta, tu dolazi ngrok. Pokrenite ngrok pokretanjem:

ngrok http 9292

Izvršenjem ove naredbe dobit ćete javni URL koji izgleda kao https://RANDOM_STRING.ngrok.io. Uzmite taj ngrok URL, dodajte put / poruke u njega i unesite ga u svoje postavke peskode WhatsApp kao URL za pozivanje kad poruka stigne s WhatsAppa.

Spremite svoje postavke za WhatsApp pješčanik i pošaljite broj pješčanika poruku. Trebali biste dobiti testiranje poruke.

WhatsApp je povezan i možemo slati poruke naprijed i nazad. Ovo stvara temelj za rad s uključenim slikama i njihovo analiziranje pomoću AWS Rekogservation.

Primanje i preuzimanje slika

Ranije smo u aplikaciju uključili Down dragulj. Koristit ćemo ga za preuzimanje slika poslanih na naš WhatsApp broj.

Po povratku na app.rb testirat ćemo ima li naša dolazna poruka slike, a ako ima, preuzmite prvu.

Twilio šalje sve potrebne podatke u tijelu zahtjeva za webhook. Tražit ćemo parametar NumMedia da bismo utvrdili ima li medija. Ako postoji, URL slike bit će u parametru MediaUrl0.

Pomoću tog MediaUrl0 parametra možemo koristiti Down za preuzimanje slike. Kad preuzmete sliku pomoću Down-a, ona vam daje Tempfile. Možemo pročitati tu datoteku ili različita svojstva datoteke.

Nakon što završimo s tempfileom, trebali bismo ga zatvoriti i povezati vezu s zatvorom! metodu tako da se ne samo oko operativnog sustava. Također trebamo rješavati slučaj kada nije poslana slika, na što možemo odgovoriti porukom koja traži sliku.

Izbrišite poruku za testiranje i dodajte sljedeći kôd:

post "/ messages" do content_type = "text / xml" twiml = Twilio :: TwiML :: MessagingResponse.new ako params ["NumMedia"]. to_i> 0 tempfile = Down.download (params ["MediaUrl0"]) započne twiml .message body: "Hvala na slici! Veliki je # {tempfile.size} bajtova." osigurajte tempfile.close! kraj drugog twiml.message body: "Ne mogu tražiti slavne osobe ako mi ne pošaljete sliku!" kraj twiml.to_xml kraj

Ponovo pokrenite aplikaciju i pošaljite sebi još par probnih poruka sa i bez slika i uvjerite se da je rezultat ono što očekujete.

Sada je vrijeme za početak traženja slavnih u slikama, vrijeme je za kopanje u AWS Rekogservation.

AWS ponovno paljenje

Prije upućivanja API-ja na AWS, trebat ćemo dobiti pristupni ključ i tajnu. U svojoj AWS konzoli stvorite korisnika sa AmazonRekogservationFullAccess pravilima.

Na mnoge je načine stvoriti korisnike i dati im dopuštenja unutar AWS-a. Slijedi jedan od načina koji će vam pružiti API-korisnik koji može pristupiti usluzi ponovnog paljenja.

Započnite u kući s AWS konzolom i potražite i odaberite IAM u okviru "Pronađi usluge".

U odjeljku IAM kliknite lijevi izbornik "Korisnici", a zatim gumb "Dodaj korisnika".

Dajte korisniku ime, potvrdite okvir "Programički pristup", a zatim kliknite "Dalje: Dozvole".

Odaberite "Priloži postojeće politike izravno" i vidjet ćete tablicu pravila. Potražite pravila za "Rekognizaciju". Vidjet ćete tri pravila, odaberite AmazonRekogservationFullAccess pravila, s opisom "Pristup svim Amazonovim API-ima za ponovno otkrivanje".

Sada kliknite "Dalje" dok ne vidite poruku uspjeha.

Na stranici uspjeha vidjet ćete svoj „ID pristupnog ključa“ i „Tajni pristupni ključ“, spremite ih u config / env.yml, zajedno s AWS regijom u kojoj je dostupno ponovno otkrivanje, poput „us-istok-1“. Ako želite saznati više o ovom procesu, pogledajte dokumentaciju o autentifikaciji i kontroli pristupa za ponovno uklanjanje.

AWS_ACCESS_KEY_ID: YOUR_KEY_ID AWS_SECRET_ACCESS_KEY: YOUR_SECRET_KEY AWS_REGION: us-istok-1

Sada, da bismo na svojim slikama uočili slavne osobe, moramo stvoriti klijenta koji će koristiti AWS API i sliku poslati u krajnju točku slavnih prepoznatljivih osoba. U blok početak dodajte sljedeći kod:

start client = Aws :: Obnovljivanje :: Client.new odgovor = client.recognize_celebrities image: {bytes: tempfile.read} osigurajte tempfile.close! kraj

Ruby AWS SDK automatski preuzima vaše vjerodajnice iz okoline. Tada čitamo sliku koju smo preuzeli i šaljemo je u bajtovima klijentu metodu prepoznavanja_celebrities.

Odgovor će sadržavati sve pojedinosti o otkrivenim licima i o tome je li vjerojatno da će biti poznate osobe. Zatim možete nadograditi svoj odgovor koliko želite. Odlučio sam izvijestiti o slavnim osobama na slici ako ih ima i ako nisam izvijestio koliko je lica otkriveno:

ako odgovor.celebrity_faces.any? ako odgovor.celebrity_faces.count == 1 celebrity = response.celebrity_faces.first twiml.message message: "Ooh, ja sam # {celebrity.match_confidence}% uvjeren da ovo izgleda kao # {celebrity.name}." else twiml.message body: "Pronašao sam # {response.celebrity_faces.count} slavne osobe na ovoj slici. Izgleda da su # {to_sentence (response.celebrity_faces.map {| face | face.name})} na slici." kraj drugog slučaja response.unrecognized_faces.count kada 0 twiml.message body: "Na toj slici nisam mogao pronaći nijedno lice. Možda pokušati još jednu sliku?" kada je jedno twiml.message tijelo: "Na toj sam fotografiji našao 1 lice, ali ne bojim se poznate ličnosti." else twiml.message body: "Pronašao sam # {response.unrecognized_faces.count} lica na toj slici, ali nijedno od njih ne liči na slavne osobe." krajnji kraj

Ovdje sam također dodao kratku pomoćnu funkciju kako bih popis imena pretvorio u čitljivu rečenicu:

def to_sentence (niz) vrati array.to_s ako array.length <= 1 "# {array [0 ..- 2] .join (", ")} i # {array [-1]}" kraj

Ponovno pokrenite svoju aplikaciju i pošaljite sliku na WhatsApp broj. Pokazalo se da ne izgledam dovoljno poput bilo koje poznate ličnosti da bih dobio meč iz Rekognacije pa sam pomislio da bih i ja pokušao s nekim poznatim osobama. Poslao sam nekoliko slika slavnih, poput ove, kako bih vidio rezultate.

Postoji nekoliko više od tog Rekognacije!

WhatsApp, Images, AWS i slavne osobe

U ovom smo postu vidjeli kako primati slike poslane na broj WhatsApp pomoću Twilio API-ja za WhatsApp, preuzimati slike pomoću Down-a i zatim tražiti poznate osobe u njima pomoću AWS Rekogservation. Sav kôd iz ovog posta možete vidjeti u ovom GitHub repo-u.

Ovo je tek početak, a Rekogservation vam daje mnoštvo alata za analizu slika, uključujući prepoznavanje objekata i scena, teksta, pa čak i golog ili sugestivnog sadržaja.

Ovo je mala aplikacija Sinatra, ali to biste mogli implementirati i u Rails. Preuzimanje slika i korištenje API-ja za ponovno uspostavljanje potrebno je dosta vremena, tako da ćete možda htjeti odgoditi te pozive API-om pomoću ActiveJob-a i odgovoriti umjesto toga pomoću REST API-ja. Vrijedno je razmotriti vremena odziva, jer će Twilio webhooks čekati 15 sekundi prije isteka vremena.

Jeste li napravili nešto super s analizom slika? Volio bih čuti o vašim hakerskim slikama u komentarima ili na Twitteru na @philnash.

Izvorno objavljeno na www.twilio.com.