Создайте приложение NBA к сезону F5!

В свете 30 июня 2022 года — даты, когда команды НБА могут начать переговоры со свободными агентами, — сейчас самое интересное время для баскетбольного болельщика. Мы уже видели столько новостей: Кевин Дюрант и Кайри Ирвинг требуют обмена, Тимбервулвз отдают ферму за Руди Голберта, и, конечно, многое другое еще впереди.

Я знаю многих болельщиков, которые нажимают F5 в своих новостных лентах на компьютерах, так не будет ли интересно сделать это и с телефона? В этом посте я расскажу вам, как написать приложение на Python, которое будет отправлять вам новости NBA.

Предварительные условия

Прежде чем приступить к работе, важно иметь следующее:

  • На вашей машине установлен Python 3.6 или выше.

  • Учетная запись Twilio. Если вы еще не сделали этого, подпишитесь на бесплатную пробную версию Twilio.

  • ngrok установлен на вашей машине. ngrok — это полезный инструмент для подключения вашего локального сервера к публичному URL. Вы можете зарегистрировать бесплатную учетную запись и узнать, как установить ngrok.

Фон

К сожалению, официального API, предоставляемого NBA, не существует. Более того, ESPN прекратила использование своего публичного API, поскольку разработчики больше не могут генерировать API-ключ. Но не бойтесь, разработчики — люди хитрые, и решение есть!

Если вы немного поищете в Google, вы увидите множество независимых сторонних разработчиков, которые создали свои собственные (неофициальные) API NBA в качестве обходного пути. Но для этого приложения я буду использовать API от компании под названием SportsDataIO, которая объединяет множество спортивных данных (не только новости NBA) и позволяет разработчикам получать их через вызовы API.

Архитектура SMS-приложения для новостей NBA

Для контекста, эта статья в блоге структурирована следующим образом:

  1. Установка: Настройка нашей локальной среды разработки

  2. NBA News API: Получить данные о новостях NBA из API SportsDataIO.

  3. Сделать исходящее SMS: Отправить текстовое сообщение (содержащее новости NBA).

  4. Сделать входящее SMS: Отправка текстового сообщения (содержащего новости NBA) при срабатывании приложения

Настройка

Первое, что мы сделаем, это создадим пустой каталог проекта:

mkdir nba_app

Затем перейдите в эту директорию, так как именно там будет находиться наш код.

cd nba_app

Создайте виртуальную среду:

python -m venv nba

Активируйте нашу виртуальную среду:

source nba/bin/activate

Установите зависимости для нашего виртуального окружения:

pip install python-dotenv twilio Flask requests

Чтобы получить данные NBA, нам необходимо зарегистрировать бесплатный аккаунт на SportsDataIO. После этого нам понадобится API-ключ для аутентификации нашего приложения в SportsDataIO. Вы можете найти его в настройках учетной записи в разделе Подписки. Скопируйте свой API-ключ и никому его не сообщайте!

Давайте создадим файл .env для хранения нашего API-ключа в переменных окружения.

В этом файле мы создадим переменную окружения под названием SPORTSDATA_API_KEY. Замените PASTE_YOUR_API_KEY_HERE на ключ API, который вы скопировали ранее.

SPORTSDATA_API_KEY=PASTE_YOUR_API_KEY_HERE

Например:

SPORTSDATA_API_KEY=f121212121212121212

Поскольку мы также будем работать с нашим аккаунтом Twilio, нам нужно будет еще больше изменить этот файл. Войдите в консоль Twilio, затем прокрутите вниз, чтобы найти SID вашей учетной записи и Auth Token. Добавьте две дополнительные строки в файл .env, но измените значения, чтобы они были равны вашему уникальному идентификатору учетной записи и Auth Token.

TWILIO_ACCOUNT_SID=PASTE_YOUR_ACCOUNT_SID_HERE
TWILIO_AUTH_TOKEN=PASTE_YOUR_AUTH_TOKEN_HERE

Например:

TWILIO_ACCOUNT_SID=AC123123123123123123
TWILIO_AUTH_TOKEN=321321321321321

Если вы размещаете эти данные в репозитории Git, пожалуйста, убедитесь, что добавили файл .env в .gitignore, чтобы эти учетные данные были защищены.

API новостей NBA

Создайте файл nba_news.py: здесь мы будем вызывать API новостей NBA от SportsDataIO.

В самой простой форме мы можем получить данные NBA News с помощью следующего кода:

import requests
import os
from dotenv import load_dotenv

load_dotenv()

url = f'https://api.sportsdata.io/v3/nba/scores/json/News'

params = {
    'key': os.getenv('SPORTSDATA_API_KEY')
}

def get_news():
    response = requests.get(url, params=params)
    return response.json()
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы сможете увидеть ответ в JSON или в браузере, обратившись к конечной точке /News и добавив свой ключ API в качестве строки запроса. Это может выглядеть следующим образом:

https://api.sportsdata.io/v3/nba/scores/json/News?key={YOUR_API_KEY}

Если вы отформатируете ответ в формате JSON, то увидите ключ под названием «Категории». Согласно словарю данных SportsDataIO на момент написания этого поста, потенциальными возвращаемыми значениями являются: Top Headlines, Breaking News, Injury, Sit/Start, Waiver Wire, Risers, Fallers, Lineups, Transactions, Free Agents, Prospects/Rookies, Game Recap, Matchup Outlook.

На данный момент я заинтересован в получении данных, которые относятся к категории «Top-Headlines». Чтобы отфильтровать их, я собираюсь заменить код в nba_news.py на следующий:

import requests
import os

from datetime import date
from dotenv import load_dotenv
from twilio.rest import Client

load_dotenv()

today = date.today()


# we are hitting 2 endpoints which returns news for today & news for all days
url_news_today = f'https://api.sportsdata.io/v3/nba/scores/json/NewsByDate/{today}'
url_news_all = f'https://api.sportsdata.io/v3/nba/scores/json/News'


# we stored our API key in the .env file and are accessing it here, then storing them as parameters for our HTTP request
params = {
    'key': os.getenv('SPORTSDATA_API_KEY')
}


# we are creating a function to either get the news for today or getting all news
def get_news(date=None):
    if date == 'today':
        response = requests.get(url_news_today, params=params)
    else:
        response = requests.get(url_news_all, params=params)
    return response.json()


# we are looping through the JSON response and seeing if ‘Top-Headlines’ are in the Category key.
def check_transactions(response, target_category):
    for news in response:
        if target_category in news['Categories']:
            return True
    return False


# we return a string output that contains the title and date of a ‘Top-Headlines’ news
def print_transactions(response, target_category):
    output = ''
    for news in response:
        if target_category in news['Categories']:
            output += f"Title: {news['Title']}n"
            output += f"Date: {news['TimeAgo']}n"
            output += '----------------------------------------n'
    return output


# we take in user input. if the user enters F5, we will get news from today only. if the user enters anything else, we will get news from all days.
def get_transactions(date=None):
    target_category = 'Top-Headlines'

    if date and 'f5' in date.lower():
        response = get_news('today')
        if not check_transactions(response, target_category):
            return('No transactions today, keep F5ing')
    else:
        response = get_news()
    return print_transactions(response, target_category)
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы можем протестировать код, вызвав get_transactions().

Например, добавьте следующее в конец файла:

if __name__ == '__main__':
print(get_transactions())

Затем выполните следующее в командной строке:

python nba_news.app

Вы также можете протестировать его, введя аргумент, содержащий текст ‘F5’. Это даст вам новости за текущий день. Но если новостей нет, вы получите сообщение о том, что вам следует продолжать нажимать F5.

Сделайте исходящее SMS

Мы успешно вернули нужные нам данные, теперь пришло время проверить их с помощью исходящего SMS. Думайте об исходящем SMS как об отправке текстового сообщения «OUT» на чей-то номер телефона. Итак, мы пытаемся отправить текстовое сообщение OUT о новостях NBA.

В том же файле создадим новую функцию send_text() для отправки текстового сообщения на выбранный вами номер телефона с вашего номера телефона Twilio. Просто не забудьте заменить ‘ENTER_YOUR_TWILIO_NUMBER’ на ваш номер Twilio (найденный в консоли), а ‘ENTER_THE_NUMBER_YOURE_TEXTING_TO’ на номер телефона, на который вы хотите отправить текстовое сообщение.

def send_text(option=None):
    account_sid = os.getenv('TWILIO_ACCOUNT_SID')
    auth_token = os.getenv('TWILIO_AUTH_TOKEN')
    client = Client(account_sid, auth_token)

    message = client.messages.create(
        body=get_transactions(option),
        from_='ENTER_YOUR_TWILIO_NUMBER',
        to='ENTER_THE_NUMBER_YOURE_TEXTING_TO'
    )
    print(message.body)
Вход в полноэкранный режим Выход из полноэкранного режима

В приведенном выше коде обратите внимание, что тело нашего сообщения представляет собой вызов функции, которая возвращает NBA-новость.

Ниже этой функции вызовите ее, например, send_text() и по желанию введите строковый аргумент, например, ‘give me news’. Помните, что если аргумент содержит ‘F5’, мы получим новости за сегодня (все остальное вернет все новости).

Вернувшись в консоль, повторно запустите файл:

python nba_news.py

Если вы ввели свой собственный номер телефона в параметре «to», то на ваш телефон должно быть отправлено текстовое сообщение!

Создание входящего SMS-сообщения

Если в нашем ответе были новости NBA, мы должны были успешно отправить SMS-сообщение с заголовками лучших новостей лиги. Теперь мы собираемся создать часть нашего приложения для входящего SMS. Думайте о входящем SMS как о входящем SMS, запускающем ваше приложение. В данном случае мы будем отправлять текст на телефонный номер Twilio (наш триггер), а затем попросим его отправить ответное сообщение с новостями.

Создайте новый файл (в той же директории) под названием app.py. Используя Flask, веб-фреймворк для Python, мы создадим приложение, которое будет работать на локальном сервере. Скопируйте следующий код в app.py:

from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse


# we need to access the code we wrote earlier in this file
from nba_news import get_transactions

app = Flask(__name__)

@app.route("/nba", methods=['GET', 'POST'])
def incoming_sms():
    # take in user input, which is contents of a text message that a user sends
    user_input = request.values.get('Body', None)
    # call our function to get nba news and return it as a string 
    transactions = get_transactions(user_input)

    resp = MessagingResponse()
    # send a message that contains the string content
    resp.message(transactions)

    return str(resp)

if __name__ == "__main__":
    app.run(host='localhost', debug=True, port=8080)
Войти в полноэкранный режим Выйти из полноэкранного режима

Запустите приложение на локальном сервере с помощью этой команды в терминале:

python app.py

Ваше приложение должно быть запущено на http://localhost:8080. Вывод будет выглядеть примерно так:

* Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://localhost:8080 (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 199-776-319
Вход в полноэкранный режим Выход из полноэкранного режима

На данный момент наше приложение работает только на сервере внутри вашего компьютера. Но нам нужен публичный URL (не http://localhost) для настройки Webhook, чтобы Twilio мог найти его. Используя инструмент под названием ngrok, мы «выведем localhost в Интернет», чтобы мы могли настроить наш webhook.

В другой вкладке консоли выполните команду:

ngrok http 8080

Это создаст «туннель» из публичного Интернета в порт 8080 на нашей локальной машине, где приложение Flask прослушивает запросы. Вы должны увидеть вывод, похожий на этот:

Обратите внимание на строку с надписью «Forwarding». На изображении выше она показывает:
https://5bad813c2718.ngrok.io -> http://localhost:8080

Это означает, что наше локальное приложение работает публично на https://5bad813c2718.ngrok.io/nba.

В консоли введите ngrok URL в качестве Webhook, когда «A Message Comes In».

Имейте в виду, что если у вас нет платного аккаунта, каждый раз при запуске команды ngrok будет генерироваться новый URL, поэтому не забудьте внести изменения в консоли Twilio.

Поскольку наше приложение и ngrok запущены, мы можем отправить текстовое сообщение на наш номер телефона Twilio, и он ответит нам новостями NBA!

Если вы отправите сообщение «F5», а новостей в этот день не будет, вы получите вот такое сообщение:

А если вы не любите баскетбол, но хотите получать новости по другим видам спорта?

Поскольку мы используем API SportsDataIO, они предоставляют разработчикам конечные точки для разных видов спорта. Если вас не интересуют новости NBA, ознакомьтесь с другими видами спорта в документации по API.

Более того, если вы хотите сделать что-то со статистикой игроков, турнирной таблицей команд, расписанием, статистикой фэнтези и многим другим, просто посмотрите, что предлагает SportsDataIO.

Покажите мне, что вы создали

Теперь, когда вы можете нажимать F5 со своего телефона, вы не пропустите ни один из главных заголовков в мире НБА. Так что продолжайте следить за F5 до начала сезона 19 октября 2022 года.

Большое спасибо, что прочитали! Если вы нашли это руководство полезным, у вас есть вопросы или вы хотите показать мне, что вы создали, дайте мне знать об этом в Интернете. А если вы хотите узнать обо мне больше, ознакомьтесь с моей вступительной статьей в блоге.

Twitter @anthonyjdella
LinkedIn @anthonydellavecchia
GitHub @anthonyjdella
Medium @anthonyjdella
Dev.to @anthonyjdella
Электронная почта: adellavecchia@twilio.com
Личный сайт: anthonydellavecchia.com

Оцените статью
devanswers.ru
Добавить комментарий