July 26, 2018

Получаем число с Random.org API на Python

У многих веб-сервисов есть свой HTTP API - интерфейс, позволяющий обмениваться с их серверами данными. В этой статье разберёмся, как делать запросы из Python без сторонних библиотек. Рассматривать мы это будем на примере небезызвестного Random.org - теперь никто нас не упрекнёт, что рандом в нашей программе "нечестный")

Необходимая информация об API представлена по ссылке api.random.org

Вот на этой странице вы сможете получить токен для API - просто введите свой email и он придёт в письме.

Мы будем пользоваться самым базовым API методом - generateIntegers, который возвращает случайные числа от min до max.

Полный код с подсветкой можете найти на Pastebin

Для начала, импортируем всё необходимое. А нужно нам немного: HTTPSConnection из http.client для того, чтобы отсылать запросы; dumps и loads из json чтобы кодировать и декодировать данные в JSON, который используется этим API.

from http.client import HTTPSConnection                     
from json import dumps, loads                          
                                         
API_TOKEN = 'xxx'# Ваш токен

Теперь давайте создадим словарь с данными для запроса и заголовками. Эти 2 словаря мы запакуем в JSON: теперь они готовы для отправки на сервер.

"""
Больше о формате запроса 
https://api.random.org/json-rpc/1/introduction
"""
request_data = {  # Тело запроса                      
  'jsonrpc': '2.0',                              
  'method': 'generateIntegers',                        
  'params': {                                  
    'apiKey': API_TOKEN,                           
    'min': 1,  # Нижняя граница рандома                       
    'max': 100,  # Верхняя граница        
    'n': 1,  # Количество запрашиваемых чисел          
  },                                      
  'id': 1,                                   
}                                        
encoded_data = dumps(request_data)                        
                                         
headers = {                                
  'Content-Type': 'application/json-rpc',  # Тип запроса              
}                                        
encoded_headers = dumps(headers)  

Теперь непосредственно к обмену данными. Установим соединение и отправим данные:

connection = HTTPSConnection('api.random.org')                  
connection.request('GET', '/json-rpc/1/invoke', encoded_data, headers)  

Получим ответ и распакуем его из JSON:

response = connection.getresponse()                       
response_data = loads(response.read().decode()) 

Если запрос прошёл успешно, то в response_data['result']['random']['data'] будет лежать массив запрошенных чисел. Запрашивали мы одно число, его и выведем на экран.

print(response_data['result']['random']['data'][0])  

Вот так вот просто можно обмениваться данными с любым HTTP API, просто надо внимательно читать описания методов и формата, который требуется.

Жду вас в группе SnakeBlog