我有大约8年的代码采摘经验。 在这段时间里,我设法在不同方向上尝试了许多不同的语言和技术:从PHP Devel Studio上各种网络钓鱼笑话的“开发”到现代框架上成熟的Web应用程序和神经网络上的软件。 顺便说一下,由于
这个职位,我第一次沉迷于编程是在12岁。 现在,我进入了计算机科学学士学位的第二年。 直到最近,也就是直到第一年,很长时间以来,每次看到JSON这个词时,我总是很害怕。 理解和理解。 但是我注意到,我小组中的许多人仍然无法使用任何API。 我喜欢那些文章的作者,他们在其中详细解释了他的主题,并附上了代码片段,并嚼碎了为什么和为什么决定这样做,并且不会陷入复杂的术语和技术中。 在本文中,我将描述API的用法(以PUBG API为例),就像他们所说的那样,用一个简单的词来表示新手,不要胡说八道。 走吧

谷歌合作
要完成本文,您将需要最少的Python知识。 所谓“最小”,是指印刷各种表格和字典。 我们将在Google合作环境(以下简称为“ colab”)中工作。 Colab是一个免费的浏览器环境,聪明的人可以在其中使用人工智能训练和测试他们的程序,并进行各种研究。 但是现在对我们来说无关紧要,我们对在那里编写代码的格式感兴趣:那里的执行文件称为“笔记本电脑”(英文-笔记本)。 以这种格式,可以直接在浏览器中编写和执行代码段(colab中的一段代码称为“代码单元”)。
让我们尝试:
- 我们转到 Google Colab并使用您的Google帐户登录
- 主页面将为您提供有关如何使用Colab的帮助,我们将通过单击左上角的File> New Python 3 notebook 创建我们的第一台笔记本电脑
几秒钟后,我们应该看到类似于以下内容:

- 记住以下键盘快捷键:
Ctrl + Enter(对于MacOS为Cmd + Enter) -运行当前代码单元
ALT + Enter(对于MacOS为Option + Enter) -运行当前代码单元,创建并转到新的代码单元
在代码单元中,您可以立即编写常规的python代码。 如果要执行某些控制台命令,则在该行之前插入一个感叹号,例如:
Python代码print('Hello, PUBG!')
控制台团队 !mkdir hello_pubg !cd hello_pubg
让我们尝试执行某种简单的算法,例如,找到两个数字的最大公约数:
- 在代码单元格中,我们输入:
a = 10 b = 8
- 按Alt + Enter(对于MacOS为Option + Enter),然后输入新的代码单元格:
while a != 0 and b != 0: if a > b: a %= b else: b %= a gcd = a + b
- 再次按Alt + Enter(对于MacOS是Option + Enter),然后在新的代码单元中输入:
print(gcd)
然后按Ctrl + Enter(对于MacOS是Cmd + Enter)。 我们得到答案: 2

如您所见,在Colab中工作非常简单,在这里测试将来应用程序的某些功能非常方便。 顺便说一句,如果要使用其他数字执行该算法,则需要更改第一个代码单元中变量的值,启动它,然后启动第二个,然后启动第三个。
我们没有关闭笔记本电脑,让我们走得更远。
PUBG API
简单来说,什么是API。 每次我们访问某个网站时,该网站的服务器都会用HTML代码进行响应,例如,通过转到google.com,Google服务器会将HTML发送到我们的浏览器,由浏览器本身进行处理,并且浏览器向我们展示了一个漂亮的处理了所有样式的图片等。 但这并不总是会发生,例如,通过
此链接,我们将看到与print()命令在python中的字典输出类似的内容。 就是这样 这是我们从
openweathermap获得的当前天气信息的字典。 一个人永远不会自己处理来自服务器的此类响应。 该站点的开发人员已向我们提供了此类链接,以便我们可以在程序中使用它们。 通常,如果需要在我们的网站或应用程序上进行天气阻止,则可以转到openweathermap(或提供API的任何其他类似物),打开其文档并使用它。 解码和翻译成俄语的API听起来像“应用程序编程接口”,即
site.com/request形式的请求的集合,这些请求返回包含我们所需信息的字典。 这些字典的格式称为JSON。 还有一种XML格式,但是在本文中我们将不对其进行分析。
首先,我写道我们将使用游戏PUBG开发人员的
官方API 。 让我们开始吧。
这是我们用来验证获得的阵型
的资源 ,在新选项卡中将其打开,然后在搜索玩家的过程中输入任何玩家的昵称,例如“ Twitch_todol”。 该玩家的统计信息将打开:

我们打开他的最后一场比赛(列表中的第一场),然后查看我们需要的所有信息:

要从PUBG API获取有关此匹配项的信息:
- 我们转到 PUBG开发人员的官方页面 。
- 通过单击“获取您自己的API密钥”按钮登录或注册页面。 我们是否玩这个游戏都没关系。 我们只需要从此站点获取我们的令牌,即api密钥。
每次使用PUBG服务器获取任何信息时,我们都需要为其提供唯一的令牌。 这样做有多种原因,最明显的是,游戏开发人员可以知道谁确切地从服务器接收信息,并对每个程序员进行限制。 在这种情况下,我们有一个限制-每分钟最多10个请求。 这对我们来说绰绰有余。
- 我们创建应用程序并获取令牌

目前,我们在此处输入的内容并不重要。 我们单击“创建”应用程序,然后看到一长串与此类型有关的字符(使用您自己的字符,此字符不起作用):
eyJ0eXAiOiJKV1QiLWFeCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5ZjIwYTJkMC0xMzYwLTAxMzgtZTFhYS03ZDVjOWM4YTdjZWUiLCJpc3MiOiJnYW1lbG9ja2VyIiwiaWF04IjoxNTc4MzkwNDQwLCJwdWIiOiJibHVlaG9sZSIsInRpdGxlIjoicHViZyIsImFwcCI6ImxlYW5jb3JlZ2ctZ21hIn0.fwFwEeEw3OghE8sACAHbpKWlJFBVo6F_DbB7dbanybLIIToJc4
- 复制令牌并使用colab打开标签。 您没有关闭它,对吗?
- 在第一个代码单元格中,我们输入以下代码:
import requests url = "endpoint-url" API_KEY = '< >' header = { "Authorization": "Bearer " + API_KEY, "Accept": "application/vnd.api+json" }
快跑 在这段代码中,我们创建了一个字典(标头),其中包含用于访问PUBG API的基本参数。 每当我们要从字典中获取某些信息时,我们都会将其发送到服务器。 有条件地,我们告诉服务器“您好,我的名字是Petya,”-Petya是我们的令牌-“我想以JSON格式接收来自您的信息!” 我从本页的PUBG API文档中获得了刚刚给您的代码。
- 现在我们需要告诉我们到底需要从服务器那里得到什么。 在我们的案例中,我们想从他那里获得Twitch_todol玩家的最后一场比赛。 有关播放器的信息,请在以下位置提出要求
api.pubg.com/shards/steam/players?filter [playerNames] = Twitch_todol
那就是(在新的代码单元中):
player_name = 'Twitch_todol' r = requests.get('https://api.pubg.com/shards/steam/players?filter[playerNames]=' + player_name, headers=header) player = r.json()
在第二行中,我们使用请求库中的函数,其中第一个参数是服务器需要的参数,第二个参数是标头字典。 换句话说,我们对服务器说:“您好,我是Petya! 我想从您那里获得有关JSON格式的Twitch_todol播放器的信息。
在第三行中,我们将服务器的响应转换为相同的JSON。 我们为什么要这样做? 事实是服务器不会向我们返回json响应,而是将json转换为字符串。 并使用.json()方法,将这种字符串转换为Python可以理解的字典。
让我们通过编写新的代码单元格来确保这一点:
type(player)
答案是字典 。 也就是说,现在我们可以肯定地知道player变量包含一个字典,Python可以理解该字典并提供有关播放器的信息。
- 这本词典到底包含什么? 让我们来看看
player.keys()
我们看到了答案:
dict_keys(['数据','链接','元'])
这些是我们字典的键。 每个页面包含的内容都写在此页面上 。
为了确保获得所需的播放器,我们将编写以下内容:
player['data'][0]['attributes']
在这里,我们看到有关玩家的基本信息:他的注册时间,昵称,在哪个平台上玩游戏等等。
- 我们需要获取他的上一场比赛的ID,我们可以通过pubg.op.gg网站进行验证,该网站已经在我们的浏览器标签中打开。 为此,我们写:
player['data'][0]['relationships']['matches']['data'][0]['id']
我们得到的内容类似于“ ca2c453b-649a-4556-b768-66b9e01aae63”(您可能会有所不同,因为在阅读本文时,该玩家可能已经玩了几次比赛)。 用你得到的东西。 我举一个例子,以免引起您的困惑。
因此,我们知道了比赛的ID,现在让我们获取有关比赛的信息,为此,我们创建了一个变量match_id,它等于我们收到的ID。 并且我们在稍微不同的地址处发出请求,但是按照通常的方案,即:
match_id = player['data'][0]['relationships']['matches']['data'][0]['id']
- match变量,它是一个字典,包含有关该匹配的所有信息。 首先,我们将获得本场比赛所有球员的表现:
match_players = [item for item in match['included'] if item['type'] == 'participant'] match_players
在这种情况下,我们填写玩家列表(match_players),并进行字典匹配['included'](“ included”是字典词典的键,其中包含比赛中所有玩家的指示符),同时检查键“ type”的值。 我们为什么要检查
match ['included']包含玩家信息吗? 事实并非完全如此,比赛['included']还包含有关这些球员参加过的球队的信息(即项目['type']可以等于“花名册”)。 也就是说,match ['included']看起来像这样:
[玩家,团队,团队,玩家,玩家,玩家,团队,...]
尚不清楚为什么开发人员决定这样做,但这并没有以任何方式困扰我们。
因此,我们获得了球员的表现,但是我们对其他球员在这场比赛中的表现并不特别感兴趣,我们将看看球员Twitch_todol在这场比赛中的表现。 为此,我们执行:
my_player_stats = [item for item in match_players if item['attributes']['stats']['name'] == player_name][0] my_player_stats
比较结果统计信息:

有关pubg.op.gg的统计信息

我们看到一切都是一致的。 欢喜! 顺便说一句,在我写这篇文章的时候,我们的英雄已经设法打了几场比赛,所以上面我给出的一些屏幕截图可能并不相同。
完成时间
在本文中,我想告诉最小的程序员,您不必担心JSON和API这两个词,它们可以方便,清晰地实现并且每个文档都附带有文档。 我试图用最易用的语言来解释这一点,而不使用复杂的术语。
同时,我还要感谢Habr和作者(
ArhMax )帮助我8年来第一次编写代码。