为F5赛季创建一个NBA应用程序!

鉴于 2022 年 6 月 30 日,即 NBA 球队可以开始与自由球员谈判的日期,现在对于篮球迷来说是一个激动人心的时刻。我们已经看到了很多突发新闻,比如凯文杜兰特和凯里欧文要求交易,森林狼队为鲁迪戈尔伯特放弃了农场,当然还有更多。
我知道很多粉丝都在他们的电脑上 F5 他们的新闻提要,所以在你的手机上这样做不是很有趣吗?在这篇文章中,我将教你如何编写一个向你发送 NBA 新闻的 Python 应用程序。
先决条件
在开始之前,在继续之前有以下几点很重要:
-
Python 3.6 或更高版本安装在您的机器上。
-
Twilio 帐户。如果您还没有,请注册免费的 Twilio 试用版。
-
ngrok 安装在你的机器上。 ngrok 是将本地服务器连接到公共 URL 的有用工具。您可以注册一个免费帐户并学习如何安装 ngrok。
背景
不幸的是,NBA 没有提供官方 API。此外,ESPN 已停用其公共 API,因为开发人员无法再生成 API 密钥。但不要害怕,开发人员是狡猾的人,有一个解决方案!
如果您进行一些 Google 搜索,您会看到许多独立的第三方开发人员创建了自己的(非官方)NBA API 作为解决方法。但是对于这个应用程序,我将使用一家名为 SportsDataIO 的公司的 API,它聚合了一堆体育数据(不仅仅是 NBA 新闻),并允许开发人员通过 API 调用来访问它。
SMS NBA 新闻应用程序的架构
就上下文而言,这篇博文的结构如下:
1.设置:设置我们的本地开发环境
-
NBA News API:从 SportsDataIO API 获取 NBA 新闻数据
-
Make an Outbound SMS:发送一条短信(包含NBA新闻)
-
Make an Inbound 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 控制台,然后向下滚动以找到您的 Account SID 和 Auth Token。向 .env 文件添加另外两行,但将值更改为等于您的唯一 Account SID 和 Auth Token。
TWILIO_ACCOUNT_SID=PASTE_YOUR_ACCOUNT_SID_HERE TWILIO_AUTH_TOKEN=PASTE_YOUR_AUTH_TOKEN_HERE
例如:
zoz100027
如果您将这些推送到 Git 存储库,请确保将 .env 文件添加到您的 .gitignore 以确保这些凭据的安全。
NBA新闻API
创建一个名为 nba_news.py的文件:我们将在这里调用 SportsDataIO NBA 新闻 API。
在其最基本的形式中,我们可以使用以下代码获取 NBA 新闻数据:
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()
通过点击 /News 端点并将 API 密钥作为查询字符串附加,您将能够在 JSON 或浏览器中查看响应。这可能看起来像这样:
https://api.sportsdata.io/v3/nba/scores/json/News?key={YOUR_API_KEY}

如果您格式化 JSON 响应,您将看到一个名为“Categories”的键。根据我写这篇文章时的 SportsDataIO 数据字典,潜在的返回值是:头条新闻、突发新闻、受伤、坐下/开始、弃权线、上升者、下降者、阵容、交易、自由球员、前景/新秀、比赛回顾,比赛展望。
目前,我有兴趣获取归类为“头条新闻”的数据。为了过滤这个,我将 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() 来测试代码。
例如,将以下内容添加到文件末尾:
zoz100036
然后,在命令行上运行以下命令:
zoz100037
您还可以通过输入包含文本“F5”的参数来测试它。这将为您提供当天的新闻。但是如果没有任何消息,你会收到一条消息,说你应该继续 F5ing。
出站短信
我们已经成功返回了我们需要的数据,现在是时候使用出站 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() 并可选择输入字符串参数,例如“给我新闻”。请记住,如果参数包含“F5”,我们将获得今天的新闻(其他任何内容都将返回所有新闻)。
回到控制台,重新运行文件:
python nba_news.py
如果您在“to”参数中输入了自己的电话号码,则应该会向您的手机发送一条短信!
发入站短信
如果我们的回复中有 NBA 新闻,我们应该已经成功发送了一条包含全联盟头条新闻的短信。现在我们将为入站 SMS 创建应用程序的一部分。将入站视为触发您的应用程序的入站 SMS。在这种情况下,我们将向 Twilio 电话号码(我们的触发器)发送文本,然后让它通过发送包含新闻的回复来响应。
创建一个名为app.py的新文件(在同一目录中)。使用 Python 的 Web 框架 Flask,我们将创建一个在本地服务器上运行的应用程序。将以下代码复制到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您的应用程序应该在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(不是localhost)来配置 Webhook,以便 Twilio 可以找到它。通过使用一个名为 ngrok 的工具,我们将“将 localhost 放到 Internet 上”,这样我们就可以配置我们的 webhook。
在另一个控制台选项卡中,运行以下命令:
ngrok http 8080这将创建一个从公共 Internet 到我们本地计算机的端口 8080 的“隧道”,Flask 应用程序正在侦听请求。您应该会看到与此类似的输出:

请注意显示“转发”的行。在上图中,它显示:5bad813c2718.ngrok.io->localhost:8080
这意味着我们的本地应用程序在5bad813c2718.ngrok.io/nba上公开运行
在控制台中,当“A Message Comes In”时输入 ngrok URL 作为 Webhook。

请注意,除非您有付费帐户,否则每次运行 ngrok 命令时都会生成一个新 URL,因此请务必在 Twilio 控制台中进行更改。
由于我们的应用程序和 ngrok 正在运行,我们可以向我们的 Twilio 电话号码发送一条短信,它会回复 NBA 新闻!

如果您发短信“F5”并且当天没有消息,您将收到如下消息:

如果你不喜欢篮球但想了解其他运动的消息怎么办?
由于我们使用的是 SportsDataIO API,它们为开发人员提供了多种运动的端点。如果您对 NBA 新闻不感兴趣,请查看他们的 API 文档中的其他运动项目。
此外,如果您想对球员统计数据、球队积分榜、赛程表、梦幻数据等做一些事情,只需看看 SportsDataIO 提供的内容。
告诉我你构建了什么
现在您可以通过手机进行 F5,您将不会错过任何 NBA 世界头条新闻。所以,继续加油,直到 2022 年 10 月 19 日赛季开始。
非常感谢您的阅读!如果您发现本教程有帮助、有任何疑问或想向我展示您构建的内容,请在线告诉我。如果您想了解更多关于我的信息,请查看我的介绍性博客文章。

Twitter @anthonyjdella LinkedIn @anthonydellavecchia GitHub @anthonyjdella Medium @anthonyjdella Dev.to @anthonyjdella Email: adellavecchia@twilio.com Personal Website: anthonydellavecchia .com
更多推荐

所有评论(0)