【问题标题】:PHP: Cannot retrieve correct ajax response using curl or file_get_contentsPHP:无法使用 curl 或 file_get_contents 检索正确的 ajax 响应
【发布时间】:2012-01-15 05:50:32
【问题描述】:
  1. Start page
  2. Frame page
  3. End page

我无法弄清楚我错过了什么。我试过模仿firefox的请求头,但是没用。

此外,框架页面使用 javascript ajax 请求到达结束页面。它将数据发布到$post_to_link(参见下面的代码),然后导航到expected result(不是我的current result),即megaupload 链接所在的位置。

预期输出:

/membersonly/components/com_iceplayer/GMorBMlet.php?url=http%3A%2F%2Fwww.megaupload.com%2F%3Fd%3DVNICBFWL&

当前输出:

  • file_get_contents 输出 3
  • curl 输出错误 403 禁止访问

这是我的代码:

    // call it like so...
    echo GetHosterLink( 1148, 252636, '', '37fn8Oklq', 15, -75 );
    // $s is incremented every second you are 'visiting' the referer page
    // $m decreases below zero when you move your mouse `down` on the start page

    function GetHosterLink( $id, $link_id, $cap, $sec, $s, $m )
    {

        $link_page = str_replace( '[ID]', $id, 'http://www.icefilms.info/membersonly/components/com_iceplayer/video.php?vid=[ID]' );
        $post = "id={$link_id}&s={$s}&iqs=&url=&m={$m}&cap=&sec={$sec}&t={$id}";

        $header = implode( "\r\n", array(
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
            "Accept-Encoding: gzip, deflate",
            "Accept-Language: en-us,en;q=0.5",
            "Cache-Control: no-cache",
            "Connection: keep-alive",
            "Content-Length: " . strlen( $post ),
            "Content-Type: application/x-www-form-urlencoded; charset=UTF-8",
            "Host: www.icefilms.info",
            "Pragma: no-cache",
            "Referer: http://www.icefilms.info/membersonly/components/com_iceplayer/video.php?h=374&w=631&vid={$id}&img=",
            "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0"
        ));

        $opts = array('http' =>
            array(
                'method'  => 'POST',
                'header'  => implode("\r\n",
                    array(
                        'Content-type: application/x-www-form-urlencoded',
                        'Content-length: ' . strlen( $post ),
                        'Referer: ' . $link_page . '&h=374&w=631',
                        'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0',
                        'Host: www.icefilms.info'
                    )
                ),
                'content' => http_build_query(
                    array(
                        'id' => $link_id,
                        's' => $s,
                        'sec' => $sec,
                        't' => $id,
                        'm' => $m,
                        'iqs' => '',
                        'url' => '',
                        'cap' => ''
                    )
                )
            )
        );

        $context  = stream_context_create($opts);

        $post_to_link = 'http://www.icefilms.info/membersonly/components/com_iceplayer/video.phpAjaxResp.php';
        $get_result = file_get_contents( $post_to_link, false, $context );

        $f_result = cURL::DoRequest( $post_to_link, $post, '',
            array( array( CURLOPT_HTTPHEADER, $header ) ) );

        $f_r = array(
            'result' => $f_result,
            'get_result' => $get_result,
            'get_opts' => $opts,
            'get_response' => $http_response_header,
            'req_post' => $post,
            'req_href' => $post_to_link,
            'req_header' => $header
        );

        return ( $f_r );

    }

这是我的curl.php 文件:

class cURL
{

    public static function DoRequest( $url, $post = '',
        $cookie_file = '', $variables = array() )
    {

        $curl = curl_init();
        @session_start();
        $cookie = ( 'PHPSESSID=' . session_id() . '; path=/' );
        @session_write_close();

        curl_setopt( $curl, CURLOPT_URL, $url );
        curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt( $curl, CURLOPT_COOKIE, $cookie );

        if ( !empty( $cookie_file ) )
        {

            curl_setopt( $curl, CURLOPT_COOKIEFILE, $cookie_file );
            curl_setopt( $curl, CURLOPT_COOKIEJAR, $cookie_file );

        }

        if ( !empty( $post ) )
        {

            //curl_setopt( $curl, CURLOPT_POST, 1 );
            curl_setopt( $curl, CURLOPT_POSTFIELDS, $post );

        }

        foreach ( $variables as $var )
            curl_setopt( $curl, $var[0], $var[1] );

        $result = curl_exec( $curl );
        curl_close( $curl );

        return ( $result );

    }

}

【问题讨论】:

  • 我也不知道你错过了什么。你想做什么?
  • @HelgiHrafnGunnarsson 我正在尝试访问框架页面,获取sec 变量并将信息发布到$post_to_link 以检索megaupload 链接。我过去或现在的方法都没有给出正确的输出,它要么是编码的(?),要么是数字,要么是 403 被禁止。
  • 网站可能使用会话,所以你必须有有效的会话。
  • @webarto 如果您查看我的 curl 课程,您会注意到我将相同的会话从我的站点强制执行到网页上。如果你的意思是他们使用会话变量,那么也许。

标签: php ajax curl http-headers file-get-contents


【解决方案1】:

尝试使用 curl 访问初始页面(您在 $link_page 中的网址)并确保您指向的文件:

curl_setopt( $curl, CURLOPT_COOKIE, $cookie );

存在且可写。

然后请求具有相同 curl 资源的 $post_to_link url。

通过访问初始页面,您将获得 cookie,并确保您的下一个请求存在有效会话。这也可以保护您随后在标题中提供的引用者。有很多方法可以计算“自动”请求,并且检查 cookie 以及您是否真的访问过“referer”-ed 链接之类的事情很常见。

【讨论】:

  • +1 我也猜这是一个受会话/cookie 保护的成员区域。使用 curl 登录,获取 cookie 并重新使用存储的 cookie 似乎是正确的轨道。
猜你喜欢
  • 2018-11-02
  • 2013-07-23
  • 1970-01-01
  • 2015-08-28
  • 2016-02-20
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2015-11-17
相关资源
最近更新 更多