2009-03-30 27 views
58

Tengo problemas para llamar a una url desde el código PHP. Necesito llamar a un servicio usando una cadena de consulta de mi código PHP. Si escribo la url en un navegador, funciona bien, pero si uso file-get-contents() para hacer la llamada, obtengo:PHP file_get_contents() devuelve "no se pudo abrir la secuencia: ¡Falló la solicitud HTTP!"

Advertencia: file-get-contents (http: // ....) no se pudo abrir la secuencia: ¡Falló la solicitud HTTP! HTTP/1.1 202 Aceptado en ...

El código que estoy utilizando es:

$query=file_get_contents('http://###.##.##.##/mp/get?mpsrc=http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv'); 
echo($query); 

Como dije - llamada desde el navegador y funciona bien. ¿Alguna sugerencia?

también he intentado con otro enlace como:

$query=file_get_contents('http://www.youtube.com/watch?v=XiFrfeJ8dKM'); 

Esto funciona bien ... ¿podría ser que la url Tengo que llamar tiene una segunda http:// en ella?

Respuesta

85

Intente utilizar cURL.

<?php 

$curl_handle=curl_init(); 
curl_setopt($curl_handle, CURLOPT_URL,'http://###.##.##.##/mp/get?mpsrc=http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv'); 
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name'); 
$query = curl_exec($curl_handle); 
curl_close($curl_handle); 

?> 
+4

Esto es demasiado complicado cuando el problema real se encuentra dentro de los símbolos. – Christian

+0

@Christian, ¿puedes dar más detalles? – vonUbisch

+4

No todos tienen (pero deberían) cURL instalado. CURL es mucho más rápido, pero file_get_contents no * * tampoco se ralentiza, y no requiere que recuerde todas las opciones cada vez que lo use. – Christian

2

No estoy seguro acerca de los parámetros (mpaction, formato), si se especifican para la página de amazonaws o ##. ##.

Probar urlencode() la url.

+0

gracias - estos son parametros para la instancia mediaplug. Si urlencode la URL todavía no funciona, obtengo una url muy confusa en el error ... ?? – undefined

+0

¿qué tipo de error? urlencode no oculta url. – SilentGhost

+0

Debe codificar solo la cadena de parámetros: "formato de conversión" debe ser "convertir% 20formato" (o alternativamente "convertir + formato"). – bobince

5

que notar que su URL tiene espacios en él. Creo que generalmente es algo malo. Intenta que codifica la dirección URL con

$my_url = urlencode("my url"); 

y luego llamar

file_get_contents($my_url); 

y ver si tiene más suerte.

16

file_get_contents() utiliza los contenedores fopen(), por lo tanto, está restringido para acceder a las URL a través de la opción allow_url_fopen dentro de php.ini.

Deberá modificar su php.ini para activar esta opción o usar un método alternativo, es decir, cURL, la forma más popular y sincera para lograr lo que está tratando de hacer.

+0

No importa, acabo de notar que dijo 'file_get_contents()' trabajó en una URL diferente. Sin embargo, este sigue siendo un buen consejo para otros que tienen este problema. –

+0

sí, he analizado otras opciones y veo que cURL es la forma estándar de hacerlo, pero lo intenté porque era más fácil y funcionaba con otras direcciones URL. Creo que tengo que reiniciar apache para intsall cURL. y no puedo entender cómo hacer esto (otra pregunta) ... gracias por su rápida respuesta – undefined

19
<?php 

$lurl=get_fcontent("http://ip2.cc/?api=cname&ip=84.228.229.81"); 
echo"cid:".$lurl[0]."<BR>"; 


function get_fcontent($url, $javascript_loop = 0, $timeout = 5) { 
    $url = str_replace("&amp;", "&", urldecode(trim($url))); 

    $cookie = tempnam ("/tmp", "CURLCOOKIE"); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1"); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_ENCODING, ""); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); # required for https urls 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10); 
    $content = curl_exec($ch); 
    $response = curl_getinfo($ch); 
    curl_close ($ch); 

    if ($response['http_code'] == 301 || $response['http_code'] == 302) { 
     ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1"); 

     if ($headers = get_headers($response['url'])) { 
      foreach($headers as $value) { 
       if (substr(strtolower($value), 0, 9) == "location:") 
        return get_url(trim(substr($value, 9, strlen($value)))); 
      } 
     } 
    } 

    if ( (preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value)) && $javascript_loop < 5) { 
     return get_url($value[1], $javascript_loop+1); 
    } else { 
     return array($content, $response); 
    } 
} 


?> 
+5

Gracias por el código, parece que lo obtuvo de: http://php.net/manual/en/ref.curl.php El principal problema es la llamada a la función 'get_url' en realidad debería ser' get_fcontent' ya ha cambiado el nombre de la función en sí. En realidad, se trata de una llamada de función recursiva que vuelve a intentar obtener el contenido de la URL cambiando algunos parámetros. –

+0

¡lo tienes! estaba tratando de https y estaba siendo rechazado. lo lograste. ACTUALIZADO;) –

2

tengo un problema similar, que Analizada la url de YouTube. El código es;

$json_is = "http://gdata.youtube.com/feeds/api/videos?q=".$this->video_url."&max-results=1&alt=json"; 
$video_info = json_decode (file_get_contents ($json_is), true);  
$video_title = is_array ($video_info) ? $video_info ['feed'] ['entry'] [0] ['title'] ['$t'] : ''; 

Entonces se dan cuenta de que $this->video_url incluyen el espacio en blanco. Lo solucioné usando trim($this->video_url).

Quizás te ayude.Buena suerte

-3

Utilice esta

file_get_contents($my_url,null,null); 
3

Es, básicamente, está obligado a enviar alguna información con la solicitud.

Prueba de esto,

$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); 
//Basically adding headers to the request 
$context = stream_context_create($opts); 
$html = file_get_contents($url,false,$context); 
$html = htmlspecialchars($html); 

Esto funcionó para mí

+1

¡Esto también funcionó para mí! Parece que necesitaba un agente de usuario – bryan

+1

Esto también me funciona, ¡gracias! – Fwolf

Cuestiones relacionadas