mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 09:47:13 +00:00
add photo functionality to telegram (#2506)
* add photo functionality to telegram * basic auth need password and username
This commit is contained in:
parent
b9cadbecaa
commit
8ed2c8e6a4
@ -38,7 +38,7 @@ NOTIFY_SERVICE_SCHEMA = vol.Schema({
|
|||||||
vol.Required(ATTR_MESSAGE): cv.template,
|
vol.Required(ATTR_MESSAGE): cv.template,
|
||||||
vol.Optional(ATTR_TITLE, default=ATTR_TITLE_DEFAULT): cv.string,
|
vol.Optional(ATTR_TITLE, default=ATTR_TITLE_DEFAULT): cv.string,
|
||||||
vol.Optional(ATTR_TARGET): cv.string,
|
vol.Optional(ATTR_TARGET): cv.string,
|
||||||
vol.Optional(ATTR_DATA): dict, # nobody seems to be using this (yet)
|
vol.Optional(ATTR_DATA): dict,
|
||||||
})
|
})
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -13,3 +13,7 @@ notify:
|
|||||||
target:
|
target:
|
||||||
description: Target of the notification. Optional depending on the platform
|
description: Target of the notification. Optional depending on the platform
|
||||||
example: platform specific
|
example: platform specific
|
||||||
|
|
||||||
|
data:
|
||||||
|
description: Extended information for notification. Optional depending on the platform
|
||||||
|
example: platform specific
|
||||||
|
@ -4,11 +4,14 @@ Telegram platform for notify component.
|
|||||||
For more details about this platform, please refer to the documentation at
|
For more details about this platform, please refer to the documentation at
|
||||||
https://home-assistant.io/components/notify.telegram/
|
https://home-assistant.io/components/notify.telegram/
|
||||||
"""
|
"""
|
||||||
|
import io
|
||||||
import logging
|
import logging
|
||||||
import urllib
|
import urllib
|
||||||
|
import requests
|
||||||
|
from requests.auth import HTTPBasicAuth
|
||||||
|
|
||||||
from homeassistant.components.notify import (
|
from homeassistant.components.notify import (
|
||||||
ATTR_TITLE, DOMAIN, BaseNotificationService)
|
ATTR_TITLE, ATTR_DATA, DOMAIN, BaseNotificationService)
|
||||||
from homeassistant.const import CONF_API_KEY
|
from homeassistant.const import CONF_API_KEY
|
||||||
from homeassistant.helpers import validate_config
|
from homeassistant.helpers import validate_config
|
||||||
|
|
||||||
@ -16,6 +19,13 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
REQUIREMENTS = ['python-telegram-bot==4.3.3']
|
REQUIREMENTS = ['python-telegram-bot==4.3.3']
|
||||||
|
|
||||||
|
ATTR_PHOTO = "photo"
|
||||||
|
ATTR_FILE = "file"
|
||||||
|
ATTR_URL = "url"
|
||||||
|
ATTR_CAPTION = "caption"
|
||||||
|
ATTR_USERNAME = "username"
|
||||||
|
ATTR_PASSWORD = "password"
|
||||||
|
|
||||||
|
|
||||||
def get_service(hass, config):
|
def get_service(hass, config):
|
||||||
"""Get the Telegram notification service."""
|
"""Get the Telegram notification service."""
|
||||||
@ -54,9 +64,51 @@ class TelegramNotificationService(BaseNotificationService):
|
|||||||
import telegram
|
import telegram
|
||||||
|
|
||||||
title = kwargs.get(ATTR_TITLE)
|
title = kwargs.get(ATTR_TITLE)
|
||||||
|
data = kwargs.get(ATTR_DATA, {})
|
||||||
|
|
||||||
|
# send message
|
||||||
try:
|
try:
|
||||||
self.bot.sendMessage(chat_id=self._chat_id,
|
self.bot.sendMessage(chat_id=self._chat_id,
|
||||||
text=title + " " + message)
|
text=title + " " + message)
|
||||||
except telegram.error.TelegramError:
|
except telegram.error.TelegramError:
|
||||||
_LOGGER.exception("Error sending message.")
|
_LOGGER.exception("Error sending message.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# send photo
|
||||||
|
if ATTR_PHOTO in data:
|
||||||
|
# if not a list
|
||||||
|
if not isinstance(data[ATTR_PHOTO], list):
|
||||||
|
photos = [data[ATTR_PHOTO]]
|
||||||
|
else:
|
||||||
|
photos = data[ATTR_PHOTO]
|
||||||
|
|
||||||
|
try:
|
||||||
|
for photo_data in photos:
|
||||||
|
caption = photo_data.get(ATTR_CAPTION, None)
|
||||||
|
|
||||||
|
# file is a url
|
||||||
|
if ATTR_URL in photo_data:
|
||||||
|
# use http authenticate
|
||||||
|
if ATTR_USERNAME in photo_data and\
|
||||||
|
ATTR_PASSWORD in photo_data:
|
||||||
|
req = requests.get(
|
||||||
|
photo_data[ATTR_URL],
|
||||||
|
auth=HTTPBasicAuth(photo_data[ATTR_USERNAME],
|
||||||
|
photo_data[ATTR_PASSWORD])
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
req = requests.get(photo_data[ATTR_URL])
|
||||||
|
file_id = io.BytesIO(req.content)
|
||||||
|
elif ATTR_FILE in photo_data:
|
||||||
|
file_id = open(photo_data[ATTR_FILE], "rb")
|
||||||
|
else:
|
||||||
|
_LOGGER.error("No url or path is set for photo!")
|
||||||
|
continue
|
||||||
|
|
||||||
|
self.bot.sendPhoto(chat_id=self._chat_id,
|
||||||
|
photo=file_id, caption=caption)
|
||||||
|
|
||||||
|
except (OSError, IOError, telegram.error.TelegramError,
|
||||||
|
urllib.error.HTTPError):
|
||||||
|
_LOGGER.exception("Error sending photo.")
|
||||||
|
return
|
||||||
|
Loading…
x
Reference in New Issue
Block a user