Ankündigung

Einklappen
Keine Ankündigung bisher.

Webabfragen verschiedene Länge

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

    HS/FS Webabfragen verschiedene Länge

    Ich werte grade per Webabfrage die Playlists eines Exstreamers aus.
    Das ist per Webabfrage gut machbar.
    Nun habe ich aber das Problem, dass die Playlists nicht immer gleich viele Titel haben. D.h. ich frage die Titel 1-20 ab. Wenn die Playlist jetzt aber weniger als 20 Titel hat , bekomme ich kein Ergebnis (weil die Abfrage nicht erfolgreich war).

    Daher wollte ich es wie folgt lösen : Ich frage Titel 1 mit einer einzelenen Webabfrage ab und starte bei erfolgreicher Auswertung die nächste Abfrage für Titel 2 usw..
    Das funktioniert auch, aber dauert viel zu lange (und überschreibt mir auch nicht die hinteren Titel aus der letzten Playlist).

    Daher war mein Denkansatz, eine Abfrage sollte auf einmal die 20 Titel auslesen und in die KO´s , für die die Webabfrage kein Ergebnis lieferte, einen Wert = 0 (bzw. einen leeren 14byte Text) schreiben.
    Kann man das irgendwie hinbekommen oder gibt´s eine andere komfortable Möglichkeit, das Problem zu lösen ?
    ____________

    Gruss Norbe

    #2
    Ja, das geht!

    Ich verwende dazu Bytecode . Der unschlagbare Vorteil ist, daß einem nahezu alle Möglichkeiten von Python zur Verfügung stehen. Man muss sich nur ein wenig mit Python auseinandersetzen.

    Ich nutze das für eine ähnliche Aufgabenstellung, nämlich die Abfrage der Warnungen von unwetterzentrale.de . Auch dort sind naturgemäß die Zahl der Meldungen variabel.
    Das sieht dann z.B. so aus:
    Code:
    text=subject.read()
    bild      = re.findall('(?<=url......).*?(?=. no-repeat;">)', text)
    titel     = re.findall('(?<=<h1>).*?(?=<br />)', text)
    warnstufe = re.findall('(?<=;">).*?(?=</span>)', text)
    ort       = re.findall('(?<=<h2>).*?(?=</h2>)', text)
    gueltig   = re.findall('(?<=<h3>).*?(?=</h3>)', text)
    text      = re.findall('(?<=<p>).*?(?=</p>)', text)
    
    if len(titel)==0:
      print "LEER"
    
    else:
    
      print len(titel)
      for lauf in range(0,len(titel)):
        print lauf,bild[lauf],titel[lauf],warnstufe[lauf],ort[lauf],gueltig[lauf],text[lauf]
    Gruss aus Radevormwald
    Michel

    Kommentar


      #3
      Falls dir das was hilft, hier ist eine Logik in der die gesamte Funktion in eine Klasse verpackt ist die einfach auf SN[1] gelegt wird und dann direkt in vorhandenen Logiken verwendet werden kann.

      folgendes kann der Klasse übergeben werden

      ## -- agent='Mein Agent' // Useragent
      ## -- timeout=1 // timeout FW>=2.4
      ## -- header=0/1 // HTTP-Header anzeigen default=0
      ## -- content=0/1 // Content anzeigen default=1
      ## -- follow=0/1 // Redirects folgen default=1
      ## -- method='get'/'post' // default='get'
      ## -- data='daten=1&abschicken=abschicken' // POST oder GET Daten
      ## -- referer='https://knx-user-forum.de/index.php' // einen Referer
      ## -- seperator='#' Trennzeichen für Telnet

      Ruft google als Internet Explorer auf
      Code:
       
      5012|0|"EC[1] and len(EN[1])>0"|"SN[1].open('http://www.google.de/',agent='MSIE')"|""|1|0|0|0
      Ruft google als Agent "GIRA Homeserver" auf und gibt nur den Header aus
      Code:
       
      5012|0|"EC[1] and len(EN[1])>0"|"SN[1].open('http://www.google.de/',header=1,content=0)"|""|1|0|0|0
      mit der lib geht auch telnet

      führt ein "ls /" durch und beendet sich dann.
      Code:
       
      5012|0|"EC[1] and len(EN[1])>0"|"SN[1].open('telnet://192.168.178.25/ls%20/#exit#')"|""|1|0|0|0
      BETA nicht 100% getestet also auf eigenes Risiko
      Angehängte Dateien
      Nils

      aktuelle Bausteine:
      BusAufsicht - ServiceCheck - Pushover - HS-Insight

      Kommentar


        #4
        Achso fast vergessen ist GPL also bitte beim weiterverarbeiten die Lizenz beachten

        Hier der Quelltext

        Code:
        ## Copyright © 2010, knx-user-forum e.V, All rights reserved.
        ##
        ## This program is free software; you can redistribute it and/or modify it under the terms
        ## of the GNU General Public License as published by the Free Software Foundation; either
        ## version 3 of the License, or (at your option) any later version.
        ##
        ## This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
        ## without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
        ## See the GNU General Public License for more details.
        ##
        ## You should have received a copy of the GNU General Public License along with this program;
        ## if not, see <[URL]http://www.gnu.de/documents/gpl-3.0.de.html[/URL]>.
        if EI==1:    
            class KNXUF_urllib:
                def __init__(self,obj):
                    self.MC = obj.MC
                    self.recursiv=0
                def resolve(self,host):
                    try:
                        return self.MC.DNSResolver.getHostIP(host)
                    except:
                        pass
                        try:
                            return __import__('socket').gethostbyname(host)
                        except:
                            raise "Host: " + host + " not found"
                def open(self,url,method='GET', data='', referer='', agent="GIRA Homeserver",follow=1,timeout=1,header=0,content=1,seperator="#"):
                    if self.recursiv>2:
                        ###DEBUG###print "Zuviele Umleitungen, Abbruch"
                        return ""
                    haveBehaviour=True
                    if agent=="MSIE":
                        agent="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
                        haveBehaviour=False
                    if agent=="FF2":
                        agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"
                        haveBehaviour=False
         
                    method=method.upper()
                    ## URL als Array durchsuchen
                    url=url.split("/")
                    ## Protokoll http/telnet
                    proto=url[0].lower()
         
                    if proto=="http:":
                        ## Standardport 80
                        port=80
                    else:
                        port=23
         
                    ## Hostteil
                    host=url[2].lower()
         
                    ## Wenn das einen : enthält Port extrahieren
                    if host.find(":")>0:
                        (host, port) = host.split(":")
                        port=int(port)
         
                    ## Namen auflösen
                    dst_addr = self.resolve(host)
         
                    ## [URL]http://host/[/URL] von der url entfernen
                    url.pop(0)
                    url.pop(0)
                    url.pop(0)
         
         
                    ## Socket auf
                    sock = __import__('socket').socket(__import__('socket').AF_INET,__import__('socket').SOCK_STREAM)
         
                    ## Wenn Python >2.2 dann timeout auf den Socket anwenden
                    if float(__import__('sys').version[0:3])>2.2:
                        sock.settimeout(timeout)
         
                    ## Verbindung aufbauen
                    try:
                        ###DEBUG###print "Verbindung zu "+dst_addr+"("+host+") Port: "+str(port)
                        sock.connect((dst_addr,port))
                    except:
                        pass
                        ###DEBUG###print "Fehlgeschlagen"
                        raise "Keine Verbindung zu Host "+host+" auf Port "+str(port)
                        sock.close()
                        return ""
                    url="/".join(url)                
                    if proto=="http:":
                        ## URL Quoting
                        url = __import__('urllib').quote_plus("/"+url,"/?&=%#")
                        ## Datenblock erstellen
                        postdata=""
                        if len(data)>0:
                            senddata=__import__('urllib').quote_plus(data,"&=")
                            if method == "GET":
                                url+="?"+data
                                senddata=""
                            else:
                                postdata ="Content-Type: application/x-www-form-urlencoded\\r\\n"
                                postdata+="Content-Length: "+str(len(data))+"[URL="file://\\r\\n"]\\r\\n[/URL]"
                                postdata+="Conection: close\\r\\n\\r\\n"
         
                            ###DEBUG###print "Data send\\n" + senddata + "[URL="file://\\nURL"]\\nURL[/URL]: "+url
                        ## HTTP starten
                        sock.send(method+" "+url+" HTTP/1.1\\r\\n")
                        sock.send("HOST: "+host+"[URL="file://\\r\\n"]\\r\\n[/URL]")
                        sock.send("User-Agent: "+agent+"[URL="file://\\r\\n"]\\r\\n[/URL]")
                        if not haveBehaviour:
                            ### Das senden wir mal damit 403 bad Behaviour uns verschont
                            sock.send("Accept: "+"text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5")
                            sock.send("Accept-Language: " + "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")
                            sock.send("Accept-Charset: "+ "ISO-8859-1,utf-8;q=0.7,*;q=0.7")
         
                        if len(referer)>0:
                            sock.send("Referer: "+referer+"[URL="file://\\r\\n"]\\r\\n[/URL]")
                        if len(postdata)>0:
                            sock.send(postdata)
                            sock.send(senddata)
                        else:
                            sock.send("[URL="file://\\r\\n"]\\r\\n[/URL]")
                            sock.send("[URL="file://\\r\\n"]\\r\\n[/URL]")
         
                    elif proto=="telnet:":
                        ###DEBUG###print "TELNET"
                        header=1
                        content=1
                        ## Telnet einfach so senden
                        if url.find(seperator)!=-1:
                            for cmd in url.split(seperator):
                                ###DEBUG###print "CMD:"+cmd
                                sock.send(cmd+"[URL="file://\\r\\n"]\\r\\n[/URL]")
                        else:
                            ###DEBUG###print "CMD:"+url
                            sock.send(url+"[URL="file://\\r\\n"]\\r\\n[/URL]")
                    ## Senden beenden
                    sock.shutdown(1)
         
                    ## Jetzt empfangen
                    received=""
                    while True:
                        read=sock.recv(1024)
                        if not read:
                            break
                        received+=read
         
                    ## Verbindung wieder zu   
                    sock.close()
                    ## Header und Content teilen
                    received = __import__('re').split("[URL="file://\\r\\n\\r\\n",received"]\\r\\n\\r\\n",received[/URL])
         
                    redirect = __import__('re').findall(r"(?m)^Location:\s(\w+:.*)\\r\\n", received[0])
                    if redirect:
                        if follow==1:
                            self.recursiv+=1
                            ###DEBUG###print "Redirect zu "+repr(redirect[0])
                            return self.open(redirect[0],method=method, data=data, referer=referer, agent=agent,timeout=timeout,header=header,content=content,seperator=seperator)
                        ###DEBUG###else:
                            ###DEBUG###print "Redirect verweigert"
                    ret=""
         
                    if header:
                        ## Header ausgeben
                        ret+=received[0]
                    if content:
                        if header:
                            ## Wenn Header auch ausgegeben werden soll die CRLF/CRLF wieder einfügen 
                            ret+="[URL="file://\\r\\n\\r\\n"]\\r\\n\\r\\n[/URL]"
         
                        ## Header ist schon ausgegeben also weg damit
                        received.pop(0)
         
                        ## Den Rest wieder zusammen könnten ja noch mehr CRLF hintereinander enthalten sein
                        ret+="[URL="file://\\r\\n\\r\\n".join(received"]\\r\\n\\r\\n".join(received[/URL])
         
         
                    ## Daten wieder zurück
                    return ret
        kann mit dem LogikGeneratorTemplate kompiliert werden
        Nils

        aktuelle Bausteine:
        BusAufsicht - ServiceCheck - Pushover - HS-Insight

        Kommentar

        Lädt...
        X