Питхон пројекат у 30 редова кода: како поставити СМС обавештење када ваш омиљени Твитцхер стримује

Поздрав свима :) Данас започињем нову серију постова посебно намењених почетницима на Питхону. Концепт је прилично једноставан: урадићу забаван пројекат у што мање редова кода и испробаћу што више нових алата.

На пример, данас ћемо научити да користимо Твилио АПИ, Твитцх АПИ и видећемо како да применимо пројекат на Хероку. Показаћу вам како можете да имате свој сопствени СМС обавештавач „Твитцх Ливе“, у 30 линија кода и за 12 центи месечно.

Предуслов : Потребно је само да знате како да покренете Питхон на својој машини и неке основне команде у гит-у (цоммит & пусх). Ако вам је потребна помоћ са овим, могу вам препоручити ова два чланка:

Питхон 3 Водич за инсталацију и подешавање

Крајњи водич за команде Гит-а за почетнике, Адриан Хајдин.

Шта ћете научити :

  • Твитцх АПИ
  • Твилио АПИ
  • Распоређивање на Херокуу
  • Постављање планера на Хероку

Шта ћете градити:

Спецификације су једноставне: желимо да примимо СМС чим одређени Твитцхер почне уживо. Желимо да знамо када ова особа иде уживо и када напушта стриминг. Желимо да цела ова ствар траје сама, цео дан.

Пројекат ћемо поделити на 3 дела. Прво ћемо видети како програмски знати да ли је одређени Твитцхер на мрежи. Тада ћемо видети како да примимо СМС када се то догоди. Завршићемо тако што ћемо видети како да покренемо овај део кода сваких Кс минута, тако да никада не пропустимо ниједан тренутак из живота нашег омиљеног стримера.

Да ли је овај Твитцхер уживо?

Да бисмо знали да ли је Твитцхер активан, можемо учинити две ствари: можемо отићи на УРЛ Твитцхер-а и покушати да видимо да ли је тамо значка „Уживо“.

Овај поступак укључује стругање и није лако изведив у Питхону за мање од 20 редова кода. Твитцх покреће пуно ЈС кода и једноставан рекуест.гет () неће бити довољан.

Да би стругање успело, у овом случају би требало да стругамо ову страницу у Цхроме-у да бисмо добили исти садржај попут оног који видите на снимку екрана. Ово је изводљиво, али биће потребно много више од 30 редова кода. Ако желите да сазнате више, не устручавајте се да проверите моје недавно стругање по интернету, а да не добијете блокирани водич. (Недавно сам лансирао СцрапингБее, алатку за стругање веба, отуда и моје знање из те области;))

Дакле, уместо да покушавамо да стружемо Твитцх, ми ћемо користити њихов АПИ. За оне који нису упознати са тим појмом, АПИ је програмски интерфејс који омогућава веб локацијама да излажу своје функције и податке било коме, углавном програмерима. У Твитцх-овом случају, њихов АПИ је изложен путем ХТТП-а, што значи да можемо имати пуно информација и учинити много ствари једноставним постављањем једноставног ХТТП захтева.

Набавите свој АПИ кључ

Да бисте то урадили, прво морате створити Твитцх АПИ кључ. Многе услуге намећу потврду идентитета за своје АПИ-је како би се осигурало да их нико не злоупотребљава или да би ограничиле приступ одређеним функцијама одређеним људима.

Слиједите ове кораке да бисте добили свој АПИ кључ:

  • Направите Твитцх налог
  • Сада креирајте Твитцх дев налог -> „Регистровање помоћу Твитцха“ горе десно
  • Идите на „контролну таблу“ након што се пријавите
  • „Региструјте своју пријаву“
  • Име -> Свеједно, УРЛ адреса преусмеравања Оаутх -> // лоцалхост, Категорија -> Свеједно

Сада бисте требали видети, при дну екрана, свој ИД клијента. Задржи ово за касније.

Да ли то Твитцхер сада стримује?

Са вашим АПИ кључем у руци, сада можемо да упитамо Твитцх АПИ да добије информације које желимо, па почнимо са кодирањем. Следећи исечак само троши Твитцх АПИ са тачним параметрима и исписује одговор.

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

Овај формат података назива се ЈСОН и лако је читљив. dataОбјекат је низ који садржи све тренутно активне токове. Кључ typeосигурава да је ток тренутно live. У супротном ће овај кључ бити празан (на пример у случају грешке).

Дакле, ако желимо да креирамо логичку променљиву у Питхону која чува да ли тренутни корисник стримује, све што морамо додати нашем коду је:

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је Тачно када је ваш омиљени Твитцхер уживо.

Погледајмо сада како ћемо бити обавештени СМС-ом.

Пошаљите ми текст, САДА!

Дакле, да бисмо себи послали текст, користићемо Твилио АПИ. Само идите тамо и отворите рачун. Када се од вас затражи да потврдите свој телефонски број, користите телефонски број који желите да користите у овом пројекту. На овај начин моћи ћете да искористите 15 УСД бесплатног кредита који Твилио нуди новим корисницима. Отприлике 1 цент на текст, требало би да буде довољно да ваш бот ради једну годину.

Ако уђете на конзолу, видећете своје Account SIDи своје Auth Token, сачувајте их за касније. Такође кликните на велико црвено дугме „Набавите мој пробни број“, следите корак и сачувајте и овај за касније.

Слање текста помоћу Твилио Питхон АПИ-ја је врло једноставно, јер они нуде пакет који за вас ради досадне ствари. Инсталирајте пакет помоћу pip install Twilioи само урадите:

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

И то је све што вам треба да бисте себи послали текст, невероватно, зар не?

Састављајући све

Сада ћемо све саставити и мало скратити код тако да успевамо да кажемо испод 30 редова Питхон кода.

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

Избегавање двоструких обавештења

Овај исечак одлично функционише, али ако се тај исечак покреће сваког минута на серверу, чим наш омиљени Твитцхер крене уживо, добићемо СМС сваког минута.

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

Надам се да вам се свидео овај пост и да сте научили ствари читајући га. Искрено верујем да је овакав пројекат један од најбољих начина за учење нових алата и концепата, недавно сам покренуо АПИ за стругање по вебу где сам научио пуно тога правећи га.

У коментарима ми реците да ли вам се свидео овај формат и желите ли да урадите више.

Имам много других идеја и надам се да ће вам се свидети. Не устручавајте се да поделите шта све још направите помоћу овог исечка, могућности је безброј.

Хаппи Цодинг.

Пиерре

Не желим да пропустим следећи пост:

Овде се можете претплатити на мој билтен.