Et Python-projekt i 30 linjers kode: hvordan du opretter en SMS-besked, når din yndlings Twitcher streamer

Hej alle :) I dag begynder jeg en ny serie indlæg, der specifikt er rettet mod Python-begyndere. Konceptet er ret simpelt: Jeg laver et sjovt projekt i så få kodelinjer som muligt og vil prøve så mange nye værktøjer som muligt.

For eksempel lærer vi i dag at bruge Twilio API, Twitch API, og vi vil se, hvordan vi implementerer projektet på Heroku. Jeg viser dig, hvordan du kan få din egen "Twitch Live" SMS-besked i 30 linjer koder og i 12 cent om måneden.

Forudsætning : Du behøver kun at vide, hvordan du kører Python på din maskine og nogle grundlæggende kommandoer i git (commit & push). Hvis du har brug for hjælp til disse, kan jeg anbefale disse 2 artikler til dig:

Python 3 Installations- og installationsvejledning

The Ultimate Git Command Tutorial for Beginners fra Adrian Hajdin.

Hvad du lærer :

  • Twitch API
  • Twilio API
  • Implementering på Heroku
  • Opsætning af en planlægning på Heroku

Hvad du vil bygge:

Specifikationerne er enkle: Vi ønsker at modtage en SMS, så snart en bestemt Twitcher er live streaming. Vi vil vide, hvornår denne person bliver live, og hvornår de forlader streaming. Vi ønsker, at det hele skal køre af sig selv hele dagen.

Vi deler projektet i 3 dele. Først vil vi se, hvordan man programmatisk ved, om en bestemt Twitcher er online. Så vil vi se, hvordan vi modtager en SMS, når dette sker. Vi slutter med at se, hvordan vi får dette stykke kode til at køre hvert X. minut, så vi går aldrig glip af endnu et øjeblik i vores yndlings streameres liv.

Er denne Twitcher live?

For at vide, om en Twitcher er live, kan vi gøre to ting: Vi kan gå til Twitcher URL og prøve at se, om badgen "Live" er der.

Denne proces involverer skrabning og kan ikke let udføres i Python på mindre end 20 kodelinjer. Twitch kører en masse JS-kode, og en simpel anmodning. Get () er ikke nok.

For at skrabning kan fungere, skal vi i dette tilfælde skrabe denne side inde i Chrome for at få det samme indhold som det, du ser på skærmbilledet. Dette er gennemførligt, men det tager meget mere end 30 linjer kode. Hvis du gerne vil vide mere, så tøv ikke med at tjekke min seneste webskrabning uden at få blokeret guide. (Jeg lancerede for nylig ScrapingBee, et web-skrabeværktøj, derfor min viden inden for området;))

Så i stedet for at forsøge at skrabe Twitch, bruger vi deres API. For dem, der ikke er bekendt med udtrykket, er en API en programmatisk grænseflade, der giver websteder mulighed for at eksponere deres funktioner og data for alle, hovedsagelig udviklere. I Twitchs tilfælde er deres API eksponeret gennem HTTP, heks betyder, at vi kan have masser af oplysninger og gøre mange ting ved bare at lave en simpel HTTP-anmodning.

Få din API-nøgle

For at gøre dette skal du først oprette en Twitch API-nøgle. Mange tjenester håndhæver godkendelse af deres API'er for at sikre, at ingen misbruger dem eller for at begrænse adgangen til bestemte funktioner fra bestemte personer.

Følg disse trin for at hente din API-nøgle:

  • Opret en Twitch-konto
  • Opret nu en Twitch dev-konto -> "Tilmeld dig med Twitch" øverst til højre
  • Gå til dit "dashboard", når du først er logget ind
  • "Registrer din ansøgning"
  • Navn -> Uanset hvad, Oauth-omdirigerings-URL -> // localhost, Kategori -> Uanset hvad

Du skal nu se dit klient-id nederst på skærmen. Opbevar dette til senere.

Streamer den Twitcher nu?

Med din API-nøgle i hånden kan vi nu spørge Twitch API for at have de oplysninger, vi ønsker, så lad os begynde at kode. Følgende uddrag bruger kun Twitch API med de korrekte parametre og udskriver svaret.

# requests is the go to package in python to make http request # //2.python-requests.org/en/master/ import requests # This is one of the route where Twich expose data, # They have many more: //dev.twitch.tv/docs endpoint = "//api.twitch.tv/helix/streams?" # In order to authenticate we need to pass our api key through header headers = {"Client-ID": ""} # The previously set endpoint needs some parameter, here, the Twitcher we want to follow # Disclaimer, I don't even know who this is, but he was the first one on Twich to have a live stream so I could have nice examples params = {"user_login": "Solary"} # It is now time to make the actual request response = request.get(endpoint, params=params, headers=headers) print(response.json())

Outputtet skal se sådan ud:

{ 'data':[ { 'id':'35289543872', 'user_id':'174955366', 'user_name':'Solary', 'game_id':'21779', 'type':'live', 'title':"Wakz duoQ w/ Tioo - GM 400LP - On récupère le chall après les -250LP d'inactivité !", 'viewer_count':4073, 'started_at':'2019-08-14T07:01:59Z', 'language':'fr', 'thumbnail_url':'//static-cdn.jtvnw.net/previews-ttv/live_user_solary-{width}x{height}.jpg', 'tag_ids':[ '6f655045-9989-4ef7-8f85-1edcec42d648' ] } ], 'pagination':{ 'cursor':'eyJiIjpudWxsLCJhIjp7Ik9mZnNldCI6MX19' } }

Dette dataformat kaldes JSON og er let læseligt. Den dataobjekt er en matrix, der indeholder alle de aktuelt aktive streams. Nøglen typesikrer, at strømmen er i øjeblikket live. Denne nøgle er ellers tom (f.eks. I tilfælde af en fejl).

Så hvis vi vil oprette en boolesk variabel i Python, der gemmer, om den aktuelle bruger streamer, er alt, hvad vi skal tilføje til vores kode:

json_response = response.json() # We get only streams streams = json_response.get('data', []) # We create a small function, (a lambda), that tests if a stream is live or not is_active = lambda stream: stream.get('type') == 'live' # We filter our array of streams with this function so we only keep streams that are active streams_active = filter(is_active, streams) # any returns True if streams_active has at least one element, else False at_least_one_stream_active = any(streams_active) print(at_least_one_stream_active)

På dette tidspunkt at_least_one_stream_activeer det sandt, når din yndlings Twitcher er live.

Lad os nu se, hvordan man får besked via SMS.

Send mig en sms, NU!

Så for at sende en tekst til os selv bruger vi Twilio API. Bare gå derovre og opret en konto. Når du bliver bedt om at bekræfte dit telefonnummer, skal du bruge det telefonnummer, du vil bruge i dette projekt. På denne måde kan du bruge $ 15 gratis kredit, som Twilio tilbyder til nye brugere. På omkring 1 cent en tekst, skal det være nok for din bot at køre i et år.

Hvis du går på konsollen, kan du se din Account SIDog din Auth Token, gem dem til senere. Klik også på den store røde knap "Get My Trial Number", følg trinnet, og gem denne til senere også.

At sende en tekst med Twilio Python API er meget let, da de leverer en pakke, der gør de irriterende ting for dig. Installer pakken med pip install Twilioog gør bare:

from twilio.rest import Client client = Client(, ) client.messages.create( body="Test MSG",from_=,to=) 

Og det er alt hvad du behøver for at sende dig en sms, fantastisk, ikke?

Sætter alt sammen

Vi sætter nu alt sammen og forkorter koden en smule, så det lykkes os at sige under 30 linjer Python-kode.

import requests from twilio.rest import Client endpoint = "//api.twitch.tv/helix/streams?" headers = {"Client-ID": ""} params = {"user_login": "Solary"} response = request.get(endpoint, params=params, headers=headers) json_response = response.json() streams = json_response.get('data', []) is_active = lambda stream:stream.get('type') == 'live' streams_active = filter(is_active, streams) at_least_one_stream_active = any(streams_active) if at_least_one_stream_active: client = Client(, ) client.messages.create(body='LIVE !!!',from_=,to=)

Undgå dobbelt underretninger

Dette uddrag fungerer godt, men hvis dette uddrag kører hvert minut på en server, så snart vores yndlings Twitcher går live, modtager vi en sms hvert minut.

We need a way to store the fact that we were already notified that our Twitcher is live and that we don't need to be notified anymore.

The good thing with the Twilio API is that it offers a way to retrieve our message history, so we just have to retrieve the last SMS we sent to see if we already sent a text notifying us that the twitcher is live.

Here what we are going do to in pseudocode:

if favorite_twitcher_live and last_sent_sms is not live_notification: send_live_notification() if not favorite_twitcher_live and last_sent_sms is live_notification: send_live_is_over_notification()

This way we will receive a text as soon as the stream starts, as well as when it is over. This way we won't get spammed - perfect right? Let's code it:

# reusing our Twilio client last_messages_sent = client.messages.list(limit=1) last_message_id = last_messages_sent[0].sid last_message_data = client.messages(last_message_id).fetch() last_message_content = last_message_data.body

Let's now put everything together again:

import requests from twilio.rest import Client client = Client(, ) endpoint = "//api.twitch.tv/helix/streams?" headers = {"Client-ID": ""} params = {"user_login": "Solary"} response = request.get(endpoint, params=params, headers=headers) json_response = response.json() streams = json_response.get('data', []) is_active = lambda stream:stream.get('type') == 'live' streams_active = filter(is_active, streams) at_least_one_stream_active = any(streams_active) last_messages_sent = client.messages.list(limit=1) if last_messages_sent: last_message_id = last_messages_sent[0].sid last_message_data = client.messages(last_message_id).fetch() last_message_content = last_message_data.body online_notified = "LIVE" in last_message_content offline_notified = not online_notified else: online_notified, offline_notified = False, False if at_least_one_stream_active and not online_notified: client.messages.create(body='LIVE !!!',from_=,to=) if not at_least_one_stream_active and not offline_notified: client.messages.create(body='OFFLINE !!!',from_=,to=)

And voilà!

You now have a snippet of code, in less than 30 lines of Python, that will send you a text a soon as your favourite Twitcher goes Online / Offline and without spamming you.

We just now need a way to host and run this snippet every X minutes.

The quest for a host

To host and run this snippet we will use Heroku. Heroku is honestly one of the easiest ways to host an app on the web. The downside is that it is really expensive compared to other solutions out there. Fortunately for us, they have a generous free plan that will allow us to do what we want for almost nothing.

If you don't already, you need to create a Heroku account. You also need to download and install the Heroku client.

You now have to move your Python script to its own folder, don't forget to add a requirements.txt file in it. The content of the latter begins:

requests twilio

cd into this folder and just do a `heroku create --app `.

If you go on your app dashboard you'll see your new app.

We now need to initialize a git repo and push the code on Heroku:

git init heroku git:remote -a  git add . git commit -am 'Deploy breakthrough script' git push heroku master

Your app is now on Heroku, but it is not doing anything. Since this little script can't accept HTTP requests, going to .herokuapp.com won't do anything. But that should not be a problem.

To have this script running 24/7 we need to use a simple Heroku add-on call "Heroku Scheduler". To install this add-on, click on the "Configure Add-ons" button on your app dashboard.

Then, on the search bar, look for Heroku Scheduler:

Click on the result, and click on "Provision"

If you go back to your App dashboard, you'll see the add-on:

Click on the "Heroku Scheduler" link to configure a job. Then click on "Create Job". Here select "10 minutes", and for run command select `python .py`. Click on "Save job".

While everything we used so far on Heroku is free, the Heroku Scheduler will run the job on the $25/month instance, but prorated to the second. Since this script approximately takes 3 seconds to run, for this script to run every 10 minutes you should just have to spend 12 cents a month.

Ideas for improvements

I hope you liked this project and that you had fun putting it into place. In less than 30 lines of code, we did a lot, but this whole thing is far from perfect. Here are a few ideas to improve it:

  • Send yourself more information about the current streaming (game played, number of viewers ...)
  • Send yourself the duration of the last stream once the twitcher goes offline
  • Don't send you a text, but rather an email
  • Monitor multiple twitchers at the same time

Do not hesitate to tell me in the comments if you have more ideas.

Conclusion

Jeg håber, at du kunne lide dette indlæg, og at du lærte ting at læse det. Jeg tror virkelig, at denne form for projekt er en af ​​de bedste måder at lære nye værktøjer og koncepter på, jeg lancerede for nylig en web-skrabning API, hvor jeg lærte meget, mens jeg lavede det.

Fortæl mig i kommentarerne, om du kunne lide dette format, og om du vil gøre mere.

Jeg har mange andre ideer, og jeg håber, du vil kunne lide dem. Tøv ikke med at dele, hvilke andre ting du bygger med dette uddrag, mulighederne er uendelige.

Glad kodning.

Pierre

Vil ikke gå glip af mit næste indlæg:

Du kan abonnere her på mit nyhedsbrev.