Ankündigung

Einklappen
Keine Ankündigung bisher.

Python urllib für Kamera mit Username:Passwort - Hikvision

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Python urllib für Kamera mit Username:Passwort - Hikvision

    Hallo.
    Ich bin etwas verzweifelt, da ich nun schon seit Tagen versuche aus einer Hikvision Kamera ein jpg Bild von einer Logic zu pullen.
    Ich komme da absolut nicht weiter.....
    Bei anderen Kameras wo entweder kein oder das Passwort am Ende geschrieben wird ist das kein Problem. Aber eben hier, wo das Passwort vorne stehen muss.


    Der HTML aufruf den ich Browser eingeben muss um ein Bild zu bekommen ist:

    http://User:Passwort@IP/Streaming/channels/101/picture

    Das Problem was sich jetzt daraus ergibt, ist der Doppelpunkt zwischen dem User und dem Passwort.
    URLLIB versucht nun immer den Port "Passwort@IP...." zu finden.

    Der aufruf der URL erfolgt so:
    Code:
    with urllib.request.urlopen(bild_url) as response, open('/tmp/cam'+bild_dateiname1, 'wb') as out_file:
            shutil.copyfileobj(response, out_file)
    Damit speichere ich das Bild temporär und benutze es später zum Senden mit Pushbullet und FTP Speicherung.

    Was ich schon versucht habe....

    Code:
    import urllib2
    SERVER = 'example.com/pass-protected/'
    authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm()
    authinfo.add_password(None, SERVER, 'testuser', 'test-user-pass')
    page = 'HTTP://'+SERVER+'/cgi-bin/tools/orders_waiting.py'
    handler = urllib2.HTTPBasicAuthHandler(authinfo)
    myopener = urllib2.build_opener(handler)
    opened = urllib2.install_opener(myopener)
    output = urllib2.urlopen(page)
    do_something(output)
    Damit oder mit anderen Beispielen die alle das Auth. oder passwordmgr benutzen komme ich überhaupt nicht klar .-(
    Ich weiss auch nicht was dann aus der URL gemacht wird. Blicke einfach nicht durch... .-(

    Dann habe ich noch diese Lösung gefunden:

    Code:
    username = 'XXX'
    password = 'YYYYYY'
    print(requests.get(bild_url, auth=(username, password)).content)
    Das hat mir aber auch nicht weiter geholfen.
    Das ist echt blöd wenn man einfach nicht mehr weiter weiss!
    Ihr seid jetzt meine letzte Hoffnung. Evtl kann mir da jemand den entscheidenden Tip geben!

    Grüße, Marc




    #2
    Machs dir einfach und nimme die Python-Requests-Klasse.

    Code:
    import requests
    from requests.auth import HTTPBasicAuth
    
    auth = HTTPBasicAuth(user, password)
    
    response = requests.get(url, auth=auth, stream=True)
    
    with open("/tmp/snapshot.jpg", "wb") as f:
        for chunk in repsone.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)
    Ist jetzt aus dem Kopf, sollte ber klappen. Die URL muss dann aber hier ohne Nutzername und Passwort überheb werden. Das macht die Funktion selber.

    Gruss,

    Stefan
    Zuletzt geändert von pfischi; 23.12.2016, 18:50.
    Sonos

    Kommentar


      #3
      Alternativ kannst du das Bild auch so abfragen: Link
      "Optimize MJPEG sub stream command, no need inputting username and password after input URL. URL format is “http://ip: port/Streaming/channels/1/preview?auth=xxxxxxx”. Here xxxxxxx is base64 encrypted verification."

      Kommentar


        #4
        Vielen Dank an Euch Beide!
        Ich habe es jetzt einfach mit dem Tip von SaschaG gelöst.
        Bei meiner Kamera, eine DS-2CD2142FWD-I FW: 5.4.3 Hikvision wird sogar der Mainstream so übertragen!

        Der Aufruf erfolgt dann mit:

        http://IP/streaming/channels/1/picture/?auth=XXXX

        Wobei XXXX dann halt Base64 im Format User:Pwd ist.

        Vielen Dank! Jetzt kann Weihnachten kommen....

        Marc

        P.S. Die Lösung von pfischi werde ich nach Weihnachten dann auch noch einmal testen und eine Rückmeldung hier posten.

        Kommentar


          #5
          sooo....

          Die Lösung von pfischi funktioniert auch super!
          Allerdings gibt es da noch einen kleinen Schreibfehler. Hier noch einmal das Ganze der Vollständigkeit halber:

          Code:
          import requests
          from requests.auth import HTTPBasicAuth
          
          user = 'XXXX'
          password = 'YYYY'
          
          auth = HTTPBasicAuth(user, password)
          response = requests.get(bild_url, auth=auth, stream=True)
          with open("/tmp/snapshot.jpg", "wb") as f:
              for chunk in response.iter_content(chunk_size=1024):
                  if chunk:
                      f.write(chunk)
          Vielen Dank noch einmal,
          Marc
          Zuletzt geändert von schuma; 26.12.2016, 15:51.

          Kommentar


            #6
            Zitat von schuma Beitrag anzeigen
            sooo....

            Die Lösung von pfitschi funktioniert auch super!
            Hey, seit wann bin ich pfitschi
            Sonos

            Kommentar


              #7
              Ups.... sorry

              Kommentar

              Lädt...
              X