Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Toisen sivun lähdekoodista etsiminen php:llä

Sivun loppuun

Bearz [19.07.2009 01:25:41]

#

Terve! Olen tekemässä pientä pelipalvelin-lista scriptiä kotisivuilleni ja huomasin että pelin sivuston(kyseessä on siis selainpeli) lähdekoodissa on palvelimen ip osoite joka voisi olla kätevä pelipalvelin-listassani. Kysymys siis kuuluu, että miten voisin kopioida jotain tekstiä toisen sivun lähdekoodista ja tallentaa sen vaikka mysliin? Olisiko semmoisen toteuttaminen php:llä kovinkin vaikeata? Olen kuitenkin aika alotteleva php:n koodaaja, että kuinka vaikeata se voisi olla?

Lisäkysymykseksi esittäisin tälläisen ihan eri aihe-alueeseen kuuluvan jutun. Elikkä, miten voisin estää sen että text boxiin ei pysty laittamaa esim pelkkää välilyöntiä, että siinä pitäisi olla jotain tekstiä? Sen onnistuin tekemään, että tyhjää kenttää ei voi lähettää eteenpäin.. Pitäisikö tämä toteuttaa Phpllä vaiko javascriptillä(josta minulla ei pahemmin kokemusta ole..) Olisi myös sellainen ongelma, että miten kannattaisi tehdä esto, että tekstilaatikkoon pystyisi laittamaan vain jollain tietyllä sanalla alkavaa tekstiä. Tässä tapauksessa jotain tyyliin "http://blablabla.com.."

Sori jos viestissäni on kirjoitusvirheitä taikka muuten sekavaa tekstiä. Anteeksi myös, jos tämäntapaisia kysymyksiä on joskus ennenkin kysytty.

Metabolix [19.07.2009 10:03:01]

#

Ensimmäiseen kysymykseen: Ei ole kovin vaikeaa, Sen sijaan, että tässä pyytelisit "esimerkkejä" eli valmista koodia kuten monet muut, kannattaa tutustua sopiviin tiedostojen- ja tekstinkäsittelyfunktioihin, jolloin koodaus sujuu taas jatkossa paljon helpommin, kun olet entistä vähemmän "aloitteleva". Esimerkiksi file_get_contents sopii sivun hakemiseen ja säännölliset lausekkeet tai strpos ja substr oikean datan poimimiseen. PHP:n funktioista saa helpoiten tietoa osoitteesta https://www.php.net/funktion_nimi.

Toiseen kysymykseen: PHP:n trim-funktio poistaa tekstin reunoista tyhjät (välit, tabulaattorit, rivinvaihdot jne.), eli sillä voit tarkistaa tuollaisen tyhjyyden. Kaikki tärkeät tarkistukset kannattaa tehdä PHP:llä, koska sillä tehtyjä tarkistuksia käyttäjä ei voi yksinkertaisesti kiertää. Samat asiat voi lisäksi tarkistaa JS:llä, jotta käyttäjä saa tiedon virheestään nopeammin eikä palvelinta turhaan vaivata asialla. JS-tarkistukseen ei kuitenkaan voi luottaa, koska JS:n voi ottaa pois päältä. Tarkoitus onkin ensisijaisesti nopeuttaa sivun toimintaa.

Teuro [19.07.2009 10:07:28]

#

Toiselta palvelimelta on mahdollista hakea tietoa php:n avulla helpohkosti. Aiheesta on keskusteltu hetki sitten, joten voit yrittää lukea tätä lankaa. Mikäli et onnistu noiden ohjeiden avulla hakemaan tietoa, voit aivan hyvin kysyä lisää apua ongelmaasi, mutta koeta tiivistää kysymys yhteen ongelmaan.

IP-osoite lienee muodossa xxx.xxx.xxx.xxx, jolloin seuraava säännöllinen lauseke saattaa tulla tarpeeseen.

<?php
$ip = "202.165.13.225";

if(preg_match("/^[0-9]{2,3}\\.[0-9]{2,3}\\.[0-9]{2,3}\\.[0-9]{2,3}$/", $ip)){
	echo "OK!";
}else{
	echo "VÄÄRIN!";
}
?>

Metabolix [19.07.2009 10:26:41]

#

Teuron IP-lauseke on viallinen, koska IP-osoitteen osat voivat olla yhdenkin numeron mittaisia. Tämän voi kuitenkin helposti jo linkittämäni oppaan avullakin korjata. Lisäksi se kelpuuttaa virheellisiä osoitteita kuten 345.678.987.654; tämän korjaaminen vaatii jo pidemmän lausekkeen eikä välttämättä ole alkuperäisen ongelman kannalta olennaista.

Teuro [19.07.2009 10:47:06]

#

Jooh pitäisi tarkistaa lisäksi, ettei numerot ylitä 255 arvoa, mutta tuo tosiaan vaatisi pidemmän lausekkeen. Toisaalta tuo yrittää tunnistaa oikeita ip-osoitteita tekstimassasta. Toistoon on ikävä kyllä lipsahtanut 1 sijasta numero 2, joten oikea toisto olisi tietenkin {1,3}. Kiitos huomautuksesta.

Antti Laaksonen [19.07.2009 11:28:38]

#

Tämä koodi hakee nettisivun lähdekoodin muuttujaan:

<?php
$teksti = file_get_contents("https://www.ohjelmointiputka.net/");
?>

Tämä koodi etsii tekstistä IP-numerot ja näyttää ne listassa:

<?php
$teksti = "Palvelimet ovat 123.123.123.123, 231.231.231.231 ja 312.312.312.312.";
preg_match_all("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/", $teksti, $tulos);
echo "Teksti sisältää seuraavat IP-numerot:";
echo "<ul>";
foreach ($tulos[0] as $ip) {
    echo "<li>$ip";
}
echo "</ul>";
?>

Tämä koodi tarkistaa, että kenttä "eka" ei ole tyhjä (pelkkää välilyöntiä) ja että kenttä "toka" alkaa "http://":

<?php
$eka = $_POST["eka"];
$toka = $_POST["toka"];
if (trim($eka) == "") {
    die("Kenttä \"eka\" on tyhjä!");
}
$alku = "http://";
if (substr($toka, 0, strlen($alku)) <> $alku) {
    die("Kenttä \"toka\" ei ala http://!");
}
?>

Bearz [19.07.2009 15:43:06]

#

Kiitos vaan! Olisihan tuo ollut opillisesti hyödyllisempää jos itse olisin koodia kirjoitellut, mutta tuostahan tuota on nyt hyvä soveltaa.

E: Hmm.. Mietiskelin tuossa vähäsen ja aktselin php.net :tiä. Ja tulin siihen tulokseen, että tuo file_get_contents taitaa vain kopioida kaiken mitä "sivulla" on. Eikä lähdekoodia? Vai olenko väärässä?

Meinaan, tämän pelin http://minecraft.net/play.jsp?server­=48dae164f687debf2bc82543c7208b96 lähdekoodissa lukee serverin ip osoite.

Tähän tyyliin:

	    	<param name="server" value="94.136.44.116">
	    	<param name="port" value="25565">
	    	<param name="mppass" value="637256c04561f046c41bde1bd03396af">

Jos pystyisin jotenkin kopioimaan tuon ip osoitteen niin pystyisen tekemään online/offline scriptin.

Pitääkö tämä tehdä eri tavalla vai miten?

Metabolix [19.07.2009 21:42:42]

#

Kyllä se nimenomaan lähdekoodin hakee, sehän on se sivun sisältö. On täysin selaimen asia, miten se näyttää ja tulkitsee lähdekoodia; ei ole erikseen lähdekoodia ja "sisältöä". Kokeilemallakin voisit todeta, mitä funktio palauttaa.

Bearz [20.07.2009 01:26:06]

#

Tiedättekö mitään hyvää functiota jolla pystyisi etsimään tuolta lähdekoodista jotai tiettyä sanaa ja kopsata sen koko rivin? strpos :ia koitin, mutta tein joko jotain väärin tai se ei toiminut.

Teuro [20.07.2009 09:11:37]

#

Tiedetään me montakin hyvää tapaa etsiä tietoa lähdekoodista. Tässäkin keskustelussa on esitelty yksi tapa etsiä tietoa säännöllisillä lausekkeilla. Keskustelussa, johon viittasin käytettiin DOM rajapintaa tietyn nimisen kentän hakemiseen. Tässä voisi hakea noita param-elementtejä DOMDocument::getElementsByTagName($string) metodin avulla, jonka jälkeen käydään saatu lista läpi ja verrataan DOMElement::getAttribute($string) metodilla onko oikea solmu käsillä.

Antti Laaksonen [20.07.2009 13:15:07]

#

Seuraava koodi etsii Ohjelmointiputkan etusivun lähdekoodista rivin, jossa lukee "kokoontumispaikka", ja tulostaa sen näkyviin.

<?php
$rivit = file("https://www.ohjelmointiputka.net/");
for ($i = 0; $i < count($rivit); $i++) {
    if (strstr($rivit[$i], "kokoontumispaikka") !== false) {
        $rivi = $rivit[$i];
        break;
    }
}
echo $rivi;
?>

tsuriga [20.07.2009 14:05:29]

#

Voisko tässä olla ongelmana jotain semmosta, että pitää täyttää tietyt ehdot (esim. ollakseen kirjautunut) nähdäkseen tuon IP-osoitteen? Ei mulla nimittäin näy lähdekoodissa moista.

Tässä vielä tuon IP-osoitteen haku DOMilla.

<?php
$doc = new DOMDocument();
$doc->loadHTML($src);

$xpath = new DOMXpath($doc);

$servers = $xpath->query("//applet/param[@name='server']");

$ip = ($servers->length > 0) ?
      $servers->item(0)
              ->getAttribute('value'):
      false;
?>

Bearz [20.07.2009 15:58:54]

#

tsuriga kirjoitti:

Voisko tässä olla ongelmana jotain semmosta, että pitää täyttää tietyt ehdot (esim. ollakseen kirjautunut) nähdäkseen tuon IP-osoitteen? Ei mulla nimittäin näy lähdekoodissa moista.

Hmm totta. ITsekin hieman mietiskelin ja testailin, niin huomasin että file_get_contents ei tulostakkaan kaikkea mitä minä näen sisäänkirjautuneena. Tämän takia en siis ole onnistunut tulostamaan ip osoitteita sivustolta.

tsuriga [20.07.2009 16:57:23]

#

Voit ensin kirjautua sivustolle vaikkapa cURLin avulla ja hakea lähdekoodin sitten.

Wrapper classeja löytynee hommaan aimo kasa, tässä muutama (en mene takuuseen ko ei ole tullut kokeiltua):

Bearz [21.07.2009 15:26:24]

#

tsuriga kirjoitti:

Voit ensin kirjautua sivustolle vaikkapa cURLin avulla ja hakea lähdekoodin sitten.

Wrapper classeja löytynee hommaan aimo kasa, tässä muutama (en mene takuuseen ko ei ole tullut kokeiltua):

Moni noista curl wrappereista tarvii serveriltä safe moden pois päältä.. Sitten serverellä joissa on safe mode pois päältä niin niissä ei ole curlia. Vaikeeta siis tulee.


Sivun alkuun

Vastaus

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

Tietoa sivustosta