Auto-Updater für Javascript Dateien (Greasemonkey)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Auto-Updater für Javascript Dateien (Greasemonkey)

    Moinmoin.
    Ich hoffe mal, ein paar von euch haben sich schonmal mit Greasemonkey beschäftigt. Falls nicht, auch nicht schlimm :D Greasemonkey ist ein FF-Addon, das einem ermöglicht eigene JS-Dateien auf jeder Seite ausführen zu lassen. Informationen auf welcher Seite das Script ausgeführt werden soll und so weiter werden im header angegeben.

    Beispiel:

    Quellcode

    1. // ==UserScript==
    2. // @name SZS Pro
    3. // @namespace SZS Pro
    4. // @description Ändert einige Sachen im SZS
    5. // @include http://szs.looki.de/*
    6. // @version 0.5.1
    7. // @history Built: Skillhelfer-Grundgerüst erstellt. SZS-Pro-Menü rechts eingefügt.all. (0.1.0 alpha) [19.08.2011]
    8. // @history Built: CP für Skillhelfer werden ausgelesen. Ausrüstungsmenü erstellt. (0.2.0 alpha) [22.08.2011]
    9. // @history Built: Skillhelfer und Ausrüstungsmenü funktionieren vollständig. (0.3.0 alpha) [23.08.2011]
    10. // @history Fixed: Es wird nicht mehr "Werkzeug" angezeigt, wenn man nichts in der Hand hat. (0.3.1 alpha) [28.08.2011]
    11. // @history Built: Warnungstool gestartet und funktionsfähig. (0.4.0 alpha) [22.10.2011]
    12. // @history Fixed: Skillhelfer setzt nun nur Werte ein, wenn Skillen möglich ist + Hinweiß. (0.4.1 alpha) [22.10.2011]
    13. // @history Built: Auswahlmöglichkeit, welche Tools man haben will. (0.5.0 alpha) [23.10.2011]
    14. // @history Add: Warnungstool prüft nun ob WR und JR vorhanden sind und zeigen dies an. (0.5.1 alpha) [23.10.2011]
    15. // ==/UserScript==
    Alles anzeigen


    Solche Userscript sind auf der Seite userscript.org jederzeit aufrufbar. Da der Nutzer nicht jedes mal das Script de- und den installieren muss, brauche ich einen automatischen updater. Dieser benötigt, dass man um diesen Header scr_meta=<><![CDATA[ ]]></>.toString(); macht.
    Das spuckt allerdings in Opera und FF eine Fehlermeldung aus. Scriptly sagt auch, dass eins der < nicht stimmt. Im FF wird jedoch der Code ausgeführt. Hier mal das Auto-Update-Script:


    Quellcode

    1. CheckScriptForUpdate = {
    2. id: '116191',
    3. days: 1,
    4. name: /\/\/\s*@name\s+(.*)\s*\n/i.exec(scr_meta)[1],
    5. version: /\/\/\s*@version\s+(.*)\s*\n/i.exec(scr_meta)[1].replace(/\./g, ''),
    6. time: new Date().getTime(),
    7. call: function(response) {
    8. GM_xmlhttpRequest({
    9. method: 'GET',
    10. url: 'https://userscripts.org/scripts/source/'+this.id+'.meta.js',
    11. onload: function(xpr) {AnotherAutoUpdater.compare(xpr,response);}
    12. });
    13. },
    14. compare: function(xpr,response) {
    15. this.xversion=/\/\/\s*@version\s+(.*)\s*\n/i.exec(xpr.responseText);
    16. this.xname=/\/\/\s*@name\s+(.*)\s*\n/i.exec(xpr.responseText);
    17. if ( (this.xversion) && (this.xname[1] == this.name) ) {
    18. this.xversion = this.xversion[1].replace(/\./g, '');
    19. this.xname = this.xname[1];
    20. } else {
    21. if ( (xpr.responseText.match("the page you requested doesn't exist")) || (this.xname[1] != this.name) )
    22. GM_setValue('updated_'+this.id, 'off');
    23. return false;
    24. }
    25. if ( (+this.xversion > +this.version) && (confirm('A new version of the '+this.xname+' user script is available. Do you want to update?')) ) {
    26. GM_setValue('updated_'+this.id, this.time+'');
    27. top.location.href = 'https://userscripts.org/scripts/source/'+this.id+'.user.js';
    28. } else if ( (this.xversion) && (+this.xversion > +this.version) ) {
    29. if(confirm('Do you want to turn off auto updating for this script?')) {
    30. GM_setValue('updated_'+this.id, 'off');
    31. GM_registerMenuCommand("Auto Update "+this.name, function(){GM_setValue('updated_'+this.id, new Date().getTime()+''); AnotherAutoUpdater.call(true);});
    32. alert('Automatic updates can be re-enabled for this script from the User Script Commands submenu.');
    33. } else {
    34. GM_setValue('updated_'+this.id, this.time+'');
    35. }
    36. } else {
    37. if(response) alert('No updates available for '+this.name);
    38. GM_setValue('updated_'+this.id, this.time+'');
    39. }
    40. },
    41. check: function() {
    42. if (GM_getValue('updated_'+this.id, 0) == 0) GM_setValue('updated_'+this.id, this.time+'');
    43. if ( (GM_getValue('updated_'+this.id, 0) != 'off') && (+this.time > (+GM_getValue('updated_'+this.id, 0) + (1000*60*60*24*this.days))) ) {
    44. this.call();
    45. } else if (GM_getValue('updated_'+this.id, 0) == 'off') {
    46. GM_registerMenuCommand("Enable "+this.name+" updates", function(){GM_setValue('updated_'+this.id, new Date().getTime()+'');AnotherAutoUpdater.call(true);});
    47. } else {
    48. GM_registerMenuCommand("Check "+this.name+" for updates", function(){GM_setValue('updated_'+this.id, new Date().getTime()+'');AnotherAutoUpdater.call(true);});
    49. }
    50. }
    51. };
    52. if (self.location == top.location && typeof GM_xmlhttpRequest != 'undefined') AnotherAutoUpdater.check();
    Alles anzeigen


    Mir ist nicht ganz klar, wie es möglich ist, eine Javascript-Datei, die auf dem Rechner liegt, dauerhaft zu ändern. Könnte mir das villeicht jemand erklären? :whistling: Habe mir schon überlegt, ob das was mit top.location.href zu tun hat, aber das würde ja nicht das JS, sondern die Seite beeinflussen. Dann wäre mir auch das ganze drumherum unklar...

    Danke schonmal ;)


    Edit: Bei TW-Pro kann man per Mausklick das neue Script einfach installieren, Seite neuladen -> Fertig. Geht das hier auch irgendwie?
  • Torben Brodt schrieb:

    Hi, ich verstehe den Zusammenhang mit deiner CDATA Zeile und deinem JavaScript Code nicht so ganz. Mit Userscripts haben wir früher in der Firma auch gearbeitet.
    Hast du denn mal diesen Code ausprobiert? userscripts.org/scripts/show/2296

    Lg


    Erstmal danke, dass du geantwortet hast :thumbsup:

    Den Updater habe ich schon ausprobiert, aber das gab dann Probleme in Opera. Ich habe inzwischen, was anderes gebastelt. Das Userscript ruft eine JS-Datei auf meinem Webspace auf, die checkt ob die Versionsnummer, die übergeben wurde mit der Aktuellen, die ich dann im Webspace jeder Zeit bearbeiten kann übereinstimmt oder nicht. Und wenn nicht, wird halt eine Nachricht ausgegeben. in FF funktionierts perfekt :thumbsup:

    Quellcode

    1. $(document).ready(function()
    2. {
    3. var version_name_JS = $('#hidden_vnum').val();
    4. var update_version_name = '0.5.2 Alpha';
    5. var update_neues;
    6. var update_bugs;
    7. var update_comment;
    8. if(version_name_JS != update_version_name && update_version_name != null)
    9. {
    10. var update_submit = '<br /><br /><br /><a href="http://userscripts.org/scripts/source/116191.user.js"><button id="update_button" style="width: 100%;">Update installieren</button></a>';
    11. var update_info = '<font color="lime"><b>Version '+update_version_name+' ist verfügbar!</b><br /><br />'+update_neues+update_bugs+update_comment+update_submit+'</font>';
    12. $('<tr bgcolor="#123014"><td style="width: 100px; vertical-align: middle;"><b>SZS-Pro</b></td><td>'+update_info+'</td></tr>').insertAfter('table[align="center"][width="90%"][border="0"] tr:contains("Zeit:")');
    13. }
    14. });
    Alles anzeigen


    Quellcode

    1. var version_name = '0.5.1 Alpha';
    2. var version_update = '23.10.2011';
    3. var update_comment = '<br /><br />Hallo';
    4. $('<input type="hidden" id="hidden_vnum" value="'+version_name+'" />').appendTo('body');
    5. include('http://szspro.sz.funpic.de/updateJS.js');
    6. execute('drag();');
    7. function include(file)
    8. {
    9. var script = document.createElement('script');
    10. var type = document.createAttribute('type');
    11. type.nodeValue = 'text/javascript';
    12. script.setAttributeNode(type);
    13. var source = document.createAttribute('src');
    14. source.nodeValue = file;
    15. script.setAttributeNode(source);
    16. var head = document.getElementsByTagName('head')[0];
    17. head.appendChild(script);
    18. }
    19. function execute(code)
    20. {
    21. var i = 0;
    22. try {
    23. eval(code);
    24. } catch (e) {
    25. if (i < 20) {
    26. setTimeout('execute("' + code + '");', 1);
    27. }
    28. i++;
    29. }
    30. }
    Alles anzeigen