Então, alguém de outra empresa achou que seria incrível se, em vez de usar sabão ou xml-rpc ou rest ou qualquer outro protocolo de comunicação razoável, ele apenas incorporasse toda a sua resposta como cookies no cabeçalho.
Eu preciso puxar esses cookies como espero que uma matriz desta resposta de curl. Se eu tiver que perder um monte de minha vida escrevendo um analisador para isso, ficarei muito infeliz.
Alguém sabe como isso pode ser feito simplesmente, de preferência sem gravar nada em um arquivo?
Ficarei muito grato se alguém puder me ajudar com isso.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'callback_SaveHeaders');
parse_str($m[1], $cookies)
, que irá encher os biscoitos em uma matriz associativa na$cookies
variável ....preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); }
Embora essa pergunta seja bastante antiga e a resposta aceita seja válida, acho um pouco desconfortável porque o conteúdo da resposta HTTP (HTML, XML, JSON, binário ou o que for) se mistura com os cabeçalhos.
Eu encontrei uma alternativa diferente. CURL fornece uma opção (
CURLOPT_HEADERFUNCTION
) para definir um retorno de chamada que será chamado para cada linha de cabeçalho de resposta. A função receberá o objeto curl e uma string com a linha do cabeçalho.Você pode usar um código como este (adaptado da resposta TML):
Esta solução tem a desvantagem de usar uma variável global, mas acho que isso não é um problema para scripts curtos. E você sempre pode usar métodos e atributos estáticos se o enrolamento estiver sendo agrupado em uma classe.
fonte
$cookies
.$curlResponseHeaderCallback = function ($ch, $headerLine) use (&$cookies) {
entãocurl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlResponseHeaderCallback);
.$class->curlResponseHeaderCallback()
? Ou você apenas temcurlResponseHeaderCallback
fora da classe?Isso é feito sem regexps, mas requer a extensão HTTP PECL .
fonte
pecl install
realmente funcionasse. Grrr.Se você usar CURLOPT_COOKIE_FILE e CURLOPT_COOKIE_JAR, o curl lerá / gravará os cookies de / para um arquivo. Você pode, depois que o enrolamento terminar, ler e / ou modificá-lo da maneira que desejar.
fonte
A libcurl também fornece CURLOPT_COOKIELIST que extrai todos os cookies conhecidos. Tudo que você precisa é garantir que a ligação PHP / CURL possa usá-la.
fonte
alguém aqui pode achar útil. hhb_curl_exec2 funciona praticamente como curl_exec, mas arg3 é uma matriz que será preenchida com os cabeçalhos http retornados (índice numérico) e arg4 é uma matriz que será preenchida com os cookies retornados ($ cookies ["expires"] => " Sex, 06 de maio de 2016 05:58:51 GMT ") e arg5 serão preenchidos com ... informações sobre a solicitação bruta feita por curl.
A desvantagem é que ele requer que CURLOPT_RETURNTRANSFER esteja ativado, caso contrário, ele gera um erro e substitui CURLOPT_STDERR e CURLOPT_VERBOSE, se você já os estiver usando para outra coisa .. (eu poderia corrigir isso mais tarde)
exemplo de como usá-lo:
e a própria função ..
fonte
A resposta aceita parece que procurará por toda a mensagem de resposta. Isso pode fornecer correspondências falsas para os cabeçalhos dos cookies se a palavra "Set-Cookie" estiver no início de uma linha. Embora deva ficar bem na maioria dos casos. A maneira mais segura pode ser ler a mensagem desde o início até a primeira linha vazia que indica o fim dos cabeçalhos da mensagem. Esta é apenas uma solução alternativa que deve procurar a primeira linha em branco e usar preg_grep nessas linhas apenas para encontrar "Set-Cookie".
fonte
Entendo que os cookies de
curl
devem ser gravados em um arquivo (curl -c cookie_file
). Se você estiver executandocurl
as funçõesexec
ou PHPsystem
(ou qualquer coisa dessa família), poderá salvar os cookies em um arquivo, abra o arquivo e leia-os.fonte