Cleanup telegram / Add url to webhook (#7824)

* Cleanup telegram / Add url to webhook

* fix lint

* Fix lint
This commit is contained in:
Pascal Vizeli 2017-05-30 06:55:06 +02:00 committed by GitHub
parent 81b2111751
commit 2df6aabbf3
3 changed files with 56 additions and 38 deletions

View File

@ -7,7 +7,6 @@ https://home-assistant.io/components/telegram_bot/
import asyncio import asyncio
import io import io
from functools import partial from functools import partial
from ipaddress import ip_network
import logging import logging
import os import os
@ -60,10 +59,18 @@ ATTR_USER_ID = 'user_id'
ATTR_USERNAME = 'username' ATTR_USERNAME = 'username'
CONF_ALLOWED_CHAT_IDS = 'allowed_chat_ids' CONF_ALLOWED_CHAT_IDS = 'allowed_chat_ids'
CONF_TRUSTED_NETWORKS = 'trusted_networks'
DOMAIN = 'telegram_bot' DOMAIN = 'telegram_bot'
SERVICE_SEND_MESSAGE = 'send_message'
SERVICE_SEND_PHOTO = 'send_photo'
SERVICE_SEND_DOCUMENT = 'send_document'
SERVICE_SEND_LOCATION = 'send_location'
SERVICE_EDIT_MESSAGE = 'edit_message'
SERVICE_EDIT_CAPTION = 'edit_caption'
SERVICE_EDIT_REPLYMARKUP = 'edit_replymarkup'
SERVICE_ANSWER_CALLBACK_QUERY = 'answer_callback_query'
EVENT_TELEGRAM_CALLBACK = 'telegram_callback' EVENT_TELEGRAM_CALLBACK = 'telegram_callback'
EVENT_TELEGRAM_COMMAND = 'telegram_command' EVENT_TELEGRAM_COMMAND = 'telegram_command'
EVENT_TELEGRAM_TEXT = 'telegram_text' EVENT_TELEGRAM_TEXT = 'telegram_text'
@ -71,26 +78,13 @@ EVENT_TELEGRAM_TEXT = 'telegram_text'
PARSER_HTML = 'html' PARSER_HTML = 'html'
PARSER_MD = 'markdown' PARSER_MD = 'markdown'
DEFAULT_TRUSTED_NETWORKS = [ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
ip_network('149.154.167.197/32'), vol.Required(CONF_PLATFORM): cv.string,
ip_network('149.154.167.198/31'), vol.Required(CONF_API_KEY): cv.string,
ip_network('149.154.167.200/29'), vol.Required(CONF_ALLOWED_CHAT_IDS):
ip_network('149.154.167.208/28'), vol.All(cv.ensure_list, [vol.Coerce(int)]),
ip_network('149.154.167.224/29'), vol.Optional(ATTR_PARSER, default=PARSER_MD): cv.string,
ip_network('149.154.167.232/31') })
]
CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({
vol.Required(CONF_PLATFORM): cv.string,
vol.Required(CONF_API_KEY): cv.string,
vol.Required(CONF_ALLOWED_CHAT_IDS):
vol.All(cv.ensure_list, [vol.Coerce(int)]),
vol.Optional(ATTR_PARSER, default=PARSER_MD): cv.string,
vol.Optional(CONF_TRUSTED_NETWORKS, default=DEFAULT_TRUSTED_NETWORKS):
vol.All(cv.ensure_list, [ip_network])
}),
}, extra=vol.ALLOW_EXTRA)
BASE_SERVICE_SCHEMA = vol.Schema({ BASE_SERVICE_SCHEMA = vol.Schema({
vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]), vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]),
@ -100,13 +94,12 @@ BASE_SERVICE_SCHEMA = vol.Schema({
vol.Optional(ATTR_KEYBOARD): vol.All(cv.ensure_list, [cv.string]), vol.Optional(ATTR_KEYBOARD): vol.All(cv.ensure_list, [cv.string]),
vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list,
}, extra=vol.ALLOW_EXTRA) }, extra=vol.ALLOW_EXTRA)
SERVICE_SEND_MESSAGE = 'send_message'
SERVICE_SCHEMA_SEND_MESSAGE = BASE_SERVICE_SCHEMA.extend({ SERVICE_SCHEMA_SEND_MESSAGE = BASE_SERVICE_SCHEMA.extend({
vol.Required(ATTR_MESSAGE): cv.template, vol.Required(ATTR_MESSAGE): cv.template,
vol.Optional(ATTR_TITLE): cv.template, vol.Optional(ATTR_TITLE): cv.template,
}) })
SERVICE_SEND_PHOTO = 'send_photo'
SERVICE_SEND_DOCUMENT = 'send_document'
SERVICE_SCHEMA_SEND_FILE = BASE_SERVICE_SCHEMA.extend({ SERVICE_SCHEMA_SEND_FILE = BASE_SERVICE_SCHEMA.extend({
vol.Optional(ATTR_URL): cv.template, vol.Optional(ATTR_URL): cv.template,
vol.Optional(ATTR_FILE): cv.template, vol.Optional(ATTR_FILE): cv.template,
@ -115,30 +108,30 @@ SERVICE_SCHEMA_SEND_FILE = BASE_SERVICE_SCHEMA.extend({
vol.Optional(ATTR_PASSWORD): cv.string, vol.Optional(ATTR_PASSWORD): cv.string,
vol.Optional(ATTR_AUTHENTICATION): cv.string, vol.Optional(ATTR_AUTHENTICATION): cv.string,
}) })
SERVICE_SEND_LOCATION = 'send_location'
SERVICE_SCHEMA_SEND_LOCATION = BASE_SERVICE_SCHEMA.extend({ SERVICE_SCHEMA_SEND_LOCATION = BASE_SERVICE_SCHEMA.extend({
vol.Required(ATTR_LONGITUDE): cv.template, vol.Required(ATTR_LONGITUDE): cv.template,
vol.Required(ATTR_LATITUDE): cv.template, vol.Required(ATTR_LATITUDE): cv.template,
}) })
SERVICE_EDIT_MESSAGE = 'edit_message'
SERVICE_SCHEMA_EDIT_MESSAGE = SERVICE_SCHEMA_SEND_MESSAGE.extend({ SERVICE_SCHEMA_EDIT_MESSAGE = SERVICE_SCHEMA_SEND_MESSAGE.extend({
vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string), vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string),
vol.Required(ATTR_CHAT_ID): vol.Coerce(int), vol.Required(ATTR_CHAT_ID): vol.Coerce(int),
}) })
SERVICE_EDIT_CAPTION = 'edit_caption'
SERVICE_SCHEMA_EDIT_CAPTION = vol.Schema({ SERVICE_SCHEMA_EDIT_CAPTION = vol.Schema({
vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string), vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string),
vol.Required(ATTR_CHAT_ID): vol.Coerce(int), vol.Required(ATTR_CHAT_ID): vol.Coerce(int),
vol.Required(ATTR_CAPTION): cv.template, vol.Required(ATTR_CAPTION): cv.template,
vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list,
}, extra=vol.ALLOW_EXTRA) }, extra=vol.ALLOW_EXTRA)
SERVICE_EDIT_REPLYMARKUP = 'edit_replymarkup'
SERVICE_SCHEMA_EDIT_REPLYMARKUP = vol.Schema({ SERVICE_SCHEMA_EDIT_REPLYMARKUP = vol.Schema({
vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string), vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string),
vol.Required(ATTR_CHAT_ID): vol.Coerce(int), vol.Required(ATTR_CHAT_ID): vol.Coerce(int),
vol.Required(ATTR_KEYBOARD_INLINE): cv.ensure_list, vol.Required(ATTR_KEYBOARD_INLINE): cv.ensure_list,
}, extra=vol.ALLOW_EXTRA) }, extra=vol.ALLOW_EXTRA)
SERVICE_ANSWER_CALLBACK_QUERY = 'answer_callback_query'
SERVICE_SCHEMA_ANSWER_CALLBACK_QUERY = vol.Schema({ SERVICE_SCHEMA_ANSWER_CALLBACK_QUERY = vol.Schema({
vol.Required(ATTR_MESSAGE): cv.template, vol.Required(ATTR_MESSAGE): cv.template,
vol.Required(ATTR_CALLBACK_QUERY_ID): vol.Coerce(int), vol.Required(ATTR_CALLBACK_QUERY_ID): vol.Coerce(int),
@ -157,8 +150,7 @@ SERVICE_MAP = {
} }
def load_data(url=None, filepath=None, def load_data(url=None, filepath=None, username=None, password=None,
username=None, password=None,
authentication=None, num_retries=5): authentication=None, num_retries=5):
"""Load photo/document into ByteIO/File container from a source.""" """Load photo/document into ByteIO/File container from a source."""
try: try:

View File

@ -12,7 +12,8 @@ import async_timeout
from aiohttp.client_exceptions import ClientError from aiohttp.client_exceptions import ClientError
from homeassistant.components.telegram_bot import ( from homeassistant.components.telegram_bot import (
CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity) CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity,
PLATFORM_SCHEMA as TELEGRAM_PLATFORM_SCHEMA)
from homeassistant.const import ( from homeassistant.const import (
EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, CONF_API_KEY) EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, CONF_API_KEY)
from homeassistant.core import callback from homeassistant.core import callback
@ -20,6 +21,8 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
PLATFORM_SCHEMA = TELEGRAM_PLATFORM_SCHEMA
@asyncio.coroutine @asyncio.coroutine
def async_setup_platform(hass, config, async_add_devices, discovery_info=None): def async_setup_platform(hass, config, async_add_devices, discovery_info=None):

View File

@ -6,15 +6,19 @@ https://home-assistant.io/components/telegram_bot.webhooks/
""" """
import asyncio import asyncio
import datetime as dt import datetime as dt
from ipaddress import ip_network
import logging import logging
import voluptuous as vol
from homeassistant.components.http import HomeAssistantView from homeassistant.components.http import HomeAssistantView
from homeassistant.components.http.util import get_real_ip from homeassistant.components.http.util import get_real_ip
from homeassistant.components.telegram_bot import ( from homeassistant.components.telegram_bot import (
CONF_ALLOWED_CHAT_IDS, CONF_TRUSTED_NETWORKS, BaseTelegramBotEntity) CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity, PLATFORM_SCHEMA)
from homeassistant.const import ( from homeassistant.const import (
CONF_API_KEY, EVENT_HOMEASSISTANT_STOP, CONF_API_KEY, EVENT_HOMEASSISTANT_STOP, HTTP_BAD_REQUEST,
HTTP_BAD_REQUEST, HTTP_UNAUTHORIZED) HTTP_UNAUTHORIZED, CONF_URL)
import homeassistant.helpers.config_validation as cv
DEPENDENCIES = ['http'] DEPENDENCIES = ['http']
@ -23,6 +27,24 @@ _LOGGER = logging.getLogger(__name__)
TELEGRAM_HANDLER_URL = '/api/telegram_webhooks' TELEGRAM_HANDLER_URL = '/api/telegram_webhooks'
REMOVE_HANDLER_URL = '' REMOVE_HANDLER_URL = ''
CONF_TRUSTED_NETWORKS = 'trusted_networks'
DEFAULT_TRUSTED_NETWORKS = [
ip_network('149.154.167.197/32'),
ip_network('149.154.167.198/31'),
ip_network('149.154.167.200/29'),
ip_network('149.154.167.208/28'),
ip_network('149.154.167.224/29'),
ip_network('149.154.167.232/31')
]
# pylint: disable=no-value-for-parameter
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_URL): vol.Url(),
vol.Optional(CONF_TRUSTED_NETWORKS, default=DEFAULT_TRUSTED_NETWORKS):
vol.All(cv.ensure_list, [ip_network])
})
@asyncio.coroutine @asyncio.coroutine
def async_setup_platform(hass, config, async_add_devices, discovery_info=None): def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
@ -31,6 +53,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
bot = telegram.Bot(config[CONF_API_KEY]) bot = telegram.Bot(config[CONF_API_KEY])
current_status = yield from hass.async_add_job(bot.getWebhookInfo) current_status = yield from hass.async_add_job(bot.getWebhookInfo)
base_url = config.get(CONF_URL, hass.config.api.base_url)
# Some logging of Bot current status: # Some logging of Bot current status:
last_error_date = getattr(current_status, 'last_error_date', None) last_error_date = getattr(current_status, 'last_error_date', None)
@ -40,8 +63,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
last_error_date, current_status) last_error_date, current_status)
else: else:
_LOGGER.debug("telegram webhook Status: %s", current_status) _LOGGER.debug("telegram webhook Status: %s", current_status)
handler_url = '{0}{1}'.format(hass.config.api.base_url,
TELEGRAM_HANDLER_URL) handler_url = "{0}{1}".format(base_url, TELEGRAM_HANDLER_URL)
if not handler_url.startswith('https'): if not handler_url.startswith('https'):
_LOGGER.error("Invalid telegram webhook %s must be https", handler_url) _LOGGER.error("Invalid telegram webhook %s must be https", handler_url)
return False return False