Egy Python-projekt 30 kódsorban: hogyan állíthat be SMS-értesítést, amikor kedvenc Twitcherje közvetít

Sziasztok mindenkinek :) Ma új bejegyzéssorozatot kezdek, amely kifejezetten a Python kezdőinek szól. A koncepció meglehetősen egyszerű: szórakoztató projektet készítek, a lehető legkevesebb sorban, és a lehető legtöbb új eszközt kipróbálom.

Például ma megtanuljuk használni a Twilio API-t, a Twitch API-t, és meglátjuk, hogyan telepítsük a projektet Heroku-ra. Megmutatom, hogyan lehet saját "Twitch Live" SMS-értesítő, 30 kódsorban és havi 12 centért.

Előfeltétel : Csak azt kell tudnia, hogyan kell futtatni a Python-ot a gépén, és néhány alapvető parancsot git-ben (végrehajtás és nyomás). Ha segítségre van szüksége ezekkel kapcsolatban, akkor ezt a 2 cikket tudom ajánlani Önnek:

Python 3 telepítési és telepítési útmutató

Adrian Hajdin Ultimate Git Command Tutorial kezdőknek.

Amit megtanulsz :

  • Twitch API
  • Twilio API
  • Heroku telepítése
  • Ütemező beállítása Heroku-ra

Mit fog építeni:

A specifikációk egyszerűek: szeretnénk SMS-t kapni, amint egy adott Twitcher élőben közvetít. Szeretnénk tudni, hogy ez a személy mikor megy élőben, és mikor hagyja el a streaminget. Azt akarjuk, hogy ez az egész magától működjön, egész nap.

A projektet 3 részre osztjuk. Először meglátjuk, hogyan lehet programszerűen megtudni, hogy egy adott Twitcher online-e. Majd meglátjuk, hogyan lehet SMS-t kapni, ha ez megtörténik. Befejezzük, hogy megtudjuk, hogyan lehet ezt a kóddarabot X percenként futtatni, így soha nem hagyjuk ki a kedvenc streamerünk életének egyetlen pillanatát sem.

Élőben van ez a Twitcher?

Két dolgot tehetünk arról, hogy megtudjuk, él-e egy Twitcher: elmehetünk a Twitcher URL-re, és megpróbálhatjuk megnézni, hogy ott van-e a "Live" jelvény.

Ez a folyamat kaparással jár, és Pythonban nem könnyen végrehajtható kb. 20-nál kevesebb kódsorban. A Twitch sok JS-kódot futtat, és egy egyszerű request.get () nem lesz elég.

A kaparás működéséhez ebben az esetben meg kell kaparni ezt az oldalt a Chrome-ban, hogy ugyanazt a tartalmat kapjuk, mint amit a képernyőképen lát. Ez megvalósítható, de sokkal több, mint 30 sornyi kódra lesz szükség. Ha szeretne többet megtudni, ne habozzon ellenőrizni a legutóbbi webes kaparásomat anélkül, hogy letiltott útmutatót kapna. (Nemrég indítottam el a ScrapingBee-t, egy internetes kaparóeszközt, így tudásom van a területen;))

Tehát ahelyett, hogy megpróbálnánk lekaparni a Twitchet, az API-jukat fogjuk használni. Azok számára, akik nem ismerik ezt a kifejezést, az API egy olyan programozási felület, amely lehetővé teszi a webhelyek számára, hogy bárki, főként a fejlesztők előtt kitegyék sajátosságaikat és adataikat. Twitch esetében az API-juk HTTP-n keresztül van kitéve, a witch azt jelenti, hogy rengeteg információval rendelkezhetünk, és sok mindent megtehetünk csupán egy egyszerű HTTP-kérés megadásával.

Szerezze be az API kulcsát

Ehhez először létre kell hoznia egy Twitch API kulcsot. Sok szolgáltatás kényszeríti az API-k hitelesítését annak biztosítására, hogy senki ne éljen vissza velük, vagy korlátozzák bizonyos személyek hozzáférését bizonyos funkciókhoz.

Kérjük, kövesse az alábbi lépéseket az API kulcs megszerzéséhez:

  • Hozzon létre egy Twitch-fiókot
  • Most hozz létre egy Twitch dev fiókot -> "Regisztráció a Twitch segítségével" jobb felső sarokban
  • Miután bejelentkezett, lépjen az "irányítópultra"
  • "Jelentkezés regisztrálása"
  • Név -> Bármi, Oauth átirányítási URL -> // localhost, Kategória -> Bármi

Ekkor látnia kell a képernyő alján az ügyfél-azonosítót. Őrizze meg későbbre.

Most a Twitcher streaming?

Ha az API-kulcsa a kezében van, most megkérdezhetjük a Twitch API-t, hogy rendelkezzen a kívánt információval, ezért kezdjük el a kódolást. A következő részlet csak a Twitch API-t használja fel a megfelelő paraméterekkel, és kinyomtatja a választ.

# 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())

A kimenetnek így kell kinéznie:

{ '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' } }

Ezt az adatformátumot JSON-nak hívják, és könnyen olvasható. Az dataobjektum egy tömb, amely az összes jelenleg aktív adatfolyamot tartalmazza. A kulcs typebiztosítja, hogy az adatfolyam aktuális legyen live. Ez a kulcs egyébként üres lesz (például hiba esetén).

Tehát, ha létre akarunk hozni egy logikai változót a Pythonban, amely tárolja, hogy az aktuális felhasználó streamel-e, akkor csak annyit kell csatolnunk a kódunkhoz:

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)

Ezen a ponton at_least_one_stream_activeigaz, amikor a kedvenc Twitcher élőben van.

Nézzük meg, hogyan lehet SMS-ben értesítést kapni.

Küldj nekem egy szöveget, MOST!

Tehát, hogy szöveget küldjünk magunknak, a Twilio API-t fogjuk használni. Csak menjen oda, és hozzon létre egy fiókot. Amikor a telefonszám megerősítésére kérik, használja azt a telefonszámot, amelyet ebben a projektben használni szeretne. Így felhasználhatja a Twilio által az új felhasználók számára kínált 15 dolláros ingyenes hitelt. Körülbelül 1 centes szövegnél elegendőnek kell lennie ahhoz, hogy botja egy évig futhasson.

Ha a konzolra lép, meglátja az Önét Account SIDés a Auth Tokensajátját, mentse őket későbbre. Szintén kattintson a nagy piros gombra "Próbálkozzon a számmal", kövesse a lépést, és ezt mentse későbbre is.

Szöveg küldése a Twilio Python API-val nagyon egyszerű, mivel olyan csomagot nyújtanak, amely elvégzi az Ön számára a bosszantó dolgokat. Telepítse a csomagot a következővel pip install Twilio:

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

És csak erre van szükséged, hogy szöveget küldj magadnak, elképesztő, igaz?

Mindent összerakva

Most mindent összerakunk, és kissé lerövidítjük a kódot, így sikerül 30 sornyi Python-kódot mondanunk.

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=)

A kettős értesítések elkerülése

Ez a részlet remekül működik, de ha ez a kódrészlet percenként fut egy szerveren, amint kedvenc Twitcherünk élőben lesz, percenként kapunk SMS-t.

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

I hope that you liked this post and that you learned things reading it. I truly believe that this kind of project is one of the best ways to learn new tools and concepts, I recently launched a web scraping API where I learned a lot while making it.

Please tell me in the comments if you liked this format and if you want to do more.

I have many other ideas, and I hope you will like them. Do not hesitate to share what other things you build with this snippet, possibilities are endless.

Happy Coding.

Pierre

Don't want to miss my next post:

You can subscribe here to my newsletter.