mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 17:27:10 +00:00
Cleanup telegram / Add url to webhook (#7824)
* Cleanup telegram / Add url to webhook * fix lint * Fix lint
This commit is contained in:
parent
81b2111751
commit
2df6aabbf3
@ -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:
|
||||||
|
@ -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):
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user