programmier-noob sucht python wissenden zum pseudo reverse engineering *g*

  • worum gehts?
    ich hatte einen 3d-drucker, den man mit get/post seine daten entlocken konnte.
    ich habe jetzt den beweis für ähnliche funktionalität bei meinem neuen drucker gefunden. jemand hat für hass ein modul geschrieben: https://github.com/kruzhkov/hass-flashforge-adventurer-5


    was will ich?
    die sensordaten von meinem drucker *g*
    mir wurde auch schon ein wenig geholfen. ein netter kerl aus dem druckerforum hat mal die richtige richtung angezeigt:
    STATUS_COMMAND = "~M601 S1"
    PRINT_JOB_INFO_COMMAND = "~M27"
    TEMPERATURE_COMMAND = "~M105"
    STATE_COMMAND = "~M119\r\n"
    das scheint mal das relevante zu sein.


    was hab ich bisher gemacht?
    im firefox rumprobiert, da kommt bei folgendem versuch "https://192.168.178.9:8899/~M105" aber vom firefox nur:
    Fehler: Gesicherte Verbindung fehlgeschlagen
    Beim Verbinden mit 192.168.178.9:8899 trat ein Fehler auf. PR_END_OF_FILE_ERROR
    Fehlercode: PR_END_OF_FILE_ERROR

    ich hab natürlich auch probiert, das als abschreibübung zum alten zu sehen:
    curl --location --request POST 'http://<printer_ip>/TEMPERATURE_COMMAND ' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'

    dabei kommt dann:
    Invoke-WebRequest : Es wurde kein Positionsparameter gefunden, der das Argument "--request" akzeptiert.
    In Zeile:1 Zeichen:1
    + curl --location --request POST 'http://192.168.178.9/TEMPERATURE_COMM ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
       + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand


    was brauche ich also?
    einen funktionierenden aufruf im browser.


    gibt's weitere infos?
    ich hab leider nur noch, wie das früher am alten drucker gefunzt hat. der ist übrigens von derselben firma (flashforge) und eigentlich waren die aufrufe da bei allen "gehobenen" druckern von denen gleich, aber ...
    zumindest war folgender aufruf da, um z.b. den druckerstatus zu kriegen:
    curl --location --request POST 'http://<printer_ip>/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'GETPRINTERSTATUS'

    daraus konnte man dan ein einfaches modul für fhem erstellen, dass dann in etwa so ausgesehen hat:
    define dremel3d45 HTTPMOD http://192.168.178.9/command 5 (die "5" ist nur der abrufintervall)
    attr dremel3d45 extractAllJSON 1
    attr dremel3d45 requestData GETPRINTERSTATUS
    attr dremel3d45 stateFormat status

    alle meine "weisheiten" hab ich damals für den alten drucker von https://docs.google.com/document/d/1Of…FT0aroKhuU/edit
    vielleicht steht da ja auch was brauchbares drinnen. ich bin mir nicht gar so sicher, dass meine abrufe auch bei gcodes zutreffend sind. aber wie, wo, warum, ... keine ahnung!


    für hilfe recht dankbar wäre ...
    und ja, ich weiß, manche halten mich für 'ne faule sau, ich halt mich nur für unfähig ... und ... ich kenn’ mich besser *g*
    wer mir also nur sagen will, wie dämlich ich bin: spar dirs, das weiß ich schon!

  • Invoke-WebRequest : Es wurde kein Positionsparameter gefunden, der das Argument "--request" akzeptiert.

    Dieser Fehler kommt daher, dass Du offenbar die PowerShell (unter Windows?) benutzt. Da ist "curl" nur ein Alias auf "Invoke-WebRequest". Und das ist wenig direkt kompatibel zu dem Original "curl".

    Aber für sowas gibt es Konverter, z.B. https://curlconverter.com/powershell-webrequest/ und der spuckt folgendes aus:

    Code
    Invoke-WebRequest -Uri "http://<printer_ip>/command" `
        -Method Post `
        -ContentType "application/x-www-form-urlencoded" `
        -Body "~M105"

    Alternativ kannst Du in der WSL unter Windows mit den echten Linux-Tools arbeiten.

  • thx!

    wobei ich mir mittlerweile nicht mal mehr so sicher bin, ob das so überhaupt funzt.
    wenn ich wiederum den alten drucker hernehme, gehen per curl nur ein paar infos abzurufen, der rest wären gcodes, wie ich sie auch hier habe.
    ich hab langsam den verdacht, die gcodes muss ich irgendwie anders an den drucker senden ... aber dann wirds noch gruseliger für mich, weil ich jetzt noch genauer weiß, dass ich nix weiß *g*

    das währen die infos dazu für den alten drucker --> https://docs.google.com/document/d/1Of…FT0aroKhuU/edit
    für mich ist da aber eindeutig nicht ersichtlich, wie man die gcodes richtung drucker kriegen kann.


    nachtrag: ich habe es auch mit dem httpmod-modul von fhem probiert. das würde mir alles zusammen basteln. aber verweigert auch seinen dienst. die powershell war da nur ein zusatz eigentlich. hab ich dann hier genommen, weil ich bezweifle, dass jeder fhem kennt *g*

  • Alternativ kannst Du in der WSL unter Windows mit den echten Linux-Tools arbeiten.

    curl ist normalerweise unter Windows auch verfügbar ohne WSL ganz einfach in der Kommandozeile. Jedenfalls ist das bei allen meinen Windows-Installationen so. Also einfach cmd.exe ausführen statt powershell, z.B.: Windows-Taste+R cmd ENTER. Dort deinen curl-Befehl eintippen/rein pasten. Eventuell noch die Apostrophe durch Gänsefüßchen ersetzen (sollte aber hier nicht wirklich notwendig sein. Ist aber schon eine typische Falle beim Abschreiben von Unix-Curl Beispielen, weil Quoting und Escapes unter Unix Shells im Detail etwas anders funktionieren als unter cmd).

    Ansonsten, vielleicht mal mit anderem Browser als Firefox probieren oder Fehlermeldung in Google eintippen. Ich bin da jetzt kein Firefox Experte. Jedenfalls sind Browser heute oft so voreingestellt, dass sie standardmäßig http-Verbindungen verweigern, wenn nicht https genommen wird. Dein Drucker kann aber wohl kaum https mit vollständiger Zertifikatskette.

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

  • curl ist normalerweise unter Windows auch verfügbar ohne WSL ganz einfach in der Kommandozeile.

    Das war ja nicht die Aussage von Ingo-FP-Angel - er sagte das man dann mit den Original CURL arbeiten kann. Die Aussage ist soweit korrekt.

    dass sie standardmäßig http-Verbindungen verweigern, wenn nicht https genommen wird

    Auch nicht ganz korrekt, der Versuch der Verbindungsaufnahme wird mit https versucht und führt zu fehlern wenn man nicht explizit http:// hinschreibt.

    Verweigern tun die Browser die Verbindungsaufnahme also nicht. Sie versuchen es nur gar nicht unaufgefordert ungesichert. Hab ich bei vielen meiner IOT Geräte (Tasmota).

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • er sagte das man dann mit den Original CURL arbeiten kann

    Ich wollte ja auch nicht widersprechen, nur ergänzen, dass man curl auch unter Windows ohne WSL bequem nutzen kann. Ich hatte übrigens immer das Verständnis, dass das irgendwie genauso ein Original curl ist, wie Unix, da aus den selben Quellen kompiliert. Jedenfalls lässt sich GitHub - curl/curl: A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features für WIndows genauso wie für Linux übersetzen. libcurl daraus wird in vielen Projekten für Linux und Unix und Windows und MacOS genutzt (auch von mir).

    Egal, praktisch funktionierte für mich Windows-mitgeliefertes curl seit Langem sehr zuverlässig.

    Zum Verweigern der Browser. Ich meinte, das hing durchaus von Browser/Standard-Einstellungen/evt. Firmenpolicies ab und auch ob und wie man https-Wunsch des Browser umgehen kann, und ob oder ob nicht es sich um eine lokale Adresse handelt. Die Firefox-Fehlermeldung deutet doch schon darauf hin - oder nicht? Klar, selbst nutze ich auch viele IoT-Geräte ohne https.

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

  • leute: ich brauch’ curl ja eigentlich nicht. wie geschrieben, wars nur ein zusätzlicher test. genauso wie der firefox. der ff hat wenigstens irgendwas 'rausgeschrieben.

    normal nehm ich das httmod-modul von fhem. das baut mir die abrufe automatisch zusammen, solange ich die ip und den befehl dahinter kenne. allerdings ists fraglich, ob ein eventueller helfer sich damit auseinandersetzen wollen würde.
    falls es aber interessant ist, da ist die hilfe zum modul: https://wiki.fhem.de/wiki/HTTPMOD

    aber:

    ich hab langsam das gefühl, dass ich mit den gcodes da in eine falsche richtung laufe.
    weil, siehe die infos für meinen alten drucker https://docs.google.com/document/d/1Of…FT0aroKhuU/edit kommt da curl nur in 3 fällen vor. ich ersehe dort aber nicht, wie ich die gcodes versenden könnte.
    und ja, dremel ist eigentlich flashforge. was man dort liest, ging auf sehr vielen druckern von denen.

  • Wieder was gelernt, dass es eine `curl.exe` auch unter Windows gibt, war mir nicht bewusst. Würde ja bedeuten, die Beispiele, die man so im Netz findet, sollten in der PowerShell auch funktionieren, wenn man `curl` durch `curl.exe` ersetzt, so dass eben nicht der Alias genutzt wird (ich hab verstanden, dass es am Ende mit anderen Tools umgesetzt werden soll; nur fürs Gesamtverständnis).

    Und ja, fhem kenne ich nicht und würde ich mich jetzt auch nicht einarbeiten wollen. ;)

    Mit Firefox würde ich das ganze definitiv nicht ausprobieren, wenn man da was in die URL Zeile packt, wird da ja immer ein GET Request ohne Request Body draus. Nachdem, was ich hier so gelesen habe, braucht es aber POST plus Body. Damit ist FF m.E. raus (ja, man kann natürlich auch per JavaScript und fetch in der Browser Konsole arbeiten, wenn man das will).

    Zur Lösungsfindung fände ich es hilfreich, sich auf einen Weg zu einigen.

    Ich würde denken, folgendes sollte funktionieren:

    curl.exe --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'

    Zumindest sollte es dann sinnvollere Ausgaben geben, weil die Syntax korrekt ist.

    Das schickt dann per POST das Temperatur-Kommando "~M105" an den allgemeinen "command" Endpunkt.

    Wobei ich natürlich nicht sagen und mangels Hardware nicht testen kann, ob "--location" (zum Folgen eventueller Redirects) und das URL-Encoding überhaupt nötig ist, d.h. ob nicht auch schon das hier reicht:

    curl.exe --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: text/plain' --data '~M105'

  • aufruf: curl.exe --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'

    pudermuschel sagt zu curl und curl.exe
    curl: (1) Received HTTP/0.9 when not allowed

    cmd sagt:
    mit und ohne .exe
    curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535
    curl: (6) Could not resolve host: application


    aufruf: curl.exe --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: text/plain' --data '~M105'

    pudermuschel mit .exe
    curl: (1) Received HTTP/0.9 when not allowed

    mit .exe und versuchsweise mit http:// und dann https://
    curl: (35) schannel: failed to receive handshake, SSL/TLS connection failed

    ohne .exe
    Invoke-WebRequest : Es wurde kein Positionsparameter gefunden, der das Argument "POST" akzeptiert.
    In Zeile:1 Zeichen:1
    + curl --request POST 'http://192.168.178.9:8899/command' --header 'Con ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
       + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

    cmd sagt mit und ohne .exe und dann noch mal mit "https://":
    curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535
    curl: (6) Could not resolve host: text


    nachtrag: gehen muss aber irgendwie
    1) ich komm’ ja auch zur cam und deren einstellungen ... gut, ist n streamingserver aus der neapolitanischen zeit (Version info: v0.1 (Okt 22, 2007)) am drucker, aber immerhin bringt der drucker was raus.
    2) es gäbe auch einen telnet zugang (port 23). der meldet sich auch ... aber ohne passwort bin ich irgendwie machtlos dort *g*

  • curl: (1) Received HTTP/0.9 when not allowed

    Ok, das sieht insofern "gut" aus, als dass es eine echte Antwort vom Drucker gegeben hat. Die "gefällt" curl mit Standardeinstellungen nur nicht.

    Der Drucker spricht offenbar eine veraltete Version des HTTP Protokoll, das kann man aber explizit mit `--http0.9` erlauben:

    curl.exe --http0.9 --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'

    Die Fehlermeldungen aus der cmd deuten für mich darauf hin, dass die cmd das Kommando anders parst und deshalb nicht mit genau dieser Syntax klar kommt. "URL rejected: Port number was not a decimal number between 0 and 65535" heisst ja, dass es die cmd nicht hinbekommen hat, die "8899" als Portnummer zu erkennen bzw. das "Could not resolve host: application" deutet drauf hin, dass die cmd das 'Content-Type: application/x-www-form-urlencoded' für die URL hält. Damit würde ich mich nicht weiter auseinandersetzen, sondern bei der PowerShell bleiben.

  • ich will ein kind von dir *g*

    Code
    PS C:\Users\xxx> curl.exe --http0.9 --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
    CMD M105 Received.
    T0:21.8/0.0 T1:0.0/0.0 B:21.9/0.0
    ok

    ich darf das im druckerforum usw. weiterleiten? und willst du erwähnt werden?
    jeder drucker-hapschi, der nicht über flashfoges eigene saftware und /oder cloud gehen will, wird dir die füße küssen ...

  • Cool, dass das jetzt geklappt hat :)

    Kannst Du gerne so weitergeben. Brauchst mich dabei auch nicht zu erwähnen.

    Dann drück ich mal die Daumen, dass sich das auch mit dem httmod-modul von fhem irgendwie ausdrücken lässt. Da müsste dann aber ggf. jemand anderes einspringen, wenn das da nicht auf Anhieb klappt.

  • Die Fehlermeldungen aus der cmd deuten für mich darauf hin, dass die cmd das Kommando anders parst und deshalb nicht mit genau dieser Syntax klar kommt.

    ja

    die Apostrophe [="Hochkomma" = "einache Quotes"] durch Gänsefüßchen ersetzen

    War mir oben zwar nicht sicher, ob man das braucht. Laut Fehlermeldung wohl schon (und auch nach genauerem Nachdenken wurde mir das klar). Oft reicht das allein leider nicht beim Übersetzen von Unix-Kommandozeilen nach Windows, beispielsweise benötigen curl posts an Kodi oft json Argumente mit Gänsefüßchen (die curl sehen muss, nicht der Parser der Kommandozeile). Bei Unix-Shells kann man " innerhalb von ' einfach benutzen. Bei Windows cmd braucht man in solchen Situationen \".

    In dem Kommando in deinem Post kann man auch einige Quotes weglassen und es sollte (ungetestet)

    curl.exe --http0.9 --location --request POST http://192.168.178.9:8899/command --header "Content-Type: application/x-www-form-urlencoded" --data-urlencode ~M105

    funktionieren, jedenfalls unter cmd.exe. Wobei ich jetzt nicht auf die Argumente geachtet habe, sondern nur auf korrektes Quoting.

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

    Einmal editiert, zuletzt von SkyBird1980 (9. März 2024 um 20:11) aus folgendem Grund: hab mal die tt marks entfernt, die braucht man nicht mehr.

  • ich hab übrigens neuigkeiten aus dem fhem-forum mit. weil die programmierer dort nämlich recht genau sind, was deren techniken angeht und flashforge sich wohl eher nicht an konventionen hält, hier erst mal folgendes.

    nur, falls jemand curl mitnehmen will für was eigenes zum basteln:

    --> das http-protokoll ist nicht 0.9, sondern 1.1 - die annahme ergab sich wohl, weil der drucker nix als header zurücksendet, was sich aber anständig programmierte (also nicht chinesische scheiß-tools) erwarten würden.

    fazit: wissende sollen sich nicht wundern, wenn sie mit meinen angaben basteln, und ich brauch’ beruhigungs-pillen in rauen mengen grad ...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!