mirror of
https://github.com/caronc/apprise.git
synced 2024-11-26 01:53:10 +01:00
remove NMA, see #9
This commit is contained in:
parent
7e38921835
commit
97c18d2c3b
3
README
3
README
@ -62,9 +62,6 @@ The table below identifies the services this tool supports and some example serv
|
||||
mmosts://hostname/authkey
|
||||
mmosts://user@hostname/authkey
|
||||
|
||||
* Notify My Android
|
||||
nma://apikey
|
||||
|
||||
* Prowl
|
||||
prowl://apikey
|
||||
prowl://apikey/providerkey
|
||||
|
@ -30,7 +30,6 @@ The table below identifies the services this tool supports and some example serv
|
||||
| [Join](https://github.com/caronc/apprise/wiki/Notify_join) | join:// | (TCP) 443 | join://apikey/device<br />join://apikey/device1/device2/deviceN/<br />join://apikey/group<br />join://apikey/groupA/groupB/groupN<br />join://apikey/DeviceA/groupA/groupN/DeviceN/
|
||||
| [KODI](https://github.com/caronc/apprise/wiki/Notify_kodi) | kodi:// or kodis:// | (TCP) 8080 or 443 | kodi://hostname<br />kodi://user@hostname<br />kodi://user:password@hostname:port
|
||||
| [Mattermost](https://github.com/caronc/apprise/wiki/Notify_mattermost) | mmost:// | (TCP) 8065 | mmost://hostname/authkey<br />mmost://hostname:80/authkey<br />mmost://user@hostname:80/authkey<br />mmost://hostname/authkey?channel=channel<br />mmosts://hostname/authkey<br />mmosts://user@hostname/authkey<br />
|
||||
| [Notify My Android](https://github.com/caronc/apprise/wiki/Notify_my_android) | nma:// | (TCP) 443 | nma://apikey
|
||||
| [Prowl](https://github.com/caronc/apprise/wiki/Notify_prowl) | prowl:// | (TCP) 443 | prowl://apikey<br />prowl://apikey/providerkey
|
||||
| [Pushalot](https://github.com/caronc/apprise/wiki/Notify_pushalot) | palot:// | (TCP) 443 | palot://authorizationtoken
|
||||
| [PushBullet](https://github.com/caronc/apprise/wiki/Notify_pushbullet) | pbul:// | (TCP) 443 | pbul://accesstoken<br />pbul://accesstoken/#channel<br/>pbul://accesstoken/A_DEVICE_ID<br />pbul://accesstoken/email@address.com<br />pbul://accesstoken/#channel/#channel2/email@address.net/DEVICE
|
||||
|
@ -1,223 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Notify My Android (NMA) Notify Wrapper
|
||||
#
|
||||
# Copyright (C) 2017-2018 Chris Caron <lead2gold@gmail.com>
|
||||
#
|
||||
# This file is part of apprise.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
|
||||
import re
|
||||
import requests
|
||||
|
||||
from .NotifyBase import NotifyBase
|
||||
from .NotifyBase import HTTP_ERROR_MAP
|
||||
from ..common import NotifyFormat
|
||||
|
||||
# Extend HTTP Error Messages
|
||||
NMA_HTTP_ERROR_MAP = HTTP_ERROR_MAP.copy()
|
||||
NMA_HTTP_ERROR_MAP.update({
|
||||
400: 'Data is wrong format, invalid length or null.',
|
||||
401: 'API Key provided is invalid',
|
||||
402: 'Maximum number of API calls per hour reached.',
|
||||
})
|
||||
|
||||
# Used to validate Authorization Token
|
||||
VALIDATE_APIKEY = re.compile(r'[A-Za-z0-9]{48}')
|
||||
|
||||
|
||||
# Priorities
|
||||
class NotifyMyAndroidPriority(object):
|
||||
LOW = -2
|
||||
MODERATE = -1
|
||||
NORMAL = 0
|
||||
HIGH = 1
|
||||
EMERGENCY = 2
|
||||
|
||||
|
||||
NMA_PRIORITIES = (
|
||||
NotifyMyAndroidPriority.LOW,
|
||||
NotifyMyAndroidPriority.MODERATE,
|
||||
NotifyMyAndroidPriority.NORMAL,
|
||||
NotifyMyAndroidPriority.HIGH,
|
||||
NotifyMyAndroidPriority.EMERGENCY,
|
||||
)
|
||||
|
||||
|
||||
class NotifyMyAndroid(NotifyBase):
|
||||
"""
|
||||
A wrapper for Notify My Android (NMA) Notifications
|
||||
"""
|
||||
|
||||
# The default protocol
|
||||
protocol = 'nma'
|
||||
|
||||
# Notify My Android uses the http protocol with JSON requests
|
||||
notify_url = 'https://www.notifymyandroid.com/publicapi/notify'
|
||||
|
||||
# The maximum allowable characters allowed in the body per message
|
||||
body_maxlen = 10000
|
||||
|
||||
# Defines the maximum allowable characters in the title
|
||||
title_maxlen = 1000
|
||||
|
||||
def __init__(self, apikey, priority=None, devapikey=None, **kwargs):
|
||||
"""
|
||||
Initialize Notify My Android Object
|
||||
"""
|
||||
super(NotifyMyAndroid, self).__init__(**kwargs)
|
||||
|
||||
# The Priority of the message
|
||||
if priority not in NMA_PRIORITIES:
|
||||
self.priority = NotifyMyAndroidPriority.NORMAL
|
||||
|
||||
else:
|
||||
self.priority = priority
|
||||
|
||||
# Validate apikey
|
||||
if not VALIDATE_APIKEY.match(apikey):
|
||||
self.logger.warning(
|
||||
'Invalid NMA API Key specified.'
|
||||
)
|
||||
raise TypeError(
|
||||
'Invalid NMA API Key specified.'
|
||||
)
|
||||
self.apikey = apikey
|
||||
|
||||
if devapikey:
|
||||
# Validate apikey
|
||||
if not VALIDATE_APIKEY.match(devapikey):
|
||||
self.logger.warning(
|
||||
'Invalid NMA DEV API Key specified.'
|
||||
)
|
||||
raise TypeError(
|
||||
'Invalid NMA DEV API Key specified.'
|
||||
)
|
||||
self.devapikey = devapikey
|
||||
|
||||
def notify(self, title, body, notify_type, **kwargs):
|
||||
"""
|
||||
Perform Notify My Android Notification
|
||||
"""
|
||||
|
||||
headers = {
|
||||
'User-Agent': self.app_id,
|
||||
}
|
||||
|
||||
# prepare JSON Object
|
||||
payload = {
|
||||
'apikey': self.apikey,
|
||||
'application': self.app_id,
|
||||
'event': title,
|
||||
'description': body,
|
||||
'priority': self.priority,
|
||||
}
|
||||
|
||||
if self.notify_format == NotifyFormat.HTML:
|
||||
payload['content-type'] = 'text/html'
|
||||
|
||||
if self.devapikey:
|
||||
payload['developerkey'] = self.devapikey
|
||||
|
||||
self.logger.debug('NMA POST URL: %s (cert_verify=%r)' % (
|
||||
self.notify_url, self.verify_certificate,
|
||||
))
|
||||
self.logger.debug('NMA Payload: %s' % str(payload))
|
||||
try:
|
||||
r = requests.post(
|
||||
self.notify_url,
|
||||
data=payload,
|
||||
headers=headers,
|
||||
verify=self.verify_certificate,
|
||||
)
|
||||
if r.status_code != requests.codes.ok:
|
||||
# We had a problem
|
||||
try:
|
||||
self.logger.warning(
|
||||
'Failed to send NMA notification: %s (error=%s).' % (
|
||||
NMA_HTTP_ERROR_MAP[r.status_code],
|
||||
r.status_code))
|
||||
|
||||
except KeyError:
|
||||
self.logger.warning(
|
||||
'Failed to send NMA notification (error=%s).' % (
|
||||
r.status_code))
|
||||
|
||||
# Return; we're done
|
||||
return False
|
||||
|
||||
else:
|
||||
self.logger.debug('NMA Server Response: %s.' % r.raw.read())
|
||||
self.logger.info('Sent NMA notification.')
|
||||
|
||||
except requests.RequestException as e:
|
||||
self.logger.warning(
|
||||
'A Connection error occured sending NMA notification.'
|
||||
)
|
||||
self.logger.debug('Socket Exception: %s' % str(e))
|
||||
|
||||
# Return; we're done
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def parse_url(url):
|
||||
"""
|
||||
Parses the URL and returns enough arguments that can allow
|
||||
us to substantiate this object.
|
||||
|
||||
"""
|
||||
results = NotifyBase.parse_url(url)
|
||||
|
||||
if not results:
|
||||
# We're done early as we couldn't load the results
|
||||
return results
|
||||
|
||||
# Apply our settings now
|
||||
results['notify_format'] = NotifyFormat.HTML
|
||||
|
||||
if 'format' in results['qsd'] and len(results['qsd']['format']):
|
||||
# Extract email format (Text/Html)
|
||||
format = NotifyBase.unquote(results['qsd']['format']).lower()
|
||||
if len(format) > 0 and format[0] == 't':
|
||||
results['notify_format'] = NotifyFormat.TEXT
|
||||
|
||||
if 'priority' in results['qsd'] and len(results['qsd']['priority']):
|
||||
_map = {
|
||||
'l': NotifyMyAndroidPriority.LOW,
|
||||
'-2': NotifyMyAndroidPriority.LOW,
|
||||
'm': NotifyMyAndroidPriority.MODERATE,
|
||||
'-1': NotifyMyAndroidPriority.MODERATE,
|
||||
'n': NotifyMyAndroidPriority.NORMAL,
|
||||
'0': NotifyMyAndroidPriority.NORMAL,
|
||||
'h': NotifyMyAndroidPriority.HIGH,
|
||||
'1': NotifyMyAndroidPriority.HIGH,
|
||||
'e': NotifyMyAndroidPriority.EMERGENCY,
|
||||
'2': NotifyMyAndroidPriority.EMERGENCY,
|
||||
}
|
||||
try:
|
||||
results['priority'] = \
|
||||
_map[results['qsd']['priority'][0].lower()]
|
||||
|
||||
except KeyError:
|
||||
# No priority was set
|
||||
pass
|
||||
|
||||
# Now fetch devapi if specified
|
||||
devapi = NotifyBase.split_path(results['fullpath'])[0]
|
||||
if devapi:
|
||||
results['devapikey'] = devapi
|
||||
|
||||
results['apikey'] = results['host']
|
||||
|
||||
return results
|
@ -599,88 +599,6 @@ TEST_URLS = (
|
||||
'test_requests_exceptions': True,
|
||||
}),
|
||||
|
||||
##################################
|
||||
# NotifyMyAndroid
|
||||
##################################
|
||||
('nma://', {
|
||||
'instance': None,
|
||||
}),
|
||||
# APIkey; no device
|
||||
('nma://%s' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# Invalid APIKey
|
||||
('nma://%s' % ('a' * 24), {
|
||||
'instance': TypeError,
|
||||
}),
|
||||
# APIKey
|
||||
('nma://%s' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
# don't include an image by default
|
||||
'include_image': False,
|
||||
}),
|
||||
# APIKey + priority setting
|
||||
('nma://%s?priority=high' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# APIKey + invalid priority setting
|
||||
('nma://%s?priority=invalid' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# APIKey + priority setting (empty)
|
||||
('nma://%s?priority=' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# APIKey + Invalid DevAPI Key
|
||||
('nma://%s/%s' % ('a' * 48, 'b' * 24), {
|
||||
'instance': TypeError,
|
||||
}),
|
||||
# APIKey + DevAPI Key
|
||||
('nma://%s/%s' % ('a' * 48, 'b' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# Testing valid format
|
||||
('nma://%s?format=text' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# Testing valid format
|
||||
('nma://%s?format=html' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# Testing invalid format (fall's back to html)
|
||||
('nma://%s?format=invalid' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# Testing empty format (falls back to html)
|
||||
('nma://%s?format=' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# APIKey + with image
|
||||
('nma://%s' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
}),
|
||||
# bad url
|
||||
('nma://:@/', {
|
||||
'instance': None,
|
||||
}),
|
||||
('nma://%s' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
# force a failure
|
||||
'response': False,
|
||||
'requests_response_code': requests.codes.internal_server_error,
|
||||
}),
|
||||
('nma://%s' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
# throw a bizzare code forcing us to fail to look it up
|
||||
'response': False,
|
||||
'requests_response_code': 999,
|
||||
}),
|
||||
('nma://%s' % ('a' * 48), {
|
||||
'instance': plugins.NotifyMyAndroid,
|
||||
# Throws a series of connection and transfer exceptions when this flag
|
||||
# is set and tests that we gracfully handle them
|
||||
'test_requests_exceptions': True,
|
||||
}),
|
||||
|
||||
##################################
|
||||
# NotifyProwl
|
||||
|
Loading…
Reference in New Issue
Block a user