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.