С помощью Python, чтобы получить данные из Звездных войн по API


Я учусь на Python (около 6 месяцев, эпизодически) и сегодня я решил написать скрипт для загрузки информации JSON от API-интерфейс.

Для начала, я написал одну страницу сценария с несколькими функциями.

Скрипт выполняет следующие действия:

  1. Пользователь вводит скрипт на терминал поиска.
  2. Скрипт получает в ответ информацию из Звездных войн API (сhttps://swapi.co). Это открытый API, поэтому мне не нужны никакие ключи или жетоны.
  3. Если API возвращает одно значение, информация сразу же отображается.
  4. Если API возвращает несколько значений, скрипт предлагает пользователю сделать выбор. Затем информация отображается.

Сейчас скрипт работает только для людей в SWAPI (например, Люк Скайуокер).

Любой отзыв на мой код будет полезно.

#!/usr/bin/python3

'''Script to get information from https://swapi.co/'''

import requests
import json
import sys

#TODO: Print useful information such as movie titles or names of worlds instead of showing links
#Break up URL to allow for more dynamic searching in the future. Right now, script only handles the people parameter when getting info from the API.

UNDERLINE_LEN = 30

def show(data, index=0):
    '''
        Displays an individual Swapi object.
        data = data retrieved from api
        index = which entry to select. Default is 0 for single item lists.
    '''
    info = data['results'][index]
    print()
    print('-' * UNDERLINE_LEN)
    print("Name : {0}\n{1}".format(data['results'][index]['name'], '-' * UNDERLINE_LEN))
    for k, v in info.items():
        if type(v) is list:
            counter = 0
            print(k, ':')
            for j in v:
                print("\t{0}".format(v[counter]))
                counter += 1
        else: 
            if k != 'name':
                print(k, ':', v)


def show_choices(data):
    '''Shows a list of Swapi objects and prompts users to select an object [integer]'''
    info = data['results']
    counter = 0
    for i in info:
        print("[{0}] {1}".format(counter + 1, data['results'][counter]['name']))
        counter += 1
    print()
    choice = int(input("Which item would you like to view? "))
    try:
        show(data, choice - 1)
    except IndexError as ie:
        print(ie)


def grab():
    '''Main function.'''
    try:
        search = sys.argv[1]
        url = 'https://swapi.co/api/people/?search={0}'.format(search)      #need to divide url to make search process more dynamic
        r = requests.get(url)
        data = json.loads(r.text)
        if data is not None:
            numResults = int(data['count'])
            txt = "results"
            if numResults == 1:
                txt = "result"    
            resText = "{0} {1} found for search parameter '{2}'".format(numResults, txt, search)
            print(resText)
            if numResults == 1:
                show(data)
            else:
                show_choices(data)      
    except Exception as e:
        print(e)

grab()


444
2
задан 26 января 2018 в 11:01 Источник Поделиться
Комментарии
1 ответ

Вы никогда не должны составить url, используя эту технику!


search = sys.argv[1]
url = 'https://swapi.co/api/people/?search={0}'.format(search) #need to divide url to make search process more dynamic
r = requests.get(url)

Параметры строки запроса должны быть закодированы в процентах. На Python библиотека запросов обеспечивает правильный способ сделать это:

search = sys.argv[1]
url = 'https://swapi.co/api/people/'
r = requests.get(url, params={'search': search})

Пройдя дальше, я хотел бы предостеречь вас, чтобы не сцепить строки, предоставленные пользователем, чтобы сформировать другую строку, которая будет истолковано некоторыми компьютерной системы. Сначала необходимо с учетом экранирования механизма. В SQL инъекции, межсайтовый скриптинг, для LDAP-инъекциии т. д. — они все уязвимости, которые являются результатом этой же беспечности.

5
ответ дан 26 января 2018 в 11:01 Источник Поделиться