Bună tuturor 🙂 Astăzi încep o nouă serie de postări special destinate începătorilor Python. Conceptul este destul de simplu: voi face un proiect distractiv, în cât mai puține linii de cod posibil și voi încerca cât mai multe instrumente noi.

De exemplu, astăzi vom învăța să folosim Twilio API, Twitch API și vom vedea cum să implementăm proiectul pe Heroku. Vă voi arăta cum puteți avea propriul dvs. notificator SMS „Twitch Live”, în 30 de linii de coduri și cu 12 cenți pe lună.

Condiție prealabilă: Trebuie doar să știți cum să rulați Python pe mașina dvs. și câteva comenzi de bază în git (commit & push). Dacă aveți nevoie de ajutor cu acestea, vă pot recomanda aceste 2 articole:

Ghid de instalare și configurare Python 3

Ultimul tutorial Git Command pentru începători de la Adrian Hajdin.

Ce veți învăța:

  • API Twitch
  • API Twilio
  • Implementarea pe Heroku
  • Configurarea unui planificator pe Heroku

Ce veți construi:

Specificațiile sunt simple: dorim să primim un SMS de îndată ce un Twitcher specific este transmis în direct. Vrem să știm când această persoană intră în direct și când pleacă din streaming. Vrem ca toată treaba asta să se desfășoare singură, toată ziua.

Vom împărți proiectul în 3 părți. În primul rând, vom vedea cum să știm programatic dacă un anumit Twitcher este online. Apoi vom vedea cum să primim un SMS când se întâmplă acest lucru. Vom termina prin a vedea cum să facem ca această bucată de cod să ruleze la fiecare X minute, astfel încât să nu pierdem niciodată un alt moment din viața noastră de streamer preferat.

Este Twitcher live?

Pentru a ști dacă un Twitcher este live, putem face două lucruri: putem accesa adresa URL Twitcher și putem încerca să vedem dacă există insigna „Live”.

Un proiect Python in 30 de linii de cod cum
Captură de ecran a unui streaming live Twitcher.

Acest proces implică răzuirea și nu este ușor de realizat în Python în mai puțin de 20 de linii de cod. Twitch rulează o mulțime de cod JS și o simplă request.get () nu va fi suficientă.

Pentru ca răzuirea să funcționeze, în acest caz, ar trebui să răzuim această pagină în Chrome pentru a obține același conținut ca ceea ce vedeți în captura de ecran. Acest lucru este realizabil, dar va dura mult mai mult de 30 de linii de cod. Dacă doriți să aflați mai multe, nu ezitați să verificați recenta mea răzuire web fără a fi blocat ghid. (Am lansat recent ScrapingBee, a instrument de răzuire web de aici și cunoștințele mele în domeniu;))

Deci, în loc să încercăm să-l răzuim pe Twitch, vom folosi API-ul lor. Pentru cei care nu sunt familiarizați cu termenul, un API este o interfață programatică care permite site-urilor web să expună caracteristicile și datele lor oricui, în principal dezvoltatorilor. În cazul lui Twitch, API-ul lor este expus prin HTTP, vrăjitoarea înseamnă că putem avea o mulțime de informații și putem face o mulțime de lucruri prin simpla solicitare HTTP.

Obțineți cheia API

Pentru a face acest lucru, trebuie mai întâi să creați o cheie API Twitch. Multe servicii impun autentificarea pentru API-urile lor pentru a se asigura că nimeni nu le abuzează sau pentru a restricționa accesul la anumite funcții de către anumite persoane.

Vă rugăm să urmați acești pași pentru a obține cheia API:

  • Creați un cont Twitch
  • Acum creați un Twitch cont dev -> „Înscriere cu Twitch” în dreapta sus
  • Accesați „tabloul de bord” după ce v-ați conectat
  • „Înregistrați-vă cererea”
  • Nume -> Orice, URL de redirecționare Oauth -> http: // localhost, Categorie -> Orice

Acum ar trebui să vedeți, în partea de jos a ecranului, codul dvs. de client. Păstrați acest lucru pentru mai târziu.

Este Twitcher în streaming acum?

Având cheia API în mână, putem interoga acum API-ul Twitch pentru a avea informațiile dorite, așa că să începem să codăm. Următorul fragment consumă doar API-ul Twitch cu parametrii corecți și imprimă răspunsul.

# requests is the go to package in python to make http request
# https://2.python-requests.org/en/master/
import requests

# This is one of the route where Twich expose data, 
# They have many more: https://dev.twitch.tv/docs
endpoint = "https://api.twitch.tv/helix/streams?"

# In order to authenticate we need to pass our api key through header
headers = {"Client-ID": "<YOUR-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())

Rezultatul ar trebui să arate astfel:

{
   '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':'https://static-cdn.jtvnw.net/previews-ttv/live_user_solary-{width}x{height}.jpg',
         'tag_ids':[
            '6f655045-9989-4ef7-8f85-1edcec42d648'
         ]
      }
   ],
   'pagination':{
      'cursor':'eyJiIjpudWxsLCJhIjp7Ik9mZnNldCI6MX19'
   }
}

Acest format de date se numește JSON și este ușor de citit. data obiect este o matrice care conține toate fluxurile active în prezent. Cheia type se asigură că fluxul este în prezent live. Această cheie va fi goală altfel (în caz de eroare, de exemplu).

Deci, dacă dorim să creăm o variabilă booleană în Python care stochează dacă utilizatorul curent este în flux, tot ce trebuie să adăugăm la codul nostru este:

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)

In acest punct, at_least_one_stream_active este adevărat când Twitcher-ul tău preferat este live.

Să vedem acum cum să primim notificări prin SMS.

Trimite-mi un text, ACUM!

Deci, pentru a ne trimite un text, vom folosi API-ul Twilio. Treci doar Acolo și creați un cont. Când vi se solicită să vă confirmați numărul de telefon, vă rugăm să utilizați numărul de telefon pe care doriți să îl utilizați în acest proiect. Astfel veți putea folosi creditul gratuit de 15 USD oferit de Twilio noilor utilizatori. La aproximativ 1 cent un text, ar trebui să fie suficient ca botul dvs. să ruleze timp de un an.

Dacă mergi pe consolă, o să-ți vezi Account SID si al tau Auth Token , salvați-le pentru mai târziu. De asemenea, faceți clic pe butonul roșu mare „Obțineți numărul meu de încercare”, urmați pasul și salvați-l și pentru mai târziu.

Trimiterea unui text cu API-ul Twilio Python este foarte ușoară, deoarece oferă un pachet care face lucrurile enervante pentru dvs. Instalați pachetul cu pip install Twilio și doar faceți:

from twilio.rest import Client
client = Client(<Your Account SID>, <Your Auth Token>)
client.messages.create(
	body='Test MSG',from_=<Your Trial Number>,to=<Your Real Number>)

Și asta este tot ce ai nevoie pentru a-ți trimite un text, uimitor nu?

Punând totul împreună

Acum vom pune totul împreună și vom scurta puțin codul, așa că vom reuși să spunem sub 30 de linii de cod Python.

import requests
from twilio.rest import Client
endpoint = "https://api.twitch.tv/helix/streams?"
headers = {"Client-ID": "<YOUR-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(<Your Account SID>, <Your Auth Token>)
	client.messages.create(body='LIVE !!!',from_=<Your Trial Number>,to=<Your Real Number>)
Mai au 16 linii!

Evitarea notificărilor duble

Acest fragment funcționează excelent, dar dacă fragmentul respectiv rulează în fiecare minut pe un server, de îndată ce Twitcher-ul nostru preferat va fi difuzat, vom primi un SMS în fiecare minut.

Avem nevoie de o modalitate de a stoca faptul că am fost deja anunțați că Twitcher-ul nostru este live și că nu mai trebuie să fim anunțați.

Lucrul bun cu API-ul Twilio este că oferă o modalitate de a prelua istoricul mesajelor noastre, așa că trebuie doar să preluăm ultimul SMS pe care l-am trimis pentru a vedea dacă am trimis deja un text care să ne anunțe că twitcher-ul este live.

Iată ce vom face în pseudocod:

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

În acest fel, vom primi un text imediat ce fluxul începe, precum și când acesta se termină. În acest fel, nu vom primi spam – perfect nu? Să o codificăm:

# 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

Să punem acum totul la loc:

import requests
from twilio.rest import Client
client = Client(<Your Account SID>, <Your Auth Token>)

endpoint = "https://api.twitch.tv/helix/streams?"
headers = {"Client-ID": "<YOUR-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_=<Your Trial Number>,to=<Your Real Number>)
if not at_least_one_stream_active and not offline_notified:
	client.messages.create(body='OFFLINE !!!',from_=<Your Trial Number>,to=<Your Real Number>)

Și voilà!

Acum aveți un fragment de cod, în mai puțin de 30 de linii de Python, care vă va trimite un text imediat ce Twitcher-ul dvs. preferat intră online / offline și fără a vă trimite spam.

Abia acum avem nevoie de o modalitate de a găzdui și a rula acest fragment la fiecare X minute.

Căutarea unei gazde

Pentru a găzdui și a rula acest fragment, vom folosi Heroku. Heroku este sincer unul dintre cele mai simple moduri de a găzdui o aplicație pe web. Dezavantajul este că este foarte scump în comparație cu alte soluții disponibile. Din fericire pentru noi, ei au un plan generos gratuit, care ne va permite să facem ceea ce vrem pentru aproape nimic.

Dacă nu faceți deja, trebuie să creați un Cont Heroku. De asemenea, trebuie descărcați și instalați clientul Heroku.

Acum trebuie să vă mutați scriptul Python în propriul folder, nu uitați să adăugați un requirements.txt fișier în el. Conținutul acestuia din urmă începe:

requests
twilio
Aceasta este pentru a vă asigura că Heroku descarcă dependențele corecte.

cd în acest folder și faceți doar un „heroku create –app `.

Dacă te duci pe tabloul de bord al aplicației veți vedea noua aplicație.

Acum trebuie să inițializăm o repoziție git și să împingem codul pe Heroku:

git init
heroku git:remote -a <app name>
git add .
git commit -am 'Deploy breakthrough script'
git push heroku master

Aplicația dvs. este acum pe Heroku, dar nu face nimic. Deoarece acest mic script nu poate accepta cereri HTTP, mergeți la <app name>.herokuapp.com nu va face nimic. Dar asta nu ar trebui să fie o problemă.

Pentru ca acest script să ruleze 24/7, trebuie să folosim un simplu program de completare Heroku „Heroku Scheduler”. Pentru a instala acest supliment, faceți clic pe butonul „Configurare programe de completare” de pe tabloul de bord al aplicației.

1611218469 458 Un proiect Python in 30 de linii de cod cum

Apoi, pe bara de căutare, căutați Heroku Scheduler:

1611218469 146 Un proiect Python in 30 de linii de cod cum

Faceți clic pe rezultat și faceți clic pe „Furnizare”

1611218470 470 Un proiect Python in 30 de linii de cod cum

Dacă reveniți la tabloul de bord al aplicației, veți vedea suplimentul:

1611218470 907 Un proiect Python in 30 de linii de cod cum

Faceți clic pe linkul „Heroku Scheduler” pentru a configura o lucrare. Apoi faceți clic pe „Creați job”. Aici selectați „10 minute”, iar pentru comanda de rulare selectați `python .py`. Faceți clic pe „Salvați jobul”.

În timp ce tot ce am folosit până acum pe Heroku este gratuit, programatorul Heroku va rula lucrarea în instanța de 25 USD / lună, dar proporțional cu a doua. Deoarece acest script durează aproximativ 3 secunde pentru a rula, pentru ca acest script să ruleze la fiecare 10 minute, ar trebui să cheltuiți doar 12 cenți pe lună.

Idei pentru îmbunătățiri

Sper că ți-a plăcut acest proiect și că te-ai distrat punându-l în practică. În mai puțin de 30 de linii de cod, am făcut multe, dar toată treaba asta este departe de a fi perfectă. Iată câteva idei de îmbunătățire:

  • Trimite-ți mai multe informații despre fluxul curent (joc jucat, numărul de spectatori …)
  • Trimiteți-vă durata ultimului flux odată ce declanșatorul este deconectat
  • Nu vă trimite un text, ci mai degrabă un e-mail
  • Monitorizați mai multe mișcări simultan

Nu ezitați să-mi spuneți în comentarii dacă aveți mai multe idei.

Concluzie

Sper că ți-a plăcut această postare și că ai învățat lucruri citind-o. Cred cu adevărat că acest tip de proiect este una dintre cele mai bune modalități de a învăța noi instrumente și concepte, am lansat recent un API de răzuire web unde am învățat multe în timp ce o făceam.

Vă rog să-mi spuneți în comentarii dacă v-a plăcut acest format și dacă doriți să faceți mai multe.

Am multe alte idei și sper să vă placă. Nu ezitați să împărtășiți ce alte lucruri construiți cu acest fragment, posibilitățile sunt nelimitate.

Codificare fericită.

Pierre

Nu vreau să ratez următoarea mea postare:

Vă puteți abona aici la newsletter-ul meu.