Kirjoittaja Aihe: php ja curl  (Luettu 3447 kertaa)

ooo

  • Käyttäjä
  • Viestejä: 120
    • Profiili
php ja curl
« : 13.06.09 - klo:22.02 »
Haluaisin hakea php:llä omiin tarkoituksiini ilmailun METAR-sääsanomia takautuvasti useiden päivien ajalta. Vain wunderground.com -sivustolla tuntuu olevan METAR-tiedot hyvin pitkältä ajalta. Ongelma on siinä, että kyseiset tiedot saa näkyviin selaimeen, mutta php:llä niiden nappaaminen on varsin hankalaa.

Tiedot pitäisi näkyä tällä sivulla kunkin rivin lopussa ja niiden pitäisi alkaa sanalla METAR:
http://www.wunderground.com/history/airport/EFHK/2009/6/13/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1&format=1

Ongelma on siinä, että tietoja ei näy, ellei tuolle sivulle siirry klikkaamalla linkkiä "Comma Delimited File" joka löytyy tämän sivun alareunasta:
http://www.wunderground.com/history/airport/EFHK/2009/6/13/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1

Selaimen cookie-tietoja katselemalla olen päätellyt, että ensinmainitussa linkissä EI näytetä METAR-tietoja, ellei jälkimmäisessä linkissä ole käyty ja siten koneelle ole tallennettu muutama cookie. Haluaisin nyt siis napata METAR-tiedot php:llä ja tarvitsen tietysti apuun curl:ia. Olen koodannut tällaista:

Koodia: [Valitse]
$lentopaikka = "EFHK";
$nyt = time();

$referer = "http://www.wunderground.com/history/airport/" . $lentopaikka . "/" . date(Y, $nyt) . "/" . date(n, $nyt) . "/" . date(j, $nyt) . "/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1";
$linkki = "http://www.wunderground.com/history/airport/" . $lentopaikka . "/" . date(Y, $nyt) . "/" . date(n, $nyt) . "/" . date(j, $nyt) . "/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1&format=1";
$user_agent = "Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.10) Gecko/20080528 Epiphany/2.22 Firefox/3.0";

$cookie_jar = "cookie.txt";
# Käydään referer-sivulla jotta cookiet tallennetaan tiedostoon.
$ch = curl_init($referer);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
$page = curl_exec($ch);
curl_close($ch);

$ch = curl_init($linkki);
# Käydään halutulla sivulla ja syötetään tallennetut cookie-tiedot.
curl_setopt($ch, CURLOPT_URL, $linkki);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
$linkin_sisalto = curl_exec($ch);
curl_close($ch);

echo $linkin_sisalto;


Koitin siis tehdä homman tämän ohjeen mukaan: http://hell.org.ua/Docs/oreilly/webprog/pcook/ch11_04.htm

Koodini ei kuitenkaan näytä METAR-tietoja, eli ilmeisesti cookie-asiassa on ongelmaa, tai sitten wundergroundilla on vielä jokin muu jippo miksi tietoja ei saisi näin ulos. Olisiko ideoita?
______________________________
Minäkö tyhmä? Nyt en ymmärrä.

ooo

  • Käyttäjä
  • Viestejä: 120
    • Profiili
Vs: php ja curl
« Vastaus #1 : 14.06.09 - klo:14.11 »
Kiitokset ajatuksesta. Olisin voinut olla tarkempikin ongelman kuvauksessa. Tosiaankin ne perussäätiedot näkyy ilman cookietakin juuri niinkuin liimasit viestiisi otteita. Ongelma onkin niissä ilmailun sääsähkesanomissa, joiden pitäisi näkyä kunkin rivin lopussa. Ne alkavat sanalla METAR. Niin ollen kunkin rivin pitäisi olla muotoa:

Koodia: [Valitse]
12:20 AM,14.0,12.0,88,1007,10.0,Pohjoisen ja luoteen välinen,6.9,-,N/A,,Tihkusadetta,METAR EFHK 122120Z 34006KT 9999 -DZ FEW005 BKN009 BKN012 14/12 Q1007 NOSIG
Huomaa rivin lopussa oleva METAR-alkuinen osa joka ei näy ellei ensin ole käynyt sillä referer-sivulla ja saanut cookien.


Edit: Höh, tässä oli vielä äsken yksi vastaus välissä mutta se hävisi jonnekin kuin pieru saharaan  :)
« Viimeksi muokattu: 14.06.09 - klo:14.13 kirjoittanut ooo »
______________________________
Minäkö tyhmä? Nyt en ymmärrä.

Jiku

  • Käyttäjä
  • Viestejä: 248
    • Profiili
Vs: php ja curl
« Vastaus #2 : 14.06.09 - klo:14.13 »
Kiitokset ajatuksesta. Olisin voinut olla tarkempikin ongelman kuvauksessa. Tosiaankin ne perussäätiedot näkyy ilman cookietakin juuri niinkuin liimasit viestiisi otteita. Ongelma onkin niissä ilmailun sääsähkesanomissa, joiden pitäisi näkyä kunkin rivin lopussa. Ne alkavat sanalla METAR. Niin ollen kunkin rivin pitäisi olla muotoa:

Koodia: [Valitse]
12:20 AM,14.0,12.0,88,1007,10.0,Pohjoisen ja luoteen välinen,6.9,-,N/A,,Tihkusadetta,METAR EFHK 122120Z 34006KT 9999 -DZ FEW005 BKN009 BKN012 14/12 Q1007 NOSIG
Huomaa rivin lopussa oleva METAR-alkuinen osa joka ei näy ellei ensin ole käynyt sillä referer-sivulla ja saanut cookien.

Huomasin ongelman samoin sen että tuli väärällä kielellä nuo säätiedot. siksi poistinkin sen viestin turhaan sotkemasta :)
Puoliksi suunniteltu on hyvin tehty

Jiku

  • Käyttäjä
  • Viestejä: 248
    • Profiili
Vs: php ja curl
« Vastaus #3 : 14.06.09 - klo:16.31 »
Huomasitko että cookie.txt tallentuva eväste on:
Koodia: [Valitse]
FAVS:1|WXSN:1|PWSOBS:1|WPHO:1|PHOT:1|RADC:0|RADALL:0|HIST0:NULL|GIFT:1|PHOTOTHUMBS:50|HISTICAO:EFHK*NULL|
Kun taas operan sivukohtaisista asetuksista katsoo evästettä, se on:
Koodia: [Valitse]
FAVS:1|WXSN:1|PWSOBS:1|WPHO:1|PHOT:1|RADC:0|RADALL:0|HIST0:NULL|GIFT:1|PHOTOTHUMBS:50|HISTICAO:EFHK*NULL|SHOWMETAR:1|
Saisiko tuon "SHOWMETAR:1|" käpisteltyä tuohon lisäksi jotenkin ja auttaisiko se asiaa?

Sen lisäksihän sieltä tallentuu toinen eväste tyyliin: "DT   1244985947:6500:365-b4" mutta sille ei kai  mitään tarvitse tehdä?
Puoliksi suunniteltu on hyvin tehty

Jiku

  • Käyttäjä
  • Viestejä: 248
    • Profiili
Vs: php ja curl
« Vastaus #4 : 14.06.09 - klo:17.22 »
Koodia: [Valitse]
<?php
$lentopaikka 
"EFHK";
$nyt time();

$referer "http://www.wunderground.com/history/airport/" $lentopaikka "/" date(Y$nyt) . "/" date(n$nyt) . "/" date(j$nyt) . "/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1";
$linkki "http://www.wunderground.com/history/airport/" $lentopaikka "/" date(Y$nyt) . "/" date(n$nyt) . "/" date(j$nyt) . "/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1&format=1";
$user_agent "Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.10) Gecko/20080528 Epiphany/2.22 Firefox/3.0"

$cookie_jar "cookie.txt";
# Käydään referer-sivulla jotta cookiet tallennetaan tiedostoon.
$ch curl_init($referer);
curl_setopt($chCURLOPT_USERAGENT$user_agent);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_FOLLOWLOCATION1); 
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_COOKIEJAR$cookie_jar);
echo 
$_COOKIE["DT"];
$page curl_exec($ch);
curl_close($ch);



if(
$fh fopen('cookie.txt''r')){
$str fread ($fhfilesize('cookie.txt'));
$str str_replace("*NULL""*NULL|SHOWMETAR:1"$str);
fclose($fh);
} else {
die (
"Error opening file in ".__FILE__." on line ".__LINE.".");
}

$fh fopen('cookie2.txt''w') or die("can't open file");
fwrite($fh$str);
fclose($fh);



$ch curl_init($linkki);
# Käydään halutulla sivulla ja syötetään tallennetut cookie-tiedot.
curl_setopt($chCURLOPT_URL$linkki);
curl_setopt($chCURLOPT_COOKIEFILE'cookie2.txt');
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
$linkinsisalto curl_exec($ch);
curl_close($ch);

echo 
$linkinsisalto;
?>

Onhan tuo vähän purkkaa, mutta mulla ainakin nyt näyttää ne METAR-sanomatkin siellä lopussa..

edit: @-käppyrät pois
edit2: haluttiin vastaus muuttujaan, joten loppuosaan vielä "curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);" lisäksi.
« Viimeksi muokattu: 14.06.09 - klo:17.51 kirjoittanut Jiku »
Puoliksi suunniteltu on hyvin tehty

Jiku

  • Käyttäjä
  • Viestejä: 248
    • Profiili
Vs: php ja curl
« Vastaus #5 : 14.06.09 - klo:19.28 »
No niin kun tästä on itsellekin käyttöä, niin väsäsin koodia vähän eteenpäin niin että se purkaa pelkät metar-sanomat tekstitiedostoksi.
Koodia: [Valitse]
<?php
$lentopaikka 
"EFHK";
$nyt time();

$referer "http://www.wunderground.com/history/airport/" $lentopaikka "/" date(Y$nyt) . "/" date(n$nyt) . "/" date(j$nyt) . "/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1";
$linkki "http://www.wunderground.com/history/airport/" $lentopaikka "/" date(Y$nyt) . "/" date(n$nyt) . "/" date(j$nyt) . "/DailyHistory.html?req_city=NA&req_state=NA&req_statename=NA&&theprefset=SHOWMETAR&theprefvalue=1&format=1";
$user_agent "Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.10) Gecko/20080528 Epiphany/2.22 Firefox/3.0"

$cookie_jar "cookie.txt";
# Käydään referer-sivulla jotta cookiet tallennetaan tiedostoon.
$ch curl_init($referer);
curl_setopt($chCURLOPT_USERAGENT$user_agent);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_FOLLOWLOCATION1); 
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_COOKIEJAR$cookie_jar);
echo 
$_COOKIE["DT"];
$page curl_exec($ch);
curl_close($ch);



if(
$fh fopen('cookie.txt''r')){
$str fread ($fhfilesize('cookie.txt'));
$str str_replace("*NULL""*NULL|SHOWMETAR:1"$str);
fclose($fh);
} else {
die (
"Error opening file in ".__FILE__." on line ".__LINE.".");
}

$fh fopen('cookie2.txt''w') or die("can't open file");
fwrite($fh$str);
fclose($fh);



$ch curl_init($linkki);
# Käydään halutulla sivulla ja syötetään tallennetut cookie-tiedot.
curl_setopt($chCURLOPT_URL$linkki);
curl_setopt($chCURLOPT_COOKIEFILE'cookie2.txt');
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
$linkinsisalto curl_exec($ch);
curl_close($ch);
$saatiedot fopen ('saatiedot.txt''w');
fwrite($saatiedot$linkinsisalto);
fclose($saatiedot);


$handle fopen("saatiedot.txt""r");
$tallennettava fopen("metarit.txt""w");
$contents '';
while (!
feof($handle)) {
$rivi fgets($handle4096);
  
$parsed get_string_between($rivi"METAR""<br");

if (
$parsed <>"") {
 
fwrite($tallennettava"METAR ".$parsed."<br>\n");}

}
fclose($handle);
fclose($tallennettava);

include (
'metarit.txt'); //näytetään ne nyt ruudulle kun ei muutakaan ole vielä keksinyt..


function get_string_between($string$start$end){
        
$string " ".$string;
        
$ini strpos($string,$start);
        if (
$ini == 0) return "";
        
$ini += strlen($start);   
        
$len strpos($string,$end,$ini) - $ini;
        return 
substr($string,$ini,$len);
}
?>

tuo kommenttien lisääminen koodiin ei ole ihan parhaita puoliani ja ehkä tämän olisi vähän siistimminkin voinut tehdä :)

edit: METAR-sana rivien alkuun..
« Viimeksi muokattu: 14.06.09 - klo:19.30 kirjoittanut Jiku »
Puoliksi suunniteltu on hyvin tehty

ooo

  • Käyttäjä
  • Viestejä: 120
    • Profiili
Vs: php ja curl
« Vastaus #6 : 14.06.09 - klo:22.12 »
Onhan tuo vähän purkkaa, mutta mulla ainakin nyt näyttää ne METAR-sanomatkin siellä lopussa..


Juu oikein hyvin pelittää! Varsin mainio viritelmä siis. Kiitos paljon kun viitsit laittaa aikaasi tähän!  :)
______________________________
Minäkö tyhmä? Nyt en ymmärrä.