Projekt Python v 30 riadkoch kódu: ako nastaviť upozornenie SMS, keď streamuje váš obľúbený Twitcher

Ahoj všetci :) Dnes začínam novú sériu príspevkov špeciálne zameraných na začiatočníkov v Pythone. Koncept je dosť jednoduchý: urobím zábavný projekt v čo najmenšom počte riadkov kódu a vyskúšam čo najviac nových nástrojov.

Napríklad sa dnes naučíme používať Twilio API, Twitch API a uvidíme, ako nasadiť projekt na Heroku. Ukážem vám, ako môžete mať svojho vlastného oznamovateľa SMS „Twitch Live“, v 30 riadkoch kódov a za 12 centov mesačne.

Predpoklad : Musíte len vedieť, ako na vašom počítači spustiť Python a niektoré základné príkazy v git (commit & push). Ak s nimi potrebujete pomôcť, môžem vám odporučiť tieto 2 články:

Sprievodca inštaláciou a nastavením Pythonu 3

Výukový program pre príkazových riaditeľov pre začiatočníkov od Adriana Hajdina.

Čo sa naučíte :

  • Twitch API
  • Twilio API
  • Nasadzovanie na Heroku
  • Nastavenie plánovača na Heroku

Čo postavíte:

Špecifikácie sú jednoduché: chceme dostať SMS hneď, ako bude konkrétny Twitcher naživo vysielať. Chceme vedieť, kedy táto osoba bude žiť a kedy opustí streamovanie. Chceme, aby to celé fungovalo samo, po celý deň.

Projekt rozdelíme na 3 časti. Najskôr si ukážeme, ako programovo zistiť, či je konkrétny Twitcher online. Potom uvidíme, ako dostať SMS, keď sa to stane. Dokončíme to tým, že ukážeme, ako tento kúsok kódu spustiť každých X minút, takže nám už nikdy neunikne ďalší okamih života nášho obľúbeného streamera.

Je tento Twitcher naživo?

Aby sme vedeli, či je Twitcher naživo, môžeme urobiť dve veci: môžeme ísť na URL Twitcheru a skúsiť zistiť, či tam je odznak „Live“.

Tento proces zahŕňa škrabanie a nie je ľahko vykonateľný v Pythone za menej ako 20 riadkov kódu. Twitch spúšťa veľa kódu JS a jednoduchý request.get () nebude stačiť.

Aby fungovalo scraping, v tomto prípade by sme museli túto stránku v prehliadači Chrome scrapovať, aby sme získali rovnaký obsah, aký vidíte na snímke obrazovky. Je to možné, ale bude to trvať oveľa viac ako 30 riadkov kódu. Ak sa chcete dozvedieť viac, neváhajte skontrolovať moje nedávne vyradenie webu bez toho, aby ste dostali zablokovaného sprievodcu. (Nedávno som spustil program ScrapingBee, nástroj na škrabanie webu, a teda moje znalosti v tejto oblasti;))

Takže namiesto toho, aby sme sa pokúsili Twitch vyškriabať, použijeme ich API. Pre tých, ktorí tento pojem nepoznajú, predstavuje API programové rozhranie, ktoré umožňuje webovým serverom sprístupniť svoje funkcie a údaje komukoľvek, hlavne vývojárom. V prípade Twitcha je ich API odkryté cez HTTP, čo znamená, že môžeme mať veľa informácií a veľa vecí jednoduchou požiadavkou HTTP.

Získajte kľúč API

Ak to chcete urobiť, musíte najskôr vytvoriť kľúč API Twitch. Mnoho služieb vynucuje autentifikáciu svojich API, aby zabezpečili, že ich nikto nezneužije, alebo aby obmedzili prístup určitých osôb k určitým funkciám.

Podľa týchto pokynov získate kľúč API:

  • Vytvorte si účet Twitch
  • Teraz si vytvorte účet Twitch dev -> „Prihlásenie pomocou Twitch“ vpravo hore
  • Po prihlásení prejdite na „hlavný panel“
  • „Zaregistrujte svoju prihlášku“
  • Názov -> Čokoľvek, URL presmerovania Oauth -> // localhost, Kategória -> Čokoľvek

Teraz by ste mali vidieť v dolnej časti obrazovky svoje ID klienta. Toto si nechajte na neskôr.

Streamuje teraz ten Twitcher?

Keď máme váš kľúč API v ruke, môžeme teraz dopytovať na Twitch API, aby sme mali požadované informácie, takže začneme kódovať. Nasledujúci úryvok iba spotrebuje Twitch API so správnymi parametrami a vytlačí odpoveď.

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

Výstup by mal vyzerať takto:

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

Tento dátový formát sa nazýva JSON a je ľahko čitateľný. dataObjekt je pole, ktoré obsahuje všetky aktuálne aktívne toky. Kľúč typezaisťuje, že prúd je momentálne live. Tento kľúč bude inak prázdny (napríklad v prípade chyby).

Takže ak chceme v Pythone vytvoriť boolovskú premennú, ktorá ukladá, či aktuálny používateľ streamuje, musíme do nášho kódu pridať iba:

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)

V tomto okamihu platí, at_least_one_stream_activekeď je váš obľúbený Twitcher naživo.

Pozrime sa teraz, ako dostávať upozornenia prostredníctvom SMS.

Pošlite mi text, TERAZ!

Takže aby sme si poslali text, použijeme Twilio API. Stačí prejsť tam a vytvoriť si účet. Keď sa zobrazí výzva na potvrdenie vášho telefónneho čísla, použite telefónne číslo, ktoré chcete použiť v tomto projekte. Týmto spôsobom budete môcť využiť bezplatný kredit 15 dolárov, ktorý spoločnosť Twilio ponúka novým používateľom. Približne 1 cent za text by malo stačiť na to, aby váš robot fungoval jeden rok.

Ak pôjdete na konzolu, uvidíte svoje Account SIDa svoje Auth Token, odložte si ich na neskôr. Kliknite tiež na veľké červené tlačidlo „Získať moje skúšobné číslo“, postupujte podľa pokynov a odložte si ich tiež na neskôr.

Odosielanie textu pomocou rozhrania Twilio Python API je veľmi jednoduché, pretože poskytuje balík, ktorý za vás urobí nepríjemné veci. Nainštalujte balík pomocou pip install Twilioa postupujte takto:

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

A to je všetko, čo si potrebujete, aby ste si poslali textovú správu, úžasné, však?

Všetko dať dokopy

Teraz dáme všetko dohromady a trochu skrátime kód, aby sme stihli povedať pod 30 riadkov kódu Pythonu.

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

Zabránenie dvojitému upozorneniu

Tento úryvok funguje skvele, ale ak by tento úryvok bežal každú minútu na serveri, hneď ako bude zverejnený náš obľúbený Twitcher, budeme každú minútu dostávať SMS.

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

Dúfam, že sa vám tento príspevok páčil a že ste sa pri jeho čítaní dozvedeli veci. Skutočne verím, že tento druh projektu je jedným z najlepších spôsobov, ako sa naučiť nové nástroje a koncepty, nedávno som spustil webové škrabanie API, kde som sa pri jeho tvorbe veľa naučil.

Prosím, povedzte mi v komentároch, či sa vám tento formát páčil a či chcete urobiť viac.

Mám veľa ďalších nápadov a dúfam, že sa vám budú páčiť. Neváhajte a podeľte sa o ďalšie veci, ktoré pomocou tohto úryvku staviate, možností je neúrekom.

Šťastné kódovanie.

Pierre

Nechcem zmeškať môj ďalší príspevok:

Môžete sa prihlásiť na odber môjho bulletinu.