• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Triple

fsockopen

26 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

$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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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 é. :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens.

Eu fui tentar com outro sistema de login e nada... se tenho como faço isso?

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.
0

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