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 & 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. } } }
Kyllä tuo päältäpäin ihan toimivalta näyttää :O.
Muuten! Sainpas ekan kommentin \o/
Oi ei, nytkö nämä ekaajat on eksyny putkaanki >_<
Ja tämä pitäisi toimia miten...? Webissä näkyy vain koodi tekstinä...
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.
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 ^^
paikoittain vähän vaikealukuinen sisennys, näyttää ihan toimivalta kyllä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.