|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1040 Wohnort: Niederbayern
|
Verfasst am: 30.12.2020, 22:01 Titel: Text aus Internetseite auslesen? |
|
|
Gibt es eine Möglichkeit, aus einer Webseite einen bestimmten Text oder den ganzen Text auszulesen? Ich habe bereits erfolgreich aus einer Webseite einen Text ausgelesen, aber das ganze funktioniert bei Freebasic-portal.de nicht! Es kommt immer: Seite wurde verschoben oder so ähnlich
Bei Freebasic selber, ist ein Beispiel (http-get.bas) mit dabei, das theoretisch funktionieren würde. Wenn ich versuche, das beim Freebasic-Portal zu machen erkennt der den Text nicht.
Mein Plan ist, dass ich beim Freebasic-Portal eine Zahl auslese. Mit dieser will ich prüfen, ob eine neue Version eines der Programme hochgeladen wurde. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2508 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 30.12.2020, 23:16 Titel: |
|
|
Beschäftige Dich mit DOM.
Altes Beispiel von früher in diese Richtung:
http://beilagen.dreael.ch/QB/AUTOKLCK.VBS
Man kann auf jeden Fall auch Textinhalte einzelner HTML-Knoten extrahieren.
Moderne Variante (nicht selber ausprobert): Selenium.
Mit diesem Webanwendungen-Test-Automatisierungsframework kannst Du solche Aufgaben auch lösen.
Vielleicht einmal in die Dokumentation schauen, wo sich u.a. Python eignen würde.
Die FreeBasic-Profis würden sich hier vermutlich sofort der Sache annehmen, eine entsprechende Bibliothek zu bauen, damit eine Testroutine auch in FreeBasic geschrieben werden kann... ;-) _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 30.12.2020, 23:56 Titel: |
|
|
Speziell zu http-get.bas und freebasic-portal.de:
httpget kann (woe der Name auch sagt) nur http auslesen, nicht aber https. Das FreeBASIC-Portal läuft aber unter https; d. h. es ist zwar auch über http aufrufbar, leitet dort aber nur auf die https-Seite weiter. Der Browser merkt das und ruft die entsprechende Seite auf; httpget zeigt dir nur die Meldung, dass verschoben wurde.
Ich würde bei nicht-eigenen Seiten (bzw. überall, wo ich http nicht voraussetzen kann) unter Linux wget nehmen und unter Windows die Windows-API-Funktionen zum Laden einer Seite - die weiß ich aber nicht auswendig. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1040 Wohnort: Niederbayern
|
Verfasst am: 31.12.2020, 08:24 Titel: |
|
|
Ich will das ganze schon mit Freebasic lösen. Wenn eine Bibliothek verwendet wird, dann nur die WinApi. Sonst keine. Es soll auch wenn möglich, keine Internetseite angezeigt bzw. geöffnet werden. Nur reines auslesen, des jeweiligen Textes aus der Internetseite. Was mich wundert ist, dass das ganze bei einer bestimmten https - Seite zum auslesen funktioniert? Eben bei dem was ich oben genannt bzw. erwähnt habe! Keine Ahnung warum das so ist?
Trotzdem vielen Dank für die Infos. Das eigentliche Ziel, habe ich ja bereits erreicht. Mein Test mit einer bestimmten Seite, funktioniert bereits ohne Probleme. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 31.12.2020, 12:44 Titel: |
|
|
Es gibt Webseiten, welche mit UND ohne https funktionieren, bzw. http UND https bereitstellen. Daher kann es durchaus sein, das manche Anfragen funktionieren, und manche nicht.
Wenn eine Seite NUR https verwendet, dann wird es mit dem klassischen get nicht funktionieren, weil (wie schon nemored schrieb) die http anfrage nur eine Antwort enthält, welche auf einen https server verweist.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 31.12.2020, 13:21 Titel: |
|
|
Vielleicht kommst du damit weiter:
https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms775123(v=vs.85)
Würde, wenn ich es beim Überfliegen richtig verstehe, die Seite ähnlich wie httpget zwar nicht in einen String, aber in eine Datei laden, und kann dann weiter verarbeitet werden. Wenn ich mich nicht täusche, pausiert das Programm nicht während des Herunterladens; d. h. du musst vor der Auswertung der geladenen Datei sicherstellen, dass der Download bereits abgeschlossen ist.
Beim Link gibt es leider Probleme - das in den Klammern gehört zum Link dazu, Klammern werden vom Forum aber nicht als gültige Zeichen erkannt, und ich habe gerade keinen Nerv, die Codierung dafür rauszusuchen ...
Gibt auch wahrscheinlich eine neuere Version der Seite. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1040 Wohnort: Niederbayern
|
Verfasst am: 31.12.2020, 14:53 Titel: |
|
|
nemored hat Folgendes geschrieben: | Vielleicht kommst du damit weiter:
https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms775123(v=vs.85)
Würde, wenn ich es beim Überfliegen richtig verstehe, die Seite ähnlich wie httpget zwar nicht in einen String, aber in eine Datei laden, und kann dann weiter verarbeitet werden. Wenn ich mich nicht täusche, pausiert das Programm nicht während des Herunterladens; d. h. du musst vor der Auswertung der geladenen Datei sicherstellen, dass der Download bereits abgeschlossen ist.
Beim Link gibt es leider Probleme - das in den Klammern gehört zum Link dazu, Klammern werden vom Forum aber nicht als gültige Zeichen erkannt, und ich habe gerade keinen Nerv, die Codierung dafür rauszusuchen ...
Gibt auch wahrscheinlich eine neuere Version der Seite. | Vielen herzlichen Dank für die Infos! Das was ich eigentlich wollte (das eigentliche Ziel), habe ich bereits erreicht. Die Idee mit dem Auslesen eines Textes der Freebasic-Portal Seite, wäre lediglich Bonus gewesen. Das ist für mich jetzt nicht so wichtig. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 31.12.2020, 15:26 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | Ich will das ganze schon mit Freebasic lösen. Wenn eine Bibliothek verwendet wird, dann nur die WinApi. Sonst keine. | Das wird nicht funktionieren. Für solche Fälle gibt es libcurl. Die Headerdatei curl.bi ist Bestandteil des FB - Paketes. Du benötigst die Dateienlibcurl.dll
libeay32.dll
libidn-11.dll
ssleay32.dll und
zlib1.dll im Programmverzeichnis oder im Suchpfad. Damit lassen sich auch verschlüsselte Dateien herunterladen: Code: | #Include Once "vbcompat.bi"
#Include Once "curl.bi"
Type tCurlInfo
curl As CURL Ptr
ff As Integer
geslen As Double
dllen As Double
timeout As Double = 3.0
verlauf As boolean = FALSE
inhalt As String
End Type
Declare Function herunterladen_curl(titel As String, tout As Double = 10.0) As String
Dim As String text
text = herunterladen_curl("https://www.freebasic-portal.de/")
? "*";text;"*"
Sleep
Function write_callback_curl Cdecl (buffer As Byte Ptr, size As Integer, nitems As Integer, info As tCurlInfo Ptr) As Integer
Dim As Integer x, bytes = size * nitems
Dim As Double tot_len, dl_len, timeout = Timer + info->timeout
curl_easy_getinfo(info->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, @info->geslen )
curl_easy_getinfo(info->curl, CURLINFO_SIZE_DOWNLOAD, @info->dllen )
If info->ff Then
If info->geslen = -1 Then
Print Format(info->dllen/1024/1024,"#.##");" MB (ESC to terminate)"
Else
Print Int(100 * info->dllen / info->geslen);"% of ";Format(info->geslen/1024/1024,"#.##");" MB (ESC to terminate)"
EndIf
Locate CsrLin - 1,1,0
If info->geslen = info->dllen Then
Print
EndIf
Put #info->ff, ,*buffer,bytes 'write downloaded bytes to file
Else
For x = 0 To bytes - 1
info->inhalt += Chr(buffer[x])
Next
EndIf
If (Inkey = Chr(27)) Or (Timer > timeout) Then
Print
Return 0
EndIf
Return bytes
End Function
Function herunterladen_curl(titel As String, tout As Double = 10.0) As String
Dim As tCurlInfo curlinfo
Dim As String dlurl, tmp
Dim As Double timeout
Dim As ZString*255 tw, errbuf
tw = titel
'setlocale(LC_ALL, ".65001")
curlinfo.curl = curl_easy_init()
If curlinfo.curl = 0 Then
?"FEHLER"
Return ""
End If
curl_easy_setopt(curlinfo.curl, CURLOPT_URL, tw)
curl_easy_setopt(curlinfo.curl, CURLOPT_WRITEDATA, @curlinfo)
curl_easy_setopt(curlinfo.curl, CURLOPT_WRITEFUNCTION, @write_callback_curl)
curl_easy_setopt(curlinfo.curl, CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt(curlinfo.curl, CURLOPT_FOLLOWLOCATION, 1)
curl_easy_setopt(curlinfo.curl, CURLOPT_ERRORBUFFER, @errbuf)
curlinfo.timeout = tout
If curl_easy_perform(curlinfo.curl) Then 'execute..
Print "ErrorBuffer:"
Print errbuf
'Sleep
EndIf
curl_easy_cleanup(curlinfo.curl) 'shutdown
Close curlinfo.ff
Return curlinfo.inhalt
End Function |
@nemored: Ich habe deinen Tip mal ausprobiert: Code: | #Include Once "win/urlmon.bi"
Dim As String url = "https://www.freebasic-portal.de/", datei = "e:\urltest.txt"
URLDownloadToFile(NULL, StrPtr(url), StrPtr(datei), NULL, NULL)
? "OK"
Sleep | bekomme beim Compilieren aber die Fehlermeldung:
...FreeBASIC-1_05_0\inc\win\objbase.bi(147) error 58: Illegal specification, at parameter 3 (pIbscCaller) of CreateStdProgressIndicator() in 'declare function CreateStdProgressIndicator(byval hwndParent as HWND, byval pszTitle as LPCOLESTR, byval pIbscCaller as IBindStatusCallback ptr, byval ppIbsc as IBindStatusCallback ptr ptr) as HRESULT'
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 31.12.2020, 16:34 Titel: |
|
|
@grindstone:
Ich habe den Download rudimentär schon mal ausprobiert, aber den Gedanken bisher noch nicht weiter verfolgt; Compiler-Fehler hatte ich dabei keinen, aber ich muss bei Gelegenheit mal am anderen Rechner schauen, wie bei mir der Code aussieht (vielleicht hat sich in den Bibliotheken ja inzwischen auch was geändert). Ich melde mich diesbezüglich nochmal. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1040 Wohnort: Niederbayern
|
Verfasst am: 31.12.2020, 18:45 Titel: |
|
|
grindstone hat Folgendes geschrieben: | ALWIM hat Folgendes geschrieben: | Ich will das ganze schon mit Freebasic lösen. Wenn eine Bibliothek verwendet wird, dann nur die WinApi. Sonst keine. | Das wird nicht funktionieren. |
Mit Freebasic meinte ich, dass ich Freebasic als Programmiersprache verwende und nicht eine andere. Da hat man mich etwas falsch verstanden. Ich nehme zur Not auch eine andere Bibliothek. Muss jetzt nicht die WinApi sein. Wäre zwar schön, wenn es WinApi ist, aber keine Bedingung! Hauptsache es funktioniert. Das ist das wichtigste. Die Funktion kann ich auch weglassen. Was ich vor hatte zu programmieren, funktioniert! Da kann ich den entsprechenden Quellcode verwenden. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 31.12.2020, 20:00 Titel: |
|
|
Code: | #ifdef __FB_UNIX__
function download(url as string, dest as string) as integer
return = shell("wget " & url & " -t 3 -P " & dest)
end function
#elseif defined(__FB_PCOS__)
function download(url as string, dest as string) as integer
dim as integer ret
dim URLDownloadToFile as function(byval pCaller as long, byval szURL as zstring ptr, byval szFileName as zstring ptr, _
byval dwReserved as long, byval lpfnCB as long) as long
dim lR as long, library as any ptr
library = dylibload("urlmon.dll")
URLDownloadToFile = dylibsymbol(library, "URLDownloadToFileA")
ret = URLDownloadToFile(0, url, dest, 0, 0)
dylibfree(library)
return ret
end function
#endif |
Der Rückgabewert der Funktion gibt nur an, ob ein Fehler aufgetreten ist. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 31.12.2020, 21:15 Titel: |
|
|
@nemored: Dein Code funktioniert, offenbar ist da ein Fehler in den FB-Headerdateien (ich arbeite allerdings aktuell immer noch mit Version 1.05). Leider bekomme ich als Fehlermeldung 800C000E (security problem), also kein eingebautes SSL . Schade, das wäre wesentlich einfacher gewesen als jedesmal curl einzubinden.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 31.12.2020, 21:56 Titel: |
|
|
Meine Umgebung hier ist fbc 1.07.1 32bit unter Windows 10 (64bit), da funktioniert es aber auf zwei verschiedenen Rechnern (jeweils getestet mit "https://freebasic-portal.de")
Das "https://" hast du ja mit angegeben? Ansonsten klingt der Fehler ja mehr nach einem Windowsproblem als nach einem FreeBASIC-Problem.
Eigentlich bin ich dafür, Microsoft gesetzlich zu verpflichten, wget standardmäßig mitzuliefern. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2508 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 31.12.2020, 23:30 Titel: |
|
|
nemored hat Folgendes geschrieben: | Eigentlich bin ich dafür, Microsoft gesetzlich zu verpflichten, wget standardmäßig mitzuliefern. :D |
Ohne grossen Kommentar: Schau Dir bitte
http://gnuwin32.sourceforge.net/packages/wget.htm
an und Du hast exakt dass, was in einem Linux nach einem Code: | apt-get install wget | bzw. zur Vorfügung steht.
Ansonsten für den OP (Original-Poster): Grundsätzlich kann man auch mittels Socket-Bibliothek das HTTP-Protokoll implementieren, aber dies lohnt sich nicht. Stattdessen besser auf Bibliotheken anderer zurückgreifen, z.B. der eine hat TLS implementiert (=eine Software-Schicht, die verschlüsselt mit den Webserver kommuniziert und Dir über dessen API aber die Daten so repräsentiert, als wäre es Klartext). Ein anderer hat HTTP(S) komplett implementiert, so dass Du den Inhalt bekommt, jedoch nur als Rohformat. Ein dritter hat einen HTML/XML-Parser implementiert, so dass Du wie diskutiert, Deine gewünschte Information (hier Zahl) aus der DOM-Baumstruktur aus diesen Rohdahten extrahieren kannst.
Die Kunst ist mittlerweile freilich, auf Bibliotheken zurückgreifen zu können, welche aktiv von einer Community gepflegt wird, denn viele Sicherheitslöcher heutiger Software rühren daher, dass vielfach eine veraltete Version einer Bibliothek zur Anwendung kommt.
Somit schlussendlich sinnvolles Ziel: Dass man diese Bibliotheken letzlich aus FreeBasic heraus in unserem Fall nutzen kann. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 01.01.2021, 01:23 Titel: |
|
|
Ja, schon, mir geht es aber nicht um meine private Nutzung, sondern um eine Verwendung in meinen Programmen. Der Standardnutzer hat halt wget nicht installiert, und meiner Erfahrung nach müssen zumindest Teile davon korrekt installiert werden, womit ich wget nicht einfach meinem Programm beilegen kann. Den Benutzer zur Installation eines Drittprogramms zwingen will ich auch nicht, wenn es sich vermeiden lässt (deswegen verwende ich auch für Linux nach Möglichkeit nur externe Tools, die "fast sicher" immer zur Verfügung stehen). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
|
Nach oben |
|
|
UEZ
Anmeldungsdatum: 24.06.2016 Beiträge: 129 Wohnort: Opel Stadt
|
Verfasst am: 02.01.2021, 22:03 Titel: |
|
|
Wenn du nur mit Windows arbeitest, dann kannst du mal hier schauen: https://docs.microsoft.com/en-us/windows/win32/winhttp/winhttp-start-page
Mit diesen WinHTTP Funktionen sollte es möglich sein, den Source Code von einer Seite auszulesen.
Oder alternativ dir die WinHTTP Funktionen in AutoIt anschauen und sie nach FB portieren.
Dies kombiniert mit Regex, sollte es geschickt möglich sein, die Software Version aus der Webseite auszulesen. _________________ Gruß,
UEZ |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 03.01.2021, 05:25 Titel: |
|
|
curl funktioniert mit https wohl nur, wenn ich explizit das Protokoll mitgebe - oder kann ich da mal ein Beispiel haben, wie ich da z. B. über die cmd die FreeBASIC-Seite aufrufen kann? Wenn das klappt, wäre das natürlich super. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 03.01.2021, 18:12 Titel: |
|
|
Code: | curl -v -k https://www.freebasic-portal.de/ |
Näheres siehe https://curl.se/docs/sslcerts.html
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 03.01.2021, 21:21 Titel: |
|
|
Danke, dann doch einfach mit -k. Ich hatte das gestern am Laptop probiert (nur ohne -v) und bin nur bei der http-(Weiterleitungs)-Ausgabe gelandet, warum auch immer; jetzt hier am PC funktioniert es. Muss ich nochmal am Laptop testen, ob es ein temporäres Problem war oder mir da irgendeine Konfiguration einen Strich durch die Rechnung macht.
(Am Laptop funktioniert ja auch aus irgendwelchen mysteriösen Gründen die (neue) variable Parameterliste mit Stringvariablen* nicht ...)
(edit: Stringliterale oder Stringvariablen; eines der beiden funktioniert, das andere nicht - Problem aber nur am Laptop und unabhängig von 32- oder 64Bit fbc) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|