Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Triple

fsockopen

Mensagens Recomendadas

Triple    0
Triple

Boas,

Como alternativa ao curl decidi usar esta função.

E estou a usar o seguinte code para fazer o POST para uma pagina e e obter o HTML mas deve faltar aqui qualquer coisa:

<?php
# working vars
$host = 'www.megashares.com';
$service_uri = '/index.php?d01=90b99c7';
$vars ='lc_email=xxxx&lc_pin=xxxx&lc_signin=Sign-In';

# compose HTTP request header
$header = "Host: $host\r\n";
$header .= "User-Agent: PHP Script\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($vars)."\r\n";
$header .= "Connection: close\r\n\r\n";

$fp = fsockopen($host, 80, $errno, $errstr);
if (!$fp) {
   echo "$errstr ($errno)<br/>\n";
   echo $fp;
} else {
    fputs($fp, "POST $service_uri  HTTP/1.1\r\n");
    fputs($fp, $header.$vars);
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

Agora queria que isso me devolvesse o HTML que era o que a curl fazia.

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas

Bem, o principal problema é o nível de complexidade da página a buscar, isto é, se tens que autenticar primeiro, porque então passas a ter que tratar de cookies, ou $_GETs, ou seja lá o que for que o site a que te queres ligar usa para te reconhecer.

Se não queres ter que te preocupar com esses pormenores, incluindo a construção de http headers, podes usar uma classe que faça isso por ti (não tenho a certeza, mas pode ser que o Snoopy seja uma ajuda - não usa CURL, excepto para https).

Caso queiras mesmo tratar disto à unha, então o que tens aí é uma boa base. Só não estou a perceber esse $out aí no meio, não está a fazer nada.

Fora isso, ele já busca o HTML tal como está.  Podes é querer mudar a linha:

echo fgets($fp, 128);

para algo como

$returned_html[] = fgets($fp, 1024); //Guarda o html num array, cada linha num novo índice. Máximo tamanho da linha é 1024 bytes.

Assim passas a ficar com o html em $returned_html e podes fazer algo com ele.

PS: Podes querer considerar enviar como header HTTP 1.0 em vez de 1.1, caso notes má performance e/ou valores hex na página que buscaste. Lê o comentário de [info at TAKETHISOUT dot ski-info-online dot com] em fsockopen().

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triple    0
Triple

Boas,

afinal isto retorna o HTML, mas tenho de tirar o Header do content length.

Mas depois é como se não estivesse logado. Ali as $vars não deviam tratar disso?

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas

Boas,

afinal isto retorna o HTML, mas tenho de tirar o Header do content length.

Mas depois é como se não estivesse logado. Ali as $vars não deviam tratar disso?

Cumps

Deviam, e tanto quanto me apercebo estão a tratar. Como não tenho dados válidos para testar, é-me dito que não tenho crédito, ou que tenho que activar o passport ou qualquer coisa assim. Assumo que tenhas os valores correctos, não obténs a página esperada? A mim parece-me que estás a passar bem os valores do POST...

Bjecas, o $out equivale a NULL = chr(0); uma vez que não foi definido.

Usar variáveis sem as inicializar? Tsk tsk, olha que depois caem-nos em cima a dizer que o pessoal que usa PHP programa mal!  :biggrin:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triple    0
Triple

$vars ='lc_email=xxxx&lc_pin=xxxx&lc_signin=Sign-In';

Eu tenho os dados correctos mas não sei se é assim que devo colocalos separando as vars por "&" Mas não obtenho a pagina correcta. E tu também tiras o header do lenght?

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

Bjecas, o $out equivale a NULL = chr(0); uma vez que não foi definido.

Usar variáveis sem as inicializar? Tsk tsk, olha que depois caem-nos em cima a dizer que o pessoal que usa PHP programa mal!  :biggrin:

Ninguém o manda copiar código mau aqui do forum. :cheesygrin:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triple    0
Triple

Bjecas, o $out equivale a NULL = chr(0); uma vez que não foi definido.

Usar variáveis sem as inicializar? Tsk tsk, olha que depois caem-nos em cima a dizer que o pessoal que usa PHP programa mal!  :biggrin:

Ninguém o manda copiar código mau aqui do forum. :cheesygrin:

lol não copiei cá do forum por acaso xD foi dos comments no php.net

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas

Bem, vais ter que vasculhar um pouco nas especificações dos headers HTML (não sabias usar uma class já feita?  :cheesygrin:)

Penso que o conteúdo de $vars está correcto, estive aqui a testar com um script de login e correu tudo bem. Confirma que estás a enviar todos os campos necessários (incluindo algum campo de validação da form que possa haver, como por exemplo hidden).

Uma nota: depois de conseguires fazer login, este não se mantém. Para te manteres autenticado, imagino que tenhas que guardar o cookie da sessão (ou a session id?) e reenviá-lo nos pedidos posteriores.

Em relação ao lenght, pelo que li não é obrigatório mas antes recomendado, por isso pelo menos por enquanto deve ser seguro (e se calhar melhor) deixá-lo de fora...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas
Ninguém o manda copiar código mau aqui do forum. :cheesygrin:

lol não copiei cá do forum por acaso xD foi dos comments no php.net

Lol, é que esse código fez-me lembrar um que tinha cá postado once. :P

LOL, tás a dizer mal do teu próprio código? :P

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax
Ninguém o manda copiar código mau aqui do forum. :cheesygrin:

lol não copiei cá do forum por acaso xD foi dos comments no php.net

Lol, é que esse código fez-me lembrar um que tinha cá postado once. :P

LOL, tás a dizer mal do teu próprio código? :P

Estou. :) Mesmo sendo meu, não vou dizer que é perfeito quando sei que não o é. :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas

Estou. :P Mesmo sendo meu, não vou dizer que é perfeito quando sei que não o é. :P

É assim mesmo, viva a honestidade (e não te preocupes, que o meu código deve ser pior que o teu  :cheesygrin:)

Mas back on topic, isso já bule, Triple? É que o único problema que estou a ver é mesmo teres-te esquecido de algum dos campos do POST, porque de resto...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triple    0
Triple

Julgo que não me esqueçi de nenhum campo, pelo menos eram estes que usava com a lib CURL. Só preciso de me logar uma vez e obter o HTML dessa pagina para sacar de lá um URL =P Mas vai sempre ter à pagina mas sem estar logado. Posso ter de modificar os headers? Porque?

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas

Julgo que não me esqueçi de nenhum campo, pelo menos eram estes que usava com a lib CURL. Só preciso de me logar uma vez e obter o HTML dessa pagina para sacar de lá um URL =P Mas vai sempre ter à pagina mas sem estar logado. Posso ter de modificar os headers? Porque?

Cumps

Bem, quando testei esse script ele dava-me um link para download, por isso será que já não está a funcionar direito? É certo que aparecia um monte de lixo na página, mas o link estava lá... De resto, não vejo razão nenhuma para não estar a funcionar. Como te disse, parece que o POST é feito com sucesso, por isso a página de resposta devia ser a de logged in, a menos como te disse que te estejas a esquecer de algum campo, ou que o username/password (ou lá o que esse site usa) não estejam correctos.

Isso lembra-me, será que esses dados têm algum caracter que possa ser mal interpretado com diferentes encodings? Tipo acentuação, cedilha ou assim... Se for o caso podes usar:

$header .= "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n"; //Ou outro charset

A propósito dos headers, estava a falar de consultar os RFCs para garantir que estavam bem formados, mas pelo que estive a ver não há problemas com eles...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triple    0
Triple

Julgo que não me esqueçi de nenhum campo, pelo menos eram estes que usava com a lib CURL. Só preciso de me logar uma vez e obter o HTML dessa pagina para sacar de lá um URL =P Mas vai sempre ter à pagina mas sem estar logado. Posso ter de modificar os headers? Porque?

Cumps

Bem, quando testei esse script ele dava-me um link para download, por isso será que já não está a funcionar direito? É certo que aparecia um monte de lixo na página, mas o link estava lá... De resto, não vejo razão nenhuma para não estar a funcionar. Como te disse, parece que o POST é feito com sucesso, por isso a página de resposta devia ser a de logged in, a menos como te disse que te estejas a esquecer de algum campo, ou que o username/password (ou lá o que esse site usa) não estejam correctos.

Isso lembra-me, será que esses dados têm algum caracter que possa ser mal interpretado com diferentes encodings? Tipo acentuação, cedilha ou assim... Se for o caso podes usar:

$header .= "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n"; //Ou outro charset

A propósito dos headers, estava a falar de consultar os RFCs para garantir que estavam bem formados, mas pelo que estive a ver não há problemas com eles...

O link está lá x) mas o link que eu quero é algo diferente, é premium... essa conta é premium... vou tentar isso já dou novidades, mas n tem nenhum caracter estranho... tem o @ mas isto n causa problema acho eu x)

EDIT: nop... nada... os dados estão correctos =X deve ser necessário mais alguma coisa.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triple    0
Triple

Encontrei o problema carago :cheesygrin: é o Header do Content-Length, têm de lá estar... mas tipo eu meto lá... e o problema é que fica a 0... logo não mostra nada =X Já pus vários valores x) e nada...  :wallbash:

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas

Tive a ver o script com CURL e tinha de guardar os cookies num file, será que n tenho de fazer o mesmo aqui?

Para receber o link não era preciso guardar os cookies, porque bastava fazer o pedido e o link vinha como resposta, junto com os cookies. Se calhar para fazer download já seria preciso :D

Olhem x) isto que vá dar uma volta XD Arranjei forma de instalar a CURL pelo WHM e tá resolvido x) thanks anyway

Bem, ainda bem que resolveste o problema, se bem que não tenha percebido nada dessa história do content-lengh. :P

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bjecas    0
Bjecas

Boas, já que conseguiste, nao podes postar ai sff..

Precisava de fazer uma coisa parecida .. Mas tinha outra ideia ..

Cumprimentos

Acho que ele instalou o CURL, assim já não tem que andar às voltas com o fsockopen...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

Boas, já que conseguiste, nao podes postar ai sff..

Precisava de fazer uma coisa parecida .. Mas tinha outra ideia ..

Cumprimentos

Acho que ele instalou o CURL, assim já não tem que andar às voltas com o fsockopen...

Exacto.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade