Текстовый робот на марсе с использованием Python, Flask, API NASA и Twilio MMS

Как это ни странно, но речь сегодня пойдет о NASA. У Национального управления по аэронавтике и исследованию космического пространства есть огромное количество API,  с помощью которых вы получите программный доступ ко всем чудесам космоса. Именно таким API я считаю Mars Rover Photos API.  Он просто потрясающий, а так как помогает увидеть какие изображения получает марсоход Curiosity.

Сейчас я покажу вам как создать приложение при помощи Mars Rover API в связке с Twilio MMS, Python и Flask. А делать это приложение будет ну просто невероятную вещь – получать изображения прямо с марса на ваш телефон.

Настройка среды

Ну самое главное – это конечно нужно поставить Python. Каким образом его ставить – зависит от вашей операционной системы.

Если вы счастливый обладатель OS X, то там уже установлен Python, но я вам рекомендую поставить и настроить все самому.  Homebrew вам в помощь. Выбирайте сами Python 2 или Python 3. Более подробные инструкции здесь.

Лучший способ установить Python для Windows – использовать официальный установщик из Python Software Foundation. X86 ( или 32-разрядная) версия будет иметь лучшую совместимость с пакетами сторонних производителей.

В Linux все намного разнообразней. Инструкции по установке Python различаются в зависимости от дистрибутива. Здесь вы найдете инструкции для Ubuntu, CentOS и других дистрибутивов.

Перед началом любого нового проекта на Python нужно создать для него виртуальную среду. Виртуальная среда (сокращенные как «virtualenv») отделяет зависимости нашего нового Python проекта от от других наших проектов и Python библиотек , используемых нашей операционной системой.

Установите утилиту virtualenv, которая позволит вам создавать и управлять виртуальными средами Python.  Используйте команду «virtualenv» для создания новой виртуальной среды, используя единственный аргумент – имя среды:

#создайте новую виртуальную среду с именем myproject
$
virtualenv myproject

New python executable in myproject/bin/python
Installing setuptools, pip, wheel…done.

#активируйте эту виртуальную среду (OS X & Linux)
$ source myproject/bin/activate

#активируйте эту виртуальную среду (Windows)
$ myproject\Scripts\activate

В принципе все почти готово к написанию нашего Flask приложения, но  ведь сначала нам нужно установить саму библиотеку Flask в нашей виртуальной среде:

#используй pip, чтобы установить flask и twilio
$ pip install Flask twilio

Еще нужно не забыть установить Requests. Он то и будет собирать нам данные с API Mars Rover:

$ pip install requests==2.13.0

После того как вы установите все зависимости, вам наверняка захочется их отслеживать и  контролировать. Мы можем их “заморозить”, и  поможет нам в этом pip. Он аккуратненько запишет их в файл, который по соглашению называется requirements.txt. Все это действие делается всего одной командой:

$ pip freeze > requirements.txt

Теперь нужно проверить, что наше окружение работает корректно. Мы берем простой пример из 9 строк и называем это приложение app.py:

from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def hello():
return “Hello World!”
if __name__ == “__main__”:
app.run()

Запускайте наше новое приложение Flask с помощью команды python app.py. Затем вы можете открыть http: // localhost: 5000 в своем браузере, и вы увидите «Hello World!»(ну если вы конечно все сделали правильно )).

Все почти готово. Нам нужна будет еще одна крутая штука. Все дело в том, что Twilio используют webhooks для связи с вашим приложением. Когда Twilio получает входящий телефонный звонок, например, он обращается к URL-адресу в приложении для получения инструкций о том, как обрабатывать вызов.

Когда вы работаете над приложением Flask в своей среде разработки, ваше приложение доступно только другим программам на том же компьютере, поэтому Twilio не сможет с ним “коннектиться”.

Ngrok– это то самое решение этой проблемы. После запуска он предоставляет уникальный URL-адрес в домене ngrok.io, который будет перенаправлять входящие запросы в локальную среду разработки.

После его установки выполните следующую команду:

./ngrok http 5000

Он запустится и вы увидите следующее (не забывайте, что перед запуском ngrok ваше flask приложение должно работать на порту 5000):

ngrok screen

Получение данных с API

Начнем с написания модуля, с помощью которого мы взаимодействовать с Mars Rover API. Самое главное здесь – это url rover_url, по адресу которого хранятся данные в json формате.

Создайте файл с именем mars.py и следующим программным кодом:

import requests
from random import choice
rover_url = ‘https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos’
def get_mars_photo_url(sol, api_key=’DEMO_KEY‘):
params = { ‘sol‘: sol, ‘api_key‘: api_key }
response = requests.get(rover_url, params)
response_dictionary = response.json()
photos = response_dictionary[‘photos‘]
return choice(photos)[‘img_src‘]

Здесь мы просто отправляем запрос к  Mars Rover’s API при помощи requests, парсим ответ в виде json, а потом захватываем любое случайное изображение с марса.

Настраиваем Twilio

Вы сможете отвечать на сообщения, но вам нужен будет номер телефона Twilio. Купить его можно здесь.  Да и стоить он будет всего лишь 1$.

Ну а ваше приложение Flask обязательно должно быть видно из интернета, чтобы Twilio мог отправлять ему запросы. Дальше нам нужен Ngrok:

$ ngrok http 5000

И обязательно настройте свой номер телефона как показано на картинке:

Screen Shot 2016-07-14 at 10.54.53 AM.png

Теперь вы готовы отправлять текстовое сообщение на новый номер Twilio.

Создаем приложение Flask

Теперь у вас есть номер телефона Twilio и возможность “захватить” случайное изображение прямо с марса. Делитесь с пользователями вашим номером телефона, чтобы они могли насладиться этими изображениями.

Ну и в конце создаем наше приложение Flask:

import os
from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse, Message
from mars import get_mars_photo_url
app = Flask(__name__)
@app.route(‘/sms’, methods=[‘POST’])
def inbound_sms():
message_body = request.form[‘Body’]
resp = MessagingResponse()
if message_body.isdigit():
response_message = ‘Taken {} Martian solar days into the journey.’ \
.format(message_body)
photo_url = get_mars_photo_url(message_body)
msg = Message().body(response_message).media(photo_url)
resp.append(msg)
else:
msg = Message().body(‘Text a number of solar days into the rover\’s journey.’)
resp.append(msg)
return str(resp)
if __name__ == ‘__main__’:
app.run()

/sms обрабатывает входящие текстовые сообщения. Запускайте ваше приложение:

$ python app.py

Теперь напишите свой номер Twilio, чтобы буквально связаться с роботом на Марсе!