Frage Script Erweiterung funktioniert nur bedingt + nodeJS Inspiration

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Sumale.my

Neues Mitglied
22 September 2020
3
0
1
32
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:

tk1234

Mitglied
2 September 2020
64
17
8
  • Sad
Reaktionen: Sumale.my

tk1234

Mitglied
2 September 2020
64
17
8
Genau das ist aber unerwünscht und führt in den meisten Boards zur Sperrung des Threads (der bei php.de ist ja schon gesperrt).
 

Sumale.my

Neues Mitglied
22 September 2020
3
0
1
32
Verstehe den Sinn dabei nicht?
Ich habe so doch eine viel höhere Chance eventuell eine Antwort zu erhalten.
Aber klar, wenn es in dem Fall, solche Petzen wie dich gibt, kein Wunder.
 

tk1234

Mitglied
2 September 2020
64
17
8
Verstehe den Sinn dabei nicht?
Ich habe so doch eine viel höhere Chance eventuell eine Antwort zu erhalten.
Genau das "Ich" ist das Problem: für dich mag es von Vorteil sein potentiell mehr bzw. schnellere Antworten zu bekommen, für die Antwortenden ist das aber genau ein Nachteil: womöglich wurde die Frage in einem anderen Form schon behandelt und das Problem ist bereits gelöst, dann hat er völlig umsonst Zeit in eine Antwort investiert. Du darfst nicht vergessen dass in den Foren alle Leute kostenlos und in ihrer Freizeit unterwegs sind, da ist es einfach unverschämt aus egoistischen Gründen die gleiche Frage ohne Hinweis in mehrere Boards zu klatschen.
 

basti1012

Senior HTML'ler
26 November 2017
1.523
167
63
Minden
sebastian1012.bplaced.net
Da auch
 
Werbung: