Seite 1 von 1

Java-Script/Python in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Fr 19. Feb 2016, 10:40
von scientific
Hi Leute!

Ich bin immer noch auf der Suche nach einer sinnvollen Möglichkeit, mit LO-Makros ein Kalender-Event in Outlook zu erzeugen und zu verändern.

Dabei bin ich jetzt auf die API von Outlook gestoßen, welche die Möglichkeit bietet, per Javascript ein Kalender-Event zu erzeugen (und andere Operationen)

LO bietet die Möglichkeit, Javascript auch als Makros einzusetzen. Jedoch hab ich überhaupt keine Erfahrung damit. JS ist mir ein etwas spanisches Dorf, aber ich kann bei einfachen Vorlagen schon Anpassungen vornehmen, um diese an meine Bedürfnisse anzupassen.

Aber wie rufe ich nur ein Javascript aus einem Basic-Makro auf? Wie übergebe ich hier div. Parameter?
Und kann ich ev. dieses Beispiel https://msdn.microsoft.com/office/offic ... entsClient auch in ein Basic-Makro packen, oder auch mit Basic allein lösen? Oder muss ich doch mit JS arbeiten?

Fragen über Fragen...

Ich hoffe auf Antworten :)

lg scientific

Re: Java-Script in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Fr 19. Feb 2016, 13:20
von karolus
Hallo

Nein, du musst nicht Basic oder JS nehmen du darfst es mit python lösen.
Soweit ich das erkennen kann benötigst du nur das mitgelieferte `json` dokumentation
und `urllib2`Dokumentation oder besser gleich das thirdparty-paket requests

Re: Java-Script in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: So 21. Feb 2016, 14:22
von scientific
Ich hab mich jetzt mit Python und der Office365-Api beschäftigt und bin auf folgenden Code gekommen, der mir mit Python ein Event in Outlook erzeugt, bzw. dieses wieder löscht:

erzeugen

Code: Alles auswählen

#!/usr/bin/python

import urllib2
import getpass
import os
import json
import sys
import base64


# Set the request parameters
url = 'https://outlook.office365.com/api/v1.0/me/events?$Select=Start,End'
user = 'email@adresse'

pwd = getpass.getpass('Please enter your AD password: ')

# Create JSON payload
data = {
  "Subject": "My Subject",
  "Body": {
    "ContentType": "HTML",
    "Content": ""
  },
  "Start": "2016-02-21T14:00:00-05:00",
  "StartTimeZone": "Central Europe Standard Time",
  "End": "2016-02-21T15:00:00-05:00",
  "EndTimeZone": "Central Europe Standard Time",
}

json_payload = json.dumps(data)

# Build the HTTP request
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request(url, data=json_payload)
auth = base64.encodestring('%s:%s' % (user, pwd)).replace('\n', '')
request.add_header('Authorization', 'Basic %s' % auth)
request.add_header('Content-Type', 'application/json')
request.add_header('Accept', 'application/json')
request.get_method = lambda: 'POST'
# Perform the request
result = json.load(opener.open(request))
print result.get("Id")

 
löschen

Code: Alles auswählen

#!/usr/bin/python

import urllib2
import getpass
import os
import json
import sys
import base64


# Set the request parameters
url = 'https://outlook.office365.com/api/v1.0/me/events/<EVENDID>'
user = 'email@adresse'

pwd = getpass.getpass('Please enter your AD password: ')


# Build the HTTP request
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request(url)
auth = base64.encodestring('%s:%s' % (user, pwd)).replace('\n', '')
request.add_header('Authorization', 'Basic %s' % auth)
#request.add_header('Content-Type', 'application/json')
#request.add_header('Accept', 'application/json')
request.get_method = lambda: 'DELETE'
# Perform the request
result = opener.open(request)

Wobei <EVENTID> durch die 153 Zeichen langen ID des zuvor erzeugten Events zu ersetzen ist.

Das ganze läuft bisher nur auf der Shell unter Linux. Unter Windows konnte ich das noch nicht testen.

Die Serverantwort erfolgt als JSON.

Jetzt habe ich dazu ein paar Fragen...

Die Einbindung von Python-Skripten und die Bearbeitung in ein Base-Dokument ist ja etwas "aufwändig".
Das Absetzen des HTTP-Requests müsste ja auch mit Starbasic zu erledigen sein...

Ich hab hier schon einen Beispielcode gefunden, der funktioniert. Allerdings weiß ich noch nicht, wie die Authentifizierung zu erledigen ist.

Code: Alles auswählen

Sub gethttpfromurl

   sURL = "http://www.digitallook.com/cgi-bin/dlmedia/security.cgi?username=&ac=&csi=10088"
   myfilepath =  "c:/users/public/html.txt"
   oSFA = createUNOService ("com.sun.star.ucb.SimpleFileAccess")
   oInpDataStream = createUNOService ("com.sun.star.io.TextInputStream")
   oInpDataStream.setInputStream(oSFA.openFileRead(sUrl))
   
   for x = 0 to 3
      mytext = oInpDataStream.readLine()
      msgbox mytext
   next x
 
End Sub
Und dann stell ich mir die Frage, wie ich die JSON-Antwort des Outlook-Servers parsen kann... mit Starbasic. Gibt es dazu überhaupt etwas?

Wenn ich das mit Python löse... Dazu muss ja am Rechner Python installiert sein. Wie binde ich dann die Skripte in das Dokument ein? Wie übergebe ich Parameter? Wie bekomme ich die Ausgaben wieder in die schon bestehenden Starbasic-Makros?

lg scientific

Re: Java-Script in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Mo 22. Feb 2016, 16:21
von Wanderer
Hallo,
scientific hat geschrieben: Wenn ich das mit Python löse... Dazu muss ja am Rechner Python installiert sein. Wie binde ich dann die Skripte in das Dokument ein? Wie übergebe ich Parameter? Wie bekomme ich die Ausgaben wieder in die schon bestehenden Starbasic-Makros?

lg scientific
Ruf doch mal in LibreOffice Extras->Makros->Makros verwalten aus dem Menü auf.
Bei meiner 4.4-Versiobn steht da schon Python direkt unter Basic...
Soweit ich mich erinnere liefert LibreOffice dir Python3 gleich mit (OO aber noch Python2.7).

Die folgenden Links kommen aus einer kurzen Google-Suche:
https://tmtlakmal.wordpress.com/2013/08 ... ffice-4-0/
http://stackoverflow.com/questions/2141 ... ibreoffice
https://wiki.openoffice.org/wiki/Python ... o_language
http://lmgtfy.com/?q=Python+in+LibreOffice

Fazit: Entscheide dich vorher zwischen Basic oder Python. Mischen ist meiner Ansicht nach nicht sinnvoll.

MfG, Jörn

Re: Java-Script/Python in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Mo 22. Feb 2016, 20:28
von scientific
Danke!

Ich habs mittlerweile soweit gebracht, dass ich das Python-Skript aus Basic gut aufrufen kann, damit Python die Geschichte mit den Outlook-Events erledigt. Anlegen und Löschen geht schon.

Ich bin deswegen auf Python gekommen, weil Basic gewisse Geschichten nicht kann. Da bin ich auch erst im Laufe des Programmierens draufgekommen. :)

Jetzt das Ganze Projekt auf Python umzustellen, ist auch keine gute Idee. Ist ziemlich umfangreich. Vielleicht in einer weiteren Version, wenn ich besser in Python zurechtkomm.

Momentan plage ich mich mit der Übergabe der Variablen. Da scheint die Schnittstelle zwischen LO und Python nicht ganz so zu funktionieren, wie wenn ich die Argumente von einem Python-Skript an eine Python-Funktion übergebe (Konkret *arg und **kwarg verursachen Fehler)

Muss mich mal durch deine Links arbeiten. Ich hab schon ziemlich viel an Seite abgegrast... (Also, Google kenne ich ;-) )

lg scientific

Re: Java-Script/Python in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Di 23. Feb 2016, 10:56
von karolus
Hallo
Jetzt das Ganze Projekt auf Python umzustellen, ist auch keine gute Idee. Ist ziemlich umfangreich. Vielleicht in einer weiteren Version, wenn ich besser in Python zurechtkomm.
Es jetzt nicht zu tun, ist eine (noch) schlechtere Idee - Gewöhnlich wachsen Projekte und damit auch der Umfang an Code der umgestellt werden muss - und wie du selbst schreibst - kämpfst du gerade mit der Übergabe von Argumenten an Schnittstellen die du im anderen Fall nicht benötigen würdest.

Re: Java-Script/Python in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Di 23. Feb 2016, 12:55
von scientific
Du hast recht. Es wäre wirklich viel vernünftiger, jetzt das ganze Projekt auf Python umzustellen.
Der Zeitaufwand, mich jetzt in Python soweit einzuarbeiten, dass ich dass Neuschreiben des gesamten Projektes in Python rasch erledigen könnte, steht aber in keinem Verhältnis zum tatsächlichen Neuschreiben des Projektes...

Der Code ist jetzt ziemlich umfangreich. Und ich muss "nur" ein paar Funktionen mit Python lösen, die mit Basic nicht gehen.

Und ja, es bringt Probleme... aber die hab ich anderswo mit anderen Lösungen an anderer Stelle auch. :)

Weißt du zufällig, wie ich Argumente im Script-Aufruf in Basic formulieren muss, damit sie Python mit **kwargs akzeptiert?

lg scientific

Re: Java-Script/Python in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Di 23. Feb 2016, 15:17
von karolus
Hallo

wenn du in Basic sowas auf die Reise schickst:

Code: Alles auswählen

arg = array(array("a",1),array("b",2), array("c",3))
kommt arg (sofern du den part schon kapiert hast- und richtig machst) auf der python-seite als verschachtelter tuple an

Code: Alles auswählen

print( arg)

(('a',1),
 ('b',2),
 ('c',3) )

#in ein Key-word-dictionary umwandeln

kwargs = dict( arg )

print(kwargs)
{'a':1, 'b':2, 'c':3}

Re: Java-Script/Python in Libreoffice - Erstellen eines Kalenderevents in Outlook

Verfasst: Mi 24. Feb 2016, 10:11
von scientific
Ah!!!

Mir war nicht bewusst, dass Arrays in Starbasic auch benamst sein können (Und nicht nur per Index).
Gut, das ändert jetzt einiges.

Die Übergabe eines Arguments als Array hab ich schon gecheckt. Die explizite Argumentenannahme als **kwargs tut also an der Schnittstelle nicht. Ich hab mir einmal mit einem Konstrukt aus Strings beholfen, welches ich dann in Python splitte und so dann per Namen auf die einzelnen Argumente zugreifen kann. Aber diese Lösung gefällt mir weit besser.

Vielen Dank für den Hinweis.

Weißt du auch, wie man aus Python einen SELECT-Befehl an die Datenbank absetzen kann? Dazu finde ich irgendwie auch nichts brauchbares.

lg scientific