Seite 1 von 2

gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 07.05.2013 23:24
von Sunny
Ich bin grade dabei, einen kleinen Client zu schreiben, der in gewissen Zeitabständen (so ca. alle 5 Sekunden) die neusten Fragen von gf.net downloaden soll.
Ich hab hier schonmal ein kleinen Codeschnippsel, der im Debugger den Link-Pfad zur 1. Frage ausgibt.

Code: Alles auswählen

If InitNetwork() = #False
  End
EndIf

port = 80
host.s = "www.gutefrage.net"
bl = 1024
*b = AllocateMemory(bl)

findlink.s = "<a class="+Chr(34)+"detailLink"+Chr(34)+" href="+Chr(34)



connection = OpenNetworkConnection(host, port)
If connection
  SendNetworkString(connection, "GET /fragen/neue/1" + #CRLF$)
  SendNetworkString(connection, "Host: " + host + #CRLF$)
  SendNetworkString(connection, "User-Agent: Enable" + #CRLF$)
  SendNetworkString(connection, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + #CRLF$)
  SendNetworkString(connection, "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" + #CRLF$)
  SendNetworkString(connection, "Connection: close" + #CRLF$ + #CRLF$)
  
  page$ = ""
  While ReceiveNetworkData(connection, *b, bl)
    page$ + PeekS(*b)
  Wend
  
  
  ;--------------------------------
  pos = FindString(page$, findlink) + Len(findlink)
  path$ = ""
  
  While Mid(page$, pos, 1) <> Chr(34)
    path$ + Mid(page$, pos, 1)
    pos + 1
  Wend
  
  Debug path$
  ;--------------------------------
  
  
  FreeMemory(*b)
  CloseNetworkConnection(connection)
Else
  Debug "false"
EndIf
Jetzt besteht allerdings das Problem, dass die Daten, die sich der Client downloadet nur ca. alle 60 Sekunden aktualisiert werden aber in meinem Browser werden immer die aktuell neusten Fragen angezeigt, wenn ich die seite Aktualisiere, wie kann das sein und wie bekomme ich mit meinem Client die aktuellen Daten von gf.net?

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 07.05.2013 23:36
von STARGÅTE
kA was du genau meinst, aber die Website benutzt ja eine menge JavaScript, die im "normalen" Browser auch ausgeführt wird, und somit eine "gewisse" Verbindung zu Server hält.

Du hingegen lädst ja einfach nur den SeitenQuellcode runter ohne in auszuführen.

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 08.05.2013 02:36
von Sunny
kA was du genau meinst
Ja, das ist irgendwie nicht grade leicht zu erklären, was genau ich meine.^^

Ich versuchs Mal so:

Sagen wir mal, ich öffne mit meinem Browser die Seite "http://www.gutefrage.net/fragen/neue/1" dann stehen da die ersten 20 neuen Fragen, wobei ja die oberste Frage die neuste ist.

Wenn ich danach meinen Client ausführe, dann müsste mir ja eigentlich der Link zur obersten (neuesten) Frage im Debugger ausgegeben werden (Oder eine noch neuere Frage, falls in der Zwischenzeit eine dazugekommen ist). Mir wird allerdings meistens eine etwas ältere Nachricht angezeigt.

Beim Rumprobieren ist mir dann aufgefallen, das sich in meinem Client die angezeigte Nachricht ca. alle 60 Sekunden ändert. d.h. ja, das gf.net die Daten jede Minute ein mal aktualisiert.
aber die Website benutzt ja eine menge JavaScript
Könnte sein, dass es daran liegt aber einen JavaScript-Interpreter nur für ein kleines Programm zur Filterung zu schreiben scheint mir dann doch etwas sehr aufwändig. ^^
Evtl. liegt es ja auch daran, dass man nur als angemeldeter Nutzer die aktuellen Daten angezeigt bekommt. Ich werde mich gleich mal bei gf.net ausloggen und das ausprobieren. (Ich weiß... Traurig, dass ich noch nicht ehr auf die Idee gekommen bin ^^)

Edit:
Also wenn ich ausgeloggt bin werden mir trotzdem aktuell die neuesten Fragen im Browser angezeigt.

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 08.05.2013 09:14
von Kiffi
hier eine COMate-Ansatz:

Code: Alles auswählen

IncludePath "[DeinPfadZu]\COMatePLUS\"
XIncludeFile "COMatePLUS.pbi"

EnableExplicit

#frmMain = 0
#frmMain_WebGadget = 0

Define WB.COMateObject
Define li.COMateObject

Define Anzahl_li
Define li_Zaehler

If OpenWindow(#frmMain, 0, 0, 0, 0, "", #PB_Window_Invisible) 
  
  WebGadget(#frmMain_WebGadget, 0, 0, 0, 0, "http://www.gutefrage.net/fragen/neue/1")
  
  ; make sure that the page was completely loaded
  Repeat
    While WindowEvent() : Delay(1) : Wend
    If GetGadgetAttribute(#frmMain_WebGadget, #PB_Web_Busy) = 0 : Break : EndIf
  ForEver
  
  WB = COMate_WrapCOMObject(GetWindowLong_(GadgetID(#frmMain_WebGadget), #GWL_USERDATA))
  If WB
    Anzahl_li = WB\GetIntegerProperty("document\GetElementsByTagName('li')\length")
    For li_Zaehler = 0 To Anzahl_li - 1
      li = WB\GetObjectProperty("document\GetElementsByTagName('li')\Item(" + Str(li_Zaehler) + ")")
      If li
        If li\GetStringProperty("getAttribute('data-type')") = "question"
          Debug li\GetStringProperty("innerHTML") ; hier geht Deine Arbeit weiter
        EndIf
        li\Release()
      EndIf
    Next
    WB\Release()
  EndIf

EndIf
Grüße ... Kiffi

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 08.05.2013 12:31
von NicTheQuick
Gibt es keinen RSS-Feed für gutefrage.net? Dann könnte man doch einfach den empfangen, was wesentlich einfacher wäre.

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 08.05.2013 13:45
von Kiffi
NicTheQuick hat geschrieben:Gibt es keinen RSS-Feed für gutefrage.net? Dann könnte man doch einfach den empfangen, was wesentlich einfacher wäre.
Tadaaah! http://www.gutefrage.net/feed/neue

// Edit: ein entsprechender RSS-Reader ist hier zu finden: http://www.purebasic.fr/german/viewtopi ... 42#p302142

Grüße ... Kiffi

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 08.05.2013 21:20
von WPö
Moin!

Da zeigt sich halt immer wieder einmal, wie wichtig es ist, die richtige Frage zu stellen. So sind wir wieder auf dem Holzweg gelandet.

Anstatt "die Audio-Endstufe im Fernseher ist hin" zu schreiben, hätte man "kein Ton" reklamieren sollen. Dann wäre der defekte Sicherungswiderstand auf der Audio-Versorgungsleitung im Netzteil eher aufgefallen. Wie oft ich das schon hatte!

Gruß - WPö

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 17.11.2013 10:43
von Sunny
Hallöchen @All...
Ich greife dieses Thema von mir nochmal auf, weil ich mich nochmal damit befassen wollte.

Also erstmal dankeschön @Kiffi, für den Link zum RSS-Feed, den ich bis heute noch nicht auf der Seite von GF.net gefunden habe ^^

Allerdings besteht bei diesem Link, das selbe Problem, das ich auch schon vorher hatte.
Und zwar werden mir im Browser die aktuellen Einträge angezeigt, wenn ich die Seite allerdings über PB mittels "ReceiveHTTPFile()" oder "URLDownloadToFile_()" downloade, sind die Einträge darin nicht aktuell (Einträge die jünger als eine Minute sind, werden nicht angezeigt).

Hab hier mal was gecodet, dass die Infos des Feeds downloadet, filtert und im Debugger ausgibt:

Code: Alles auswählen

InitNetwork()

Structure gf
  title.s
  description.s
  link.s
  guid.s
  date.s
EndStructure

Global FeedURL.s, FeedFile.s, QuellFile.s, NewList Items.gf()

FeedURL   = "http://www.gutefrage.net/feed/neue"
FeedFile  = GetTemporaryDirectory() + "temp.txt"

Enumeration ;Windows
  #WND_MAIN
EndEnumeration

Enumeration ;Gadgets
  #CKB_MAIN_TITLE
  #CKB_MAIN_DESCRIPTION
  #CKB_MAIN_KEYWORDS
EndEnumeration

Procedure ReadXMLCode(File.s)
  If LoadXML(0, File)
    *Root       = RootXMLNode(0)
    *Channel    = ChildXMLNode(*Root)
    *Items      = ChildXMLNode(*Channel)
    countChilds = XMLChildCount(*Items)
    
    For i = 1 To countChilds
      *Item = ChildXMLNode(*Items, i)
      
      If GetXMLNodeName(*Item) = "item"
        *Title        = ChildXMLNode(*Item, 1)
        *Description  = ChildXMLNode(*Item, 2)
        *Link         = ChildXMLNode(*Item, 3)
        *GUID         = ChildXMLNode(*Item, 4)
        *Date         = ChildXMLNode(*Item, 5)
        
        Found = #False
        
        ForEach Items()
          If Items()\guid = GetXMLNodeText(*GUID)
            Found = #True
            Break
          EndIf
        Next
        
        
        If Found = #False
          AddElement(Items())
          Items()\title       = GetXMLNodeText(*Title)
          Items()\description = GetXMLNodeText(*Description)
          Items()\link        = GetXMLNodeText(*Link)
          Items()\guid        = GetXMLNodeText(*GUID)
          Items()\date        = GetXMLNodeText(*Date)
          
          Debug "Title: " + Items()\title
          Debug "Desc.: " + Items()\description
          Debug "Link:  " + Items()\link 
          Debug "GUID:  " + Items()\guid
          Debug "Date:  " + Items()\date
          Debug "----------"
          
        EndIf
      EndIf
    Next
    
  EndIf
EndProcedure

Procedure ReadFeed()
  Repeat
    ReceiveHTTPFile(FeedURL,FeedFile)
    
    ReadXMLCode(FeedFile)
    
    Delay(1000)
  ForEver
EndProcedure

ReadFeed()
Dann könnt ihr das ja auch mal mit dem vergleichen, was im Browser angezeigt wird.
Möglicherweise kommt ja jemand auf die Idee woran das liegen könnte.

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 17.11.2013 12:56
von Kiffi
ist vermutlich ein Cache-Problem. Versuchs mal so:

Edit: Code unten

Grüße ... Kiffi

Edit: So klappt's

Code: Alles auswählen

Procedure ReadFeed()
 Repeat
  DeleteFile(FeedFile)
  ReceiveHTTPFile(FeedURL + "?rnd=" + Str(ElapsedMilliseconds()), FeedFile)
  ReadXMLCode(FeedFile)
  Delay(1000)
 ForEver
EndProcedure

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Verfasst: 17.11.2013 14:05
von Sunny
Kiffi, du bist der größte.
So funktioniert es einwandfrei.

Nur mal so ne Frage...
Wie bist du auf diesen Parameter gekommen?
Ist das möglicherweise irgend so ein Standard-Cache-Manipulations-Dingens-Parameter?