mirror of https://github.com/caronc/apprise
Removal of palot:// as service is no longer available; refs #46
parent
042c5ed2da
commit
fa6e34eb86
|
@ -43,7 +43,6 @@ The table below identifies the services this tool supports and some example serv
|
||||||
| [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix) | matrix:// | (TCP) 443 | matrix://token<br />matrix://user@token<br />matrixs://token?mode=slack<br />matrixs://user@token
|
| [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix) | matrix:// | (TCP) 443 | matrix://token<br />matrix://user@token<br />matrixs://token?mode=slack<br />matrixs://user@token
|
||||||
| [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 />
|
| [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 />
|
||||||
| [Prowl](https://github.com/caronc/apprise/wiki/Notify_prowl) | prowl:// | (TCP) 443 | prowl://apikey<br />prowl://apikey/providerkey
|
| [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
|
| [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
|
||||||
| [Pushjet](https://github.com/caronc/apprise/wiki/Notify_pushjet) | pjet:// | (TCP) 80 | pjet://secret<br />pjet://secret@hostname<br />pjet://secret@hostname:port<br />pjets://secret@hostname<br />pjets://secret@hostname:port<br /><i>Note: if no hostname defined https://api.pushjet.io will be used
|
| [Pushjet](https://github.com/caronc/apprise/wiki/Notify_pushjet) | pjet:// | (TCP) 80 | pjet://secret<br />pjet://secret@hostname<br />pjet://secret@hostname:port<br />pjets://secret@hostname<br />pjets://secret@hostname:port<br /><i>Note: if no hostname defined https://api.pushjet.io will be used
|
||||||
| [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover) | pover:// | (TCP) 443 | pover://user@token<br />pover://user@token/DEVICE<br />pover://user@token/DEVICE1/DEVICE2/DEVICEN<br />_Note: you must specify both your user_id and token_
|
| [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover) | pover:// | (TCP) 443 | pover://user@token<br />pover://user@token/DEVICE<br />pover://user@token/DEVICE1/DEVICE2/DEVICEN<br />_Note: you must specify both your user_id and token_
|
||||||
|
|
|
@ -1,168 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2019 Chris Caron <lead2gold@gmail.com>
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# This code is licensed under the MIT License.
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files(the "Software"), to deal
|
|
||||||
# in the Software without restriction, including without limitation the rights
|
|
||||||
# to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
|
||||||
# copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions :
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
|
||||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
# THE SOFTWARE.
|
|
||||||
|
|
||||||
import re
|
|
||||||
import requests
|
|
||||||
from json import dumps
|
|
||||||
|
|
||||||
from .NotifyBase import NotifyBase
|
|
||||||
from .NotifyBase import HTTP_ERROR_MAP
|
|
||||||
from ..common import NotifyImageSize
|
|
||||||
|
|
||||||
# Extend HTTP Error Messages
|
|
||||||
PUSHALOT_HTTP_ERROR_MAP = HTTP_ERROR_MAP.copy()
|
|
||||||
PUSHALOT_HTTP_ERROR_MAP.update({
|
|
||||||
406: 'Message throttle limit hit.',
|
|
||||||
410: 'AuthorizedToken is no longer valid.',
|
|
||||||
})
|
|
||||||
|
|
||||||
# Used to validate Authorization Token
|
|
||||||
VALIDATE_AUTHTOKEN = re.compile(r'[A-Za-z0-9]{32}')
|
|
||||||
|
|
||||||
|
|
||||||
class NotifyPushalot(NotifyBase):
|
|
||||||
"""
|
|
||||||
A wrapper for Pushalot Notifications
|
|
||||||
"""
|
|
||||||
|
|
||||||
# The default descriptive name associated with the Notification
|
|
||||||
service_name = 'Pushalot'
|
|
||||||
|
|
||||||
# The services URL
|
|
||||||
service_url = 'https://pushalot.com/'
|
|
||||||
|
|
||||||
# The default protocol is always secured
|
|
||||||
secure_protocol = 'palot'
|
|
||||||
|
|
||||||
# A URL that takes you to the setup/help of the specific protocol
|
|
||||||
setup_url = 'https://github.com/caronc/apprise/wiki/Notify_pushalot'
|
|
||||||
|
|
||||||
# Pushalot uses the http protocol with JSON requests
|
|
||||||
notify_url = 'https://pushalot.com/api/sendmessage'
|
|
||||||
|
|
||||||
# Allows the user to specify the NotifyImageSize object
|
|
||||||
image_size = NotifyImageSize.XY_72
|
|
||||||
|
|
||||||
def __init__(self, authtoken, is_important=False, **kwargs):
|
|
||||||
"""
|
|
||||||
Initialize Pushalot Object
|
|
||||||
"""
|
|
||||||
super(NotifyPushalot, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
# Is Important Flag
|
|
||||||
self.is_important = is_important
|
|
||||||
|
|
||||||
self.authtoken = authtoken
|
|
||||||
# Validate authtoken
|
|
||||||
if not VALIDATE_AUTHTOKEN.match(authtoken):
|
|
||||||
self.logger.warning(
|
|
||||||
'Invalid Pushalot Authorization Token Specified.'
|
|
||||||
)
|
|
||||||
raise TypeError(
|
|
||||||
'Invalid Pushalot Authorization Token Specified.'
|
|
||||||
)
|
|
||||||
|
|
||||||
def notify(self, title, body, notify_type, **kwargs):
|
|
||||||
"""
|
|
||||||
Perform Pushalot Notification
|
|
||||||
"""
|
|
||||||
|
|
||||||
headers = {
|
|
||||||
'User-Agent': self.app_id,
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
}
|
|
||||||
|
|
||||||
# prepare JSON Object
|
|
||||||
payload = {
|
|
||||||
'AuthorizationToken': self.authtoken,
|
|
||||||
'IsImportant': self.is_important,
|
|
||||||
'Title': title,
|
|
||||||
'Body': body,
|
|
||||||
'Source': self.app_id,
|
|
||||||
}
|
|
||||||
|
|
||||||
image_url = self.image_url(notify_type)
|
|
||||||
if image_url:
|
|
||||||
payload['Image'] = image_url
|
|
||||||
|
|
||||||
self.logger.debug('Pushalot POST URL: %s (cert_verify=%r)' % (
|
|
||||||
self.notify_url, self.verify_certificate,
|
|
||||||
))
|
|
||||||
self.logger.debug('Pushalot Payload: %s' % str(payload))
|
|
||||||
try:
|
|
||||||
r = requests.post(
|
|
||||||
self.notify_url,
|
|
||||||
data=dumps(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 Pushalot notification: '
|
|
||||||
'%s (error=%s).' % (
|
|
||||||
PUSHALOT_HTTP_ERROR_MAP[r.status_code],
|
|
||||||
r.status_code))
|
|
||||||
|
|
||||||
except KeyError:
|
|
||||||
self.logger.warning(
|
|
||||||
'Failed to send Pushalot notification '
|
|
||||||
'(error=%s).' % r.status_code)
|
|
||||||
|
|
||||||
# Return; we're done
|
|
||||||
return False
|
|
||||||
|
|
||||||
else:
|
|
||||||
self.logger.info('Sent Pushalot notification.')
|
|
||||||
|
|
||||||
except requests.RequestException as e:
|
|
||||||
self.logger.warning(
|
|
||||||
'A Connection error occured sending Pushalot 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['authtoken'] = results['host']
|
|
||||||
|
|
||||||
return results
|
|
|
@ -40,7 +40,6 @@ from .NotifyJSON import NotifyJSON
|
||||||
from .NotifyMatrix import NotifyMatrix
|
from .NotifyMatrix import NotifyMatrix
|
||||||
from .NotifyMatterMost import NotifyMatterMost
|
from .NotifyMatterMost import NotifyMatterMost
|
||||||
from .NotifyProwl import NotifyProwl
|
from .NotifyProwl import NotifyProwl
|
||||||
from .NotifyPushalot import NotifyPushalot
|
|
||||||
from .NotifyPushBullet import NotifyPushBullet
|
from .NotifyPushBullet import NotifyPushBullet
|
||||||
from .NotifyPushjet.NotifyPushjet import NotifyPushjet
|
from .NotifyPushjet.NotifyPushjet import NotifyPushjet
|
||||||
from .NotifyPushover import NotifyPushover
|
from .NotifyPushover import NotifyPushover
|
||||||
|
@ -68,7 +67,7 @@ __all__ = [
|
||||||
'NotifyBoxcar', 'NotifyEmail', 'NotifyEmby', 'NotifyDiscord',
|
'NotifyBoxcar', 'NotifyEmail', 'NotifyEmby', 'NotifyDiscord',
|
||||||
'NotifyFaast', 'NotifyGnome', 'NotifyGrowl', 'NotifyIFTTT', 'NotifyJoin',
|
'NotifyFaast', 'NotifyGnome', 'NotifyGrowl', 'NotifyIFTTT', 'NotifyJoin',
|
||||||
'NotifyJSON', 'NotifyMatrix', 'NotifyMatterMost', 'NotifyProwl',
|
'NotifyJSON', 'NotifyMatrix', 'NotifyMatterMost', 'NotifyProwl',
|
||||||
'NotifyPushalot', 'NotifyPushBullet', 'NotifyPushjet', 'NotifyPushover',
|
'NotifyPushBullet', 'NotifyPushjet', 'NotifyPushover',
|
||||||
'NotifyRocketChat', 'NotifySlack', 'NotifyStride', 'NotifyToasty',
|
'NotifyRocketChat', 'NotifySlack', 'NotifyStride', 'NotifyToasty',
|
||||||
'NotifyTwitter', 'NotifyTelegram', 'NotifyXBMC', 'NotifyXML',
|
'NotifyTwitter', 'NotifyTelegram', 'NotifyXBMC', 'NotifyXML',
|
||||||
'NotifyWindows',
|
'NotifyWindows',
|
||||||
|
|
|
@ -65,19 +65,18 @@ def test_apprise():
|
||||||
servers = [
|
servers = [
|
||||||
'faast://abcdefghijklmnop-abcdefg',
|
'faast://abcdefghijklmnop-abcdefg',
|
||||||
'kodi://kodi.server.local',
|
'kodi://kodi.server.local',
|
||||||
'palot://1f418df7577e32b89ac6511f2eb9aa68',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
a = Apprise(servers=servers)
|
a = Apprise(servers=servers)
|
||||||
|
|
||||||
# 3 servers loaded
|
# 3 servers loaded
|
||||||
assert(len(a) == 3)
|
assert(len(a) == 2)
|
||||||
|
|
||||||
# We can add another server
|
# We can add another server
|
||||||
assert(
|
assert(
|
||||||
a.add('mmosts://mattermost.server.local/'
|
a.add('mmosts://mattermost.server.local/'
|
||||||
'3ccdd113474722377935511fc85d3dd4') is True)
|
'3ccdd113474722377935511fc85d3dd4') is True)
|
||||||
assert(len(a) == 4)
|
assert(len(a) == 3)
|
||||||
|
|
||||||
# We can empty our set
|
# We can empty our set
|
||||||
a.clear()
|
a.clear()
|
||||||
|
|
|
@ -744,50 +744,6 @@ TEST_URLS = (
|
||||||
'test_requests_exceptions': True,
|
'test_requests_exceptions': True,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
##################################
|
|
||||||
# NotifyPushalot
|
|
||||||
##################################
|
|
||||||
('palot://', {
|
|
||||||
'instance': None,
|
|
||||||
}),
|
|
||||||
# AuthToken
|
|
||||||
('palot://%s' % ('a' * 32), {
|
|
||||||
'instance': plugins.NotifyPushalot,
|
|
||||||
}),
|
|
||||||
# AuthToken, no image
|
|
||||||
('palot://%s' % ('a' * 32), {
|
|
||||||
'instance': plugins.NotifyPushalot,
|
|
||||||
# don't include an image by default
|
|
||||||
'include_image': False,
|
|
||||||
}),
|
|
||||||
# Invalid AuthToken
|
|
||||||
('palot://%s' % ('a' * 24), {
|
|
||||||
# Missing a channel
|
|
||||||
'instance': TypeError,
|
|
||||||
}),
|
|
||||||
# AuthToken + bad url
|
|
||||||
('palot://:@/', {
|
|
||||||
'instance': None,
|
|
||||||
}),
|
|
||||||
('palot://%s' % ('a' * 32), {
|
|
||||||
'instance': plugins.NotifyPushalot,
|
|
||||||
# force a failure
|
|
||||||
'response': False,
|
|
||||||
'requests_response_code': requests.codes.internal_server_error,
|
|
||||||
}),
|
|
||||||
('palot://%s' % ('a' * 32), {
|
|
||||||
'instance': plugins.NotifyPushalot,
|
|
||||||
# throw a bizzare code forcing us to fail to look it up
|
|
||||||
'response': False,
|
|
||||||
'requests_response_code': 999,
|
|
||||||
}),
|
|
||||||
('palot://%s' % ('a' * 32), {
|
|
||||||
'instance': plugins.NotifyPushalot,
|
|
||||||
# Throws a series of connection and transfer exceptions when this flag
|
|
||||||
# is set and tests that we gracfully handle them
|
|
||||||
'test_requests_exceptions': True,
|
|
||||||
}),
|
|
||||||
|
|
||||||
##################################
|
##################################
|
||||||
# NotifyPushBullet
|
# NotifyPushBullet
|
||||||
##################################
|
##################################
|
||||||
|
|
Loading…
Reference in New Issue