Веб-приложения Python, созданные с помощью веб-фреймворка Bottle, могут отправить и получать текстовые SMS-сообщения. В этом уроке мы выйдем за рамки текстовых сообщений и научимся набирать исходящие номера. телефонные звонки. Звонки будут читать фрагмент текста, а затем воспроизводить файл MP3, но затем их можно легко изменить для создания линий конференции и многих другие голосовые функции в ваших веб-приложениях Python.
Инструменты, которые нам нужны
У вас должен быть установлен Python 2 или 3 для создайте приложение Bottle, хотя Python 3 рекомендуется для новых Приложения. Также нам понадобятся:
- pip и
- virtualenv для обработки
- зависимости приложений
- Ngrok для локального туннелирования в нашу бутылку
- приложение, пока оно работает в нашей локальной среде разработки
- Фреймворк для бутылок
- Бесплатная учетная запись Twilio для использования своих
- веб-API телефонных звонков
- Twilio’s
- вспомогательная библиотека Python ,
- который является открытым исходным кодом на GitHub
- и доступны для загрузки из PyPI
Взгляни на это руководство по настройке Python 3, Bottle и Gunicorn на Ubuntu 16.04 LTS если вам нужна помощь в получении среда разработки настроен, прежде чем продолжить изучение оставшейся части этого руководства.
Вы можете найти весь открытый исходный код для этого руководства в python-bottle-phone Репозиторий GitHub под исходящий каталог . Используйте и копируйте код, как хотите – все с открытым исходным кодом под Лицензия MIT.
Установка зависимостей нашего приложения
Нашему приложению Bottle нужна вспомогательная библиотека кода, чтобы упростить исходящий вызов. телефонные звонки. Bottle и вспомогательную библиотеку Twilio можно установить из PyPI в файл virtualenv. Откройте свой терминал и используйте команду virtualenv
для создания нового virtualenv:
virtualenv bottlephone
Используйте сценарий activate
в virtualenv, который делает этот virtualenv активная установка Python. Учтите, что вам нужно делать это каждый раз окно терминала, в котором вы хотите использовать этот virtualenv.
source bottlephone/bin/activate
Командная строка изменится после активации virtualenv на что-то вроде (bottlephone) $
. Вот скриншот того, что у меня среда выглядела так, когда я использовал скрипт activate
.
Затем используйте команду pip
, чтобы установить Bottle и Пакеты Twilio Python в ваш virtualenv.
pip install bottle twilio==5.7.0
После завершения сценария установки у нас будет необходимый зависимости для создания нашего приложения. Пора написать код Python для набора номера исходящие телефонные звонки.
Бутылка и Twilio
У нашего простого веб-приложения Bottle будет три маршрута:
/
– возвращает текстовую строку, чтобы сообщить нам, что наше приложение Bottle запущено./ twiml
– отвечает TwiML- (простое подмножество XML), которое указывает Twilio, что делать, когда кто-то
- принимает вызов из нашего веб-приложения Bottle
/dial-phone/
, где outbound_phone_number –- номер телефона в формате «+12025551234» – этот маршрут использует Twilio
- вспомогательная библиотека для отправки запроса POST в Twilio Voice API для набора
- телефонный звонок
Мы можем построить структуру нашего приложения Bottle и первый маршрут прямо сейчас. Создайте новый файл с именем app.py
со следующим содержимым, чтобы запустить наш приложение.
import os import bottle from bottle import route, run, post, Response from twilio import twiml from twilio.rest import TwilioRestClient app = bottle.default_app() # plug in account SID and auth token here if they are not already exposed as # environment variables twilio_client = TwilioRestClient() TWILIO_NUMBER = os.environ.get('TWILIO_NUMBER', '+12025551234') NGROK_BASE_URL = os.environ.get('NGROK_BASE_URL', 'https://c6c6d4e8.ngrok.io') @route('/') def index(): """ Returns a standard text response to show the app is up and running. """ return Response("Bottle app running!") if __name__ == '__main__': run(host='127.0.0.1', port=8000, debug=False, reloader=True)
Убедитесь, что вы находитесь в каталоге, в котором вы создали указанный выше app.py
файл. Запустите приложение через сервер разработки Bottle со следующими команда. Убедитесь, что ваш виртуальный сервер все еще активирован, чтобы наш код мог полагаться в библиотеке кода бутылки.
python app.py
Мы должны увидеть успешный запуск сервера разработки следующим образом:
(bottlephone) [email protected]:~/bottlephone$ python app.py Bottle v0.12.9 server starting up (using WSGIRefServer())... Listening on http://127.0.0.1:8000/ Hit Ctrl-C to quit.
Вот как выглядит сообщение сервера разработки в моей среде в Ubuntu:
Давайте протестируем приложение, перейдя на «localhost: 8000». в веб-браузере. Мы должны получить простое сообщение об успешном выполнении, что приложение работает и отвечает на запросы.
Затем нам нужно получить номер телефона, который наше приложение Bottle может использовать для звонить по другим телефонным номерам.
Получите номер телефона
Наше базовое веб-приложение Bottle работает, но мы действительно хотим набрать номер исходящие вызовы, которые будут обрабатываться Twilio .
В вашем веб-браузере перейдите на на веб-сайте Twilio и зарегистрируйтесь для получения бесплатной учетной записи . Вы также можете войти в свою существующую учетную запись Twilio, если она у вас уже есть.
Пробная учетная запись Twilio позволяет набирать и принимать телефонные звонки на ваш собственный подтвержденный номер телефона. Набирать и принимать звонки с любого телефона номер, то вам нужно обновить свою учетную запись (нажмите кнопку обновления на верхняя панель навигации для этого). Пробные аккаунты отлично подходят для начального до запуска вашего приложения, но обновленные учетные записи приходит реальная сила.
После того, как вы войдете в свою учетную запись Twilio, перейдите в экран управления телефонными номерами . На этом экране вы можете купите один или несколько телефонных номеров или щелкните существующий номер телефона в своей учетной записи, чтобы настроить его.
Нам нечего сейчас настраивать по номеру телефона страницу конфигурации, потому что мы делаем исходящие телефонные звонки для этого руководство. Теперь, когда у нас есть номер телефона, давайте добавим последний бит кода в наше приложение Bottle, чтобы оно работало.
Телефонные звонки
Нам нужно добавить два новых маршрута в наше приложение Bottle, чтобы оно могло исходить телефонные звонки. Измените существующий файл app.py двумя новыми функциями. ниже twiml_response
и outbound_call
. Ни один другой код в этот файл необходимо изменить, кроме добавления этих двух новых функций в то, что мы писали в предыдущем разделе.
import os import bottle from bottle import route, run, post, Response from twilio import twiml from twilio.rest import TwilioRestClient app = bottle.default_app() # plug in account SID and auth token here if they are not already exposed as # environment variables twilio_client = TwilioRestClient() # add your Twilio phone number here TWILIO_NUMBER = os.environ.get('TWILIO_NUMBER', '+16093002984') # plug in your Ngrok Forwarding URL - we'll set it up in a minute NGROK_BASE_URL = os.environ.get('NGROK_BASE_URL', 'https://c6c6d4e8.ngrok.io') @route('/') def index(): """ Returns a standard text response to show the app is up and running. """ return Response("Bottle app running!") @post('/twiml') def twiml_response(): """ Provides TwiML instructions in response to a Twilio POST webhook event so that Twilio knows how to handle the outbound phone call when someone picks up the phone. """ response = twiml.Response() response.say("Sweet, this phone call is answered by your Bottle app!") response.play("https://api.twilio.com/cowbell.mp3", loop=10) return Response(str(response)) @route('/dial-phone/') def outbound_call(outbound_phone_number): """ Uses the Twilio Python helper library to send a POST request to Twilio telling it to dial an outbound phone call from our specific Twilio phone number (that phone number must be owned by our Twilio account). """ # the url must match the Ngrok Forwarding URL plus the route defined in # the previous function that responds with TwiML instructions twilio_client.calls.create(to=outbound_phone_number, from_=BLOG_POST_NUMBER, url=NGROK_BASE_URL + '/twiml') return Response('phone call placed to ' + outbound_phone_number + '!') if __name__ == '__main__': run(host='127.0.0.1', port=8000, debug=False, reloader=True)
Есть только одна проблема с нашей текущей настройкой, если вы разрабатываете в локальной среде: Twilio не сможет достичь этого маршрута /twiml
. Нам нужно развернуть наше приложение на доступном сервере или просто использовать локальный хост инструмент туннелирования, например Ngrok . Ngrok предоставляет внешний URL-адрес, который подключается к порту, запущенному на вашем компьютере. Загрузите и установите приложение Ngrok это подходит для вашей операционной системы.
Мы запускаем Ngrok локально и открываем наше приложение Bottle, работающее на порт 8000. Запустите эту команду в каталоге, где находится исполняемый файл Ngrok. располагается.
./ngrok http 8000
Ngrok запустится и предоставит нам URL-адрес пересылки с HTTP и HTTPS версии.
Мы можем использовать URL-адрес пересылки, чтобы указать Twilio, как обрабатывать исходящие телефонный звонок, когда кто-то поднимает трубку. Вставьте URL-адрес пересылки Ngrok в app.py
файл, в котором указан NGROK_BASE_URL
.
Если Нгрок вам полезен, обязательно прочтите это 6 замечательных причин использовать Ngrok при тестировании сообщение webhooks чтобы узнать еще больше об инструменте.
Пора протестировать наше приложение, давайте быстро его рассмотрим.
Телефонные звонки
Убедитесь, что ваш сервер разработки Bottle все еще работает, или перезапустите его с помощью команда python app.py
в оболочке, в которой все еще находится виртуальная среда активирован.
Запустите приложение в браузере, на этот раз проверьте телефонный звонок. возможности. Перейдите в “localhost: 8000/dial-phone/my-phone-number”, где «мой-номер-телефона» – это номер в формате «+12025551234». Например, вот что происходит, когда я набираю +12023351278:
А вот и входящий звонок!
Когда мы отвечаем на телефонный звонок, мы также видим, что маршрут /twiml
вызывается через Нгрок.
С помощью всего двух маршрутов в нашем приложении Bottle и Twilio мы смогли исходящие телефонные звонки. Неплохо!
Что дальше?
Отлично, теперь мы можем набирать исходящие телефонные звонки на любой номер телефона с наше веб-приложение Bottle. Затем вы можете попробовать одно из этих руководств. чтобы добавить в приложение еще больше функций:
- Обновите приложение Bottle, чтобы также отправлять текстовые сообщения и отвечать на них
- Создайте бота Slack для телефонных звонков
- Реализуйте отслеживание звонков
- как для входящих, так и для исходящих телефонных звонков, сделанных через ваше приложение
Вопросов? Свяжитесь со мной через Twitter @fullstackpython или @mattmakai . Я также на GitHub как mattmakai .
Что-то не так в этом посте? Вилка источник этой страницы на GitHub и отправьте запрос на перенос.