Drucker Webinterface abfragen

    • Official Post

    Hallo Zusammen, ich habe 10 Drucker (Bizhub 308) wo ich regelmäßig die Zählerstände an den Dienstleister senden muss. Da ich mich aber auf jedem Drucker einzeln aufschalten, Zählerstände suchen, addieren muss geht mir das auf den Keks. Die Teile haben ein Webinterface welches in der Adresszeile als xml angezeigt wird.



    Wenn ich mir den Quelltext der xml im Browser anzeigen lasse - sehe ich dort auch alle Werte die ich gerne hätte.



    Wenn ich das nun python probiere (per urllib oder request) krieg ich nur das hier zurück:


    Code
    import requests
    u = "http://192.168.2.150/wcd/system_counter.xml"
    response = requests.get(u)
    response.content
    Code
    b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">\r\n<HTML lang="en">\r\n<HEAD>\r\n<TITLE></TITLE>\r\n<meta http-equiv="Expires" content="0">\r\n<meta http-equiv="Pragma" content="no-cache">\r\n<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">\r\n<meta content="text/javascript" http-equiv="Content-Script-Type">\r\n<noscript>\r\n<meta http-equiv="refresh" content="0; URL=/wcd/js_error.xml">\r\n</noscript>\r\n</HEAD>\r\n<BODY BGCOLOR="#ffffff" LINK="#000000" ALINK="#ff0000" VLINK="#000000" onload="location.replace(\'/wcd/index.html?access=SYS_COU\');" >\r\n</BODY>\r\n</HTML>\r\n'

    Ich vermute das dort javascript seine Finger im Spiel hat und mir deswegen nichts angezeigt wird. Wie frage ich denn nun am sinnigsten dieses Webinterface ab?

  • So eine Seite habe ich in der Firma auch. Der Zustand der E-Ladestation wird aktiv per Javascript in die Seite eingefügt. Ich konnte die Werte nur abfragen, indem ich die Seite automatisiert mit dem Browser öffne, die Seite abspeichere und das Ergebnis dann parse.


    Für den Drucker wäre aber vielleicht eine Abfrage via SNMP, wenn verfügbar, sinnvoller. So eine Abfrage der damaligen HP-Drucker und Übermittlung der Zählerstände an unsere Sekretärin habe ich schon einmal gemacht.

    Anfragen ausserhalb des Forums (Mail o.ä.) werden ignoriert!

  • Da habe ich immer einen kompletten snmwalk ausgegeben und dann dort nach den Seitenzahlen gesucht. Bei unseren Xerox Kopierern war es z.B. .1.3.6.1.2.1.43.18.1.1.8.1

    Anfragen ausserhalb des Forums (Mail o.ä.) werden ignoriert!

  • Zu Beitrag #1: Ich kann in der XML-Datei den Zählerstand nicht finden. Übersehe ich da irgendwas?


    Hast Du mal probiert, was curl als Ergebnis liefert?

    Mein Github-Repository ist hier zu finden.

    • Official Post

    Vielleicht hilft Dir das hier ein Stück weiter: http://theautomatic.net/2019/0…avascript-webpage-python/ oder evtl. doch mit Selenium oder so https://towardsdatascience.com…using-python-97a29738353f


    Mehr kann man leider nicht dazu sagen, weil man nicht weiß was Javascript da macht. BeautifulSoup wirst Du ja eh verwenden wollen, deshalb nur am Rande erwähnt.

    • Official Post

    Zu Beitrag #1: Ich kann in der XML-Datei den Zählerstand nicht finden. Übersehe ich da irgendwas?


    Hast Du mal probiert, was curl als Ergebnis liefert?

    Nein du übersiehst nix - weil es für das Problem auch unerheblich ist und die XML gefühlt 1Mio Zeilen lang ist - hab ich sie einfach gekürzt, damit man sieht, dass es wirklich xml ist ;)


    curl probiere ich gleich mal aus


    edit (für wget gilt das gleiche)

  • dbv: du kannst bei den bizhub Systemen alternativ eine automatisierte eMail Benachrichtung zB mit Zählerständen, beispielsweise 1x im Monat versenden lassen. Ebenso ist ein Auslesen und Exportieren zB in Excel mit Hilfe des kostenlosen PageScope DataAdmin des Herstellers möglich.

    • Official Post

    Vielleicht hilft Dir das hier ein Stück weiter: http://theautomatic.net/2019/0…avascript-webpage-python/

    Hey cool, damit krieg ich einen endlosen Schwall an HTML, wo sogar meine Zahlen drin stehen :)

    Code
    class="contents-header">Total (Copy + Print)<img src="arrow.png" id="WS_MC_ColorTotalCounter" alt=" " class="move-contents" style="display: inline;" onclick="moveToFavorite(\'MC_ColorTotalCounter\');" onmouseover="ContentsDragDropRegist(\'MC_ColorTotalCounter\');" onmouseout="ContentsDragDropDestroy(\'MC_ColorTotalCounter\');">\n</h1>\n<div class="contents-body">\n<table class="data-table data-table-counter" width="390px">\n<tbody><tr>\n<th rowspan="5" width="130px" class="firstth-bottom-radius">Total<br>(Copy + Print)</th>\n<th class="th-indent1" width="130px">Total</th>\n<td width="130px" class="tbody-topright-td"><div align="right">261306</div></td>\n</tr>\n<tr>\n<th class="counterlist tbody-th-delete-leftborder">Black</th>\n<td><div align="right">157222</div></td>\n</tr>\n<tr>\n<th 


    wie verarbeitet man das jetzt am besten? Mit beautifulsoup? Gibts da was um dieses Chaos zu entwirren? Ich hab den kompletten output mal angehangen (in html umbennen). Mich interessiert dieser part




    Ebenso ist ein Auslesen und Exportieren zB in Excel mit Hilfe des kostenlosen PageScope DataAdmin des Herstellers möglich.

    auch automatisiert? Ich schau mir das Tool mal an.

  • Traurig, wie gesagt am einfachsten ist die eMail Benachrichtigung... SMTP Server und Anmeldedaten hinterlegen und dann die Benachrichtigungen aktivieren.


    Ne Bastellösung per Skriptparser würde ich nicht empfehlen, da der Aufbau des WebGUI sich zB durch ein Firmwareupdate ändern könnte und dann ggfs die falschen Zähler ermittelt werden. Da diese Zähler für die Abrechnungen genutzt werden, könnt das in die Hose gehen. Kompromiss könnte sonst noch snmp sein, die OID‘s lassen sich rausbekommen.

    Edited 3 times, last by Micky ().

  • Hallo,


    Python hat da noch ein html parser eventuell kannst du damit etwas anfangen?


    Ich habe einfach mal das Skript aus der Doku genommen und dein 'output.txt' übergeben. Dann erhälst du schon mal übersichtlichere Blöche, wie zum Beispiel:

    Code
    Encountered a start tag: th
    Encountered some data  : Black
    Encountered an end tag : th
    Encountered some data  : 
    
    Encountered a start tag: td
    Encountered a start tag: div
    Encountered some data  : 157222
    Encountered an end tag : div
    Encountered an end tag : td

    Damit müsste dein Problem doch lösbar werden.



    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

    • Official Post

    Habe schon ewig nichts mehr mit bs4 gemacht.

    Python
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(text, features="html5lib")

    text ist die Variable, in dem Du (hoffentlich) den "endlosen Schwall an HTML" gesetzt hast. ;)


    Jetzt kannst Du mit z.B. soup.find() oder soup.find_all() (beides HTML-Tags) oder ggf. reicht auch soup.get_text() (Text der Seite ohne HTML) nach Begriffen oder Tags suchen.


    Hier die Doku: https://www.crummy.com/software/BeautifulSoup/bs4/doc/


    Wie geschrieben bin ich aus dem Thema total raus und müsste die Doku auch erst wieder studieren. Sorry! :blush:


    Aber naja, vielleicht reicht auch wirklich einfach der HTML Parser aus.

  • Probier mal das um das File zu lesen:


    Python
    from bs4 import BeautifulSoup
    
    with open( "output.html", "r" ) as f:
        soup = BeautifulSoup( f, "html.parser" )
    
        table = soup.find( "table", { "class" : "data-table data-table-counter" } )
    
        tds = table.find_all( "td" )
        for td in tds:
            print( td.text )

    Wenn das klappt, dann die Suppe mit einem request anruehren, wie schon vorgeschlagen.

    • Official Post

    Weil da ja noch noch mehr dahinter hängt . Die Webinterface erreiche ich alle vom Applicationserver - snmp müsste ich erst einrichten in allen Standorten in Firewall freigeben etc. Als Backuplösung absolut iO und gefällt mir auch gut. Allerdings wollte ich schon immer mal ein Webinterface mit python abfragen, das ist nun meine chance.

  • Ich mach das bei unserem c360i wie wie folgt:


    Dann bekommst du deine Infos als JSON.

  • Ich gucke immer, ob im Hintergrund XHR-Requests laufen (F12 -> Netzwerkanalyse). Meist holen sich die Webinterfaces die Daten über einen Endpunkt und die Daten werden dann mittels JavaScript in die Felder eingetragen. Der Request wird höchstwahrscheinlich auch json sein und damit die Daten bekommt, wird auch eine Authentifizierung notwendig sein. Man kann sich die Requests auch im Browser einzeln ansehen. Dann weiß man auch, was übertragen werden muss, um an die Daten zu kommen.