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?