login  Naam:   Wachtwoord: 
Registreer je!
 Forum

curl werkt niet

Offline GroundZero - 13/10/2013 20:35 (laatste wijziging 13/10/2013 20:40)
Avatar van GroundZeroLid Beste,

kan een website een curl request blokkeren? ik probeer namelijk statistieken op te halen maar ik krijg slechts een blanke pagina terug (niks)... mijn code:

  1. <?php
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, 'http://na.finalfantasyxiv.com/lodestone/character/2194582/');
  4. curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
  5. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Language: en-us,en;q=0.5'));
  6. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($ch, CURLOPT_HEADER, 1);
  8.  
  9. $result = curl_exec($ch);
  10.  
  11. if(curl_errno($ch)){
  12. echo 'Curl error: ' . curl_error($ch);
  13. } else {
  14. echo $result;
  15. }
  16.  
  17. curl_close($ch);
  18. ?>


Enigste wat ik zie is header info namelijk:

HTTP/1.1 302 Found Server: nginx/1.4.1 Date: Sun, 13 Oct 2013 18:39:07 GMT Transfer-Encoding: chunked Connection: close Cache-Control: no-cache Location: http://na.final...2194582%2F Vary: User-Agent Content-Language: en-US Set-Cookie: ldst_touchstone=1; domain=finalfantasyxiv.com; path=/; expires=Wed, 11-Oct-2023 18:39:07 GMT Set-Cookie: ldst_is_support_browser=0; domain=finalfantasyxiv.com; path=/; expires=Wed, 11-Oct-2023 18:39:07 GMT; HttpOnly Set-Cookie: ldst_sess=0f7c13a1108f3cc822d49020356983a4dbaebebb; domain=finalfantasyxiv.com; path=/; expires=Tue, 12-Nov-2013 18:39:07 GMT; HttpOnly X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN

5 antwoorden

Gesponsorde links
Offline Martijn2008 - 13/10/2013 21:33
Avatar van Martijn2008 PHP beginner Ik vermoed dat het mis gaat in je IF-lus. Methode curl_errno returnt 0 als er geen errors zijn. Je moet je IF-lus dus aanpassen naar dit:

  1. <?php
  2.  
  3. if(curl_errno($ch) > 0)
  4. {
  5. echo 'Curl error: ' . curl_error($ch);
  6. }
  7. else
  8. {
  9. echo $result;
  10. }
  11.  
  12. curl_close($ch);
  13. ?>

Offline Joost - 13/10/2013 21:47 (laatste wijziging 13/10/2013 21:49)
Avatar van Joost PHP expert Als je de response goed bekijkt, zie je dat je een 302 redirect krijgt http://na.final...2194582%2F . Je zult dus dit adres nog een keer moeten aanroepen om de inhoud daarvan te krijgen. Zie http://stackove...found-curl

Dit zal je probleem waarschijnlijk niet oplossen overigens omdat je een niet ondersteunde browser pagina krijgt. Je zal bij je CURL request dus voor moeten doen alsof je een ondersteunde browser bent.
Bedankt door: GroundZero
Offline GroundZero - 13/10/2013 21:48 (laatste wijziging 13/10/2013 21:53)
Avatar van GroundZero Lid ik ga het meteen even proberen, is mijn 1e keer met curl dus zal eens kijken hoe ver ik kom, dankjewel!

P.S. Krijg het niet voor elkaar, ik accepteer cookies, heb de browser versie verhoogt en van alles maar kom er niet door heen... nu geeft hij een foutmelding dat hij enkele includes mist..

Ik wil eigenlijk gewoon de inhoud van die pagina in een variabele hebben zodat ik met explode en preg_replace informatie er uit kan halen 
Offline Stijn - 15/10/2013 23:17 (laatste wijziging 15/10/2013 23:23)
Avatar van Stijn PHP expert Waarom niet gewoon met PHP.net: file_get_contents ?

Edit

blijkbaar krijg je een error hierdoor. Je wordt geredirect naar een andere pagina. althans als ik het test is het zo.
Offline Thomas - 18/10/2013 15:29 (laatste wijziging 18/10/2013 15:39)
Avatar van Thomas Moderator Ik heb het voor elkaar gekregen om de profielpagina van de gebruiker op te vragen via cURL.

Ik denk dat de volgende twee zaken doorslaggevend zijn:
- de user agent; die uit je originele post was te oud (je komt terecht op de deze-browser-wordt-niet-ondersteund pagina)
de user agent die ik heb gebruikt is Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0 (laatste versie van Firefox geloof ik)
- gebrek aan output escaping
Je zegt dat je een foutmelding krijgt dat je enkele includes mist; is dit toevallig de melding:
  1. Not Found
  2.  
  3. The requested URL /lodestone/error/cookie_disabled/ was not found on this server.

In principe ging je cURL-request na het aanpassen van je user agent goed, ECHTER:
- je hebt aangegeven dat je de headers van de response wilt zien (CURLOPT_HEADER 1)
- je drukt de response unescaped af, oftewel je stuurt een complete rauwe HTTP-response naar je browser, deze raakt hierdoor van slag, waardoor je wordt geredirect, en dan ben je ineens je cookies kwijt, waardoor de website niet meer werkt (je ziet ook even een zwarte pagina voorbij flitsen als het goed is, tenzij de pagina caching van je browser aan staat, dan onthoudt deze mogelijk redirects )

Het volgende werkt wel (ik heb <pre> toegevoegd om het e.e.a. nog wat leesbaarder te maken):
  1. <?php
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, 'http://na.finalfantasyxiv.com/lodestone/character/2194582/');
  4. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0');
  5. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Language: en-us,en;q=0.5'));
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($ch, CURLOPT_HEADER, 1);
  8.  
  9. $result = curl_exec($ch);
  10.  
  11. if(curl_errno($ch) > 0){
  12. echo 'Curl error: '.curl_error($ch);
  13. } else {
  14. echo '<pre>'.htmlentities($result).'</pre>'; // ESCAPE OUTPUT!
  15. }
  16. curl_close($ch);
  17. ?>


Dan nog wat zaken:
- mogelijk is het verstandig om de HTTP-request te doen met de header Cache-Control: no-cache zodat je geen gecached antwoord leest, maar altijd de informatie opnieuw ophaalt
- er zijn wel meer van dit soort spinoffs van karakterprofiel-sites (als dat je doel is); je doet er verstandig aan dat als je de profielinformatie eenmaal hebt uitgelezen, je deze zelf ook ergens opslaat / cached voor een bepaalde tijd; die FF site is soms nogal traag, dus om nu elke keer die informatie binnen te trekken duurt nogal lang, daarnaast loop je de kans om geblacklist te worden als je die site bashed met honderden verzoeken voor profiel-informatie...

EDIT: benadrukken ESCAPEN output

EDIT2: er lijkt trouwens geen API/webservice/whatever te zijn voor het uitlezen van karakterprofielen, wat natuurlijk veel handiger zou zijn dan het rippen van een webpagina. Gezien de rommeligheid van de broncode is dat nog een uitdaging op zich, jammer dat ze geen opgemaakte XML hebben gebruikt, dan had je alle informatie in 1x gestructureerd binnen kunnen halen waarschijnlijk...
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.22s