Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: Linkkien tarkastaja

peran [01.05.2005 21:41:48]

#

Konsoliohjelma tarkastaa html-sivuston linkit, imaget ja framet. Ilmoittaa virheellisistä viittauksista halutun syvyyden laajuudelta ko. sivustossa.

Käynnistyy:
java linkkientarkastaja.Main "https://www.ohjelmointiputka.net/"

parametrit:
1. [Taso] - Vapaaehtoinen parametri, jos haluaa tutkia syvemmin kuin 1. tason.
2. [Sivusto] - Vapaaehtoinen parametri. Kertoo ohjelmalle sivuston, jota tutkitaan.
3...n [haku] - Ainakin yksi parametri. Läpikäytävät sivut.

Jos ensimmäinen parametri on nro, se otetaan haun maksimisyvyydeksi. Jos ei numerollisia parametreja on enemmän kuin 1, 1. ei numerollinen parametri (1. tai 2. parametri) on Sivusto, jota tutkitaan ja loput parametrit on läpikäytävia sivuja.

Toiminta:
v - listan URL:t käydään läpi, ja sen loppuun lisätään uusia URL:ja. Ne, joita ei löydy, lisätään errorit-listaan.
Kun kaikki v-listan URL:t on käyty läpi, tulostetaan raportti. Jos ei löydy virheitä, tulostetaan kaikki linkit, jotka on tarkistettu. Jos löytyi virheitä, tulostetaan vain virheet.

Ohjelma kääntyneen ainakin JDK 5.0:lla.
Ohjelma on tehty NetBeans 4.0:lla ja JDK 5.0:lla.

Docci.java

/*
 * Docci.java
 *
 * Created on 28. huhtikuuta 2005, 17:55
 */

package linkkientarkastaja;

/**
 *  Tämä luokka tallettaa linkkin tiedot
 */
public class Docci {

    private boolean haeuusialinkkeja; // Haetaan linkkejä alihakemistoista.
    private String linkki;  // Etsittävä linkki
    private String href;    // viite, joka löytyy -html:stä
    private String isa;     // Html-tiedosto, josta viite löytyy.
    private int taso = 0;   // Syvyystaso.

    /** Creates a new instance of Docci */
    public Docci(String linkki, boolean rekursiivisesti, int taso, String Href, String isa) {
        haeuusialinkkeja = rekursiivisesti;
        this.linkki=linkki;
        this.taso=taso;
        this.href=Href;
        this.isa=isa;
    }

    // Palauta viite
    public String getHref(){
        return href;
    }

    // Palauta linkki
    public String getlinkki(){
        return linkki;
    }

    // Palauta tiedosto, josta linkki löytyy.
    public String getFarther() {
        return isa;
    }

    // Palauta taso
    public int getTaso() {
        return taso;
    }

    // Palauta hae uusia linkkejä.
    public boolean haetaan(){
        return haeuusialinkkeja;
    }
}

Main.java

/*
 * Main.java
 *
 * Created on 28. huhtikuuta 2005, 17:47
 */

package linkkientarkastaja;

import java.util.LinkedList;
import java.net.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 */
public class Main {

    /** Creates a new instance of Main */
    final static int ReadKoko = 1500; // lukupuskurin koko
    final static int maxHTMLlength = 65000; // HTML-tiedoston maksimikoko

    static int maxtaso = 1; // Kuinka syvältä linkkejä kaivetaan
    public static Main me = null; // Muuttuja itseluontia varten
    private LinkedList v = new LinkedList(); // Tutkitut linkit
    private LinkedList errorit = new LinkedList(); // Virheelliset linkit
    private int osoitin = 0; // Listan osoitin
    private int taso = 0; // Kertoo kuinka syvällä ollaan linkeissä
    private String RekursioEhtoHref = ""; // Tämän linkin alta tutkitaan


    public Main() { // Konstruktori
    }

    /* addLast aliohjelmalla lisätään linkki tutkittaviin linkkeihin
     * Samalla tarkistetaan ettei linkki ole entuudestaan niissä.
     */
    public void addLast(String linkki,boolean alihaku, String href, String isa) {
        if (v.isEmpty()) {
            v.addLast(new Docci(linkki,alihaku,taso,href,isa));
        } else {
            int i=0;
            Object o = v.getLast(); // o:ksi listan viimeinen
            while ((((Docci)(v.get(i))).getlinkki().equals(linkki)==false)&&
                    (v.get(i)!=o)) i++; // Tutkitaan löytyykö linkkiä listasta
            if (((Docci)(v.get(i))).getlinkki().equals(linkki)==false) // Jos ei löydy lisä-
                v.addLast(new Docci(linkki,alihaku,taso,href,isa));    // tään, listan loppuun
        }
    }

    /* Otetaan tutkittava linkki.
     */
    public Docci get() {
        return (Docci)v.get(osoitin);
    }

    /* Otetaan viimeinen tutkittava linkki.
     */
    public Docci getLast() {
        return (Docci)v.getLast();
    }

    /* Onko tutkittava linkki listan viimeinen linkki
     */
    public boolean isLast() {
        return getLast()==get();
    }

    /* Lähdetään tutkimaan seuraavaa linkkiä
     */
    public void next(){
        osoitin++;
    }

    /* Aseta rekursioehto
     */
    public void setRekursioehto(String s) {
        RekursioEhtoHref=s;
    }

    /* Tulosta tutkittu raportti. Jos virheitä, niin virheet.
     * Muuten kaikki tutkitut linkit
     */
    public void tulostaRaportti() {
        if (errorit.isEmpty()) {  // Jos ei löytynyt vääriä linkkejä, tulostetaan kaikki
                                  // tutkitut linkit.
            System.out.println("Tarkastetut linkit");
            int i=0;
            while (v.get(i)!=v.getLast()) {
                System.out.println("         "+((Docci)v.get(i)).getlinkki());
                i++;
            }
            System.out.println("         "+((Docci)v.get(i)).getlinkki());
            System.out.println("HTML-puusta ei löytynyt virheitä"); // Lopuksi toteamus.
        } else { // Jos on löytynyt vääriä linkkejä, tulostetaan virheeliset linkit.
            System.out.println("Seuraavat virheet löydettiin linkeistä");
            String s = ((Docci)errorit.get(0)).getFarther();
            System.out.println("Tiedostossa:"+s);   // Aluksi tulostetaan tiedosto, jossa
            int i=0;                                // virheelliset linkit on löydetty
            while (errorit.get(i)!=errorit.getLast()) {
                if (s.equals(((Docci)errorit.get(i)).getFarther())!=true) {
                    s = ((Docci)errorit.get(i)).getFarther();
                    System.out.println("Tiedostossa:"+s);   // Jos tiedosto vaihtuu, niin
                }                                           // tulostetaan seuraava tiedosto.
                System.out.println("         "+((Docci)errorit.get(i)).getHref());
                //System.out.println("         "+((Docci)errorit.get(i)).getlinkki());
                i++; // Tulostetaan virheellinen linkki ja mennään seuraavaan virheeseen.
            } // Viimeisen virheen joutuu käsittelemään erikseen.
            if (s.equals(((Docci)errorit.get(i)).getFarther())!=true) {
                s = ((Docci)errorit.get(i)).getFarther();
                System.out.println("Tiedostossa:"+s);
            }
            System.out.println("         "+((Docci)errorit.get(i)).getHref());
        }
    }

    /* Lisää viellisiin linkkeihin yksi linkki.
     */
    public void addError(Docci d) {
        errorit.addLast(d);
    }

    /* addLinks-hakee linkit HTML-tiedostosta
     * aluksi tutkii onko tutkittava taso,
     * ja onko riittävän pieni tiedosto,
     * ja löytyykö RekursioEhdon (RekursioEhtoHref)
     * hakemistojen alipuusta. Lisäksi tiedostossa
     * pitää vielä löytyä joko <html> tai <body - tagi.
     * Jos ehdot toteutuvat haetaan tiedostosta löytyvät linkit.
     */
    public void addLinks(String s) {
        boolean find = true;  // Jos find-jää trueksi, tutkitaan linkit.
        Pattern pattern = null;
        Matcher m = null;
        if (taso>maxtaso) find=false; // Jos ollaan liian syvällä, niin ei tutkita syvemmälle.
        System.out.println(find);
        if (s.length()>maxHTMLlength) find=false; // Jos liian iso tiedosto -> ei ole html-tiedosto.
        System.out.println(find); // Jos ei ole tutkittan sivuston alipuussa, niin ei tutkita linkkejä.
        if (get().getlinkki().indexOf(RekursioEhtoHref)!=0) find=false;
        System.out.println(find);
        System.out.println(get().getlinkki());
        if (find) {
            find=false;
            pattern=Pattern.compile("(<[bB][oO][dD][yY])"); // Jos löytyy <Body, niin on html-tiedosto
            m = pattern.matcher( s );
            find=m.find();
            System.out.println(find);
            if( find==false ) {
                pattern=Pattern.compile("(<[hH][tT][mM][lL]>)"); // Jos löytyy <Html>,
                m=pattern.matcher(s);                            // niin on html-tiedosto.
                find=m.find();
            }
        }
        if (find) { // Jos tiedosto täyttää ehdot, tutkimme viittaukset.
            pattern=Pattern.compile("(<\\s*?[aA]\\s.*?[hH][rR][eE][Ff]\\s*?=\\s*?[\"\'].*?[\"\'])");
            m = pattern.matcher(s); // Tällä etsimme linkit
            Matcher m2 = null;
            Pattern pattern2 = null;
            Matcher m3 = null;
            Pattern pattern3 = null;
            String ss = null;
            String sss = null;
            String sGet = null;
            sGet=get().getlinkki();
            String getti = sGet;
            String ssGet;
            while (sGet.charAt(sGet.length()-1)!='/') sGet=sGet.substring(0, sGet.length()-1);
            while (sGet.charAt(sGet.length()-2)=='/') sGet=sGet.substring(0, sGet.length()-1);
            for (int j=0;j<4;j++) { // Käydään läpi kaikki viitteet.
                if (j==1) {
                    pattern=Pattern.compile(
                      "(<\\s*?[iI][mM][gG]\\s.*?[sS][rR][cC]\\s*?=\\s*?[\"\'].*?[\"\'])");
                    m = pattern.matcher(s); // Tällä etsimme kuvat
                } else if (j==2) {
                    pattern=Pattern.compile(
                      "(<\\s*?[fF][rR][aA][mM][eE]\\s.*?[sS][rR][cC]\\s*?=\\s*?[\"\'].*?[\"\'])");
                    m = pattern.matcher(s); // Tällä etsimme kehykset
                } else if (j==3) {
                    pattern=Pattern.compile(
                      "(<\\s*?[iI][fF][rR][aA][mM][eE]\\s.*?[sS][rR][cC]\\s*?=\\s*?[\"\'].*?[\"\'])");
                    m = pattern.matcher(s); // Tällä etsimme html-tiedoston sisäiset kehykset
                }
                while (m.find()){
                    ss=m.group(); // Löytyi viite
                    char ch = ss.charAt(ss.length()-1); // Viimeinen merkki on heittomerkki
                    sss=ss.substring(0, ss.length()-1); // Poistetaan viimeinen heittomerkki
                    while (sss.indexOf(ch)>=0) // Leikataan viimeisen heittomerkin kohalta
                        sss=sss.substring(sss.indexOf(ch)+1);
                    boolean jatkuu = true;
                    sss=sss.replaceAll("&[aA][mM][pP];","&"); // Linkista &amp; muutetaan &:ksi
                    sss=sss.replaceAll(" ","%20"); // Välilöynti muutetaan %20:ksi.
                    if (sss.length()>7)  // Mailaus linkkejä ei käsitellä.
                        jatkuu=sss.substring(0,7).equalsIgnoreCase("mailto:")==false;
                    if (jatkuu&&(sss.length()>11)) // Javascriptiä tämä ei tue.
                        jatkuu=(sss.substring(0,11).equalsIgnoreCase("javascript:")==false);
                    if (jatkuu) {
                        if (sss.indexOf("://")>0) { // Jos on koko osoite, niin lisätään sellaisenaan
                            this.addLast(sss, true, ss,getti); // tutkittaviin sivuihin.
                        } else { // Muuten on suhteellinen osoite.
                            ssGet=sGet; // Etsitään viittaukset alihakemistoihin.
                            pattern3=Pattern.compile("\\.\\./");
                            m3=pattern3.matcher(sss);
                            //System.out.println("sss="+sss);
                            //System.out.println("ssGet="+ssGet);
                            while (m3.find()) { // Niin monesti kuin löytyy ../ , siirrytään lähemmäksi
                                ssGet=ssGet.substring(0,ssGet.length()-1); // juurta.
                                while ((ssGet.length()>1)&&(ssGet.charAt(ssGet.length()-1)!='/'))
                                    ssGet=ssGet.substring(0,ssGet.length()-1);
                            }
                            sss=sss.replaceAll("\\.\\./",""); // poistetaan kaikki ../
                            String alku = ssGet.substring(0, 7);
                            String loppu = ssGet.substring(7)+sss; // Poistetaan loppuosasta turhat "//"
                            while (loppu.indexOf("//")>0) loppu=loppu.replaceAll("//","/");
                           this.addLast(alku+loppu, true, ss,getti); // Lisätään tutkittaviin sivuihin.
                        }
                    }
                }
            }
        }
    }

    /* Hakee internetistä tiedostot.
     */
    public void searchFile() {
        taso=get().getTaso();
        taso++;

        boolean m_Post = false; // lähetetäänkö $_GET:lle vai $_POST:lle
        String m_Href = get().getlinkki();
        URL Urkki = null; // URL-osoite php:tä varten
        InputStream is = null; // tämän avulla luetaan php:n tulos
        byte buffer[] = new byte[ReadKoko];  // lukupuskuri
        String s = "";

        try {
             String posti = ""; // lähtevä posti teksti muuttujaan
             Urkki = new URL(m_Href); // luodaan URL
             System.out.println("Connect:"+Urkki.getProtocol()+"://"+
                     Urkki.getHost()+"/"+Urkki.getFile()); // Tulostetaan URL
             int ReadLen; // Luettujen merkkien lkm.
             URLConnection con; // tarvitaan yhteyden luonnissa
             HttpURLConnection Http = null;  // tarvitaan http-pyyntöön
             OutputStream outs = null; // $_POST:n lähetys tämän kahvan avulla
             try {
                 con = Urkki.openConnection(); // luodaan yhteys serveriin
                 System.out.println(con.getContentType());
                 if (con.getContentType().indexOf("text/html")<0)
                     taso=maxtaso+1;
                 if (taso<=maxtaso) {
                     is = con.getInputStream();  // luodaan virta php:n lähettämää dataa varten
                     ReadLen=is.read(buffer);  // luetaan tavuja bufferiin
                     while ((ReadLen>=1)&&          // luetaan bufferia kunnes sieltä
                       (s.length()<maxHTMLlength)) { // ei enään tule tai liian monta merkkiä
                         s += (new String(buffer)).substring(0,ReadLen); // tallennetaan s:lle
                         ReadLen=is.read(buffer); // luetaan tavuja bufferiin
                     }
                     is.close(); // suljetaan virta
                     //System.out.println(s);
                     addLinks(s);
                 }
             } catch (Exception ex) {
                 System.out.println(ex.toString());
                 addError(get());
             }
         } catch (Exception exc) {
           System.out.println(exc.toString());
         }
    }

    /*
     * Pääohjelma
     */
    public static void main(String[] arg) {
        // TODO code application logic here
        String[] args = arg; // Laitetaan parametrit args:iin.
        if (arg.length>0) { // Jos argumentteja
            try {
                int max = Integer.parseInt(arg[0]); // Tutkitaan onko 1. parametri numero
                maxtaso = max; // Jos on numero, laitetaan maksimitasoksi ko. nro.
                args=new String[arg.length-1]; // Poistetaan ensimmäinen parametri args:sta
                for (max=0;max<args.length;max++) args[max]=arg[max+1];
            } catch (Exception e) {

            }
        }
        me=new Main(); // Luodaan me:hen olio.
        if (args.length==1) {
            me.addLast(args[0],true,"",""); // Jos parametreja args:ssa vain 1,
                                            // Lisätään parametri tutkittaviin.
        }
        if (args.length>0) {
            for(int i=1;i<args.length;i++) { // Lisätään loput parametrit tutkittaviin
                me.addLast(args[i],true,"","");
            }
            String s = args[0]; // Ensimmäinen parametri on rekursioehto
            if (args.length==1) // Jos ei enempää parametreja, poistetaan rekursioehdosta
                while ((s.length()>1)&&(s.charAt(s.length()-1)!='/')) // tiedosto
                    s=s.substring(0,s.length()-1);
            me.setRekursioehto(s);
            //me.addLast(new String(args[0]),false,0,"");
            Docci kasiteltava = null;
            String linkki = null;
            String buf = null;
            boolean islast;
            islast=false;
            while (islast==false) { // Tutkitaan kaikki tiedostot
                me.searchFile();
                islast=me.isLast();
                if (islast==false)
                    me.next();
            }
            me.tulostaRaportti(); // Lopuksi tulostetaan raportti.

        }
    }

}

tgunner [02.05.2005 16:55:42]

#

Kyllä tuo päältäpäin ihan toimivalta näyttää :O.
Muuten! Sainpas ekan kommentin \o/

Blaze [03.05.2005 13:00:40]

#

Oi ei, nytkö nämä ekaajat on eksyny putkaanki >_<

CatZ [05.05.2005 14:20:23]

#

Ja tämä pitäisi toimia miten...? Webissä näkyy vain koodi tekstinä...

wwwapu [12.05.2005 22:22:01]

#

lainaus:

Ja tämä pitäisi toimia miten...? Webissä näkyy vain koodi tekstinä...

Käännä ja kokeile sitten. Enkä tarkoita näytön kääntämistä ylösalaisin. Vaikka voihan sitä niinkin kokeilla.

Graphic [25.10.2005 22:01:16]

#

Kappas...

Ensimmäiseksi painut imuttamaan jostain JDK:n.
Sitten hankit ohjeen, jolla saat kääntäjät kuntoon.
Ja tietysti muistat tallentaa tuon tiedoston oikealle nimelle.
Ja lopuksi jokin vielä saattaa toimia ^^

Sguali [19.12.2005 02:18:14]

#

paikoittain vähän vaikealukuinen sisennys, näyttää ihan toimivalta kyllä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta