Web Workaround Votes aus MCSEU Votifierlogs scrapen

Dieses Thema im Forum "Selbstgeschriebene Plugins | Mods | Programme" wurde erstellt von SickRedStuff, 10. April 2016.

  1. SickRedStuff
    Offline

    SickRedStuff

    Registriert seit:
    19. Oktober 2014
    Beiträge:
    1
    Disclaimer:
    Dieses Script ist nur ein Workaround für den Fall dass die Verbindung zwischen MCSEU und eurem Server gestört ist. Es bietet keine Lösung dieses Problems: Wenn MCSEU dauerhaft nicht zu eurem Server verbinden kann solltet ihr das Problem beheben anstatt diesen Workaround zu nutzen! Der Sourcecode muss modifiziert werden um für euren individuellen Fall nutzbar zu sein, dafür müsst ihr wenigstens rudimentäre Kenntnisse in JS und PHP haben, ich supporte den Code hier nicht, möchte anderen die in Verlegenheit kommen so etwas basteln zu müssen nur etwas Zeit ersparen.


    Hallo allerseits,
    unser Server war bis vor kurzem für einige Tage nicht als online gelisted weil die Verbindung zwischen mcseu und uns blockiert war. Das heißt Votes wurden zwar weiterhin in den Logs hier bei mcseu gespeichert, aber nicht versendet. Hunderte votes manell einzutragen ist nicht nur lästig, es ist auch mit Zeitverzögerung verbunden = Spieler unzufrieden. Daher hab ich ein kleines Script gebastelt was dieses manuelle eintragen automatisiert. Mittlerweile ist das Problem glücklicherweise beseitigt, dieser Thread wird aber vielleicht anderen denen das gleiche widerfährt hilfreich sein:

    Das Script ist nur in Google Chrome mit Tampermonkey getestet, hat da wie gesagt gute Dienste erwiesen. Es kann:
    - Die Votes aus der Logseite von mcseu auslesen
    - Neue Votes an eine Remote Seite via get request senden (dort kann man dann die votes selbst eintragen)
    - Erkennt wenn ein neuer Tag angefangen hat
    - Autrefresh jede Minute (Neue Votes werden also minütlich erkannt)
    - Relog auf MCSEU wenn die Session abgelaufen ist (kann also 24/7 durchlaufen)


    Für den Remoteteil (das Eintragen der Votes auf dem eigenen Server) habe ich https://github.com/Spirit55555/PHP-Minecraft/blob/master/MinecraftVotifier.php verwendet, das funktioniert einwandfrei und ist mit etwas PHP kenntnissen ruckzuck gebastelt. (Cross origin header nicht vergessen)

    PHP Beispiel Snippit
    PHP:
    1.   header("Access-Control-Allow-Origin: *");
    2.         $key = "YOUROWNCHOOSENKEY";
    3.         if(!isset($_GET['key']) || !isset($_GET['un']))
    4.             die('key or un not set');
    5.         $key = $_GET['key'];
    6.         if($key != $key)
    7.             die('wrong key');
    8.         $username = $_GET['un'];
    9.         if(!isset($key) || !isset($username))
    10.             die('malformed usage');
    11.  
    12.         $type = "_workaround";
    13.         require __DIR__ . 'MinecraftVotifier.php';
    14.         $votifier = new MinecraftVotifier('PUBLICRSAKEY',
    15.             'SERVERADRESSE', 'PORT', $type);
    Das Tampermonkey Script sieht wie folgt aus:

    Code (Javascript):
    1. // ==UserScript==
    2. // @name         Minecraft-Server.eu Votifier Workaround
    3. // @namespace    mcseuworkaround
    4. // @version      0.1
    5. // @description  Check votes in logs on minecraft-server.eu and Send Votes to this tool
    6. // @author       SickRedStuff (minecraft-asylum.de)
    7. // @match        https://minecraft-server.eu/admin/votifierlog/index/SERVERID/
    8. // @match        https://minecraft-server.eu/admin/votifierlog/index/SERVERID/0
    9. // @match        https://minecraft-server.eu/admin/votifierlog/index/SERVERID/1
    10. // @match        https://minecraft-server.eu/admin/votifierlog/index/SERVERID/2
    11. // @match        https://minecraft-server.eu/admin/server/notLoggedIn
    12. // @grant        none
    13. // @require       http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
    14. // ==/UserScript==
    15.  
    16.  
    17.  
    18. var servereu_username = "MCSEUUSERNAME";
    19. var servereu_password = "MCSEUPASSWORD";
    20. var servereu_url = "https://minecraft-server.eu/admin/votifierlog/index/SERVERID/";
    21. var servereu_url_notloggedin = "https://minecraft-server.eu/admin/server/notLoggedIn";
    22. var VOTETOOLVOTEKEY = "YOUROWNSELECTEDKEY";
    23. var votetoolurl = "URLZURPHPDATEI";
    24.  
    25. var votes;
    26.  
    27. Date.prototype.yyyymmdd = function() {
    28.     var yyyy = this.getFullYear().toString();
    29.     var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
    30.     var dd  = this.getDate().toString();
    31.     return yyyy + (mm[1]?mm:"0"+mm[0]) + (dd[1]?dd:"0"+dd[0]); // padding
    32. };
    33.  
    34. function loadVotes(key){
    35.     var string = localStorage[key];
    36.     if(string === undefined || string === null)
    37.         return {};
    38.     console.log("string",string);
    39.     return JSON.parse(string);
    40. }
    41.  
    42. function saveVotes(key, votes){
    43.     console.log("saving votes");
    44.     console.log(votes);
    45.     localStorage.setItem(key, JSON.stringify(votes));
    46. }
    47.  
    48. $(document).ready(function(){
    49.  
    50.     //Check if logged out..
    51.     var loginform = $('#navbar_loginform');
    52.     if(loginform.length){
    53.         $('#ctrl_pageLogin_login').val(servereu_username);
    54.         $('#ctrl_pageLogin_password').val(servereu_password);
    55.         loginform.find('button').click();
    56.         return;
    57.     }
    58.  
    59.     var date = new Date().yyyymmdd();
    60.     votes = loadVotes(date);
    61.     if(votes == null) votes = {};
    62.     console.log("votes",votes);
    63.  
    64.     var onpage = [];
    65.     var alreadysent = false;
    66.     $('#tableVoteLog tbody tr td:nth-child(2)').each(function(){
    67.         var votedate = $(this).parent('tr').find('td:nth-child(4)').text().trim().split(' ')[0].replace(/-/g, '');
    68.         var issent = $(this).parent('tr').find('td:nth-child(6)').text().trim();
    69.         if(votedate == date){
    70.             if(issent == "noch nicht versendet") {
    71.                 onpage.push($(this).text().trim());
    72.             }
    73.             else{
    74.                 console.log("is already sent by mc-server.eu: " + issent);
    75.                 alreadysent = true;
    76.             }
    77.         }
    78.         else{
    79.             console.log("different date: ", date, votedate);
    80.         }
    81.     });
    82.     console.log("onpage", onpage);
    83.  
    84.     if(onpage.length == 0){
    85.  
    86.         if(alreadysent){
    87.             alert("Service is up and working");
    88.         }
    89.         if(location.href = servereu_url_notloggedin){
    90.             location.href = servereu_url;
    91.         }
    92.     }
    93.  
    94.     var newones = [];
    95.     for(var i = 0; i < onpage.length; i++){
    96.         if(votes[onpage[i]] === undefined){
    97.             newones.push(onpage[i]);
    98.         }
    99.     }
    100.     console.log("newones", newones);
    101.  
    102.     var addVotesHtml = '';
    103.     for(var i = 0; i < newones.length; i++){
    104.         var tryInsertByRequest = function(){
    105.             var username = newones[i];
    106.             $.get( votetoolurl, { key: VOTETOOLVOTEKEY, un: username } )
    107.                 .done(function( data ) {
    108.                     if(typeof data == 'string' && data.trim() == 'success'){
    109.                         votes[username] = true;
    110.                         saveVotes(date, votes);
    111.                         console.log("added vote for " + username + " with _workaround request");
    112.                     }
    113.                     else{
    114.                         addVotesHtml += 'new vote from: ' + newones[i] + '<br>';
    115.                     }
    116.                 });
    117.         }
    118.         tryInsertByRequest();
    119.     }
    120.  
    121.  
    122.     $('body').prepend('<a id="exportbutton">Export</a>');
    123.     $('body').prepend('<div style="width:100%;background:#ffffff">' + addVotesHtml + '</div>');
    124.  
    125.     $('#exportbutton').click(function(){
    126.         for(var i = 0; i < newones.length; i++){
    127.             votes[newones[i]] = true;
    128.             console.log("adding new one to votes file", newones[i]);
    129.         }
    130.  
    131.         console.log("saving file");
    132.         saveVotes(date, votes);
    133.         location.reload();
    134.     });
    135.  
    136.     setTimeout(function(){
    137.         location.reload();
    138.     }, 60000);
    139. });
    Alles Quick and dirty aber is ja nur nen Workaround und wie gesagt, hat fast 3 Tage super funktioniert.
    Natürlich müssen in den Scripts noch ein paar anpassungen gemacht werden, aber denke diejenigen die diese Scripts nutzen können auch sehen wo da was rein muss. Alle anderen brauchen es vermutlich nicht.
     
    #1