[AutoIt] Self-Update

10/12/2014 01:39 Moneypulation#1
Hallo,

mit diesem kleinen Tutorial will ich euch zeigen, wie euer Programm nach jedem Start prüft ob es eine neue Version gibt. Falls ja, wird man zur Downloadseite gebracht.



Dafür braucht ihr erstmal eine eigene Webseite. Erstellt einfach eine kostenlose von z.B. [Only registered and activated users can see links. Click Here To Register...] oder einem anderen Anbieter. Nachdem ihr das getan habt, erstellt ihr ein Textfeld/Titel, wo ihr die Version eures Programmes reinschreibt:





[Only registered and activated users can see links. Click Here To Register...]






Als nächstes erstellt ihr ein weiteres Textfeld, wo der Downloadlink drinstehen soll:





[Only registered and activated users can see links. Click Here To Register...]





Ich habe meinen mit DownloadBegin und DownloadEnd gekennzeichnet, damit ich ihn später leichter finden kann.


Kommen wir jetzt zum Code. Wir werden bei jedem Start den Seitenquelltext eurer Webseite auslesen und prüfen, welche Version am aktuellsten ist. Den Quelltext einer Seite lesen wir so aus:




Code:
#include <INet.au3>

$Quelltext = _INetGetSource('http://www.moneypulation.jimdo.com')




Da kommt natürlich eure Webseite rein. Gucken wir uns den Quelltext mal im Browser an.





[Only registered and activated users can see links. Click Here To Register...]


[Only registered and activated users can see links. Click Here To Register...]






Mit F3 können wir (zumindest in Chrome) nun nach unser Version suchen. In meinem Fall war es 1.9 . Wenn ihr die Stelle gefunden habt, wo eure Version zu sehen ist...





[Only registered and activated users can see links. Click Here To Register...]






dann lassen wir in unserem Programm mit _StringBetween danach suchen. _StringBetween erwartet einen großen String (unser Quelltext) und den String vor bzw. nach unserem gesuchten String. Also ein Stück Code direkt vor und nach der Version. Dieser Code darf sich aber niemals ändern, z.B. wenn ihr den <b> Tag, was für fette schrift steht, mitkopiert und später eure Version wieder normal macht, dann wird euer String nicht gefunden. Also nehmt nur sowas wie <h1 class="" id="blablabla">





[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]





Am Anfang eures Codes solltet ihr dann das haben:



Code:
#include <INet.au3>
#include <String.au3>

$Quelltext = _INetGetSource('http://www.moneypulation.jimdo.com')
$StrVersion = _StringBetween($Quelltext, 'class="n j-header"><h1 class="" id="cc-m-header-10499976623">',"</h1><script")




Die 2 UDF's String.au3 und INet.au3 müsst ihr dafür includen. Zu _StringBetween muss man noch sagen, dass die Funktion einen Array zurückgibt, da unser String ja mehrmals im Text vorkommen könnte. $StrVersion[0] ist das erstgefundene Element, daher benutzen wir auch nur dies. Als Test können wir die $StrVersion[0] ja mal mit einer MsgBox ausgeben:



Code:
Msgbox(0,"",$StrVersion[0])






[Only registered and activated users can see links. Click Here To Register...]





Und siehe da, unsere Version wird gefunden. Nun können wir auf unserer Webseite die 1.9 zu einer 2.0 ändern und unser Programm wird es erkennen. Jetzt fehlt nichts, als ein paar If-Abfragen, ob die Version aktuell ist und der Benutzer auf die Downloadseite möchte. Die Downloadseite findet euer Programm ebenfalls mit _StringBetween. Nachdem ihr wisst, wie ihr es bei eurer Version macht, solltet ihr auch in der Lage sein, das mit eurer Downloadseite hinzukriegen.



Code:
#include <INet.au3>
#include <String.au3>

$Quelltext = _INetGetSource('http://www.moneypulation.jimdo.com')
$StrVersion = _StringBetween($Quelltext, 'class="n j-header"><h1 class="" id="cc-m-header-10499976623">',"</h1><script")
Msgbox(0,"",$StrVersion[0])
IF not @error Then
   If Not ($StrVersion[0] = "1.8") Then
	  $MsgBox = MsgBox(4,"New Version","A new Version is available. Would you like to visit the download page?")
   EndIf
EndIf





If not @error prüft ob überhaupt ein String gefunden wird und mit If Not ($StrVersion[0] = "1.8") wird daraufhin geprüft ob dieser gefundene String 1.8, also die Version des aktuellen Programmes ist. Ich hab die Flag 4 der MsgBox benutzt, weil man dann in der MsgBox entweder Ja oder Nein anklicken kann. Falls der "Ja" Button angeklickt wird, wird der Wert 6 zurückgegeben. Damit findet man heraus ob der User nun die aktuelle Version möchte. Im Ganzen sieht das dann so aus:




Code:
#include <INet.au3>
#include <String.au3>

$Quelltext = _INetGetSource('http://www.moneypulation.jimdo.com')
$StrVersion = _StringBetween($Quelltext, 'class="n j-header"><h1 class="" id="cc-m-header-10499976623">',"</h1><script")
Msgbox(0,"",$StrVersion[0])
IF not @error Then
   If Not ($StrVersion[0] = "1.8") Then
	  $MsgBox = MsgBox(4,"New Version","A new Version is available. Would you like to visit the download page?")
	  If $MsgBox = 6 Then
		 $StrDownload = _StringBetween($Quelltext, '<strong>DownloadBegin</strong>','<b>DownloadEnd</b>')
		 IF not @error Then
			ShellExecute($StrBetween2[0])
			Exit
		 Else
			MsgBox(0,"Error","Couldn't find download page")
			EndIf
		 EndIf
	  EndIf
   EndIf





ShellExecute öffnet die Downloadseite, die wir ja ebenfalls auf unserer Webseite haben. Und damit hätten wir es geschafft:






[Only registered and activated users can see links. Click Here To Register...]






Falls der User ja anklickt, wird die Downloadseite aufgerufen und das Programm beendet. Wenn nicht, dann passiert nichts und euer Programm sollte daraufhin starten. Solltet ihr nun eine neue Version rausbringen, stellt ihr den Downloadlink in eure Webseite und ändert die Version. Alle User werden dann auf die Version hingewiesen, wenn sie euer Programm starten.

Ich hoffe, dass ich euch damit weiterhelfen konnte und ihr nun in der Lage seid eure Programme "selbst updaten" zu lassen.
10/12/2014 02:40 alpines#2
Wieso Inet.au3 includen wenn du statt _INetGetSource auch einfach
Code:
BinaryToString(InetRead("http://abc.de")
nehmen könntest?

Warum die ganze String.au3 includen wenn du auch einfach reguläre Ausdrücke verwenden könntest?
10/12/2014 02:43 Moneypulation#3
Quote:
Originally Posted by alpines View Post
Wieso Inet.au3 includen wenn du statt _INetGetSource auch einfach
Code:
BinaryToString(InetRead("http://abc.de")
nehmen könntest?

Warum die ganze String.au3 includen wenn du auch einfach reguläre Ausdrücke verwenden könntest?
Ich weiß es gibt viele Wege, die auch besser sind aber mit dem Tutorial hat man immerhin die Grundbasis wie man ein Programm selbst updaten lässt. Man könnte natürlich auch statt die Downloadseite aufzurufen, das Programm direkt downloaden und das alte selbst löschen lassen. Ich habs halt so gemacht
10/12/2014 12:11 YatoDev#4
Quote:
Originally Posted by alpines View Post
....
und warum überhaupt so viel arbeit machen und nicht einfach eine text datei auf ein free webspace laden? (dropbox empfiehlt sich)

StringBetween ist regex....

Mit InetGet downloaden und den user nur fragen ob ers möchte ist auch besser finde ich
10/12/2014 13:55 alpines#5
Quote:
Originally Posted by »FlutterShy™ View Post
StringBetween ist regex....
No shit sherlock, aber eine ganze UDF zu includen obwohl man ein einfaches Pattern hätte nutzen können...
10/12/2014 21:21 snow#6
Leute, bitte einigermaßen beim Thema bleiben. :rolleyes:
10/12/2014 21:22 alpines#7
Solange jeder unterschiedliche Variablennamen verwendet sollte das doch passen.

Aber zurück zum Thema: Eine Datei abzulegen die gezogen wird wäre wohl die bessere Alternative, da du einerseits weniger Traffic hast und kein RegEx (_StringBetween) brauchst.

Wenn du auf deinem Webspace z.B. die Datei "version.txt" mit dem Inhalt 1.0.0 hast, kannst du einfach
Code:
MsgBox(64, "Version", "Aktuelle Version: " & BinaryToString(InetRead("http://webspace.de/version.txt")))
verwenden und das ist um einiges schneller.
02/16/2015 11:33 シャイキング#8
THX THX THX !
04/07/2015 21:38 Xonivion#9
Not work? Help .x.
04/08/2015 08:45 Moneypulation#10
Quote:
Originally Posted by Xonivion View Post
Not work? Help .x.
Maybe you explain your problem? I can't read minds
10/23/2015 15:53 iLeo-#11
Nice Tutorial Bro
10/24/2015 15:45 Logtetsch#12
Wieso nicht gleich eigene Tags benutzen, welche das viel überschaubarer machen?

Code:
<Version:accessable>1.1</version> //Version die noch unterstützt wird
<Version:accessable>1.2</version> //Version die noch unterstützt wird

<Version:live>2.0</version> //Aktuelle Version

<Download:version_1_1>...</download>
<Download:version_1_2>...</download>
<Download:version_2_0>...</download>
Nicht gelistete bzw. unterstützte Versionen können zu einem Update gezwungen werden. Außerdem ist die Lösung mittels "generierter" Homepage suboptimal, da doch recht viel content zunächst einmal runtergeladen und dann geparsed werden muss. Wieso nicht gleich eine leere .txt mit den entsprechenden Tags auf einem FTP hosten?