[Gelöst] Jede Stunde Internetlinks vergleichen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von BraInLagg.

    [Gelöst] Jede Stunde Internetlinks vergleichen

    Hallo,

    zuerst: Ich bin nicht gerade begabt in VB!
    Ich soll etwas programmieren, und zwar:

    Das Programm soll jede Stunde, Internetlinks vergleichen!
    Ich habe einen Start und einen Stop Button & 1 textbox.
    Nun wenn ich auf Start soll er nach einer Stunde den Link aus der Textbox nehmen (z.B. google.de).
    Dieser soll er dann aufrufen und abwarten, ob der Link auch so bleibt. Also das er nicht weitergeleitet wird oder sowas.
    Wenn der Link so bleibt, soll er nichts machen, wenn der Link nicht so bleibt und sich verändert soll sofort eine Email verschickt werden.

    Nur wie mache ich das am blödesten? ICh hab mir schon nen Timer in meine Form mit dem Intervall einer Stunde, Loop muss ich dann auch iwo setzen weil er das jede Stunde machen muss.
    Aber wie soll ich ihm sagen dass er den Link abchecken soll?

    Grüße,
    Brainlagg
    Hat da jemand ne Idee?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BraInLagg“ ()

    Loop brauchst du nicht, du hast ja ein Timer welcher das Tick-Event somit jede Stunde feuert, heißt in diesem Tick-Event navigierst du die angegebene URL an, wartest bist die seite geladen ist. Dann holst du dir die aktuelle URL und vergleichst diese mit einer globalen Variable, ist die identisch machste nichts, wenn sie anders ist verschickst du eine E-Mail mit SMTP. Hierzu gibts hier und im Netz etliche Beispiele.
    Und wie kann ich ihm sagen dass er im Hintergrund die Webseite aufrufen soll?
    Ich steh grad voll aufm Schlauch sorry.
    Ich kann doch dann mit "Url.AbsoluteUri" arbeiten oder nicht? quasi den Text aus der Textbox mit "Url.AbsoluteUri" vergleichen?
    Wäre die Frage willst du den WebBrowser nutzen oder WebClient oder HttpWebRequest.

    Bei WebClient oder WebRequest wäre festzustellen, ob eine Header Weiterleitung funktioniert oder ob sowas nur der Browser macht. Wenn das funktioniert würde ich dieses benutzen, weil der WebBrowser langsam ist und unnötigen Overhead an Daten läd (Bilder, Stylingsheet usw) die du nicht benötigst.

    Und ja du könntest die URL aus der Textbox mit der AbsoluteUri vergleichen, sofern du in die Textbox auch die richtige URL eingegeben hast. Weil manchmal wird die URL automatisch noch korrigiert wie www drangehängt und ein / am ende der URL.
    Deswegen würde ich dir raten es folgendermaßen zu lösen.

    1. Du gibst die URL in die Textbox ein
    2. Drückst auf start, die URL wird annavigiert und die AbsoluteUri wird in der globalen Variablen gespeichert
    3. Danach wird der Timer aktiviert welcher dann nach 1 Std. wiederum die Seite annavigiert
    4. nun prüfst du die URL aus der Variablen mir der AbsoluteUri des WebBrowser, WebClient oder WebRequest
    Vielen Dank schonmal Dodo!

    Ich hatte keine Ahnung wie ich das per Webclient oder httpwebrequest lösen kann, hab auch erst vor einer Woche mit vb angefangen.
    Ich habs jetzt testweise einfach über einen Webbrowser probiert. Das funktioniert wunderbar, Emails versenden funktioniert auch.
    Allerdings wird das Programm bei jedem Ausführen des Timers größer. Also vom Speicherbedarf her. Ist ja auch logisch wegen des Webbrowsers..
    Kann ich iwie den Cache löschen bzw. gibts ne Möglichkeit, nachdem er alles gecheckt hat, den Speicherbedarf zu reduzieren?

    //EDIT
    Ist es eigentlich auch möglich das per IP Adresse herauszufinden?
    Quasi man gibt in Textbox 1 die IP ein.. nach einer Stunde soll er checken ob die IP noch die selbe bleibt wenn er sie aufruft oder ob der Server auf einen anderen Server weiterleitet.
    Aber das wäre dann warscheinlich wieder ganz anders zu realisieren oder?

    Er soll einfach jede Stunde checken ob der Server in der Textbox1 weiterleitet oder nicht. Mehr ist das garnicht xD
    Greetz

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BraInLagg“ ()

    Eigentlich wird das Programm nicht größer, der Cache des Browsers wird auch auf der Festplatte gespeichert und nicht im RAM. Das es größer wird, liegt wohlmöglich an deinem unsauberen Programmierstil weil noch recht neu bist. Aber solange das nicht ausartet, was bei so einem kleinen Programm kaum der Fall sein dürfte würde ich das einfach ignorieren, der Garbage Collector von .NET räumt ab und zu alleine den Speicher auf.

    Mit der IP ist das nicht umbedingt immer möglich, bzw. nicht garantiert das dort auch eine Webseite aufgerufen wird. Wenn ein Server der mehrere Seiten Hostet, hat ja nur eine IP, wenn man nun diese IP eingibt weiß der Server natürlich nicht welche Homepage du nun aufrufen möchtest, somit würde ich es bei der URL belassen.
    Naja ich soll eben ein Programm schreiben dass jede Stunde 3 Server abcheckt. Wir hatten in der Firma einmal Server die hacked wurden von iwelchen Chinesen. Unsre Seite wurde dann auf deren Seite weitergeleitet. Dazu soll das Programm da sein. Heißt ich hab auch 3 Webbrowser & Timer am laufen. Ich hab den Intervall mal auf 10 Sekunden gestellt und mal ne Stunde gewartet. Da war der Speicherbedarf bei 60-70MB.. Und das Programm soll hald rund um die Uhr laufen, darum machte ich mir ein bisschen Sorgen ;)
    Ich denke wir werdens einfach mal ausprobieren. zur Not könnte ich die 3 Timer auch versetzt laufen lassen und nur einen Webbrowser laufen lassen, das wäre vllt noch eleganter.

    Vielen Dank an dich Dodo für deine sehr gute Unterstützung.
    Der Vb Noob hat mal wieder was dazu gelernt ;D

    Schönen Tag noch & Grüße
    Brainlagg
    Ja da merkt man dass du noch anfänger bist *g*

    Wozu 3 Browser und 3 Timer? Du musst die Server doch nicht parallel prüfen. Prüfe sie doch einfach nacheinander. Schreib dir eine Methode die den Aufruf zum prüfen macht und dann rufe im TimerTick lediglich die Methode auf

    VB.NET-Quellcode

    1. Pruefe("http://www.server1.de")
    2. Pruefe("http://www.server2.de")
    3. Pruefe("http://www.server3.de")


    Das wäre z.B. die erste Art die Performance zu verbessern.

    Aber wieso du WebSeiten mit einem so "billigen" Tool überprüfen willst verstehe ich nicht, wieso prüfst du nicht die dateien auf dem Server. Damit sie weiterleiten muss entweder eine htaccess Datei geschrieben werden oder die index.html oder index.php wird verändert um weiterzuleiten. Somit müsste man nur dies prüfen und wenn die Server bei euch stehen würde ich das lokal prüfen und nicht mit so einem Programm O.o

    Dodo schrieb:

    Aber wieso du WebSeiten mit einem so "billigen" Tool überprüfen willst verstehe ich nicht, wieso prüfst du nicht die dateien auf dem Server.
    Ja das verstehe ich auch nicht. Ich bin Praktikant inner Firma und soll für die hald das schreiben. Ich hab auch schon den Vorschlag so angebracht dass es klüger wäre. Nein der Chef weiß es hald besser ;)

    Das mit der Methode ist ne super idee :)


    Allerdings habe ich nun ein anderes Problem..
    Mein Email sender kann nur einen Empfänger anwählen.
    Wenn ich mehrere Empfänger in meine Textbox eingebe, sei es mit einem "," oder ";" getrennt, funktionierts nicht mehr.

    VB.NET-Quellcode

    1. If Not TextBox1.Text = WebBrowser1.Url.AbsoluteUri Then
    2. Dim mailtext As String
    3. mailtext = "Der Server" & "" & TextBox1.Text & "" & "leitet auf eine andere Webseite um!!!" & " " & WebBrowser1.Url.AbsoluteUri
    4. Dim Client As New Net.Mail.SmtpClient(TextBox9.Text)
    5. Client.Credentials = New NetworkCredential(TextBox5.Text, TextBox6.Text)
    6. Client.Send(TextBox5.Text, TextBox8.Text, "ACHTUNG", mailtext)
    7. TextBox4.Text = "Link 1 ERROR"
    8. End If

    Wie man sehen kann habe ich für die EMpfänger bei Client.Send eine Textbox8..
    Hab schon bisschen gesucht und irgendwie sollte man es in Arrays oder so teilen oO
    Mein Cheffe ist auch super, sagt mir eine Woche vorher: "Du kannst dann mal bisschen in VB rumspielen, machst mal Hello World usw.."
    Und dann kommt der nachn paar Tagen mit so ner Aufgabe daher xD

    Danke jvbsl, hat mir gut geholfen ! :)

    Also mein Problem ist nun folgendes, was Dodo auch schon gesagt hat..
    Mit 3 Webbrowsern ist eindeutig zuviel Speicherbedarf vorhanden.
    Nun, ich will nur einen Webbrowser benutzen. Allerdings habe ich hier das Problem dass sobald der Timer tickt er alles gleichzeitig checken will, der Webrowser durcheinander kommt und falsche Ergebnisse liefert.
    Wie sage ich denn meinem Programm quasi:

    "Wenn Timer1 Tickt dann machst du zuerst Aufgabe 1. Wenn du die Aufgabe 1 komplett fertig hast machst du Aufgabe 2 usw.."
    Ich hab leider überhaupt keinen Dunst wie das gehen soll, hab schon jetzt gestern und heute früh ewig rumgesucht -.-
    Habt ihr iwo einen Beispiel Source Code mit dem ich mir das herleiten kann?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BraInLagg“ ()

    Man man man, ich kriegs einfach irgendwie nicht gebacken. Mein Programm habe ich nun um 2 Timer und 2 Webbrowser gekürzt. Nur noch 1 Timer, 3 Textboxen und 1 Webbrowser.

    Ich hab mir jetzt jeweils 3 Funktionen geschrieben. Wenn der timer1 tickt soll er die Funktion "Pruefe1" checken.. die sieht so aus:

    VB.NET-Quellcode

    1. Function Pruefe1()
    2. WebBrowser1.Navigate(TextBox1.Text)
    3. Do Until WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
    4. Try
    5. If Not TextBox1.Text = WebBrowser1.Url.AbsoluteUri Then
    6. Dim mailtext As String
    7. mailtext = "Der Server" & "" & TextBox1.Text & "" & "leitet auf eine andere Webseite um!!!" & " " & WebBrowser1.Url.AbsoluteUri
    8. Dim Client As New Net.Mail.SmtpClient(TextBox7.Text)
    9. Client.Credentials = New NetworkCredential(TextBox9.Text, TextBox6.Text)
    10. Client.Send(TextBox5.Text, TextBox8.Text, "ANGRIFF ENTDECKT", mailtext)
    11. TextBox4.Text = "Link 1 ERROR"
    12. TextBox4.ForeColor = Color.Red
    13. End If
    14. Catch ex As Exception
    15. Timer1.Enabled = False
    16. StoppUhr.Stop()
    17. MsgBox("Fehler: Aufrufen der Webseite oder Verschicken der Email!")
    18. End Try
    19. Loop
    20. Return Pruefe2()
    21. End Function


    die Funktion Pruefe2() sieht genauso aus. nur navigate ist anders (textbox2) und so.. am schluss leitet sie zu Pruefe3().. am Ende von der 3. Funktion steht einfach nur "Return Me"

    Warscheinlich habe ich übelste Fehler reingehauen, ich bitte um Entschuldigung :whistling: Ich hab eine Until-Schleife benutzt, weil ich nicht weiß wie die while-schleife da funktionieren sollte oO
    Mein Programm zeigt mir dann die Msgbox und stürzt ab.
    Klar stürzt es ab.
    Do Until = "Mach das" "bis das".

    Du sagst ihm also:
    Schicke eine E-Mail bis er die Seite geladen hat.

    Eine While funktioniert so:

    VB.NET-Quellcode

    1. While Testvariable = "Test"
    2. 'Dein Code
    3. End While

    Ganz einfach ;)
    Nun führt er alles was darin steht aus, solange in der Variable "Test" steht.

    In deinem Fall sähe die While so aus:

    VB.NET-Quellcode

    1. While not WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    2. 'Warten
    3. End While

    Heisst soviel wie:
    Solange der Webbrowser1 nicht bereit ist, mach nichts.
    Und danach dein Code, also nach der Whileschleife.
    Das ist zwar unsauber aber es geht.

    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    aaaaaaaaaaaaaaaaaachsoooo man kann die While Schleife auch mit "not" benutzen :D darauf bin ich garnicht gekommen. Ich dachte mir schon die ganze Zeit wie das mit ner normalen While Schleife gehen soll :D
    Allerdings freezed mein Programm damit, bleibt hängen und nichts geht mehr..
    Kann es sein dass ich die Readystate "funktion" iwo deklarieren muss? hab die nämliche einfach so reingesetzt..

    so hab ichs jetzt einfach umgeändert:

    VB.NET-Quellcode

    1. Function Pruefe1()
    2. WebBrowser1.Navigate(TextBox1.Text)
    3. While Not WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    4. End While
    5. Try
    6. If Not TextBox1.Text = WebBrowser1.Url.AbsoluteUri Then
    7. Dim mailtext As String
    8. mailtext = "Der Server" & "" & TextBox1.Text & "" & "leitet auf eine andere Webseite um!!!" & " " & WebBrowser1.Url.AbsoluteUri
    9. Dim Client As New Net.Mail.SmtpClient(TextBox7.Text)
    10. Client.Credentials = New NetworkCredential(TextBox9.Text, TextBox6.Text)
    11. Client.Send(TextBox5.Text, TextBox8.Text, "ANGRIFF ENTDECKT", mailtext)
    12. TextBox4.Text = "Link 1 ERROR"
    13. TextBox4.ForeColor = Color.Red
    14. End If
    15. Catch ex As Exception
    16. Timer1.Enabled = False
    17. StoppUhr.Stop()
    18. MsgBox("Fehler bei Link 1!")
    19. End Try
    20. Return Pruefe2()
    21. End Function


    Man bin ich ein Noooob :D ich muss echt noch dran arbeiten X(
    Der Browser besteht auf der Form, ist nur nicht sichtbar..
    Hm hab mal iwas gelesen mit DoEvents in die Schlange damit das Programm nicht freezed, weiß aber nich wie das gehen soll.
    Und sonst hats hald iwie ein Problem.
    Vllt liegts auch daran:

    Timer1Tick -> Pruefe1 -> Pruefe2 ->Pruefe 3 (Am Ende von jedem "Prüfe" wird auf das nächste weitergeleitet. beim dritten habe ich "Return Me" stehen)

    \\EDIT
    Also er bleibt ja hängen wegen der Whileschleife..
    Dann hab ich einfach mal
    Application.DoEvents() reingesetzt.. dann läuft er weiter, sendet mir aber keine email obwohl er mir eine hätte schicken sollen. Also stimmt dabei ja was nicht. Zudem ist das doch ne wirklich unsaubere Methode oder? :/

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „BraInLagg“ () aus folgendem Grund: siehe Edit

    Ich finde es immer ganz nett, wenn Leute einen Weg gefunden haben und diesen dann auch zu Schluss teilen, also hier meine Lösung:

    So, nachdem ich mir unzählige neue Konzepte oä ausgedacht habe, habe ich nun mein Programm anders gestaltet. Es läuft nichts mehr über den Webbrowser sondern über die httpwebrquest-Klasse.
    Zum Programm nochmal: Das Programm soll jede Stunde 3 Links aus 3 Textboxen abchecken ob diese auf eine andere Webseite leiten.
    Und hier der Code falls es wen interessiert:

    Ein bisschen unsauber mit While-Schleifen, ne andere Lösung habe ich nicht gefunden. Ein kleiner Bug mit der Stoppuhr noch, der Rest funktioniert tadellos.

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Mail
    3. Public Class Form1
    4. Private TS As TimeSpan
    5. Private StoppUhr As New Stopwatch
    6. Dim Links As String = ""
    7. Dim Fertig As Boolean = False
    8. Private Sub Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Start.Click
    9. ProgressBar1.Visible = True
    10. Timer1.Enabled = True
    11. StoppUhr1.Enabled = True
    12. Absenderemail.Enabled = False
    13. Passwort.Enabled = False
    14. Postausgangsserver.Enabled = False
    15. Empfängeremail.Enabled = False
    16. SMTPBenutzer.Enabled = False
    17. Statusbox.Text = "Aktiviert!"
    18. StoppUhr.Start()
    19. Label8.Visible = True
    20. End Sub
    21. Private Sub Abbrechen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Abbrechen.Click
    22. ProgressBar1.Visible = False
    23. Timer1.Enabled = False
    24. Absenderemail.Enabled = True
    25. Passwort.Enabled = True
    26. Postausgangsserver.Enabled = True
    27. Empfängeremail.Enabled = True
    28. SMTPBenutzer.Enabled = True
    29. Statusbox.Text = "Deaktiviert!"
    30. StoppUhr.Stop()
    31. Label8.Visible = False
    32. Label8.Text = Format(TS.Hours, "00") & ":" & Format(TS.Minutes, "00") & ":" & Mid(Format(TS.Seconds, "00"), 1, 2)
    33. End Sub
    34. Private Sub StoppUhr1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StoppUhr1.Tick
    35. TS = StoppUhr.Elapsed
    36. Label8.Text = Format(TS.Hours, "00") & ":" & Format(TS.Minutes, "00") & ":" & Mid(Format(TS.Seconds, "00"), 1, 2)
    37. End Sub
    38. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    39. Statusbox.Text = "Warte auf Start"
    40. End Sub
    41. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    42. Pruefe1()
    43. End Sub
    44. Function Pruefvorgang()
    45. Try
    46. Dim lRequest As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create(Links)
    47. lRequest.Method = "HEAD"
    48. lRequest.AllowAutoRedirect = False
    49. Dim lResponse As System.Net.HttpWebResponse = lRequest.GetResponse()
    50. If lResponse.StatusCode = Net.HttpStatusCode.Redirect Or lResponse.StatusCode = Net.HttpStatusCode.Moved Then
    51. Dim mailtext As String
    52. mailtext = "Der Server" & " " & Links & " " & "leitet auf eine andere Webseite um!!!"
    53. Dim Client As New Net.Mail.SmtpClient(Postausgangsserver.Text)
    54. Client.Credentials = New NetworkCredential(SMTPBenutzer.Text, Passwort.Text)
    55. Client.Send(Absenderemail.Text, Empfängeremail.Text, "SERVERCHECK ACHTUNG", mailtext)
    56. Statusbox.Text = Links & "Error"
    57. Statusbox.ForeColor = Color.Red
    58. End If
    59. lResponse.Close()
    60. Catch ex As Exception
    61. Timer1.Enabled = False
    62. MsgBox("Programmfehler!")
    63. End Try
    64. Fertig = True
    65. End Function
    66. Function Pruefe1()
    67. Fertig = False
    68. Links = Link1.Text
    69. Pruefvorgang()
    70. While Fertig = False
    71. Application.DoEvents()
    72. End While
    73. Fertig = False
    74. Links = ""
    75. Return Pruefe2()
    76. End Function
    77. Function Pruefe2()
    78. Links = Link2.Text
    79. Pruefvorgang()
    80. While Fertig = False
    81. Application.DoEvents()
    82. End While
    83. Fertig = False
    84. Links = ""
    85. Return Pruefe3()
    86. End Function
    87. Function Pruefe3()
    88. Links = Link3.Text
    89. Pruefvorgang()
    90. While Fertig = False
    91. Application.DoEvents()
    92. End While
    93. Fertig = False
    94. Links = ""
    95. Return Me
    96. End Function
    97. Private Sub InfoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InfoToolStripMenuItem.Click
    98. Info.Show()
    99. End Sub
    100. Private Sub BeendenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BeendenToolStripMenuItem.Click
    101. End
    102. End Sub
    103. End Class