gutefrage.net Verbinden und aktuelle Daten Abfragen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag von NicTheQuick »

Gibt es keinen RSS-Feed für gutefrage.net? Dann könnte man doch einfach den empfangen, was wesentlich einfacher wäre.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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
a²+b²=mc²
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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ö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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
a²+b²=mc²
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: gutefrage.net Verbinden und aktuelle Daten Abfragen

Beitrag 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?
Antworten