Script Erweiterung funktioniert nur bedingt + nodeJS Inspiration


Sumale.my

Grünschnabel
Hallo zusammen,

Ich habe hier ein Script, welches nichts anderes tut, als eine Seite
nach Links zu durchsuchen, welche in einer Blacklist mittels kommar getrennt
gepeichert sind Beispiel: (*test.de,test.de*,*test.de*) und der URL eben den Zusatz: "https://archive.today/?run=1&url="
anzuhängen bzw. Vorne ran zu stellen.

Das Script in Rohfassung:

Javascript:
{if ARCHIVEIS_ACTIVE && !$archiveIsBlacklist|empty}

    <script data-relocate="true">

        var allLinks = document.links;

        var archiveIsBlacklist = JSON.stringify({@$archiveIsBlacklist});

        for(var i=0; i < allLinks.length; i++) {

            var link = allLinks[i];

            if(archiveIsBlacklist.includes(link.hostname)) {

                link.href = "https://archive.today/?run=1&url=" + link.href;

            }

            for(var j=0; j < JSON.parse(archiveIsBlacklist).length; j++) {

                var blacklistLink = JSON.parse(archiveIsBlacklist)[j];

                if(blacklistLink.includes('*')) {

                    var blacklistLinkRegex = blacklistLink.split('*').join('.*');

                    blacklistLinkRegex = "^" + blacklistLinkRegex + "$";

                    if(link.hostname.match(new RegExp(blacklistLinkRegex))) {

                        link.href = "https://archive.today/?run=1&url=" + link.href;

                    }

                }

            }

        }

    </script>

{/if}

Das klappt auch wunderbar bisher, allerdings ist das ganze etwas kontraproduktiv und soll entsprechend
abgeändert- und um eine weitere Funktion erweitert werden.

Wenn die Links aus der Blacklist gefunden wurden, soll sich mittels Klick auf den entsprechenden Link, eine Dialogbox öffnen.
Das ganze habe ich auch irgendwie hinbekommen und das Script sieht dann folgendermaßen aus:

Javascript:
{if ARCHIVEIS_ACTIVE && !$archiveIsBlacklist|empty}

  <script data-relocate="true">

        var allLinks = document.links;

    var archiveIsBlacklist = JSON.stringify({@$archiveIsBlacklist});

        for(var i=0; i < allLinks.length; i++) {

      var link = allLinks[i];

      if(archiveIsBlacklist.includes(link.hostname)) {

        link.href = "https://archive.today/?run=1&url=" + link.href;


        // Klasse anhängen um den Dialog öffnen zu können

        var tags = document.getElementsByClassName("externalURL");

        for(var i=0; i<tags.length; ++i){

          if(typeof tags[i] === "object" && "classList" in tags[i]){

            tags[i].classList.add("jsStaticDialog");

            tags[i].setAttribute("data-dialog-id", "dialogInfobox");

          }

        } // ENDE


      }

      for(var j=0; j < JSON.parse(archiveIsBlacklist).length; j++) {

        var blacklistLink = JSON.parse(archiveIsBlacklist)[j];

        if(blacklistLink.includes('*')) {

          var blacklistLinkRegex = blacklistLink.split('*').join('.*');

          blacklistLinkRegex = "^" + blacklistLinkRegex + "$";

          if(link.hostname.match(new RegExp(blacklistLinkRegex))) {

            link.href = "https://archive.today/?run=1&url=" + link.href;

          }

        }

      }

        }

    </script>

{/if}

<div id="dialogInfobox" class="jsStaticDialogContent" style="display: none" data-title="Test Titel">

    <p id="showURL">URL hier übergeben</p>

</div>

Jetzt ist es aber so, dass ALLE Links auf einmal diese Dialogbox angezeigt bekommen und
somit beschränkt sich das ganze leider nicht nur auf die Links aus der Blacklist. Das würde
ich gerne abgeändert bekommen, sodass es eben doch nur diese entsprechenden Links betrifft.
Außerdem soll mittels ID oder anderer Möglichkeit, die URL an die Dialog-Box übergeben werden, sodass
man die URLs als Variable innerhalb eines Textes benutzen kann. Zudem muss der zusätzliche Code

Javascript:
        // Klasse anhängen um den Dialog öffnen zu können

        var tags = document.getElementsByClassName("externalURL");

        for(var i=0; i<tags.length; ++i){

          if(typeof tags[i] === "object" && "classList" in tags[i]){

            tags[i].classList.add("jsStaticDialog");

            tags[i].setAttribute("data-dialog-id", "dialogInfobox");

          }

        } // ENDE

Doch auch in dem unteren Bereich verbaut werden oder? Aber wenn ich das tue, funktioniert das ganze Script nicht mehr.
Da würde ich mich sehr freuen, wenn das jemand eventuell umsetzen könnte.

Die andere Funktion, scheint ser viel komplizierter zu sein und da hört es bei mir sowieso ganz auf.
Und zwar habe ich von jemanden ein nodeJS-Script bekommen, dass dort Links auf archive.is übergeben werden und
man sofort den Link des Archives erhält.

Das Script sieht folgendermaßen aus und sollte, wenn möglich bitte verbaut werden.

Kurz noch zu dem Szenario wie das Script am Ende funktionieren soll:

Das Script sucht wie zuvor nach den entsprechenden Links aus der Blacklist.
Wenn gefunden, soll die Dialog-Box ermöglicht werden.
Inhalt der Box (Beispiel) "Sie rufen die Seite {URL} auf, welche über archive.is archiviert wird.".
Mittels Klick auf "OK", soll dann eben das entsprechende Script (unten nodeJS) in Aktion treten und die URL
dann über archive.is leiten und somit an den generierten Archive-Link umleiten.

savepage.js
Javascript:
const cheerio = require('cheerio')

const axios = require('axios')

const qs = require('qs')


const getArchiveIsSubmitId = require('../lib/getArchiveIsSubmitId')


module.exports = async function (pageToSave) {

  // const makeRequest = async function (pageToSave) {

  // get fresh submitId

  const submitId = await getArchiveIsSubmitId()


  // console.log('got submitid: ', submitId)


  let response = await axios({

    url: 'http://archive.is/submit/',

    method: 'POST',

    headers: { 'content-type': 'application/x-www-form-urlencoded' },

    data: qs.stringify({ url: pageToSave, submitId }),

  }).catch((err) => {

    return false

  })


  if (response.data.includes('document.location.replace')) {

    console.log(response.data.slice(70, 97))

    return response.data.slice(70, 97)

  } else if (response.data.includes('Attention Required')) {

    console.log('Cloudflare...')

    return false

  } else if (response.request.res.responseUrl) {

    console.log(response.request.res.responseUrl)

    return response.request.res.responseUrl

  } else {

    console.log('Nothing found: ', response)

    return false

  }

}

getArchiveIsSubmitld.js
Javascript:
const cheerio = require('cheerio')

const axios = require('axios')


const url = 'http://archive.is/'


module.exports = async function getSubmitId() {

// const run = async function getSubmitId() {

  axios.get(url)

  .then(response => {

    const submitId = cheerio('input[type="hidden"]', response.data).val()

    // console.log('submitid: ', submitId)

    if(!submitId) {

      console.error('unable to get submitid... proxy ?')

    }

    return submitId

  })

  .catch(err => {

    return false

  })

}

Ich wäre zutiefst dankbar für Hilfe.


Auf Wunsch kann eine Testinstallation zur Verfügung gestellt werden, damit dies Live editiert und angeschaut werden kann.

Die entsprechenden Dateien würden dann natürlich mitgeteilt werden.

LG
 
Zuletzt bearbeitet:

Neue Beiträge