How can I send cookies using PHP curl in addition to CURLOPT_COOKIEFILE?

后端 未结 4 1526
花落未央
花落未央 2020-11-27 16:31

I am scraping some content from a website after a form submission. The problem is that the script is failing every now and then, say 2 times out of 5 the script fails. I am

相关标签:
4条回答
  • 2020-11-27 16:57

    Here is a list of examples for sending cookies - https://github.com/andriichuk/php-curl-cookbook#cookies

    $curlHandler = curl_init();
    
    curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://httpbin.org/cookies',
    CURLOPT_RETURNTRANSFER => true,
    
    CURLOPT_COOKIEFILE  => $cookieFile,
    CURLOPT_COOKIE => 'foo=bar;baz=foo',
    
    /**
     * Or set header
     * CURLOPT_HTTPHEADER => [
           'Cookie: foo=bar;baz=foo',
       ]
     */
    ]);
    
    $response = curl_exec($curlHandler);
    curl_close($curlHandler);
    
    echo $response;
    
    0 讨论(0)
  • 2020-11-27 17:13

    If the cookie is generated from script, then you can send the cookie manually along with the cookie from the file(using cookie-file option). For example:

    # sending manually set cookie
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: test=cookie"));
    
    # sending cookies from file
    curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
    

    In this case curl will send your defined cookie along with the cookies from the file.

    If the cookie is generated through javascrript, then you have to trace it out how its generated and then you can send it using the above method(through http-header).

    The utma utmc, utmz are seen when cookies are sent from Mozilla. You shouldn't bet worry about these things anymore.

    Finally, the way you are doing is alright. Just make sure you are using absolute path for the file names(i.e. /var/dir/cookie.txt) instead of relative one.

    Always enable the verbose mode when working with curl. It will help you a lot on tracing the requests. Also it will save lot of your times.

    curl_setopt($ch, CURLOPT_VERBOSE, true);
    
    0 讨论(0)
  • 2020-11-27 17:15

    Try below code,

    $cookieFile = "cookies.txt";
    if(!file_exists($cookieFile)) {
        $fh = fopen($cookieFile, "w");
        fwrite($fh, "");
        fclose($fh);
    }
    
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiCall);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // Cookie aware
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // Cookie aware
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    if(!curl_exec($ch)){
        die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
    }
    else{
        $response = curl_exec($ch); 
    }
    curl_close($ch);
    $result = json_decode($response, true);
    
    echo '<pre>';
    var_dump($result);
    echo'</pre>';
    

    I hope this will help you.

    Best regards, Dasitha.

    0 讨论(0)
  • 2020-11-27 17:15

    I think the only cookie you need is JSESSIONID=xxx..

    Also NEVER share your cookies, becasuse someone may access your personal data that way. Specially when the cookies are session. These cookies will stop working once you logout the site.

    0 讨论(0)
提交回复
热议问题