Não tenha medo do JSON ou do seu primeiro aplicativo de API

Eu tenho cerca de 8 anos de experiência escolhendo código. Durante esse período, consegui experimentar muitas linguagens e tecnologias diferentes em diferentes direções: desde o "desenvolvimento" de todos os tipos de piadas de phishing no PHP Devel Studio até aplicativos da Web completos em estruturas modernas e software em redes neurais. A propósito, minha primeira imersão em programação ocorreu aos 12 anos, graças a este post. Agora estou no meu segundo ano de bacharelado em Ciência da Computação. Até recentemente, ou seja, até o primeiro ano, por um longo tempo, eu sempre me assustava toda vez que via a palavra JSON. Entendido e compreendido. Mas notei que muitos caras do meu grupo ainda não trabalhavam com nenhuma API. Adoro artigos em que o autor explica seu tópico em detalhes, anexando trechos de código e analisando por que e por que ele decidiu fazê-lo, e não se joga em termos e tecnologias complexos. Neste artigo, descreverei o uso da API (usando a API do PUBG como exemplo) com palavras simples para um novato, como costumam dizer, sem besteira. Vamos lá!

imagem

Colab do Google


Para concluir este artigo, você precisará de um conhecimento mínimo de Python. Por "mínimo", quero dizer imprimir, se, para, bem, todos os tipos de folhas, dicionários. Trabalharemos no ambiente do Google Colaboratory (daqui em diante - simplesmente "colab"). O Colab é um ambiente de navegador gratuito, onde caras inteligentes treinam e testam seus programas com inteligência artificial e fazem todo tipo de pesquisa. Mas agora não importa para nós, estamos interessados ​​no formato para escrever o código: os arquivos em execução são chamados de "laptops" (do inglês - um notebook). Nesse formato, o código pode ser escrito e executado em partes (uma parte da colab é chamada de “célula de código”) diretamente no navegador.

Vamos tentar:

  1. Vamos ao Google Colab e fazemos login com sua conta do Google
  2. Seremos recebidos pela página principal com ajuda sobre como usar o Colab, e criamos nosso primeiro laptop clicando em Arquivo> Novo bloco de anotações Python 3 no canto superior esquerdo

    Em alguns segundos, devemos ver algo semelhante a este:

  3. Lembre-se dos seguintes atalhos de teclado:
    Ctrl + Enter (Cmd + Enter para MacOS) - Executa a célula de código atual
    ALT + Enter (Opção + Enter para MacOS) - Execute a célula de código atual, crie e vá para a nova célula de código

Na célula de código, você pode escrever imediatamente código python comum. Se queremos executar algum comando do console, um ponto de exclamação é inserido antes da linha, por exemplo:

Código Python

print('Hello, PUBG!') 

Equipe do console

 !mkdir hello_pubg !cd hello_pubg 

Vamos tentar executar algum tipo de algoritmo simples, por exemplo, encontrando o maior divisor comum de dois números:

  1. Na célula de código, inserimos:

     a = 10 b = 8 

  2. Pressione Alt + Enter (Opção + Enter para MacOS) e escreva na nova célula de código:

     while a != 0 and b != 0: if a > b: a %= b else: b %= a gcd = a + b 

  3. Pressione Alt + Enter novamente (Option + Enter para MacOS) e escreva na nova célula de código:

     print(gcd) 

    e pressione Ctrl + Enter (Cmd + Enter para MacOS). Nós obtemos a resposta: 2



Como você pode ver, trabalhar na Colab é muito simples e testar algumas funcionalidades do seu aplicativo futuro é muito conveniente aqui. A propósito, se queremos executar o algoritmo com outros números, precisamos alterar os valores das variáveis ​​na primeira célula de código, iniciá-lo e, em seguida, iniciar o segundo e depois o terceiro.

Nós não fechamos o laptop, vamos mais longe.

API do PUBG


Agora, o que é uma API em palavras simples. Sempre que vamos a um site, o servidor deste site responde com código HTML, ou seja, acessando google.com, por exemplo, o servidor do Google envia HTML para o nosso navegador, que é processado pelo próprio navegador, e o navegador nos mostra uma bela uma imagem, tendo processado todos os estilos, etc. Mas isso nem sempre acontece; por exemplo, seguindo este link, veremos algo semelhante à saída de um dicionário em python com o comando print (). Assim é. Este é um dicionário de informações meteorológicas atuais que obtemos do openweathermap . E uma pessoa nunca lida com essas respostas do servidor por conta própria. Os desenvolvedores deste site nos forneceram esses links para que possamos usá-los em nossos programas. Em geral, se precisarmos fazer um bloqueio climático em nosso site ou aplicativo, vamos ao openweathermap (ou qualquer outro analógico que forneça uma API), abra a documentação e use-a. A API na decodificação e tradução para o russo soa como uma "interface de programação de aplicativos", ou seja, uma coleção de solicitações no formulário site.com/request , que retorna um dicionário com as informações necessárias. E o formato desses dicionários é chamado JSON. Também existe um formato XML, mas não o analisaremos neste artigo.

Inicialmente, escrevi que usaremos a API oficial dos desenvolvedores do jogo PUBG. Vamos começar. Aqui está o recurso com o qual iremos verificar a formação obtida, abrir em uma nova aba e inserir o apelido de qualquer jogador na busca por jogadores, por exemplo, “Twitch_todol”. As estatísticas deste jogador são abertas:



Abrimos sua última partida (a primeira da lista) e vemos todas as informações que precisamos:



Para obter informações sobre essa correspondência na API do PUBG:

  1. Vamos para a página oficial do desenvolvedor do PUBG .
  2. Faça login ou registre - se na página clicando no botão OBTER SUA PRÓPRIA CHAVE DE API. E não importa se jogamos ou não esse jogo. Só precisamos obter nosso token neste site, ou seja, chave api.

    Cada vez, recorrendo ao servidor PUBG para obter qualquer informação, precisamos fornecer nosso token exclusivo. Isso foi feito por vários motivos, sendo o mais óbvio que os desenvolvedores do jogo puderam saber quem recebe exatamente as informações do servidor e fazer restrições para cada programador. Nesse caso, temos uma limitação - não mais que 10 solicitações por minuto. Isso é mais do que suficiente para nós.
  3. Criamos o aplicativo e obtemos nosso token



    No momento, não é muito importante o que inserimos aqui. Clicamos no aplicativo Criar e vemos um longo conjunto de caracteres sobre esse tipo (use o seu, este não funciona):

     eyJ0eXAiOiJKV1QiLWFeCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5ZjIwYTJkMC0xMzYwLTAxMzgtZTFhYS03ZDVjOWM4YTdjZWUiLCJpc3MiOiJnYW1lbG9ja2VyIiwiaWF04IjoxNTc4MzkwNDQwLCJwdWIiOiJibHVlaG9sZSIsInRpdGxlIjoicHViZyIsImFwcCI6ImxlYW5jb3JlZ2ctZ21hIn0.fwFwEeEw3OghE8sACAHbpKWlJFBVo6F_DbB7dbanybLIIToJc4 

  4. Copie seu token e abra sua guia com colab. Você não fechou, fechou?
  5. Na primeira célula de código, inserimos este código:

     import requests url = "endpoint-url" API_KEY = '< >' header = { "Authorization": "Bearer " + API_KEY, "Accept": "application/vnd.api+json" } 

    E corra. Neste pedaço de código, criamos um dicionário (cabeçalho), que contém os parâmetros básicos para acessar a API do PUBG. Enviaremos esse dicionário para o servidor toda vez que quisermos obter algo dele. Condicionalmente, dizemos ao servidor "Olá, meu nome é Petya" - onde Petya é nosso token - "Quero receber informações suas em formato JSON!" Eu recebi o código que acabei de fornecer a partir da documentação da API do PUBG nesta página .
  6. Agora precisamos dizer o que exatamente precisamos obter do servidor. No nosso caso, queremos obter dele o último jogo do jogador Twitch_todol. Para obter informações sobre o jogador, solicitamos em
    api.pubg.com/shards/steam/players?filter [playerNames] = Twitch_todol

    Ou seja (na nova célula de código):

     player_name = 'Twitch_todol' r = requests.get('https://api.pubg.com/shards/steam/players?filter[playerNames]=' + player_name, headers=header) player = r.json() 

    onde na segunda linha usamos a função da biblioteca de solicitações, onde o primeiro parâmetro é o que precisamos do servidor e o segundo parâmetro é o nosso dicionário de cabeçalho. Em outras palavras, dizemos ao servidor "Olá, sou Petya! Desejo obter informações sobre o Twitch_todol player no formato JSON. "

    E na terceira linha, traduzimos a resposta do servidor para esse mesmo JSON. Por que estamos fazendo isso? O fato é que o servidor não retorna uma resposta json para nós, mas o json foi traduzido em uma string. E com o método .json (), meio que convertemos essa string em um dicionário que o Python entende.

    Vamos ter certeza disso escrevendo na nova célula de código:

     type(player) 

    a resposta é ditado . Ou seja, agora sabemos com certeza que a variável player contém um dicionário compreensível para Python com informações sobre o player.
  7. O que exatamente este dicionário contém? Vamos ver fazendo

     player.keys() 

    Vemos a resposta:

    dict_keys (['dados', 'links', 'meta'])

    Estas são as chaves do nosso dicionário. O que cada um deles contém está escrito nesta página .

    Para garantir que tenhamos o player necessário, escreveremos o seguinte:

     player['data'][0]['attributes'] 

    Aqui vemos as informações básicas sobre o jogador: quando ele se registrou, seu apelido, em qual plataforma ele joga e assim por diante.
  8. Precisamos obter o ID da sua última partida, que podemos verificar no site pubg.op.gg, que já está aberto em uma das guias do navegador. Para isso, escrevemos:

     player['data'][0]['relationships']['matches']['data'][0]['id'] 

    Temos algo parecido com 'ca2c453b-649a-4556-b768-66b9e01aae63' (o seu pode ser diferente, porque o jogador no momento da leitura deste artigo já pode jogar várias partidas). Use o que você conseguiu. Eu dou um exemplo para você não ficar confuso.

    Assim, sabemos o ID da partida, agora vamos obter informações sobre essa partida, para isso criamos a variável match_id, que equivale ao ID que recebemos. E fazemos a solicitação em um endereço ligeiramente diferente, mas de acordo com o esquema usual, ou seja, assim:

     match_id = player['data'][0]['relationships']['matches']['data'][0]['id'] # id  r = requests.get('https://api.pubg.com/shards/steam/matches/' + match_id, headers=header) match = r.json() 

  9. A variável de correspondência, que é um dicionário, contém todas as informações sobre essa correspondência. Para começar, temos o desempenho de todos os jogadores nesta partida:

     match_players = [item for item in match['included'] if item['type'] == 'participant'] match_players 

    Nesse caso, preenchemos a lista de jogadores (match_players), percorrendo a correspondência do dicionário ['included'] ('included' é a chave do dicionário do dicionário que contém os indicadores de todos os jogadores na partida), verificando simultaneamente o valor da chave 'type'. Por que verificamos se
    match ['included'] contém informações do jogador? O fato é que isso não é inteiramente verdade, a partida ['incluída'] também contém informações sobre os times em que esses jogadores jogaram (ou seja, o item ['type'] pode ser igual a 'lista'). Ou seja, match ['included'] se parece com isso:

    [jogador, equipe, equipe, jogador, jogador, jogador, equipe, ...]

    Não está totalmente claro por que os desenvolvedores decidiram fazer exatamente isso, mas isso não nos incomoda de forma alguma.

    Portanto, obtivemos o desempenho dos jogadores, mas não estamos particularmente interessados ​​em como outros jogadores jogaram nesta partida, veremos a performance do nosso jogador Twitch_todol nesta partida. Para fazer isso, realizamos:

     my_player_stats = [item for item in match_players if item['attributes']['stats']['name'] == player_name][0] my_player_stats 


Compare as estatísticas resultantes:



com estatísticas em pubg.op.gg



Vemos que tudo coincide. Alegrai-vos! A propósito, enquanto escrevia este artigo, nosso herói já conseguiu jogar várias partidas, portanto, algumas das capturas de tela dadas por mim acima podem não coincidir.

Conclusão


Neste artigo, eu queria dizer aos nossos menores programadores que você não deve ter medo das palavras JSON e API, que elas sejam implementadas de maneira conveniente e clara e que a documentação esteja anexada a cada um. Tentei explicar isso no idioma mais acessível, sem usar termos complexos.

E também quero agradecer a Habr e ao autor ( ArhMax ) por me ajudarem a escrever o código pela primeira vez há oito anos.

Source: https://habr.com/ru/post/pt483964/


All Articles