1
0
Fork 0
This repository has been archived on 2024-06-28. You can view files and clone it, but cannot push or open issues or pull requests.
Umweltdatenmessung/Fremddateien/pushbullet.py
2014-04-19 16:31:56 +02:00

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)])