PHP/CURL Kan niet inloggen op andere website

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Ik wil mijn PHP script automatisch laten inloggen op een andere website. Daarvoor gebruik ik CURL.

Ik heb met de "Live HTTP headers" extension voor firefox bekeken wat er wordt overgestuurd, dat ziet er zo uit:

Afbeeldingslocatie: http://www.xs4all.nl/~mghvl404/bin/fotos/got/curl_live_http_headers.gif
Klik!

Dat ben ik dus gaan nabootsen in PHP, mijn eerste poging zag er zo uit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$e_mail = urlencode($e_mail);

$ch = curl_init();

$request = 'email=' . $e_mail . '&password=' . $password . '&send=Verstuur&type=&send_password=0';
curl_setopt($ch, CURLOPT_URL, '$url');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7');
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, dir(__FILE__) . '/cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

curl_exec($ch);

Ik heb de niet relevante code weg gelaten.

Met bovenstaande code gebeurt er helemaal niks. Geen errors, geen output, geen cookie, geen headers.


Toen ben ik het op de volgende manier gaan proberen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$e_mail = urlencode($e_mail);

$ch = curl_init();

$request = 'email=' . $e_mail . '&password=' . $password . '&send=Verstuur&type=&send_password=0';

$header[] = 'Host: $host';
$header[] = 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7';
$header[] = 'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png;q=0.5';
$header[] = 'Referer: $url';
$header[] = 'Content-Type: application/x-www-form-urlencoded';
$header[] = 'Content-Length: ' . strlen($request);
$header[] = "Connection: close \r\n";
$header[] = $request;

curl_setopt($ch, CURLOPT_URL,'$url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_COOKIEJAR , dir(__FILE__) . '/cookie.txt');

curl_exec($ch);


Met deze code krijg ik de volgende error terug:
"Empty reply from server"

Hoe moet het wel?

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Controleer even met een sniffer wat er gebeurt. Ik heb dat "empty reply from server" ook wel eens gehad en het bleek toen aan een redirect te liggen. Misschien dat dat hier ook het geval is.

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
MTWZZ schreef op vrijdag 22 september 2006 @ 16:17:
Controleer even met een sniffer wat er gebeurt. Ik heb dat "empty reply from server" ook wel eens gehad en het bleek toen aan een redirect te liggen. Misschien dat dat hier ook het geval is.
Het script draait op een server van mijn webhosting. Hoe log ik wat CURL doet?

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 20-09 21:53
-DarkShadow- schreef op vrijdag 22 september 2006 @ 16:25:
[...]

Het script draait op een server van mijn webhosting. Hoe log ik wat CURL doet?
Dan wordt het lastig, want dan moet je een sniffer op de Server van je webhoster installeren en dat laten ze vast niet toe. Kun je dit script niet eerst proberen op een lokale server te draaien? Dan kun je daarop de sniffer installeren om te zien wat CURL voor HTTP verkeer genereerd.
N.B: Wireshark vind ik wel een goede sniffer

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Het werkt bijna! _/-\o_ _/-\o_

Lokaal werkt het 100%, maar op m'n webhosting wordt cookie.txt niet geschreven. Dit is de code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$e_mail = urlencode($e_mail);

$ch = curl_init();

$request = 'email=' . $e_mail . '&password=' . $password . '&send=Verstuur&type=&send_password=0';

$file = fopen($path . '/header.txt', 'w');

$ch = curl_init();

$request = 'email=' . $e_mail . '&password=' . $password . '&send=Verstuur&type=&send_password=0';
curl_setopt($ch, CURLOPT_URL, '$url');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7');
curl_setopt($ch, CURLOPT_REFERER, '$url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $path . '/cookie.txt');  /* Dit deel schijnt niet te werken?? */
curl_setopt($ch, CURLOPT_POSTFIELDS, $request); 
curl_setopt($ch, CURLOPT_WRITEHEADER, $file);

curl_exec($ch)

curl_close($ch);
fclose($file);


Dit deel schijnt niet te werken:
code:
1
curl_setopt($ch, CURLOPT_COOKIEJAR, $path . '/cookie.txt');


Ik heb het al gebrobeerd met alleen de bestandsnaam, het hele pad en een file handler. Het bestand bestaat gewoon en is schrijfbaar. header.txt wordt netjes geschreven.

Hoe laat ik CURL een cookie schrijven?

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Het zou makkelijk kunnen zijn dat er geen Host: "" param in je headers staat; bij vhosting is deze van absoluut belang omdat anders de server niet weet welke pagina hij serveren moet

Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Ik kan nog steeds geen cookies naar een bestand schrijven, maar het is een bekend probleem en zou door bepaalde instelling(en) komen.

Hier staat een "oplossing":
http://nl3.php.net/manual/en/function.curl-setopt.php#64447

Ik haal de cookies nu dus uit de header. Omslachtig, maar het werkt.

Specialist in:
Soldeerstations
Oscilloscoop


  • OverSoft
  • Registratie: December 2000
  • Laatst online: 18-09 11:09
Waarom gebruik je bij de url variable quotes erom heen?

curl_setopt($ch, CURLOPT_URL, '$url');
is hetzelfde als
curl_setopt($ch, CURLOPT_URL, $url);

Alleen is de laatste sneller.

Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Nieuw probleem: multipart/form-data

Nu wil ik de volgende data versturen met CURL:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
POST /xxxxxx.php HTTP/1.1
Host: xxxxxx.nl
--> Meer header informatie <--
Content-Type: multipart/form-data; boundary=---------------------------114782935826962
Content-Length: 2729
-----------------------------114782935826962
Content-Disposition: form-data; name="max_file_size"

5242880


-----------------------------114782935826962
Content-Disposition: form-data; name="category_id"

219


-----------------------------114782935826962
Content-Disposition: form-data; name="email"

xxxxxx@gmail.com


-----------------------------114782935826962
Content-Disposition: form-data; name="userfile[]"; filename=""   /* Hier zit het probleem */
Content-Type: application/octet-stream


-----------------------------114782935826962
Content-Disposition: form-data; name="userfile[]"; filename=""
Content-Type: application/octet-stream


-----------------------------114782935826962
Content-Disposition: form-data; name="userfile[]"; filename=""
Content-Type: application/octet-stream


-----------------------------114782935826962
Content-Disposition: form-data; name="do_submit"

Verstuur
-----------------------------114782935826962--
Het lukt mij om multipart data te versturen, maar de bestanden stuurt hij niet over. Hoe vertel ik CURL dat hij de bestanden als "application/octet-stream" moet oversturen?

De code die ik nu gebruik:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
    $formdata = array('max_file_size' => '5242880' . "\n");
    $formdata['email'] = urlencode('xxxx@gmail.com') . "\n";
    $formdata['userfile[]'] = 'test_pic_1.jpg' . "\n";    /* Hoe moet het wel? */
    $formdata['userfile[]'] = 'test_pic_2.jpg' . "\n";
    $formdata['userfile[]'] = 'test_pic_3.jpg' . "\n";
    $formdata['do_submit'] = 'Verstuur' . "\n";
    
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $formdata); 

    curl_exec($ch);
Dit verstuurd de bestandsnamen (uiteraard) gewoon als mutipart data. Volgens dit en dit bericht moet er een '@' voor de bestandsnaam, maar dan zegt CURL:
"failed creating formpost data"


OverSoft schreef op zaterdag 23 september 2006 @ 13:48:
Waarom gebruik je bij de url variable quotes erom heen?

curl_setopt($ch, CURLOPT_URL, '$url');
is hetzelfde als
curl_setopt($ch, CURLOPT_URL, $url);

Alleen is de laatste sneller.
Ik pas de code aan voordat ik post op GoT, daar is het foutje er in geslopen.

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • Mennootje
  • Registratie: December 2000
  • Laatst online: 24-07 13:40
Bij mij werkte het trucje met de @ voor een filename wel goed. Ik gebruik echter wel het volledige path hiervoor ( 'tmp_name' na een fileupload).

Verder gaat het vullen van je array zo niet goed. Je overschrijft de $formdata['userfile[]'] steeds ;)

Heb geen ervaring met arrays in arrays met CURL, dus weet niet zeker of hij dat wel netjes encode. Je kan natuurlijk ook gewoon altijd userfile1, userfile2 etc. gebruiken

Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Mennootje schreef op zondag 24 september 2006 @ 21:26:
Bij mij werkte het trucje met de @ voor een filename wel goed. Ik gebruik echter wel het volledige path hiervoor ( 'tmp_name' na een fileupload).
Volledig pad maakt niks uit, CURL wordt al ziek van het apenstaartje. Op mijn hosting klaagt hij trouwens niet over het apenstaartje, maar daar kan ik het verkeer niet bekijken.
Verder gaat het vullen van je array zo niet goed. Je overschrijft de $formdata['userfile[]'] steeds ;)

Heb geen ervaring met arrays in arrays met CURL, dus weet niet zeker of hij dat wel netjes encode. Je kan natuurlijk ook gewoon altijd userfile1, userfile2 etc. gebruiken
Het probleem is dus dat ik een HTTP header aan het nabootsen ben waarin 3 keer een 'userfile[]' wordt verstuurd.

Specialist in:
Soldeerstations
Oscilloscoop


Acties:
  • 0 Henk 'm!

  • Mennootje
  • Registratie: December 2000
  • Laatst online: 24-07 13:40
PHP:
1
2
3
    $formdata['userfile'][] = '@test_pic_1.jpg';
    $formdata['userfile'][] = '@test_pic_2.jpg';
    $formdata['userfile'][] = '@test_pic_3.jpg';


Misschien snapt curl het zo wel. Curl zou alle encoding moeten afhandelen, en het zou kunnen zijn dat hij je bestand niet vond door de \n

Krijg je trouwens geen zinnige info terug via curl_error() ?

Acties:
  • 0 Henk 'm!

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Mennootje schreef op zondag 24 september 2006 @ 21:54:
... en het zou kunnen zijn dat hij je bestand niet vond door de \n
Nope, ook al getest.
Krijg je trouwens geen zinnige info terug via curl_error() ?
Ja, "failed creating formpost data".

Specialist in:
Soldeerstations
Oscilloscoop

Pagina: 1