128 lines
4.3 KiB
Python
Executable file
128 lines
4.3 KiB
Python
Executable file
# -*- coding: utf-8 -*-
|
|
try:
|
|
from urllib.request import Request, urlopen
|
|
except:
|
|
from urllib2 import Request, urlopen
|
|
|
|
from base64 import encodestring, b64encode
|
|
import json
|
|
import mimetypes
|
|
import os
|
|
|
|
HOST = "https://api.pushbullet.com/api";
|
|
|
|
class PushBulletError():
|
|
def __init__(self, value):
|
|
self.value = value
|
|
|
|
def __str__(self):
|
|
return self.value
|
|
|
|
class PushBullet():
|
|
def __init__(self, apiKey):
|
|
self.apiKey = apiKey
|
|
|
|
def _request(self, url, postdata=None):
|
|
request = Request(url)
|
|
request.add_header("Accept", "application/json")
|
|
request.add_header("Content-type","application/json");
|
|
auth = "%s:" % (self.apiKey)
|
|
auth = auth.encode('ascii')
|
|
auth = b64encode(auth)
|
|
auth = b"Basic "+auth
|
|
request.add_header("Authorization", auth)
|
|
request.add_header("User-Agent", "pyPushBullet")
|
|
if postdata:
|
|
postdata = json.dumps(postdata)
|
|
postdata = postdata.encode('utf-8')
|
|
response = urlopen(request, postdata)
|
|
data = response.read()
|
|
data = data.decode("utf-8")
|
|
j = json.loads(data)
|
|
return j
|
|
|
|
def _request_multiform(self, url, postdata, files):
|
|
request = Request(url)
|
|
content_type, body = self._encode_multipart_formdata(postdata, files)
|
|
request.add_header("Accept", "application/json")
|
|
request.add_header("Content-type", content_type);
|
|
auth = "%s:" % (self.apiKey)
|
|
auth = auth.encode('ascii')
|
|
auth = b64encode(auth)
|
|
auth = b"Basic "+auth
|
|
request.add_header("Authorization", auth)
|
|
request.add_header("User-Agent", "pyPushBullet")
|
|
response = urlopen(request, body)
|
|
data = response.read()
|
|
data = data.decode("utf-8")
|
|
j = json.loads(data)
|
|
return j
|
|
|
|
def _encode_multipart_formdata(self, fields, files):
|
|
'''
|
|
from http://mattshaw.org/news/multi-part-form-post-with-files-in-python/
|
|
'''
|
|
def guess_type(filename):
|
|
return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
|
|
|
|
BOUNDARY = '----------bound@ry_$'
|
|
CRLF = '\r\n'
|
|
L = []
|
|
for key,value in fields.iteritems():
|
|
L.append('--'+BOUNDARY)
|
|
L.append('Content-Disposition: form-data; name="%s"'%(key))
|
|
L.append('')
|
|
L.append(str(value))
|
|
|
|
for (key, filename, value) in files:
|
|
L.append('--'+BOUNDARY)
|
|
L.append('Content-Disposition: form-data; name="%s"; filename="%s"'%(key, filename))
|
|
L.append('Content-Type: %s'%(guess_type(filename)))
|
|
L.append('')
|
|
L.append(value)
|
|
|
|
L.append('--'+BOUNDARY+'--')
|
|
L.append('')
|
|
body = CRLF.join(L)
|
|
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
|
|
return content_type, body
|
|
|
|
def getDevices(self):
|
|
return self._request(HOST + "/devices")["devices"]
|
|
|
|
def pushNote(self, device, title, body):
|
|
data = {'type' : 'note',
|
|
'device_id' : device,
|
|
'title' : title,
|
|
'body' : body}
|
|
return self._request(HOST + "/pushes", data)
|
|
|
|
def pushAddress(self, device, name, address):
|
|
data = {'type' : 'address',
|
|
'device_id' : device,
|
|
'name' : name,
|
|
'address' : address}
|
|
return self._request(HOST + "/pushes", data)
|
|
|
|
def pushList(self, device, title, items):
|
|
data = {'type' : 'list',
|
|
'device_id' : device,
|
|
'title' : title,
|
|
'items' : items}
|
|
return self._request(HOST + "/pushes", data)
|
|
|
|
|
|
def pushLink(self, device, title, url):
|
|
data = {'type' : 'link',
|
|
'device_id' : device,
|
|
'title' : title,
|
|
'url' : url}
|
|
return self._request(HOST + "/pushes", data)
|
|
|
|
def pushFile(self, device, file):
|
|
data = {'type' : 'file',
|
|
'device_id' : device}
|
|
filedata = ''
|
|
with open(file, "rb") as f:
|
|
filedata = f.read()
|
|
return self._request_multiform(HOST + "/pushes", data, [('file', os.path.basename(file), filedata)])
|