0

Zeiteinträge nach "Toggle Track" kopieren

Hallo zusammen,

ich versuch gerade erfolglos meine in Ninox erstellten Zeiteinträge nach Toggl Track zu kopieren. Beim Anlegen eines Zeiteintrages in Ninox soll dieser auch automatisch oder über einen Button in Toggl erstellt werden.

In der API-Doku von Toggl steht folgendes:

curl -v -u 1971800d4d82861d8f2c1651fea4d212:api_token \
    -H "Content-Type: application/json" \
    -d '{"time_entry":{"description":"New time entry","created_with":"API example code","start":"2012-02-12T15:35:47+02:00","duration":1200,"wid":31366}}' \
     -X POST https://api.track.toggl.com/api/v8/time_entries
  • API-Key hab ich meinen eigenen Eingesetzt (die im Code ist aus dem Beispiel)
  • Die wID hab ich mir mit Make auslesen können.
let myMethod := "POST";
let myURL := "https://api.track.toggl.com/api/v8/time_entries";
let myHeaders := {
        'api_token': "1971800d4d82861d8f2c1651fea4d212",
        'Content-Type': "application/json"
    };
let myBody := {
        description: "New time entry",
        created_with: "API example code",
        start: format(now(), "YYYY-MM-DD HH:mm:ss"),
        duration: 1200,
        wid: 31366
   } ;
Result := do as server
        http(myMethod, myURL, myHeaders, myBody)
    end;

Im Feld "Result" bekomm ich aber einfach nur [object Object] ausgegeben. Ein Zeiteintrag wird nicht erstellt.

GET Abfragen um z.B. Workspace Infos abzurufen ergeben ebenfalls [object Object].
Komm leider nicht weiter, in Make sieht man leider auch nicht, was da genau an Toggl geschickt wird.

Hatte jemand schonmal mit Toggl gearbeitet oder weiß wie die curl-"Vorgabe" richtig zu übersetzen ist?

Vielen Dank im Voraus!

LG

Johannes 

4 Antworten

null
    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Einen Fehler hab ich gefunden 🙈
    Es muss natürlich lauten:

    Result := do as server
            formatJSON(http(myMethod, myURL, myHeaders, myBody))

    In Result bekomme ich jetzt {"error":"Request has failed: error - "} eingetragen.

    Aber die Autorisierung bekomme ich trotzdem nicht hin. Die curl abfrage im Mac-Terminal klappt wunderbar. Bekomm auch die entsprechende Antwort, aber ich bekomm es einfach nicht in das Ninox-Script übersetzt.

    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich hab mittlerweile rausgefunden, warum es nicht funktioniert.
    Man muss den API-Token encoden und zwar inkl. dem Zusatz ":api_token"

    aus 

    1971800d4d82861d8f2c1651fea4d212:api_token

    wird

    MTk3MTgwMGQ0ZDgyODYxZDhmMmMxNjUxZmVhNGQyMTI6YXBpX3Rva2Vu

    Natürlich entsprechend dem eigenen API-Token. (gibts auch in der Free-Version)

    Der Code sieht dann wie folgt aus:

    let myMethod := "POST";
    let myURL := "https://api.track.toggl.com/api/v8/time_entries";
    let myHeaders := {
            Authorization: "Basic MTk3MTgwMGQ0ZDgyODYxZDhmMmMxNjUxZmVhNGQyMTI6YXBpX3Rva2Vu",
            'Content-Type': "application/json"
        };
    let myBody := {
            time_entry: {
                pid: 12345,
                wid: 12345,
                start: format(now(), ""),
                duration: 1200,
                description: "Aufgabenbeschreibung",
                created_with: "Ninox API Test"
            }
        };
    Result := do as server
            formatJSON(http(myMethod, myURL, myHeaders, myBody))
        end

    PID = Projekt-ID und WID=Workspace-ID (eins der beiden wird benötigt).

    -------

    Um an die ganzen IDs zu kommen gibt es die cURL-Abfrage:

    curl -v -u 1971800d4d82861d8f2c1651fea4d212:api_token
    -X GET https://api.track.toggl.com/api/v8/me

    nach obenstehendes Logik hab ich das in Ninox-Script umgewandelt:

    let myURL := "https://api.track.toggl.com/api/v8/me";;
    let myHeaders := {
                      Authorization: "Basic MTk3MTgwMGQ0ZDgyODYxZDhmMmMxNjUxZmVhNGQyMTI6YXBpX3Rva2Vu",
                      'Content-Type': "application/json"
    };
    
    let myBody := {};
    Result := do as server
                    formatJSON(http("GET", myURL, myHeaders, myBody))
    end

    Das funktioniert jetzt aber leider nicht (wäre ja auch zu einfach gewesen)...

    Die Antwort ist:

    {"result":"\n<html><head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<title>400 Bad Request</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: Bad Request</h1>\n<h2>Your client has issued a malformed or illegal request.</h2>\n<h2></h2>\n</body></html>

     

    Und...was auch komisch ist:

    Das ganze funktioniert nur in der Cloud. Wenn ich die Datenbank lokal nutzen möchte, dann kommt generell: 

    {"error":"Request has failed: error - "}

     

    Also falls jemand was sieht, was ich nicht sehe, oder Ideen hat, Hilfe ist gerne willkommen. Der Support von Toggl hat leider wenig Infos.

     

    PS: Andere API-Abfragen gehen auch mit der offline Version. Mit was könnte das zusammen hängen?

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich denke es wird nicht direkt aus Ninox heraus funktionieren.
    Mit den von dir gezeigten Daten wird mit dem http-Request eine Authorisierungsanfrage an 'Toggle Track' gesendet. Diese gibt einen Session-Key (als Cookie) zurück, mit dem dann der eigentliche POST-Request ausgelöst werden soll. Das kann Ninox nicht.

    Du wird wohl nicht um ein Drittprogramm wie Make oder n8n für deine Http-Request Anfragen herum kommen. Jedenfalls habe ich es so in der Dokumentation verstanden.

      • john_eans
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Hey  UweG ,

      ich habs in der Cloud nun zum Laufen bekommen. Zum Anlegen eines Zeiteintrags hatte ich ja oben schon den Code, der auch funktioniert (in der Cloud).

      Zur Abfrage von Infos (IDs etc.) darf kein Body mit {} mitgeschickt werden sondern "".
      Der funktionierende Code sieht demnach so aus:

      let myURL := "https://api.track.toggl.com/api/v8/me";;
      let myHeaders := {
                        Authorization: "Basic MTk3MTgwMGQ0ZDgyODYxZDhmMmMxNjUxZmVhNGQyMTI6YXBpX3Rva2Vu",
                        'Content-Type': "application/json"
      };
      
      let myBody := "";
      Result := do as server
                      formatJSON(http("GET", myURL, myHeaders, myBody))
      end
      

      --------

      Bezüglich Funktion in der Cloud und App Version hab ich vom Support (Jörg) folgende Info bekommen:

      " [...] Es liegt kurz gesagt an der Authentifizierung beim API-Anbieter der entweder die CORS-Anfrage, die von der Ninox App kommt, unterstützt (so wie DeepL) oder diese nicht unterstützt, bzw. verbietet (so wie Toggle-Track).

      Da die API-Anfrage aus den Ninox-Cloud-Teams direkt vom Server kommt, funktioniert dort beides. ( do as server ... end kann aber nicht in der Ninox App verwendet werden)"

      --------

      Ich hab mir da nun mit einem Webhook (zum Glück gestern beim Webinar dabei gewesen ;-) ) bei Make geholfen. An den gehen meine Zeiteinträge und von da aus an Toggl.

      Sollte ich tatsächlich mehr wie 1000 Operationen benötigen muss ich mir noch überlegen ob ich in die Cloud-Version von Ninox investiere oder in ein Upgrade bei Make, scheint mir recht mächtig zu sein.