„Python“ projektas 30 kodų eilutėse: kaip nustatyti SMS pranešimą, kai jūsų mėgstamiausias „Twitcher“ transliuoja

Sveiki visi :) Šiandien pradedu naują įrašų seriją, specialiai skirtą Python pradedantiesiems. Koncepcija yra gana paprasta: atliksiu įdomų projektą, naudodamasis kuo mažiau kodo eilučių, ir išbandysiu kuo daugiau naujų įrankių.

Pavyzdžiui, šiandien mes išmoksime naudoti „Twilio“ API, „Twitch“ API ir pamatysime, kaip projektą įdiegti „Heroku“. Aš jums parodysiu, kaip galite turėti savo „Twitch Live“ SMS pranešėją 30 kodų eilutėmis ir už 12 centų per mėnesį.

Būtina sąlyga : jums reikia žinoti tik kaip paleisti „Python“ jūsų kompiuteryje ir kai kurias pagrindines komandas „git“ („įsipareigoti ir stumti“). Jei jums reikia pagalbos, galiu jums rekomenduoti šiuos 2 straipsnius:

„Python 3“ diegimo ir sąrankos vadovas

Adriano Hajdino „Ultimate Git“ komandos pamoka pradedantiesiems.

Ką sužinosite :

  • „Twitch“ API
  • „Twilio“ API
  • Diegimas Heroku
  • „Heroku“ planuoklio nustatymas

Ką sukursite:

Specifikacijos yra paprastos: norime gauti SMS, kai tik konkretus „Twitcher“ tiesiogiai transliuoja. Mes norime žinoti, kada šis asmuo gyvena tiesiogiai ir kada jis išeina iš srautinio perdavimo. Norime, kad visa tai vyktų savaime, visą dieną.

Projektą padalinsime į 3 dalis. Pirmiausia pamatysime, kaip programiškai sužinoti, ar konkretus „Twitcher“ yra internete. Tada pamatysime, kaip gauti SMS, kai taip nutiks. Pabaigoje pamatysime, kaip priversti šį kodo elementą paleisti kas X minutes, todėl niekada nepraleisime dar vienos savo mėgstamiausio srautininko gyvenimo akimirkos.

Ar šis „Twitcher“ gyvas?

Norėdami sužinoti, ar „Twitcher“ veikia tiesiogiai, galime padaryti du dalykus: galime pereiti į „Twitcher“ URL ir pabandyti patikrinti, ar yra ženklas „Live“.

Šis procesas apima iškrapštymą ir nėra lengvai atliekamas „Python“ naudojant mažiau nei 20 kodų eilučių. „Twitch“ paleidžia daug JS kodo, o paprasto request.get () nepakaks.

Kad veiktų, šiuo atveju turėtume nukrapštyti šį puslapį „Chrome“ viduje, kad gautume tą patį turinį, kokį matote ekrano kopijoje. Tai įmanoma, bet tam reikės daug daugiau nei 30 kodo eilučių. Jei norite sužinoti daugiau, nedvejodami patikrinkite mano naujausią žiniatinklio grandymą negavę blokuojamo vadovo. (Neseniai paleidžiau „ScrapingBee“ - žiniatinklio grandymo įrankį, taigi turiu žinių šioje srityje;))

Taigi, užuot bandę nukrapštyti „Twitch“, naudosime jų API. Tiems, kuriems šis terminas nėra žinomas, API yra programinė sąsaja, leidžianti svetainėms atskleisti savo funkcijas ir duomenis visiems, daugiausia kūrėjams. „Twitch“ atveju jų API yra veikiama per HTTP, ragana reiškia, kad mes galime turėti daug informacijos ir padaryti daug dalykų, tiesiog pateikdami paprastą HTTP užklausą.

Gaukite API raktą

Norėdami tai padaryti, pirmiausia turite sukurti „Twitch“ API raktą. Daugelis paslaugų priverčia savo API autentifikuoti, kad niekas jų nepiktnaudžiautų arba apribotų tam tikrų žmonių prieigą prie tam tikrų funkcijų.

Norėdami gauti API raktą, atlikite šiuos veiksmus:

  • Sukurkite „Twitch“ paskyrą
  • Dabar sukurkite „Twitch dev“ paskyrą -> „Prisiregistruokite naudodami„ Twitch “viršuje dešinėje
  • Prisijunkite prie „informacijos suvestinės“
  • „Užregistruokite savo paraišką“
  • Pavadinimas -> Kas bebūtų, Oauth peradresavimo URL -> // localhost, Category -> Whatever

Dabar ekrano apačioje turėtumėte pamatyti savo kliento ID. Laikykite tai vėliau.

Ar tas „Twitcher“ dabar transliuojamas?

Turėdami rankoje jūsų API raktą, dabar galime pateikti užklausą „Twitch“ API, kad būtų norima informacija, todėl pradėkime koduoti. Šis fragmentas tiesiog sunaudoja „Twitch“ API su teisingais parametrais ir atspausdina atsakymą.

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

Išvestis turėtų atrodyti taip:

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

Šis duomenų formatas vadinamas JSON ir yra lengvai įskaitomas. dataObjektas yra masyvas, kuriame yra visų šiuo metu aktyvių srautus. Raktas typeužtikrina, kad srautas šiuo metu yra live. Kitu atveju šis raktas bus tuščias (pavyzdžiui, klaidos atveju).

Taigi, jei norime sukurti „Python“ loginį kintamąjį, kuriame saugoma, ar dabartinis vartotojas transliuoja, viskas, ką turime pridėti prie savo kodo, yra:

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)

Šiuo metu at_least_one_stream_activeyra tiesa, kai jūsų mėgstamiausias „Twitcher“ yra tiesioginis.

Pažiūrėkime, kaip gauti pranešimą SMS žinute.

Atsiųsk man tekstą, DABAR!

Taigi, norėdami išsiųsti sau tekstą, naudosime „Twilio“ API. Tiesiog eikite ten ir sukurkite paskyrą. Kai būsite paprašyti patvirtinti savo telefono numerį, naudokite telefono numerį, kurį norite naudoti šiame projekte. Tokiu būdu galėsite naudoti 15 USD nemokamą kreditą, kurį „Twilio“ siūlo naujiems vartotojams. Maždaug 1 cento teksto turėtų pakakti, kad robotas veiktų vienerius metus.

Jei eisite į konsolę, pamatysite savo Account SIDir savo Auth Token, išsaugokite juos vėlesniam laikui. Taip pat spustelėkite didelę raudoną mygtuką „Gauti mano bandomąjį numerį“, atlikite nurodytą veiksmą ir išsaugokite jį vėliau.

Tekstą siųsti su „Twilio Python“ API yra labai lengva, nes jie pateikia paketą, kuris jums daro nemalonius dalykus. Įdiekite paketą naudodami pip install Twilio:

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

Ir tai yra viskas, ko jums reikia norint išsiųsti sau tekstą, nuostabi tiesa?

Viską sujungus

Dabar mes viską sujungsime ir šiek tiek sutrumpinsime kodą, kad pavyktų pasakyti po 30 „Python“ kodo eilučių.

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

Venkite dvigubų pranešimų

Šis fragmentas veikia puikiai, tačiau jei fragmentas turėtų veikti kiekvieną minutę serveryje, kai tik mūsų mėgstamiausias „Twitcher“ pasirodys tiesiogiai, mes kiekvieną minutę gausime 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

Tikiuosi, kad šis įrašas jums patiko ir kad išmokote jį skaitydami. Aš tikrai tikiu, kad tokio tipo projektas yra vienas geriausių būdų išmokti naujų įrankių ir koncepcijų. Neseniai paleidžiau žiniatinklio sąveikos API, kur daug išmokau jį kurdamas.

Prašau pasakykite komentaruose, ar jums patiko šis formatas ir ar norite padaryti daugiau.

Turiu daug kitų idėjų ir tikiuosi, kad jos jums patiks. Nedvejodami pasidalinkite, ką dar galite sukurti naudodami šį fragmentą, galimybės yra begalinės.

Laimingo kodavimo.

Pjeras

Nenorite praleisti mano kito įrašo:

Čia galite užsiprenumeruoti mano naujienlaiškį.