Ένα έργο Python σε 30 γραμμές κώδικα: πώς να ρυθμίσετε μια ειδοποίηση μέσω SMS κατά τη ροή του αγαπημένου σας Twitcher

Γεια σε όλους :) Σήμερα ξεκινάω μια νέα σειρά δημοσιεύσεων που απευθύνονται ειδικά στους αρχάριους της Python. Η ιδέα είναι μάλλον απλή: Θα κάνω ένα διασκεδαστικό έργο, σε όσο το δυνατόν λιγότερες γραμμές κώδικα και θα δοκιμάσω όσο το δυνατόν περισσότερα νέα εργαλεία.

Για παράδειγμα, σήμερα θα μάθουμε να χρησιμοποιούμε το Twilio API, το Twitch API και θα δούμε πώς να αναπτύξουμε το έργο στο Heroku. Θα σας δείξω πώς μπορείτε να έχετε τη δική σας ειδοποίηση SMS "Twitch Live", σε 30 γραμμές κωδικών και για 12 σεντς το μήνα.

Προαπαιτούμενο : Αρκεί να γνωρίζετε μόνο πώς να εκτελέσετε το Python στο μηχάνημά σας και ορισμένες βασικές εντολές στο git (commit & push). Εάν χρειάζεστε βοήθεια με αυτά, μπορώ να σας προτείνω αυτά τα 2 άρθρα:

Οδηγός εγκατάστασης και εγκατάστασης Python 3

Το Ultimate Git Command Tutorial για αρχάριους από τον Adrian Hajdin.

Τι θα μάθετε :

  • API Twitch
  • API Twilio
  • Ανάπτυξη στο Heroku
  • Ρύθμιση χρονοπρογραμματιστή στο Heroku

Τι θα φτιάξετε:

Οι προδιαγραφές είναι απλές: θέλουμε να λάβουμε ένα SMS αμέσως μετά τη ροή ενός συγκεκριμένου Twitcher. Θέλουμε να μάθουμε πότε αυτό το άτομο θα μεταδοθεί ζωντανά και πότε θα αφήσει τη ροή. Θέλουμε όλο αυτό να λειτουργεί μόνο του, όλη την ημέρα.

Θα χωρίσουμε το έργο σε 3 μέρη. Πρώτον, θα δούμε πώς να γνωρίζουμε μέσω προγραμματισμού εάν ένα συγκεκριμένο Twitcher είναι online. Τότε θα δούμε πώς να λαμβάνουμε ένα SMS όταν συμβαίνει αυτό. Θα τελειώσουμε βλέποντας πώς να κάνει αυτό το κομμάτι κώδικα να εκτελείται κάθε Χ λεπτά, οπότε δεν χάνουμε ποτέ άλλη στιγμή της αγαπημένης μας ταινίας.

Είναι ζωντανό αυτό το Twitcher;

Για να μάθουμε αν ένα Twitcher είναι ζωντανό, μπορούμε να κάνουμε δύο πράγματα: μπορούμε να μεταβούμε στη διεύθυνση URL του Twitcher και να προσπαθήσουμε να δούμε αν υπάρχει το σήμα "Live".

Αυτή η διαδικασία περιλαμβάνει ξύσιμο και δεν είναι εύκολο να γίνει στο Python σε λιγότερες από 20 γραμμές κώδικα. Το Twitch τρέχει πολύ κώδικα JS και ένα απλό request.get () δεν θα είναι αρκετό.

Για να λειτουργήσει η απόξεση, σε αυτήν την περίπτωση, θα πρέπει να ξύσουμε αυτήν τη σελίδα μέσα στο Chrome για να λάβουμε το ίδιο περιεχόμενο όπως αυτό που βλέπετε στο στιγμιότυπο οθόνης. Αυτό είναι εφικτό, αλλά θα χρειαστούν πολύ περισσότερες από 30 γραμμές κώδικα. Αν θέλετε να μάθετε περισσότερα, μην διστάσετε να ελέγξετε την πρόσφατη απόξεση ιστού χωρίς να μπλοκαριστεί οδηγός. (Πρόσφατα ξεκίνησα το ScrapingBee, ένα εργαλείο ξυστό στο διαδίκτυο, εξ ου και οι γνώσεις μου στον τομέα.))

Έτσι, αντί να προσπαθούμε να ξύσουμε το Twitch, θα χρησιμοποιήσουμε το API τους. Για όσους δεν είναι εξοικειωμένοι με τον όρο, ένα API είναι μια διεπαφή μέσω προγραμματισμού που επιτρέπει στους ιστότοπους να εκθέτουν τις δυνατότητες και τα δεδομένα τους σε οποιονδήποτε, κυρίως προγραμματιστές. Στην περίπτωση του Twitch, το API τους εκτίθεται μέσω HTTP, το witch σημαίνει ότι μπορούμε να έχουμε πολλές πληροφορίες και να κάνουμε πολλά πράγματα απλά κάνοντας ένα απλό αίτημα HTTP.

Αποκτήστε το κλειδί API σας

Για να το κάνετε αυτό, πρέπει πρώτα να δημιουργήσετε ένα κλειδί API Twitch. Πολλές υπηρεσίες επιβάλλουν τον έλεγχο ταυτότητας για τα API τους για να διασφαλίσουν ότι κανείς δεν τις κακοποιεί ή για να περιορίσει την πρόσβαση σε συγκεκριμένες λειτουργίες από συγκεκριμένα άτομα.

Ακολουθήστε αυτά τα βήματα για να λάβετε το κλειδί API σας:

  • Δημιουργήστε έναν λογαριασμό Twitch
  • Τώρα δημιουργήστε έναν λογαριασμό Twitch dev -> "Εγγραφή με το Twitch" πάνω δεξιά
  • Μεταβείτε στον "πίνακα ελέγχου" μόλις συνδεθείτε
  • "Καταχωρήστε την αίτησή σας"
  • Όνομα -> Οτιδήποτε, URL ανακατεύθυνσης Oauth -> // localhost, Κατηγορία -> Οτιδήποτε άλλο

Θα πρέπει τώρα να δείτε, στο κάτω μέρος της οθόνης σας, το αναγνωριστικό πελάτη σας. Κρατήστε το για αργότερα.

Αυτή η ροή Twitcher είναι τώρα;

Με το κλειδί API σας, μπορούμε τώρα να υποβάλουμε ερώτημα στο API Twitch για να έχουμε τις πληροφορίες που θέλουμε, οπότε ας αρχίσουμε να κωδικοποιούμε. Το παρακάτω απόσπασμα καταναλώνει το Twitch API με τις σωστές παραμέτρους και εκτυπώνει την απόκριση.

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

Η έξοδος θα πρέπει να έχει την εξής μορφή:

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

Αυτή η μορφή δεδομένων ονομάζεται JSON και είναι ευανάγνωστη. Το dataαντικείμενο είναι ένας πίνακας που περιέχει όλες τις τρέχουσες ενεργές ροές. Το κλειδί typeδιασφαλίζει ότι η ροή είναι αυτήν τη στιγμή live. Αυτό το κλειδί θα είναι άδειο διαφορετικά (σε περίπτωση σφάλματος, για παράδειγμα).

Επομένως, εάν θέλουμε να δημιουργήσουμε μια boolean μεταβλητή στην Python που αποθηκεύει εάν ο τρέχων χρήστης είναι σε ροή, το μόνο που πρέπει να προσθέσουμε στον κώδικα είναι:

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)

Σε αυτό το σημείο, at_least_one_stream_activeείναι αλήθεια όταν το αγαπημένο σας Twitcher είναι ζωντανό.

Ας δούμε τώρα πώς να λαμβάνουμε ειδοποίηση μέσω SMS.

Στείλτε μου ένα κείμενο, ΤΩΡΑ!

Για να στείλουμε ένα κείμενο στους εαυτούς μας, θα χρησιμοποιήσουμε το API Twilio. Απλώς πηγαίνετε εκεί και δημιουργήστε έναν λογαριασμό. Όταν σας ζητηθεί να επιβεβαιώσετε τον αριθμό τηλεφώνου σας, χρησιμοποιήστε τον αριθμό τηλεφώνου που θέλετε να χρησιμοποιήσετε σε αυτό το έργο. Με αυτόν τον τρόπο θα μπορείτε να χρησιμοποιήσετε τα 15 $ δωρεάν πίστωσης που προσφέρει η Twilio σε νέους χρήστες. Περίπου 1 λεπτό ένα κείμενο, θα πρέπει να είναι αρκετό για να τρέξει το bot σας για ένα έτος.

Εάν πάτε στην κονσόλα, θα δείτε τη δική σας Account SIDκαι τη Auth Tokenδική σας , να τις αποθηκεύσετε για αργότερα. Κάντε επίσης κλικ στο μεγάλο κόκκινο κουμπί "Λήψη του αριθμού δοκιμής μου", ακολουθήστε το βήμα και αποθηκεύστε το για αργότερα.

Η αποστολή κειμένου με το Twilio Python API είναι πολύ εύκολη, καθώς παρέχουν ένα πακέτο που σας ενοχλεί. Εγκαταστήστε το πακέτο με pip install Twilioκαι απλώς κάντε:

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

Και αυτό είναι το μόνο που χρειάζεστε για να στείλετε στον εαυτό σας ένα κείμενο, καταπληκτικό, σωστά;

Συγκεντρώνοντας τα πάντα

Τώρα θα βάλουμε τα πάντα μαζί και θα συντομεύσουμε λίγο τον κώδικα, ώστε να καταφέρουμε να πούμε κάτω από 30 γραμμές κώδικα Python.

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

Αποφυγή διπλών ειδοποιήσεων

Αυτό το απόσπασμα λειτουργεί τέλεια, αλλά αν το απόσπασμα εκτελείται κάθε λεπτό σε έναν διακομιστή, μόλις το αγαπημένο μας Twitcher ξεκινήσει ζωντανά, θα λαμβάνουμε ένα 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

Ελπίζω να σας άρεσε αυτή η ανάρτηση και ότι μάθατε πράγματα να την διαβάζετε. Πιστεύω πραγματικά ότι αυτό το είδος έργου είναι ένας από τους καλύτερους τρόπους για να μάθω νέα εργαλεία και έννοιες, πρόσφατα ξεκίνησα ένα API απόξεσης ιστού όπου έμαθα πολλά κατά τη δημιουργία του.

Πείτε μου στα σχόλια αν σας άρεσε αυτή η μορφή και αν θέλετε να κάνετε περισσότερα.

Έχω πολλές άλλες ιδέες και ελπίζω να τις αρέσουν Μην διστάσετε να μοιραστείτε τι άλλα πράγματα δημιουργείτε με αυτό το απόσπασμα, οι πιθανότητες είναι ατελείωτες.

Καλή κωδικοποίηση.

Πιέρ

Δεν θέλω να χάσω την επόμενη ανάρτησή μου:

Μπορείτε να εγγραφείτε εδώ στο ενημερωτικό δελτίο μου.