NEWS
Hilfe bei der Script erstellung
-
Hallo,
Ich bin neuling auf dem JS Gebiet. Ich benötige Hilfe beim Erstellen eines Script um Pager der Firma EMessage auszulösen. Die API von EMessage ist vorhanden. Ich weiß nicht wo ich anfangen soll. Vielleicht kann mir ja jemand Starthilfe geben1. Authentifizieren POST /auth/login HTTP/1.1 Host: https://api.emessage.de Content-Type: application/json Anfrage: ***************************** { "username": "USERNAME", "password": "password" } ***************************** Antwort: ***************************** { "apiStatusCode": 200, "message": "OK", "data": { "username": "USERNAME", "jwt": "TOKEN" } } *****************************
2. Nachricht senden POST /api/eSendMessages HTTP/1.1 Host: https://api.emessage.de Content-Type: application/json Authorization: Bearer TOKEN Content-Type: text/plain Kommentar: - TOKEN - ist bei der Authentifizierung generiert wurde Anfrage: ***************************** { "messageText": "Testnachricht", "recipients": [ { "serviceName": "eCityruf", "identifier": "Identifier 1" } ] } ***************************** Kommentar ***************************** - serviceName - aus drei Option {eCityruf, eBos, 2wayS} zu wählen. Die gleichzeitige Übertragung an mehrere Identifier bzw. Services ist möglich: { "serviceName": " eCityruf ", "identifier": "Identifier 1" }, { "serviceName": "2wayS ", "identifier": "Identifier 2" }, { "serviceName": "2wayS ", "identifier": "Identifier 3" } - "Identifier X“ - der Identifier des Pagers, mit dem der Pager beim Versenden der Nachrichten angesprochen wird. - messageText - der Inhalt der Nachricht ***************************** Antwort: ***************************** { "apiStatusCode": 200, "message": "OK", "data": { status": "success", "trackingId": "TRACKING_ID", "recipients": [ { "identifier": " Identifier 1", "serviceName": "eCityruf", "statusSendMessage": "success" } ] } } *****************************
-
solche Abfragen kannst du mit der Bibliothek axios machen, welche bereits in iobroker schon verfügbar ist.
Du kannst dir mal die Beispiele hier anschauen
https://github.com/axios/axios
Achtung im Forum gibt es auch Beispiele, die eine etwas ältere Bibliothek (request) verwenden, die aber nicht mehr verwendet werden soll. Diese Beispiele sehen ähnlich aus, funktionieren aber mit axios nicht 1:1Wie du aus der Beschreibung erkennen kannst musst du dich mit einer Anfrage erst einmal anmelden. Dadurch erhältst du ein Token welches für alle weiteren Anfragen dich identifiziert (zumindest für eine gewisse Zeit, Details stehen da nicht)
Mit dem Token musst du dann die 2. Abfrage ausführen und die Daten halt exakt so angeben, wie es da steht.
Die Anfragen nutzen das HTTP-protokoll. Dazu könntest du auch zumindest mal den wikipedia-Artikel lesen, das du das Grundprinzip verstehst und weist was GET und POST bedeutet.Wenn du in JS ganz neu bist und ggfs schon mit einer anderen Programmiersprachen beschäftigt hast, wird dich das asynchrone Prinzip von JS am Anfang überraschen und ein paar Gehirnwindungen überanstrengen. Das evtl zuvor auch mal am Anfang noch etwas nachlesen.
-
@oliverio said in Hilfe bei der Script erstellung:
solche Abfragen kannst du mit der Bibliothek axios machen, welche bereits in iobroker schon verfügbar ist.
Du kannst dir mal die Beispiele hier anschauen
https://github.com/axios/axios
Achtung im Forum gibt es auch Beispiele, die eine etwas ältere Bibliothek (request) verwenden, die aber nicht mehr verwendet werden soll. Diese Beispiele sehen ähnlich aus, funktionieren aber mit axios nicht 1:1Wie du aus der Beschreibung erkennen kannst musst du dich mit einer Anfrage erst einmal anmelden. Dadurch erhältst du ein Token welches für alle weiteren Anfragen dich identifiziert (zumindest für eine gewisse Zeit, Details stehen da nicht)
Mit dem Token musst du dann die 2. Abfrage ausführen und die Daten halt exakt so angeben, wie es da steht.
Die Anfragen nutzen das HTTP-protokoll. Dazu könntest du auch zumindest mal den wikipedia-Artikel lesen, das du das Grundprinzip verstehst und weist was GET und POST bedeutet.Wenn du in JS ganz neu bist und ggfs schon mit einer anderen Programmiersprachen beschäftigt hast, wird dich das asynchrone Prinzip von JS am Anfang überraschen und ein paar Gehirnwindungen überanstrengen. Das evtl zuvor auch mal am Anfang noch etwas nachlesen.
Moin Moin,
Leider bin ich heute erst zum Antworten gekommen.
bin aber in den letzten Tagen fleißig gewesen.var request = require('request'); var options = { 'method': 'POST', 'url': 'https://api.emessage.de/auth/login', 'headers': { 'Authorization': 'Basic Og==', 'Content-Type': 'application/json' }, body: JSON.stringify({ "username": "USERNAME", "password": "PASSWORD" }) }; request(options, function (error, response) { if (error) throw new Error(error); console.log(response.body); });
Mit diesem Script bekomme ich einen Token nach der anfrage zurück, aber wie kann ich den Token in Datenpunken ablegen und in das Script zum Nachrichten Senden wieder einfügen?
hier das Script zum Senden
var request = require('request'); var options = { 'method': 'POST', 'url': 'https://api.emessage.de/rs/eSendMessages', 'headers': { 'Authorization': 'Bearer TOKEN', 'Content-Type': 'application/json' }, body: JSON.stringify({ "messageText": "Testnachricht", "recipients": [ { "serviceName": "eCityruf", "identifier": "PAGER-ID" } ] }) }; request(options, function (error, response) { if (error) throw new Error(error); console.log(response.body); });
Ich stehe auf dem Schlauch und komme einfach nicht weiter....
-
@t0bit3ch
Es scheint als müsste der Token vor jedem Nachrichtenversand neu Generiert werden -
da du die bibliothek request verwendest, scheinst du wohl nicht auf meinen post zu antworten
-
@oliverio
habe es jetzt soweit bekommen das ich die Antwort in einem Datenpunkt bringe. Wie kann ich jetzt filtern das in dem Datenpunkt nur der Token angezeigt wird?var request = require('request'); var objectName = '0_userdata.0.E-Message.E-Message.API' var resault var options ={ 'method': 'POST', 'url': 'https://api.emessage.de/auth/login', 'headers': { 'Authorization': 'Basic Og==', 'Content-Type': 'application/json' }, body: JSON.stringify({ "username": "USERNAME", "password": "Passwort" }) }; request(options, async function (error, response, resault) { if (error) throw new Error(error); console.log(('' + getAttr(resault, '"jwt"'))); createState(objectName,{name: "E*Message - API", type: 'json', role: 'state'}, function () {}); setState("0_userdata.0.E-Message.E-Message.API"/*Testobjekt */, resault, true); });
Der Datenpunkt eintrag sieht so aus.
{ "apiStatusCode": 200, "data": { "username": "*******", "jwt": "*******TOKEN********" }, "message": "OK" }
vielen dank im vorraus
-
@oliverio sagte in Hilfe bei der Script erstellung:
solche Abfragen kannst du mit der Bibliothek axios machen, welche bereits in iobroker schon verfügbar ist.
@oliverio sagte in Hilfe bei der Script erstellung:
Achtung im Forum gibt es auch Beispiele, die eine etwas ältere Bibliothek (request) verwenden, die aber nicht mehr verwendet werden soll
-
Guten Abend,
wieder ein Stückchen weiter. Den Token habe ich in seine einzelteile zerlegen können. Jetzt geht es ans Senden der Nachrichten. Ich möchte den Token und die Nachricht aus dem Datenpunkt in mein Skript einfügen.
Dieses Skript habe ich mir zurecht geklickt, aber irgendwie funktioniert das mit dem setState nicht.
var request = require('request'); var token = '0_userdata.0.E-Message.E-Message-API'; var alarmtext = '0_userdata.0.E-Message.E-Message-Text'; var options = { 'method': 'POST', 'url': 'https://api.emessage.de/rs/eSendMessages', 'headers': { 'Authorization': setState(token), 'Content-Type': 'application/json' }, body: JSON.stringify({ "messageText": setState(alarmtext), "recipients": [ { "serviceName": "eCityruf", "identifier": "*******" } ] }) }; request(options, function (error, response) { if (error) throw new Error(error); console.log(response.body); });
-
Hab das ganze nochmal in axios geändert.
var axios = require('axios'); var token = '0_userdata.0.E-Message.E-Message-API'; var alarmtext = '0_userdata.0.E-Message.E-Message-Text'; var data = JSON.stringify({ "messageText": setState(alarmtext), "recipients": [ { "serviceName": "eCityruf", "identifier": "******" } ] }); var config = { method: 'post', url: 'https://api.emessage.de/rs/eSendMessages', headers: { 'Authorization': setState(token), 'Content-Type': 'application/json' }, data : data }; axios(config) .then(function (response) { console.log(JSON.stringify(response.data)); }) .catch(function (error) { console.log(error); });
bekomme jetzt den fehler
{'code':'ERR_HTTP_INVALID_HEADER_VALUE'}
woran kann das liegen?
beste grüße
-
@t0bit3ch sagte in Hilfe bei der Script erstellung:
'Authorization': setState(token),
Du möchtest sicherlich den Inhalt des datenpunktes lesen und nicht schreiben.
Da müsste es auch schon ein Fehler gegeben haben, da bei setState die Anzahl der Parameter nicht stimmt.Aber generell würde ich das Token nicht in ein datenpunkt schreiben, da es wahrscheinlich gar nicht so lange gültig ist und du es vor jeder Abfrage eh wieder neu abfragen musst.
-
@oliverio said in Hilfe bei der Script erstellung:
@t0bit3ch sagte in Hilfe bei der Script erstellung:
'Authorization': setState(token),
Du möchtest sicherlich den Inhalt des datenpunktes lesen und nicht schreiben.
Da müsste es auch schon ein Fehler gegeben haben, da bei setState die Anzahl der Parameter nicht stimmt.Aber generell würde ich das Token nicht in ein datenpunkt schreiben, da es wahrscheinlich gar nicht so lange gültig ist und du es vor jeder Abfrage eh wieder neu abfragen musst.
Danke für den Hinweis, aber wie könnte ich es denn dann lösen das der Token jedes mal vor dem Senden der Nachricht neu Aktualisiert wird?
-
@t0bit3ch
poste bitte hier mal deinen ganzen code, den du bisher hast.
also einmal die abfrage nach dem token und dann 2. die abfrage mit dem eigentlichen befehl in einem post. dann sieht man das auf einmal.
die ursprünglichen pdf dateien hast du nicht mehr? ich find sie nicht mehr hier im thread -
@oliverio said in Hilfe bei der Script erstellung:
@t0bit3ch
poste bitte hier mal deinen ganzen code, den du bisher hast.
also einmal die abfrage nach dem token und dann 2. die abfrage mit dem eigentlichen befehl in einem post. dann sieht man das auf einmal.
die ursprünglichen pdf dateien hast du nicht mehr? ich find sie nicht mehr hier im threadmit diesem code (bekomme es mit axios leider nicht hin) frage ich den token ab und lass mir die angeforderten daten in einen datenpunkt schreiben
var request = require('request'); var resault var options ={ 'method': 'POST', 'url': 'https://api.emessage.de/auth/login', 'headers': { 'Authorization': 'Basic Og==', 'Content-Type': 'application/json' }, body: JSON.stringify({ "username": "USERNAME", "password": "PASSWORD" }) }; request(options, async function (error, response, resault) { if (error) throw new Error(error); console.log(('' + getAttr(resault, '"jwt"'))); setState("0_userdata.0.E-Message.E-Message-API-String"/* JWT */, resault, true); });
dann rufe ich den datenpunkt mit den angeforderten daten über ein Blockly Script auf welches mir die daten zerlegt und in mehrere datenpunke sortiert
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="Kr{TqA7bmUJ@ID|SdrFb">API-Status</variable> <variable id="oWS;kTCnQynl7?P(oOxL">Username</variable> <variable id="`|k+#[5=^_i-t;SU=sgS">API-Token</variable> </variables> <block type="on" id="RDTxmtpzwY2#i8wo-5j3" x="38" y="38"> <field name="OID">0_userdata.0.E-Message.E-Message-API-String</field> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="debug" id="#vw,R^04?VHo%.W_:PA$"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="|a573mU%uv-X*c%/-9y@"> <field name="TEXT">test</field> </shadow> <block type="on_source" id="+Wx=vWMza3i7xHQV+njl"> <field name="ATTR">state.val</field> </block> </value> <next> <block type="variables_set" id="4i,h%+`A)Up@E3CWrR,("> <field name="VAR" id="Kr{TqA7bmUJ@ID|SdrFb">API-Status</field> <value name="VALUE"> <block type="text_getSubstring" id="fXy2)F{UojePPs||6m5L"> <mutation at1="true" at2="true"></mutation> <field name="WHERE1">FROM_START</field> <field name="WHERE2">FROM_START</field> <value name="STRING"> <block type="on_source" id="PA#t0e@yV5ogg01kPcd`"> <field name="ATTR">state.val</field> </block> </value> <value name="AT1"> <block type="math_number" id="F8[Ez0b*miQk`g9KKm*M"> <field name="NUM">18</field> </block> </value> <value name="AT2"> <block type="math_number" id="ku+#OXuXQ7FXbmaq=irq"> <field name="NUM">20</field> </block> </value> </block> </value> <next> <block type="update" id="?MS3Iz/f-!5hDYbQBeA_"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.E-Message.E-Message-API-Status</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="1Bb!DlC-9?Iy=j_nHF$?"> <field name="VAR" id="Kr{TqA7bmUJ@ID|SdrFb">API-Status</field> </block> </value> <next> <block type="variables_set" id="s*7{PwAY0fQ`ePmy8M,%"> <field name="VAR" id="oWS;kTCnQynl7?P(oOxL">Username</field> <value name="VALUE"> <block type="text_getSubstring" id="VV0s!?mK8.H,tnAkwKu,"> <mutation at1="true" at2="true"></mutation> <field name="WHERE1">FROM_START</field> <field name="WHERE2">FROM_START</field> <value name="STRING"> <block type="on_source" id="@ek[B.l(tKY(-4|r@rwR"> <field name="ATTR">state.val</field> </block> </value> <value name="AT1"> <block type="math_number" id="T3.[TBc_H+Q|zkIYj5IC"> <field name="NUM">42</field> </block> </value> <value name="AT2"> <block type="math_number" id="zbG?uq8_pU]d_^TjVi|o"> <field name="NUM">50</field> </block> </value> </block> </value> <next> <block type="update" id="~*vJ)~oPTXb2NR-oQcTT"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.E-Message.E-Message-Username</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="Ja`Z}5vKnY/-XsCmCsxw"> <field name="VAR" id="oWS;kTCnQynl7?P(oOxL">Username</field> </block> </value> <next> <block type="variables_set" id="`U]osubHK9WBHm)gn1B}"> <field name="VAR" id="`|k+#[5=^_i-t;SU=sgS">API-Token</field> <value name="VALUE"> <block type="text_getSubstring" id="VXC.dW^%gU94G(V1^M@H"> <mutation at1="true" at2="true"></mutation> <field name="WHERE1">FROM_START</field> <field name="WHERE2">FROM_START</field> <value name="STRING"> <block type="on_source" id="B#W50$zXk`##sSsQ}K|m"> <field name="ATTR">state.val</field> </block> </value> <value name="AT1"> <block type="math_number" id="PId}2w,-XJ[:yXXhv8bR"> <field name="NUM">60</field> </block> </value> <value name="AT2"> <block type="math_number" id="b|84SF#c+C$X+%$d8]=@"> <field name="NUM">424</field> </block> </value> </block> </value> <next> <block type="update" id="zoBV.$./O{Lb|]2`;p#z"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.E-Message.E-Message-API</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text_join" id="aUt/649RjEQgudAj~`XG"> <mutation items="3"></mutation> <value name="ADD0"> <block type="text" id=".j`Rc`;RB|m`eSR8[;BS"> <field name="TEXT">'Bearer </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="2.8QwlYFn|kNQq+U1%YN"> <field name="VAR" id="`|k+#[5=^_i-t;SU=sgS">API-Token</field> </block> </value> <value name="ADD2"> <block type="text" id="C(_2YRym/)JNO?jh5w;,"> <field name="TEXT">',</field> </block> </value> </block> </value> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </xml>
nach dem anfordern über script 1 bekomme ich diese antwort
{"apiStatusCode":200,"data":{"username":"****USERNAME****","jwt":"***TOKEN****"},"message":"OK"}
nach dem zerlegen durch blockly sieht es dann so aus
API Status
200
Username
username
Token
'Bearer gfhgghkjgshhsajhfjdsbhbkghdfdskjhfskigjhbjkddhsadhsjkhgjksxhhgf554654564jhhjgfhdgdxycvdcxgfdhdfg546+4fgdyfgfdghfdgdsgdgdfgdfgfvbxcfgfdhfghjhjkjhkh.,ghsdgsgdsgsgsd'
dann noch der code zum senden der nachricht in dem dann eigentlich der token aus dem datenpunk gesetzt werden soll
var request = require('request'); var options = { 'method': 'POST', 'url': 'https://api.emessage.de/rs/eSendMessages', 'headers': { 'Authorization': getState("0_userdata.0.E-Message.E-Message-API").val, 'Content-Type': 'application/json' }, body: JSON.stringify({ "messageText": getState("0_userdata.0.E-Message.E-Message-Text").val, "recipients": [ { "serviceName": "eCityruf", "identifier": "*********" } ] }) }; request(options, function (error, response) { if (error) throw new Error(error); console.log(response.body,); });
mit diesem code möchte ich mir alarm und störmeldungen auf einen pager senden lassen.
wäre natürlich auch cool wenn es für den service von E*Message einen eigenen adapter geben würdehier noch die PDF
Webservice API.pdf -
probier mal damit, schau aber sorgfältig nochmal durch
und ersetze mit deinen daten.
wenn du am code etwas nicht verstehst, stell bitte konkrete fragen.const axios = require('axios'); function auth() { axios.post('Host: https://api.emessage.de/auth/login', { username: 'username', password: 'password' },{ headers: { 'Content-Type': 'application/json', } }).then(function (response) { console.log(response); if (response.status==200) { var token = response.data.data.jwt; sendMessage(token) } }) .catch(function (error) { console.log(error); }); } function sendMessage(token) { axios.post('Host: https://api.emessage.de/api/eSendMessages', { "messageText": "Testnachricht", "recipients": [ { "serviceName": "eCityruf", "identifier": "Identifier 1" } ] },{ headers: { 'Content-Type': 'text/plain', 'Authorization': token, } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); } auth();
-
@oliverio
vielen dank für das script. konnte es grad mal kurz probieren
leider bekomme ich folgenden fehlerjavascript.0 (31387) script.js.Pager_Alarmierung.emessage_Send_3: {'message':'connect ECONNREFUSED 127.0.0.1:80','name':'Error','stack':'Error: connect ECONNREFUSED 127.0.0.1:80\n at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16)','config':{'url':'Host: https://api.emessage.de/auth/login','method':'post','data':'{\'username\':\'USERNAME\',\'password\':\'PASSWORD\'}','headers':{'Content-Type':'application/json','User-Agent':'axios/0.21.1','Content-Length':54},'transformRequest':[null],'transformResponse':[null],'timeout':0,'xsrfCookieName':'XSRF-TOKEN','xsrfHeaderName':'X-XSRF-TOKEN','maxContentLength':-1,'maxBodyLength':-1},'code':'ECONNREFUSED'}
-
@t0bit3ch sagte in Hilfe bei der Script erstellung:
127.0.0.1
die verbindung wurde vom Rechner abgelehnt
lustiger weise ist der rechner 127.0.0.1, was dein eigener ist.
aus irgendeinem Grund wird die anfrage dorthin umgeleitet
was läuft da auf dem rechner noch? pihole? -
nimm mal bitte diese version:
const axios = require('axios'); function auth() { axios.post('https://api.emessage.de/auth/login',{ username: 'username', password: 'password' },{ headers: { 'Content-Type': 'application/json', } }).then(function (response) { console.log(response); if (response.status==200) { var token = response.data.data.jwt; sendMessage(token) } }) .catch(function (error) { console.log(error); }); } function sendMessage(token) { axios.post('https://api.emessage.de/api/eSendMessages',{ "messageText": "Testnachricht", "recipients": [ { "serviceName": "eCityruf", "identifier": "Identifier 1" } ] },{ headers: { 'Content-Type': 'text/plain', 'Authorization': token, } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); } auth();
wenn ich diese version verwende, dann funktioniert die abfrage.
natürlich kommt dann die rückmeldung, das ich unauthorisiert bin. -
@oliverio
Danke für das Beispiel, btw. funktioniert die erste Version bei mir auch nicht Fehler 404 -
@oliverio sagte in Hilfe bei der Script erstellung:
nimm mal bitte diese version:
const axios = require('axios'); function auth() { axios.post('https://api.emessage.de/auth/login',{ username: 'username', password: 'password' },{ headers: { 'Content-Type': 'application/json', } }).then(function (response) { console.log(response); if (response.status==200) { var token = response.data.data.jwt; sendMessage(token) } }) .catch(function (error) { console.log(error); }); } function sendMessage(token) { axios.post('https://api.emessage.de/api/eSendMessages',{ "messageText": "Testnachricht", "recipients": [ { "serviceName": "eCityruf", "identifier": "Identifier 1" } ] },{ headers: { 'Content-Type': 'text/plain', 'Authorization': token, } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); } auth();
wenn ich diese version verwende, dann funktioniert die abfrage.
natürlich kommt dann die rückmeldung, das ich unauthorisiert bin.Guten Abend,
Ich habe das script grad nochmal mit meinen daten probiert. als info im log bekomme ich
info javascript.0 (31387) script.js.Pager_Alarmierung.emessage_Send_3: {}
der pager wird aber leider nicht ausgelöst.
könnte man die einzelnen schritte im script loggen um zu sehen woran es liegt?vielen vielen dank für die unterstützung
-
@t0bit3ch sagte in Hilfe bei der Script erstellung:
Zumindest das erste response objekt oder fehler objekt aus zeile 13 oder zeile 20 sollte ausgegeben werden.
hast du oben rechts im skript debug und verbose eingeschaltet?ich habe hier mal noch ein paar verlaufsmeldungen eingefügt. die im unteren bereich sichtbar sein sollten
const axios = require('axios'); function auth() { console.log("Start Auth"); axios.post('https://api.emessage.de/auth/login',{ username: 'username', password: 'password' },{ headers: { 'Content-Type': 'application/json', } }).then(function (response) { console.log("Auth response"); console.log(response); if (response.status==200) { var token = response.data.data.jwt; sendMessage(token) } }) .catch(function (error) { console.log("Auth error"); console.log(error); }); } function sendMessage(token) { console.log("sendmessage start"); axios.post('https://api.emessage.de/api/eSendMessages',{ "messageText": "Testnachricht", "recipients": [ { "serviceName": "eCityruf", "identifier": "Identifier 1" } ] },{ headers: { 'Content-Type': 'text/plain', 'Authorization': token, } }) .then(function (response) { console.log("sendmessage respones"); console.log(response); }) .catch(function (error) { console.log("sendmessage error"); console.log(error); }); } auth();