Hoe publiceer ik de data van mijn citizen science project

Zenodo data flow

Een eenvoudige handleiding voor het uploaden van gegevens via de Zenodo API!

Zenodo biedt gratis hosting voor wetenschappelijke gegevens aan. Je kan ofwel naar de website gaan en data handmatig uploaden, of data publiceren en downloaden via de API. Deze tutorial implementeert de API om dummy gegevens te publiceren.

De API maakt automatisch publiceren, opslaan of hosten van uw gegevens online mogelijk, en het opent ook mogelijkheden voor dashboarding vanuit Zenodo.

Zenodo.png

Zenodo biedt ook de mogelijkheid om "communities" te creëren waar je controle hebt (goedkeuren en afwijzen) over welke gegevens opgenomen worden in de "community collection":

Communities.png

Door main.py uit te voeren (terug te vinden in deze repository: zenodo-api) en enkele kleine aanpassingen te maken, worden dummy gegevens gepubliceerd in uw repository. U moet eerst een Zenodo-account aanmaken, dit kan eenvoudig op hun website.

Wees ervan bewust dat er 2 "websites" zijn:

  • De reguliere website.
  • Een sandbox-versie.

Deze delen uw account niet en u hebt een aparte log-in nodig om toegang te krijgen tot uw repository. De sandbox-versie kan worden gebruikt om zaken te testen. De gegevens daar worden waarschijnlijk regelmatig verwijderd, vertrouw hier dus alleen op voor testdoeleinden! Afhankelijk van of u in de sandbox wil werken of niet, kan u dit aan het begin van het script selecteren:

sandbox = 0

if sandbox:
    ACCESS_TOKEN = 'secret'
    base_api = 'https://sandbox.zenodo.org/'
else:
    ACCESS_TOKEN = 'secret'
    base_api = 'https://zenodo.org/'

In de upload_and_publish functie wordt al het werk gedaan, laten we er doorheen gaan.

We testen eerst onze token die aangemaakt werd bij de account registratie op de Zenodo-website:

def upload_and_publish(input):

    # test token
    r = requests.get('{}api/deposit/depositions'.format(base_api),
                                           params={'access_token': ACCESS_TOKEN})
    print(r.status_code)
    print(r.json())

Om het publiceren van gegevens te starten, maken we eerst een lege upload aan:

    # empty upload
    headers = {"Content-Type": "application/json"}
    params = {'access_token': ACCESS_TOKEN}
    r = requests.post('{}api/deposit/depositions'.format(base_api),
                          params=params,
                          json={},
                          # Headers are not necessary here since "requests" automatically
                          # adds "Content-Type: application/json", because we're using
                          # the "json=" keyword argument
                          # headers=headers,
                          headers=headers)
    print(r.status_code)
    print(r.json())

Vervolgens maken we een "bucket" aan die wordt gebruikt om het .txt-bestand vast te houden dat we willen uploaden.

Bewerk het pad om uw eigen dummy gegevensbestand te uploaden. De put-request vereist verder nog de 'access_token':

    # bucket
    bucket_url = r.json()["links"]["bucket"]
    deposition_id = r.json()["id"]

    # New API
    filename = "test-data-zenodo.txt"
    path = r"C:\repos\zenodo-flow\%s" % filename

    # The target URL is a combination of the bucket link with the desired filename
    # seperated by a slash.
    with open(path, "rb") as fp:
        r = requests.put(
            "%s/%s" % (bucket_url, filename),
            data=fp,
            params=params,
            )
    r.json()

Je kan ook metadata toevoegen aan de put-request: dit kan je doen door een key genaamd metadata toe te voegen aan de data-parameter.

  # add meta-data
    data = {
        'metadata': {
             'title': 'My first upload',
             'upload_type': 'dataset',
             'description': 'This is my first upload',
             'creators': [{'name': 'Van Loo, Maarten',
                           'affiliation': 'VITO'}]
        }
     }
    r = requests.put('{}api/deposit/depositions/{}'.format(base_api,deposition_id),
                     params={'access_token': ACCESS_TOKEN},
                     data=json.dumps(data),
                     headers=headers)
    print(r.status_code)
    print(r.json())

Ten slotte verzenden we dit allemaal via de API:

    r = requests.post('{}api/deposit/depositions/{}/actions/publish'.format(base_api,deposition_id),
                          params={'access_token': ACCESS_TOKEN})
    print(r.status_code)
    print(r.json())

Je kunt nu de gegevens verifiëren in je uploads op Zenodo:

thumb

Klik op de upload om alle informatie met betrekking tot deze upload te controleren:

  • de publisher (Maarten Van Loo)
  • de data file (test-data-zenodo.txt)
  • de publicatie datum (23/08/2022)
  • de DOI: (10.5281/zenodo.7016539)
  • License (CC zero v1.0 Universal)
  • Version (Version 1)
Overviewofupload.png


Ten slotte kan je ook het gegevensbestand downloaden en de upload verifiëren!

Data upload.png