Python-projekti 30 koodirivillä: kuinka asettaa SMS-ilmoitus, kun suosikki Twitcher suoratoistaa

Hei kaikki :) Tänään aloitan uuden sarjan viestejä, jotka on erityisesti tarkoitettu Python-aloittelijoille. Konsepti on melko yksinkertainen: Teen hauskan projektin mahdollisimman vähän koodirivejä käyttäen ja kokeilen mahdollisimman monia uusia työkaluja.

Esimerkiksi tänään opimme käyttämään Twilio-sovellusliittymää, Twitch-sovellusliittymää ja näemme kuinka projekti otetaan käyttöön Herokussa. Näytän sinulle, miten sinulla voi olla oma "Twitch Live" SMS-ilmoittaja, 30 koodirivillä ja 12 sentillä kuukaudessa.

Edellytys : Sinun tarvitsee vain tietää, miten Python suoritetaan koneellasi, ja joitain peruskomentoja gitissä (sitoa ja työnnä). Jos tarvitset apua näissä asioissa, voin suositella näitä 2 artikkelia sinulle:

Python 3: n asennus- ja asennusopas

Adrian Hajdinin Ultimate Git -komennot aloittelijoille.

Mitä opit :

  • Twitch-sovellusliittymä
  • Twilio-sovellusliittymä
  • Herokun käyttöönotto
  • Aikataulun asettaminen Herokulle

Mitä rakennat:

Tekniset tiedot ovat yksinkertaisia: haluamme saada tekstiviestin heti, kun tietty Twitcher suoratoistaa. Haluamme tietää, milloin tämä henkilö menee livenä ja milloin hän lähtee suoratoistosta. Haluamme, että tämä koko juttu kulkee itsestään koko päivän.

Jaamme projektin 3 osaan. Ensinnäkin näemme, kuinka ohjelmallisesti tietää, onko tietty Twitcher verkossa. Sitten näemme, miten tekstiviesti vastaanotetaan, kun näin tapahtuu. Viimeistelemme näkemällä, kuinka tämä koodikappale saadaan ajettavaksi X minuutin välein, joten emme koskaan menetä yhtäkään hetkeä suosikki streamerimme elämästä.

Onko tämä Twitcher livenä?

Jos haluat tietää, onko Twitcher live-tilassa, voimme tehdä kaksi asiaa: voimme mennä Twitcherin URL-osoitteeseen ja yrittää nähdä, onko "Live" -merkki siellä.

Tämä prosessi sisältää kaavinnan, eikä sitä voida helposti suorittaa Pythonissa alle 20 koodirivillä. Twitch käyttää paljon JS-koodia, eikä yksinkertainen request.get () riitä.

Jotta kaavinta toimisi, meidän on tässä tapauksessa raapattava tämä sivu Chromen sisällä saadaksemme samanlaisen sisällön kuin kuvakaappauksessa. Tämä on toteutettavissa, mutta se vie paljon yli 30 koodiriviä. Jos haluat oppia lisää, älä epäröi tarkistaa viimeisimpiä web-kaavintojani saamatta estettyä opasta. (Käynnistin äskettäin verkkokaavintatyökalun ScrapingBee, joten tietoni kentältä;))

Joten sen sijaan, että yritämme kaapata Twitchiä, käytämme niiden API: ta. Niille, jotka eivät tunne tätä termiä, API on ohjelmallinen käyttöliittymä, jonka avulla verkkosivustot voivat paljastaa ominaisuuksiensa ja tietonsa kenellekään, lähinnä kehittäjille. Twitchin tapauksessa heidän API: nsa paljastetaan HTTP: n kautta, noita tarkoittaa, että meillä voi olla paljon tietoa ja tehdä paljon asioita tekemällä yksinkertaisen HTTP-pyynnön.

Hanki API-avain

Tätä varten sinun on ensin luotava Twitch API -avain. Monet palvelut pakottavat käyttöliittymiensä todennuksen varmistaakseen, ettei kukaan käytä niitä väärin, tai rajoittaakseen tiettyjen ihmisten pääsyä tiettyihin ominaisuuksiin.

Noudata näitä ohjeita saadaksesi API-avaimesi:

  • Luo Twitch-tili
  • Luo nyt Twitch dev -tili -> "Kirjaudu sisään Twitchillä" oikeassa yläkulmassa
  • Siirry "hallintapaneeliin", kun olet kirjautunut sisään
  • "Rekisteröi hakemuksesi"
  • Nimi -> Mikä tahansa, Oauthin uudelleenohjauksen URL -> // paikallinen isäntä, Luokka -> Mikä tahansa

Sinun pitäisi nyt nähdä näytön alareunassa asiakastunnuksesi. Säilytä tämä myöhempää tarvetta varten.

Suoratoistaako Twitcher nyt?

Kun API-avain on kädessä, voimme nyt pyytää Twitch-sovellusliittymää saamaan haluamasi tiedot, joten aloitetaan koodaus. Seuraava katkelma kuluttaa vain Twitch-sovellusliittymän oikeilla parametreilla ja tulostaa vastauksen.

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

Tuloksen tulisi näyttää tältä:

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

Tätä tietomuotoa kutsutaan JSONiksi ja se on helposti luettavissa. dataTavoitteena on taulukko, joka sisältää kaikki tällä hetkellä aktiivisten virtojen. Avain typevarmistaa, että virta on tällä hetkellä live. Tämä avain on muuten tyhjä (esimerkiksi virheen sattuessa).

Joten jos haluamme luoda Pythonissa loogisen muuttujan, joka tallentaa nykyisen käyttäjän suoratoiston, meidän on vain liitettävä koodiin:

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)

Tässä vaiheessa at_least_one_stream_activeon totta, kun suosikki Twitcher on livenä.

Katsotaan nyt, kuinka saada ilmoituksia tekstiviestillä.

Lähetä minulle teksti NYT!

Joten lähetämme tekstin itsellemme, käytämme Twilio-sovellusliittymää. Mene vain sinne ja luo tili. Kun sinua pyydetään vahvistamaan puhelinnumerosi, käytä puhelinnumeroa, jota haluat käyttää tässä projektissa. Näin voit käyttää Twilion tarjoamia 15 dollarin ilmaisia ​​luottoja uusille käyttäjille. Noin yhden sentin tekstin pitäisi olla riittävä, että botti toimii yhden vuoden ajan.

Jos menet konsoliin, näet sinun Account SIDja sinun Auth Token, tallenna ne myöhempää käyttöä varten. Napsauta myös isoa punaista painiketta "Hanki kokeilunumero", noudata vaihetta ja tallenna tämä myös myöhempää käyttöä varten.

Tekstin lähettäminen Twilio Python -sovellusliittymän avulla on erittäin helppoa, koska ne tarjoavat paketin, joka tekee sinulle harmittaa. Asenna paketti pip install Twilioja tee vain:

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

Ja se on kaikki mitä tarvitset lähettääksesi itsellesi tekstin, hämmästyttävä?

Laita kaikki yhteen

Yhdistämme nyt kaiken ja lyhennämme koodia hieman, jotta voimme sanoa alle 30 rivin Python-koodin.

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

Kaksinkertaisten ilmoitusten välttäminen

Tämä katkelma toimii hyvin, mutta jos sen pitäisi toimia joka minuutti palvelimella, heti kun suosikki Twitcherimme julkaistaan, saamme tekstiviestin joka minuutti.

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

Toivon, että pidit tästä viestistä ja että opit asioita lukemalla sitä. Uskon todella, että tällainen projekti on yksi parhaista tavoista oppia uusia työkaluja ja konsepteja. Käynnistin äskettäin web scraping -sovellusliittymän, jossa opin paljon tekemisen aikana.

Kerro minulle kommenteissa, piditkö tästä muodosta ja haluatko tehdä enemmän.

Minulla on monia muita ideoita, ja toivon, että pidät niistä. Älä epäröi kertoa, mitä muita asioita rakennat tällä koodinpätkällä, mahdollisuudet ovat rajattomat.

Hyvää koodausta.

Pierre

En halua jättää väliin seuraavaa viestiäni:

Voit tilata uutiskirjeeni täältä.