Skip to content

Nextcloud API Zugriff

Nextcloud
  • Heute auf der Arbeit kam die Frage auf, ob man große Mengen an Datenordnern erzeugen kann, so als Template. So was von Hand anzulegen ist ja irgendwie blöd 😉

    Da fiel mir ein, das müsste man mal testen ob so was geht. War mir eigentlich vorher klar, aber noch nie gemacht, also Anleitung suchen und testen.

    Die Anleitung findet man hier

    Der Testing Request aus der Anleitung

    curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/folder' -X PROPFIND --data '<?xml version="1.0" encoding="UTF-8"?>
    

    So umgebaut, das ich das benutzen kann, also Username und PW eingefügt, Pfad angepasst und ausgeführt.

    Ok, kommt eine Fehlermeldung, die mir gar nichts sagt 😞

    <?xml version="1.0" encoding="utf-8"?>
    <d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
      <s:exception>Sabre\Xml\LibXMLException</s:exception>
      <s:message>Extra content at the end of the document
     on line 1, column 39</s:message>
    </d:error>
    

    Aufgeben? Nein, dafür spiele ich zu gerne rum. Ein paar Sachen ausprobiert und festgestellt, das ich mit

    curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/folder' -X PROPFIND
    

    folgende Antwort bekam.

    <?xml version="1.0"?>
    <d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns"><d:response>......[gekürzt].....
    

    Ok, da kamen Daten an, es wurden die Daten als XML-Datei ausgegeben. Ich habe mir das mal in eine Datei umgeleitet und dann im Browser angesehen. Da bekommt man ja XML vernünftig angezeigt. Die Daten waren korrekt. So, damit war klar das funktioniert so 🙂

    Die Idee war ja Verzeichnisse und Unterordner usw. anzulegen. Also, auf und testen....

    curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/TESTFOLDER' -X MKCOL
    

    Danach wird der Ordner angelegt, mit

    curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/TESTFOLDER/SUBFOLDER1' -X MKCOL
    

    ein Unterordner. Somit war klar, das es ganz einfach ist mit einem Script große Mengen an Ordnern vollautomatisch zu erzeugen.

    wird evtl. noch erweitert..

  • Ok, ich grabe mal wieder ein uraltes Thema aus. Ich wollte das jetzt mal umsetzen um zu schauen, wie man so was löst.

    """ Tool to create folders using the Nextcloud API """
    
    ###############################################
    # Imports
    ###############################################
    import subprocess
    from pathlib import Path
    
    ###############################################
    # Constant
    ###############################################
    # Get home directory from user
    USERHOME = str(Path.home())
    NCPATH = 'https://nextcloud.DOMAIN/remote.php/dav/files/Frank/Python_Script/'
    USERNAME = 'USER'
    PASSWORD = 'PASSWORD TOKEN'
    
    
    ###############################################
    # Function to crate folder with nextcloud api
    ###############################################
    def read_textobject():
    
        # read folders to create from textfile
        with open(f'{USERHOME}/Textdatei.txt', 'r') as obj:
    
            # create object
            for line in obj:
                # path = Path(line.rstrip()) # with whitespaces crash
                
                # replace whitespaces with %20 and remove linefeed (\n)
                path = Path((line.replace(' ', '%20')).rstrip('\n'))
                
                print(line.rstrip())
    
                ###############################################
                # Check if directory exists
                ###############################################
                try:
                    args = ['curl',
                            '-u',
                            f'{USERNAME}:{PASSWORD}',
                            f'{NCPATH}{path}',
                            '-X',
                            'PROPFIND']
                    result = subprocess.run(args,
                                            check=True,
                                            capture_output=True,
                                            text=True)
                except subprocess.CalledProcessError as error:
                    print("Error check for directory")
                    print(result.stderr)
                else:
                    # Evaluation
                    if result.stdout.find("error") != -1:
                        print('Directory not available, will be created')
                        print(result.stdout)
    
                        ###############################################
                        # Create directory
                        ###############################################
                        try:
                            args = ['curl',
                                    '-u',
                                    f'{USERNAME}:{PASSWORD}',
                                    f'{NCPATH}{path}',
                                    '-X',
                                    'MKCOL']
                            result = subprocess.run(args,
                                                    check=True,
                                                    capture_output=True,
                                                    text=True)
                        except subprocess.CalledProcessError as error:
                            print("Error create directory")
                            print(result.stderr)
                        else:
                            if result.stdout:
                                print('Directory not successful created')
                                print(result.stdout)
                            else:
                                print('Directory created successful')
    
                    else:
                        print('Directory available')
                        print(result.stdout)
    
            obj.close()
    
    
    if __name__ == '__main__':
        read_textobject()
    

    Die Textdatei die ich lade, hat folgenden Inhalt

    TEST1
    TEST2
    TEST3
    TEST4
    TEST5
    

    Und das Ergebnis

    02bf23bf-a169-4011-acfb-a40c72bbfae3-grafik.png

  • Wenn der Ordner ein Leerzeichen beinhaltete, war Ende - Script crasht mit Fehler. Die Lösung

    # replace whitespaces with %20 and remove linefeed (\n)
    path = Path((line.replace(' ', '%20')).rstrip('\n'))
    

    Ich ergänze das oben auch direkt.

  • Ok, es gab noch ein Problem und zwar '/'. Habe das Script jetzt nochmal umgebaut, jetzt bin ich soweit zufrieden. Die Textdatei ist auf meine Bedürfnisse angepasst worden

    1.2.01
    1.2.01.1 Text1.1
    1.2.01.2 Text1.2
    1.2.02
    1.2.02.1 Text2.1/Testing
    1.2.02.2 Text2.2
    

    1.2.01 und 1.2.02 erzeugt dann einen Ordner, der Rest sind dann Unterordner.

    """ Tool to create folders using the Nextcloud API """
    
    ###############################################
    # Imports
    ###############################################
    import subprocess
    from pathlib import Path
    
    ###############################################
    # Constant
    ###############################################
    # Get home directory from user
    USERHOME = str(Path.home())
    NCPATH = 'https://DOMAIN/remote.php/dav/files/Frank/Python_Script/'
    USERNAME = 'USER'
    PASSWORD = 'PASSWORD'
    
    
    ###############################################
    # Function to crate folder with nextcloud api
    ###############################################
    def read_textobject():
    
        # read folders to create from textfile
        with open(f'{USERHOME}/Textdatei.txt', 'r') as obj:
    
            # create object
            for line in obj:
    
                line_split = line.split(' ')
                elements = line_split[0].split('.')
    
                try:
                    if elements[3]:
                        main_folder = 0
                        # replace whitespaces with %20, and / with _ and remove linefeed (\n)
                        path = Path((line.replace(' ', '%20').replace('/', '_')).rstrip('\n'))
    
                except IndexError:
                    print("Element is main folder")
                    main_folder = 1
                    # replace whitespaces with %20, and / with _ and remove linefeed (\n)
                    main = Path((line.replace(' ', '%20').replace('/', '_')).rstrip('\n'))
    
                else:
                    print("Element is not a main folder")
    
                ###############################################
                # Create directory
                ###############################################
    
                if main_folder == 1:
                    # Main folder
                    try:
                        args = ['curl',
                                '-u',
                                f'{USERNAME}:{PASSWORD}',
                                f'{NCPATH}{main}',
                                '-X',
                                'MKCOL']
                        result = subprocess.run(args,
                                                check=True,
                                                capture_output=True,
                                                text=True)
    
                    except subprocess.CalledProcessError as error:
                        print(result.stderr)
    
                    else:
                        if result.stdout:
                            print(result.stdout)
                        else:
                            print('Directory created successful')
    
                else:
                    # Not a main folder
                    try:
                        args = ['curl',
                                '-u',
                                f'{USERNAME}:{PASSWORD}',
                                f'{NCPATH}{main}/{path}',
                                '-X',
                                'MKCOL']
                        result = subprocess.run(args,
                                                check=True,
                                                capture_output=True,
                                                text=True)
    
                    except subprocess.CalledProcessError as error:
                        print(result.stderr)
    
                    else:
                        if result.stdout:
                            print(result.stdout)
                        else:
                            print('Directory created successful')
    
            else:
                print(result.stdout)
    
            obj.close()
    
    
    if __name__ == '__main__':
        read_textobject()
    
  • Nextcloud - Update auf 28.0.0

    Nextcloud
    5
    3
    0 Stimmen
    5 Beiträge
    477 Aufrufe
    FrankMF
    28.0.1 ist da. Den Log Reader wieder aktiviert. Gleiches Verhalten. Kann ich so leider nicht gebrauchen, also wieder deaktiviert.
  • Nextcloud - Collabora Installation Debian Bookworm 12

    Nextcloud
    2
    3
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    FrankMF
    Ok, ich war leider nicht in der Lage den CODE-Server hinter einem Proxy zu installieren. Das CODE-Team scheint Docker zu lieben und das andere nur am Rande zu machen. Ohne Liebe Da ich extrem lange Ladezeiten hatte und die Software insgesamt nicht den Eindruck machte, das man das gerne produktiv auf einem Server nutzen möchte, habe ich den Server eben wieder gelöscht. Jetzt fehlt mir leider, die deepl.com Anbindung, aber das kann man ja auch über die Webseite nutzen. Ich nutze jetzt wieder den eingebauten CODE-Server, der eigentlich ein App-Image ist. [image: 1694677466020-28c41010-5ce1-4f7c-89d5-1c9b253011d0-grafik.png] Der klare Vorteil, es läuft incl. Dokumenten Freigabe Nicht vergessen, unter Allow list for WOPI requests kommen die Server Adressen des Nextcloud-Webservers rein! [image: 1694677621827-c1a06c2c-86b5-4750-a062-7ba9d8dd8253-grafik.png]
  • Nextcloud - Hub 5 (27.0.0)

    Nextcloud
    1
    0 Stimmen
    1 Beiträge
    117 Aufrufe
    Niemand hat geantwortet
  • Nextcloud - Upgrade auf 19.0.1

    Nextcloud
    1
    1
    0 Stimmen
    1 Beiträge
    233 Aufrufe
    Niemand hat geantwortet
  • Nextcloud - Größe Datenverzeichnis

    Nextcloud
    1
    1
    0 Stimmen
    1 Beiträge
    240 Aufrufe
    Niemand hat geantwortet
  • Restic & Rclone & Nextcloud

    Linux
    3
    0 Stimmen
    3 Beiträge
    775 Aufrufe
    FrankMF
    Hier mal eine Ausgabe vom ersten Durchgang root@frank-MS-7C37:~# restic --password-file /root/passwd -r rclone:Nextcloud:HOME_UBUNTU backup --files-from /root/includes.txt repository 99xxxxa0 opened successfully, password is correct created new cache in /root/.cache/restic rclone: 2020/05/08 17:47:57 ERROR : locks: error listing: directory not found rclone: 2020/05/08 17:47:58 ERROR : index: error listing: directory not found rclone: 2020/05/08 17:47:58 ERROR : snapshots: error listing: directory not found Files: 3503 new, 0 changed, 0 unmodified Dirs: 2 new, 0 changed, 0 unmodified Added to the repo: 16.872 GiB processed 3503 files, 21.134 GiB in 1:02:56 snapshot fdxxxxec saved Der erste Durchgang hat also etwa eine Stunde benötigt. Durch die Deduplikation der Daten, ist der Vorgang beim zweiten Durchgang viel schneller weil nur neue oder geänderte Daten gesichert werden. Und außerdem sind alle Daten AES-256 verschlüsselt. Also perfekt zur Ablage in irgendeiner Cloud root@frank-MS-7C37:~# restic --password-file /root/passwd -r rclone:Nextcloud:HOME_UBUNTU backup --files-from /root/includes.txt repository 99xxxxa0 opened successfully, password is correct Files: 57 new, 41 changed, 3449 unmodified Dirs: 0 new, 2 changed, 0 unmodified Added to the repo: 22.941 MiB processed 3547 files, 21.137 GiB in 0:13 snapshot c6xxxxe4 saved Wie ihr seht, hat der zweite Durchgang nur ein paar neue und geänderte Daten gesichert. Der Rest ist ja schon vorhanden. Und das kann man dann auch problemlos täglich, wöchentlich oder was auch immer mal eben schnell durchführen. Eines meiner absoluten Lieblingstool
  • Nextcloud - Desktop Integration

    Nextcloud
    1
    3
    0 Stimmen
    1 Beiträge
    296 Aufrufe
    Niemand hat geantwortet
  • Nextcloud - nach Federation Verbindung extrem langsam

    Verschoben Nextcloud
    1
    0 Stimmen
    1 Beiträge
    1k Aufrufe
    Niemand hat geantwortet