/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
"Grab" tekst fra SHOUTcast Song History
Fra : Ace


Dato : 21-01-10 09:43

Hejza

Jeg har før skrevet herinde og spurgt til forskellige måder
hvorpå man kan "grabbe" tekst fra andre sider via PHP, og I har
hver gang formået at hjælpe mig til fulde :) Jeg er dog nu igen
stødt på en tricky en...
Jeg kunne godt tænke mig at grabbe teksten, der står som "Current
Song", på http://78.157.97.206:8000/played.html

Jeg har forsøgt mig med følgende php-script:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div"><?php
$dom = new DomDocument();
$dom->loadHTMLFile("http://78.157.97.206:8000/played.html");
$song = $dom->getElementsByTagName("td");
print $song->item(15)->textContent; ?></div>
</body>
</html>

.. men resultatet af dette bliver bare:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div">div>
</body>
</html>

.. altså lykkes det øjensynligt ikke scriptet, at grabbe noget
som helst :(

Jeg ved selvfølgelig ikke om der, på SHOUTcast's Song History, er
en eller anden foranstaltning, der forhindrer den her slags
grab-metode. Men hvis der er én af jer, som kan gennemskue
hvordan dette kan gøres, vil jeg være taknemmelig.

Venligst
Ace

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Martin (21-01-2010)
Kommentar
Fra : Martin


Dato : 21-01-10 19:15

On 21-01-2010 09:42, Ace wrote:
> $dom = new DomDocument();
> $dom->loadHTMLFile("http://78.157.97.206:8000/played.html");

Det er altid en god idé at fejlsøge først

$html = $dom->loadHTML.....

var_dump($html);
exit;

// Returns

Warning:
DOMDocument::loadHTMLFile(http://78.157.97.206:8000/played.html)
[domdocument.loadhtmlfile]: failed to open stream: HTTP request failed!
ICY 404 Resource Not Found in D:\wwwroot\localhost\www\grab.php on line 5

Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: I/O
warning : failed to load external entity
"http://78.157.97.206:8000/played.html" in
D:\wwwroot\localhost\www\grab.php on line 5
bool(false)

Dette er fordi PHP ikke kan læse fra en anden port end port 80 af...

Så du skal have fat i cURL istedet...

$ch = curl_init("http://78.157.97.206/played.html");
// Bemærk ingen port i URL'en !
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
// Her sætter vi først porten
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);

var_dump($content);
exit;

En fandens masse HTML får du så retur...
Nu kan du så loade HTML'en ind i DOMDocument

$dom = new DomDocument();
$debug = $dom->loadHTML($content);
var_dump($debug); // får vi det rigtige retur?

Som jeg lige hurtigt har gennemskuet DOMen så ser det ud til at der
mangler at blive afsluttet en <font> så jeg tror du får en lille fejl.

> $song = $dom->getElementsByTagName("td");

Ace (22-01-2010)
Kommentar
Fra : Ace


Dato : 22-01-10 09:21

Martin skrev:

> Det er altid en god idé at fejlsøge først

Ja det har selvfølgelig ret i :) Desværre er jeg oprigtig talt bare en
knallert til det her med PHP, så var desværre ikke engang klar over hvordan
jeg skulle bære mig ad med en umiddelbar fejlsøgning :)

> En fandens masse HTML får du så retur...
> Nu kan du så loade HTML'en ind i DOMDocument

Vil det så sige, at scriptet skal se sådan ud?:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div"><?php
$ch = curl_init("http://78.157.97.206/played.html");
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);
var_dump($content);
exit;
$dom = new DomDocument();
$debug = $dom->loadHTML($content);
var_dump($debug);
$song = $dom->getElementsByTagName("td");
print $song->item(15)->textContent;?></div>
</body>
</html>

> Som jeg lige hurtigt har gennemskuet DOMen så ser det ud til at der
> mangler at blive afsluttet en <font> så jeg tror du får en lille fejl.

Med scriptet sat sammen, som det står ovenfor, kan siden ganske enkelt ikke
vises i hverken IE eller Firefox :( Beklager hvis det er mig der overser
noget totalt indlysende, men ville du evt. have noget i mod, at sammensætte
scriptet for mig, så det kan vises i browseren?

Venligst
Ace

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Martin Larsen (22-01-2010)
Kommentar
Fra : Martin Larsen


Dato : 22-01-10 10:12

Ace wrote:

> Med scriptet sat sammen, som det står ovenfor, kan siden ganske enkelt ikke
> vises i hverken IE eller Firefox:( Beklager hvis det er mig der overser
> noget totalt indlysende, men ville du evt. have noget i mod, at sammensætte
> scriptet for mig, så det kan vises i browseren?

Shoutcast synes at forespørgslen fra cUrl ser mistænkelig ud, så vi skal
have cUrl til at forklæde sig som fx Firefox:

curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows;
U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7:
1.0');

Der ud over er html'en fra Shoutcast ukorrekt, og det giver problemer
for Dom.

Enten skal du bruge Tidy til at korrigere html'en, eller du kan bruge
regex. Jeg foreslår det sidste i dette tilfælde.

Så ser koden sådan ud:

$ch = curl_init("http://78.157.97.206/played.html");
curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows;
U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7:
1.0');
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);
preg_match('|<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>|is', $content, $matches);
$current = $matches['current'];
echo $current;

Hilsen
Martin

Martin Larsen (22-01-2010)
Kommentar
Fra : Martin Larsen


Dato : 22-01-10 10:14

Bemærk at linje 2 er brudt, det skal være én lang linje

Ace (22-01-2010)
Kommentar
Fra : Ace


Dato : 22-01-10 10:48

Martin Larsen skrev:

> Bemærk at linje 2 er brudt, det skal være én lang linje

Yes, jeg tog højde for at linjen var brudt, men det lader
desværre stadig ikke til at fungere :(

Test:
http://clubace.dk/CAplayer/on_kristennetradio_rawSource.php

I ovenstående php-dokument ser koden således ud:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div"><?php
$ch = curl_init("http://78.157.97.206/played.html");
curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0
(Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909
Firefox/1.5.0.7: 1.0');
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);
preg_match('<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>is', $content, $matches);
$current = $matches['current'];
echo $current; ?></div>
</body>
</html>

.. browseren kan tilsyneladende stadig vise siden.

Nu er jeg som sagt total novice hvad dette angår, så mit følgende
spøgsmål vil sikkert få én til at ryste på hovedet i
fortvivlelse.. men skal man sætte sin computer op til at kunne
afvikle cURL, eller sådan noget? Jeg har på nuværende tidspunkt
blot installeret Apache og PHP5.

Venligst
Ace

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Martin Larsen (22-01-2010)
Kommentar
Fra : Martin Larsen


Dato : 22-01-10 11:38

Ace wrote:

> browseren kan tilsyneladende stadig vise siden

Du har ikke kopieret min kode korrekt ind!

Linjen med preg_match() skal være:

preg_match('|<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>|is', $content, $matches);

Du har af en eller anden grund fjernet de to lodrette streger, og den
går altså ikke!

> men skal man sætte sin computer op til at kunne
> afvikle cURL, eller sådan noget? Jeg har på nuværende tidspunkt
> blot installeret Apache og PHP5

Ja, det skal man.

Hvis det er Windows, skal du finde din php.ini og lede efter følgende linje:

extension=php_curl.dll

Hvis der står et semikolon foran skal du fjerne det. Og så skal du sikre
dig at php_curl.dll findes i mappen ext.

Er det Linux, afhænger det lidt af din disto.

Men måske er curl allerede aktivt. Prøv at lave en fil med <?php
phpinfo(); ?> i og se hvad outputter er. Søg efter "curl" i browseren.

Hilsen
Martin

Ace (22-01-2010)
Kommentar
Fra : Ace


Dato : 22-01-10 19:24

Martin Larsen skrev:

> Du har ikke kopieret min kode korrekt ind!

Okay, lyder lidt mærkeligt.. jeg markerede ellers bare din kode, og satte den
direkte ind i mit php-dokument :S

> Linjen med preg_match() skal være:
>
> preg_match('<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
> Song</b></td>\s*</tr>is', $content, $matches);
>
> Du har af en eller anden grund fjernet de to lodrette streger, og den
> går altså ikke!

Undskyld, men hvilke to lodrette streger referer du til?

> Hvis det er Windows, skal du finde din php.ini og lede efter følgende linje:
>
> extension=php_curl.dll
>
> Hvis der står et semikolon foran skal du fjerne det. Og så skal du sikre
> dig at php_curl.dll findes i mappen ext.

Ja, det er Windows jeg bruger, og jeg har nu fjernet semikolonet der stod foran
extension=php_curl.dll i min php.ini, og sikret mig at php_curl.dll ligger i
ext-mappen :) Skulle min computer så være sat op til cURL?

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Martin Larsen (23-01-2010)
Kommentar
Fra : Martin Larsen


Dato : 23-01-10 14:22

Ace wrote:

> Undskyld, men hvilke to lodrette streger referer du til?

Det kunne se ud som om dit mailprogram simpelthen fjerner de to lodrette
streger. For de er væk når du citerer linjerne! Her er to lodrette
streger mellem udråbstegnene, ser du dem? !||!

Nå, men så bruger vi bare et andet tegn, fx nummertegn ##, og linjen ser
da sådan du:

preg_match('#<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>#is', $content, $matches);

> Ja, det er Windows jeg bruger, og jeg har nu fjernet semikolonet der stod foran
> extension=php_curl.dll i min php.ini, og sikret mig at php_curl.dll ligger i
> ext-mappen :) Skulle min computer så være sat op til cURL?

Ja.

Men du skal genstarte Apache før det virker.

Hilsen
Martin



Martin Larsen (23-01-2010)
Kommentar
Fra : Martin Larsen


Dato : 23-01-10 21:14

Du kan se det i aktion her:

http://kreacom.dk/files/shoutcast.php

Og kildeteksten her:

http://kreacom.dk/files/shoutcast.txt

Så skulle der ikke være problemer med manglende tegn

Hilsen
Martin

Chano Andersen (23-01-2010)
Kommentar
Fra : Chano Andersen


Dato : 23-01-10 19:47

Martin Larsen skrev:
> Der ud over er html'en fra Shoutcast ukorrekt, og det giver problemer
> for Dom.
>
> Enten skal du bruge Tidy til at korrigere html'en, eller du kan bruge
> regex. Jeg foreslår det sidste i dette tilfælde.

Alternativt skal man i stedet loade XML status filen fra Shoutcast
serveren. Den findes i dette tilfælde på:
http://78.157.97.206:8000/admin.cgi?pass=yourpass&mode=viewxml&page=0

yourpass skal naturligvis erstattes med admin passwordet.

- Chano Andersen

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409075
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste