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://?

indefinido
fuente

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

?>
James Hall
fuente
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
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 );
    }
}


?>
pangeli
fuente
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.

Michael Gales
fuente
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

d_bhatnagar
fuente
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.

Delgado
fuente
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

Emre Karataşoğlu
fuente
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.

alexn
fuente
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')));
Sergey
fuente
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);
alemán
fuente
lol que solucionó mi problema, muchas gracias!
Niggo
-3

Utilizar esta

file_get_contents($my_url,null,null);
Amit Chawla
fuente