Script Erweiterung funktioniert nur bedingt + nodeJS Inspiration

  • JavaScript

    Script Erweiterung funktioniert nur bedingt + nodeJS Inspiration

    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:

    Quellcode

    1. {if ARCHIVEIS_ACTIVE && !$archiveIsBlacklist|empty}
    2. <script data-relocate="true">
    3. var allLinks = document.links;
    4. var archiveIsBlacklist = JSON.stringify({@$archiveIsBlacklist});
    5. for(var i=0; i < allLinks.length; i++) {
    6. var link = allLinks[i];
    7. if(archiveIsBlacklist.includes(link.hostname)) {
    8. link.href = "https://archive.today/?run=1&url=" + link.href;
    9. }
    10. for(var j=0; j < JSON.parse(archiveIsBlacklist).length; j++) {
    11. var blacklistLink = JSON.parse(archiveIsBlacklist)[j];
    12. if(blacklistLink.includes('*')) {
    13. var blacklistLinkRegex = blacklistLink.split('*').join('.*');
    14. blacklistLinkRegex = "^" + blacklistLinkRegex + "$";
    15. if(link.hostname.match(new RegExp(blacklistLinkRegex))) {
    16. link.href = "https://archive.today/?run=1&url=" + link.href;
    17. }
    18. }
    19. }
    20. }
    21. </script>
    22. {/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:

    Quellcode

    1. {if ARCHIVEIS_ACTIVE && !$archiveIsBlacklist|empty}
    2. <script data-relocate="true">
    3. var allLinks = document.links;
    4. var archiveIsBlacklist = JSON.stringify({@$archiveIsBlacklist});
    5. for(var i=0; i < allLinks.length; i++) {
    6. var link = allLinks[i];
    7. if(archiveIsBlacklist.includes(link.hostname)) {
    8. link.href = "https://archive.today/?run=1&url=" + link.href;
    9. // Klasse anhängen um den Dialog öffnen zu können
    10. var tags = document.getElementsByClassName("externalURL");
    11. for(var i=0; i<tags.length; ++i){
    12. if(typeof tags[i] === "object" && "classList" in tags[i]){
    13. tags[i].classList.add("jsStaticDialog");
    14. tags[i].setAttribute("data-dialog-id", "dialogInfobox");
    15. }
    16. } // ENDE
    17. }
    18. for(var j=0; j < JSON.parse(archiveIsBlacklist).length; j++) {
    19. var blacklistLink = JSON.parse(archiveIsBlacklist)[j];
    20. if(blacklistLink.includes('*')) {
    21. var blacklistLinkRegex = blacklistLink.split('*').join('.*');
    22. blacklistLinkRegex = "^" + blacklistLinkRegex + "$";
    23. if(link.hostname.match(new RegExp(blacklistLinkRegex))) {
    24. link.href = "https://archive.today/?run=1&url=" + link.href;
    25. }
    26. }
    27. }
    28. }
    29. </script>
    30. {/if}
    31. <div id="dialogInfobox" class="jsStaticDialogContent" style="display: none" data-title="Test Titel">
    32. <p id="showURL">URL hier übergeben</p>
    33. </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

    Quellcode

    1. // Klasse anhängen um den Dialog öffnen zu können
    2. var tags = document.getElementsByClassName("externalURL");
    3. for(var i=0; i<tags.length; ++i){
    4. if(typeof tags[i] === "object" && "classList" in tags[i]){
    5. tags[i].classList.add("jsStaticDialog");
    6. tags[i].setAttribute("data-dialog-id", "dialogInfobox");
    7. }
    8. } // 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

    Quellcode

    1. const cheerio = require('cheerio')
    2. const axios = require('axios')
    3. const qs = require('qs')
    4. const getArchiveIsSubmitId = require('../lib/getArchiveIsSubmitId')
    5. module.exports = async function (pageToSave) {
    6. // const makeRequest = async function (pageToSave) {
    7. // get fresh submitId
    8. const submitId = await getArchiveIsSubmitId()
    9. // console.log('got submitid: ', submitId)
    10. let response = await axios({
    11. url: 'http://archive.is/submit/',
    12. method: 'POST',
    13. headers: { 'content-type': 'application/x-www-form-urlencoded' },
    14. data: qs.stringify({ url: pageToSave, submitId }),
    15. }).catch((err) => {
    16. return false
    17. })
    18. if (response.data.includes('document.location.replace')) {
    19. console.log(response.data.slice(70, 97))
    20. return response.data.slice(70, 97)
    21. } else if (response.data.includes('Attention Required')) {
    22. console.log('Cloudflare...')
    23. return false
    24. } else if (response.request.res.responseUrl) {
    25. console.log(response.request.res.responseUrl)
    26. return response.request.res.responseUrl
    27. } else {
    28. console.log('Nothing found: ', response)
    29. return false
    30. }
    31. }


    getArchiveIsSubmitld.js

    Quellcode

    1. const cheerio = require('cheerio')
    2. const axios = require('axios')
    3. const url = 'http://archive.is/'
    4. module.exports = async function getSubmitId() {
    5. // const run = async function getSubmitId() {
    6. axios.get(url)
    7. .then(response => {
    8. const submitId = cheerio('input[type="hidden"]', response.data).val()
    9. // console.log('submitid: ', submitId)
    10. if(!submitId) {
    11. console.error('unable to get submitid... proxy ?')
    12. }
    13. return submitId
    14. })
    15. .catch(err => {
    16. return false
    17. })
    18. }


    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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sumale.my“ ()