🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Google-API

Alles zur Programmierung im LibreOffice.
Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Google-API

Beitrag von karolus » Mi 2. Mär 2016, 17:46

Hallo
Anders gefragt... wie würdest du dieses Beispiel quickstart.py umgestalten, dass es sich aus LO heraus auch starten lässt.
Die schnelle Lösung wäre: Lass das Ding erstmal über die Kommandozeile laufen, wenn das erfolgreich ist, existiert auch eine Datei im Pfad:

Code: Alles auswählen

~/.credentials/calendar-python-quickstart.json'
Wenn du die Datei bereits hast, sollte es aus LO heraus funktionieren, wenn die Zeilen 12 bis 16 auskommentiert werden.
(ohne Gewähr)
Und geht das überhaupt?
Indem du quickstart.py in <deine_benutzerkonfiguration>/Scripts/python/ speicherst und die Funktion `main` ausführst.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Google-API

Beitrag von scientific » Mi 2. Mär 2016, 18:15

So. Habs hinbekommen (Ein Event erzeugen + Abfrage der Erlaubnis über ein Browserfenster, wenn keine Credentials vorhanden sind)

Wenn ich ändern und löschen auch noch schaffe, poste ich das Ergebnis.

lg scientific
Zuletzt geändert von scientific am Mi 2. Mär 2016, 18:35, insgesamt 1-mal geändert.

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Google-API

Beitrag von scientific » Mi 2. Mär 2016, 18:32

Meine ursprüngliche Frage ist aber immer noch unbeantwortet...

Den Api-Key muss jeder Nutzer für sich auf der developer console von Google erzeugen, oder gibt man den als Entwickler einer solchen Anwendung mit der Anwendung weiter?

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Google-API

Beitrag von scientific » Do 3. Mär 2016, 01:22

So das ist nun der Code, der mir erlaubt, aus einem Skript-Aufruf in einem Starbasic-Makro in LO heraus in einem Google-Kalender ein Event zu erzeugen, verändern und zu löschen.


PYTHON: "createOL365event.py"

Code: Alles auswählen

#!/usr/bin/python3
#for python2-3 compatibility
from __future__ import print_function
import httplib2
from httplib2 import Http 

import os
import sys

try:
        sys.argv
except AttributeError:
        sys.argv = ['createOL365event.py']

import icalendar

import pytz
from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

import datetime



SCOPES = 'https://www.googleapis.com/auth/calendar'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Calendar API Python Quickstart'

def get_credentials():
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,
                                   'calendar-python-quickstart.json')

    store = oauth2client.file.Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials



def CreateGoogleEvent( args, attendees):
    """Creates a new Event in an Office365-Calendar"""
    kwargs = dict( args )
    #http://wescpy.blogspot.co.at/2015/09/creating-events-in-google-calendar.html

    credentials = get_credentials()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
        credentials = tools.run_flow(flow, store, flags) \
                if flags else tools.run(flow, store)
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('calendar', 'v3', http=http)

    locdtstart = pytz.timezone(kwargs['TZALTNAME']).localize(datetime.datetime.strptime(kwargs['StartTZ'], "%Y-%m-%dT%H:%M:%S"))
    locdtend = pytz.timezone(kwargs['TZALTNAME']).localize(datetime.datetime.strptime(kwargs['EndTZ'], "%Y-%m-%dT%H:%M:%S"))

    data = {}
    if kwargs['Subject'] != "":
        data['summary'] = kwargs['Subject']
    if kwargs['description'] != "":
       data['Body'] = {}
       data['Body']['Content'] = kwargs['description']
    if kwargs['StartTZ'] != "":
        data['start'] = {}
        data['start']['dateTime'] = locdtstart.isoformat()
        data['start']['TimeZone'] = kwargs['TZALTNAME']
    if kwargs['EndTZ'] != "":
        data['end'] = {}
        data['end']['dateTime'] = locdtend.isoformat()
        data['end']['TimeZone'] = kwargs['TZALTNAME']
    if kwargs['Location'] != "":
        data['location'] = kwargs['Location']
    if kwargs['ORGANIZER'][0] != "":
        data['organizer'] = {}
        data['organizer']['email'] = kwargs['ORGANIZER'][1]
        data['organizer']['displayName'] = kwargs['ORGANIZER'][0]
    if kwargs['ORGANIZER'][0] != "":
        data['creator'] = {}
        data['creator']['email'] = kwargs['ORGANIZER'][1]
        data['creator']['displayName'] = kwargs['ORGANIZER'][0]

    if len(attendees) > 0:
        data['Attendees'] = []
        for att in attendees:
            data['Attendees'].append(att[1])


    if kwargs['ACTION'] == 'POST':
        e = service.events().insert(calendarId=kwargs['KUID'],sendNotifications=True, body=data).execute()
        return e['id']
    elif kwargs['ACTION'] == 'PATCH':
        #e = service.events().get(calendarId='primary', eventId='eventId').execute()
        e = service.events().update(calendarId=kwargs['KUID'], eventId=kwargs['TUID'], body=data).execute()
        return e['id']
    elif kwargs['ACTION'] == 'DELETE':
        try:
            e = service.events().delete(calendarId=kwargs['KUID'], eventId=kwargs['TUID']).execute()
            return 'Termin gelöscht'
        except:
            return 'Löschen fehlgeschlagen'
    else:
        return "Irgendwas ist schief gelaufen"
Starbasic:

Code: Alles auswählen

		pyargs=Array(Array("StartTZ",TSTART)_
					,Array("EndTZ",TEND)_
					,Array("Location",TLOCATION)_
					,Array("Subject",TSUMMARY)_
					,Array("description",TDESCRIPTION)_
					,Array("loginurl",KLOGINURL)_
					,Array("urlfull",KURL)_
					,Array("username",KUSERNAME)_
					,Array("password",KPASSWD)_
					,Array("TUID",TUID)_
					,Array("TZNAME",TZNAME)_
					,Array("UPDATE",TUPDATE)_
					,Array("TZALTNAME",TZALTNAME)_
					,Array("ORGANIZER",arOrganizer(0,1))_
					,Array("ACTION",ACTION)_
					,Array("SEND",sSEND)_
					,Array("ICSFILE",convertfromurl(Path.Temp+"/message.eml"))_
					,Array("KSMTP",KSMTP)_
					,Array("APIKEY",APIKEY)_
					,Array("KUID",KUID)_
					)
					
				scpr = ThisComponent.getScriptProvider
				scmod = scpr.getScript("vnd.sun.star.script:createOL365event.py$CreateGoogleEvent?language=Python&location=share"))
				returnFromPython = scmod.invoke(Array(pyargs, arAttendee ),b,c)
				msgbox returnFromPython

Wobei anzumerken ist, dass ich im Array die Variablen über verschiedene Abfragen aus meiner Datenbank befülle.
Beispiele
TZALTNAME = "Europe/Vienna"
StartTZ = 2016-03-03T13:00:00
EndTZ = 2016-03-03T13:00:00

lg scientific

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Google-API

Beitrag von karolus » Do 3. Mär 2016, 10:58

Hallo

Für mich bleibt die Frage:
  • Warum muss das zuerst alles in Basic zusammengestückelt werden?
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Google-API

Beitrag von scientific » Do 3. Mär 2016, 11:09

Weil ich mein ganzes Projekt in Basic aufgebaut habe, bis ich an den Punkt gestoßen bin, dass Basic nicht mehr ausreichte.
Außerdem ist Basic mit der IDE komfortabler zu handhaben als Python. Wenn ich mein Python-File verändere, muss ich LO beenden und neu starten, damit die Änderungen wirksam werden (ich hab noch nicht herausgefunden, warum es ein paar Male ohne Neustart funktioniert und dann aber der Neustart notwendig wird, und warum das auf Windows öfter ohne Neustart funktioniert als auf Linux...).

Und ich weiß noch nicht, wie ich mittels Python auf meine Abfragen und Tabellen aus der Datenbank zugreifen kann. Siehe anderer Thread.

Und ich habs noch nicht hinbekommen, dass ich mit Python auf Formulare und Unterformulare und auf Spalten in darinbefindlichen Grids zugreife um Daraus Werte auszulesen.

Python ist für mich "Neuland" :)

Wenn ich mit Python vertrauter bin, und vor allem mit der Kombination aus Python mit LO (Die Dokumentationen dazu im Netz sind relativ spärlich bis verschwindend gering), stelle ich das Ganze möglicherweise einmal um. Aber der ewige Hinweis, warum ich das nicht in Python löse ist ein wenig mühsam. Vor allem dann, wenn mir auch gleichzeitig vermittelt wird, dass ich mit Großbuchstaben schreiben anfangen soll, statt gleich Differentialgleichungen zu lösen, und man "nicht die Arbeit für mich erledigen" will... ;)

lg scientific

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Google-API

Beitrag von karolus » Do 3. Mär 2016, 12:39

Hallo
Wenn ich mein Python-File verändere, muss ich LO beenden und neu starten, damit die Änderungen wirksam werden (ich hab noch nicht herausgefunden, warum es ein paar Male ohne Neustart funktioniert und dann aber der Neustart notwendig wird
Das Verhalten beobachte ich nur unter den Nebenbedingungen:
  • der Pythoncode ist einem Script in ein Dokument gespeichert
    und wird über einen Button oder irgendein Ereigniss ausgelöst.
Außerdem ist Basic mit der IDE komfortabler zu handhaben als Python.
Der Punkt stellt sich für mich genau umgekehrt dar, ich schreibe im Webrowser (innerhalb von ipython notebook ) mit weitreichender selbständiger Autovervollständigung ( das schafft das angebliche basic-Integrated-Development-Environment allenfalls in rudimentären Ansätzen.
Sogar wenn ich etwas für Basic machen will, wird das idR. zuerst in python geschrieben, danach c&p in die BasicIDE ... SyntaxAnpassungen ... und fertig.

....... Vor allem dann, wenn mir auch gleichzeitig vermittelt wird,........
Was erwartest du denn -- du fängst gleichzeitig auf mehreren "Baustellen" an.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

scientific
Beiträge: 131
Registriert: Do 25. Apr 2013, 17:27

Re: Google-API

Beitrag von scientific » Do 3. Mär 2016, 14:00

Hi
karolus hat geschrieben:
....... Vor allem dann, wenn mir auch gleichzeitig vermittelt wird,........
Was erwartest du denn -- du fängst gleichzeitig auf mehreren "Baustellen" an.
Ich erwarte mir eine Beantwortung meiner Fragen oder ein "ich weiß es nicht", oder ein "sieh hier nach, lies da, dort findest du Beispiele".

Belehrungen braucht kein Mensch. Und ich möchte mich auch nicht dafür entschuldigen müssen, dass ich relativ rasch in ein Thema einsteige und einerseits einiges nicht weiß und kann und andererseits feststelle, dass das was angeboten wird nicht intuitiv ist und die Doku mangelhaft.

lg scientific


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten