PHP file_get_contents () devuelve "no se pudo abrir la secuencia: ¡la solicitud HTTP falló!"


91

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 realizar la llamada, obtengo:

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

El código que estoy usando es:

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

Como dije, llame desde el navegador y funciona bien. ¿Alguna sugerencia?

También probé con otra URL como:

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

Esto funciona bien ... ¿podría ser que la URL a la que necesito llamar tenga un segundo http://?

Respuestas:


111

Intente usar 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);

?>

11
Esto es demasiado complicado cuando el problema real está dentro de los símbolos de unión.
Christian

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

4
No todo el mundo tiene (pero debería) cURL instalado. cURL seguro que es muchas veces más rápido, pero no es file_get_contents que lenta tampoco, y no requiere que usted recuerda todas las opciones cada vez que lo usas.
Christian

1
Esto CURLOPT_USERAGENTfue muy importante en mi caso, ¡gracias!
emotality

Creo que mi problema fue que se agotó el tiempo y esto lo solucionó. ¡Gracias!
evadecaptcha

28

Tuve el mismo error que tenía el OP, y este era mi problema: espacios en los argumentos. urlencode()en los parámetros GET resolvió el problema.
Walt W

Si no desea utilizar la solución CURL, ¡esta funciona! Utilice el URLecnode en los parámetros.
Aaron Gong

Ésta es la solución real a este problema.
Henrik Petterson

23
<?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 obtuviste de: php.net/manual/en/ref.curl.php El principal problema es que la llamada a la función get_urldebería ser, get_fcontentya que cambiaste el nombre de la función. En realidad, esta es una llamada de función recursiva que vuelve a intentar obtener el contenido de la URL cambiando algunos parámetros.
SSH Este

¡lo tienes! estaba tratando de https y fue rechazado. lo lograste. UPVOTED;)
tony gil

21

file_get_contents()utiliza los fopen()envoltorios, por lo que no puede acceder a las URL a través de la allow_url_fopenopción dentro de php.ini.

Deberá modificar su php.ini para activar esta opción o utilizar un método alternativo, a saber, cURL , con mucho la forma más popular y, para ser honesta, estándar de lograr lo que está tratando de hacer.


No importa, acabo de notar que dijo que file_get_contents()trabajaba en una URL diferente. No obstante, este sigue siendo un buen consejo para otras personas que tienen este problema.
Michael Wales

sí, he mirado otras opciones y veo que cURL es la forma estándar de hacerlo, pero lo intenté porque era más fácil y trabajé con otras URL, creo que tengo que reiniciar Apache para intsall cURL y no puedo averiguar cómo hacer esto (otra pregunta) ... gracias por su rápida respuesta
indefinido

11

Básicamente, debe enviar cierta información con la solicitud.

Prueba 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 mi


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

Si la URL parece estar codificada correctamente, este podría ser el problema. Algunos sitios restringirán sobre 'Usuario-Agente', quizás 'Aceptar' también.
Jahmic

1
super respuesta. vote para promover este a la cima. todo en php y también funcionó para la solicitud https. sólo dos líneas adicionales de código. ¿Qué pasa si el servidor compartido proporciona curl? esto es muy útil.
ndasusers

10

Noto que su URL tiene espacios. Creo que eso suele ser algo malo. Intente codificar la URL con

$my_url = urlencode("my url");

y luego llamando

file_get_contents($my_url);

y mira si tienes mejor suerte.


4

Tuve un problema similar, analicé 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 me doy cuenta de que $this->video_urlincluyen los espacios en blanco. Resolví eso usando trim($this->video_url).

Quizás te ayude. Buena suerte


3

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

Intente codificar urlen () la URL.


gracias - estos son parámetros para la instancia de mediaplug. Si codifico la url, todavía no funciona, obtengo una url muy confusa en el error ... ??
undefined

Debería codificar solo la cadena de parámetros: "convertir formato" debería ser "convertir% 20format" (o alternativamente "convertir + formato").
Bobince

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

2

Tengo un problema similar.

¡Debido al tiempo de espera!

El tiempo de espera se puede indicar así:

$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => "POST",
        'content' => http_build_query($data2),
        'timeout' => 30,
    ),
);
$context = stream_context_create($options); $retour =
$retour = @file_get_contents("http://xxxxx.xxx/xxxx", false, $context);

lol que solucionó mi problema, muchas gracias!
Niggo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.