PHP / cURL / inloggen + dataminen via HTTPS
Kan iemand me de juiste richting op sturen wat het volgende betreft:
Ik wil graag via PHP ergens op een (HTTPS) website inloggen (ingeven van USERNAME + WACHTWOORD) en vervolgens (dus nadat er ingelogd is) een tweetal tekstboxen vullen (postcode, huisnummer) om erna de data wat er terug komt (nadat je op "verstuur" zou drukken op het formulier waar je terecht zou komen als je alles gewoon via de browser deed) in een variabele ontvangen.
Alles werkt als ik het allemaal handmatig doe:
1) met browser naar URL gaan
2) inloggen met username + wachtwoord
3) (op de pagina waar ik dan terecht kom) postcode + huisnummer invullen
4) formulier versturen
5) data uitlezen
Maar hoe doe ik al deze handelingen dus vanuit PHP? Ik maak "normaal gesproken" gebruik van cURL. Maar bovenstaand is me dus niet gelukt. Normaal hoef ik ook nergens in te loggen, en vul ik direct die zoekvelden en haal mijn data op.
Hopelijk ben ik een beetje duidelijk wat ik graag zou willen. Alvast bedankt voor het meedenken in ieder geval :-)
Met vriendelijke groet,
Sjef
Klinkt niet echt legaal.
Zou je exact willen vertellen wat je bedoeling is?
Even voor de duidelijkheid: ik haal ongeveer 1 record per dag op :-)
dus alvast vriendelijk bedankt voor de hulp...
Kan je niet aan de partij vragen of die een API beschikbaar hebben? Dat werkt dan nog veel handiger.
En ik vind het natuurlijk ook leuk om zulke dingen zelf met PHP te maken.
Is het wel mogelijk volgens jullie? Want volgens mij is die tussenstap erg lastig... (tussenstap tussen eerst inloggen (login velden vullen + versturen), dan weer opnieuw andere velden (postcode + huisnummer) invullen (+versturen), en vervolgens de data wat er terugkomt opvangen) Het is in ieder geval iets wat ik nog nooit gedaan heb. Dus eigenlijk moet ik eerst weten: is dit überhaupt mogelijk?
Thanks voor het eventuele meedenken!!
Met vriendelijke groet,
Sjef
@sjef: Ik weet geen oplossing voor je maar ik heb dit wel al eens eerder behandeld gezien op phphulp. Zoekt en gij zult vinden.
Gewijzigd op 22/11/2012 20:45:26 door John D
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<?php
ini_set("safe_mode", false);
// eerst phpbb3-zooi inladen
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
//include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
//include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
//include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
ini_set("safe_mode", false);
// functie read_header (voor cUrl)
function read_header($ch, $string)
{
global $location; #keep track of location/redirects
global $cookiearr; #store cookies here
global $ch;
# ^overrides the function param $ch
# this is okay because we need to
# update the global $ch with
# new cookies
$length = strlen($string);
if(!strncmp($string, "Location:", 9))
{ #keep track of last redirect
$location = trim(substr($string, 9, -1));
}
if(!strncmp($string, "Set-Cookie:", 11))
{ #get the cookie
$cookiestr = trim(substr($string, 11, -1));
$cookie = explode(';', $cookiestr);
$cookie = explode('=', $cookie[0]);
$cookiename = trim(array_shift($cookie));
$cookiearr[$cookiename] = trim(implode('=', $cookie));
}
$cookie = "";
if(trim($string) == "")
{ #execute only at end of header
foreach ($cookiearr AS $key=>$value)
{
$cookie .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
return $length;
}
// verkrijg string tussen 2 tags
function tussen($string, $start, $end)
{
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
// haal gegevens op uit database
$sql = "
SELECT
user_id,
username,
STR_TO_DATE( user_birthday, '%e-%m-%Y' ) AS geboortedatum,
(YEAR( NOW( ) ) - YEAR( STR_TO_DATE( user_birthday, '%e-%m-%Y' ) ) ) AS leeftijd
FROM phpbb_users
WHERE
DAYOFMONTH( STR_TO_DATE( user_birthday, '%e-%m-%Y' ) ) = DAYOFMONTH( NOW( ) )
AND
MONTH( STR_TO_DATE( user_birthday, '%e-%m-%Y' ) ) = MONTH( NOW( ) )
";
// maak bericht
$result = mysql_query($sql);
$i = 0;
if($result === false)
{
echo 'Fout tijdens het ophalen van de gegevens';
}
else
{
//meerdere berichten om deze willekeurig te laten genereren.
$bericht = array(
"Namens het gehele Beheerder-team:\n\n[b]Gefeliciteerd![/b]\n",
"Ook vandaag zijn er weer jarigen! Het Beheerder-team wil deze van harte feliciteren \n\n",
"Alweer een jaar ouder! \n\n[b]Gefeliciteerd forumleden! [/b]\n",
"Gefeliciteerd en een fijne dag toegewenst van het Beheerder-team! \n\n",
"Een fijne dag toegewenst jarigen! \n\n",
"De Beheerders willen de onderstaande jarigen van harte feliciteren! \n\n",
"We zingen 'Er is er een jarig' voor iedereen! \n\n",
"Hiep Hiep Hoera voor de jarigen! \n\n",
"Dat wordt trakteren voor de onderstaande leden. Gefeliciteerd! Weer een jaar erbij! \n\n",
"De leden hieronder zijn vandaag jarig! Gefeliciteerd namens de beheerders! \n\n",
"Alle felicitaties voor diegene die hun geboortedag herdenken. \n\n",
"Van harte gefeliciteerd en nog vele veilige kilometers toegewenst! \n\n"
);
$random = rand (0,11);
$message = $bericht[$random];
while ($data = mysql_fetch_assoc($result))
{
$message .= $data['username'] . ' met je ' . $data['leeftijd'] . 'e verjaardag.' . "\n";
$i++;
}
}
if($i == 0)
{
echo 'Geen jarigen vandaag';
die();
}
// maak overige gegevens klaar
setlocale(LC_ALL, 'nl_NL');
$maand = strftime("%B");
// WAT MOETEN WE VULLEN OP posting.php?
$poster_naam = 'Hoofdbeheerder';
$poster_wachtwoord = 'had je gedacht ;). Goed dat je er naar kijkt hoor.';
$subject = 'Re: Felicitatie Topic';
$message = htmlentities($message);
$post = 1; // posten?
$lastclick = time() - 11;
$creation_time = time() - 11;
// $form_token ... komt later
// curl starten
$ch = curl_init();
echo 'Gegevens zijn succesvol uit de database gehaald<br>';
echo 'Begin aan inloggen met cUrl()<br>';
// 1 INLOGGEN
$pagina = "http://www.zundappforum.com/ucp.php?mode=login";
$opties = "username=$poster_naam&password=$poster_wachtwoord&login=true";
curl_setopt($ch, CURLOPT_URL,$pagina); // set url to post to
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 600000); // times out after Ns
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // times out after Ns
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_POST, 1); // set POST method
curl_setopt($ch, CURLOPT_POSTFIELDS, $opties); // add POST fields
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIE, session_name().'='.session_id());
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
$result = curl_exec($ch);
// tussendoor
$sessionid = tussen($result, 'sid=', '" />');
$form_token = sha1($creation_time . '083feb423c3e6a0a' . 'postform' . $sessionid);
echo 'form-tooken: '.$form_token.'<br>';
echo 'Succesvol ingelogd als '.$poster_naam.'<br>';
echo 'Huidige sessie-id: '.$sessionid.'<br>';
echo 'Begin met posten van bericht<br>';
// 2 POST MAKEN (in juiste topic etc)
$pagina = "http://www.zundappforum.com/posting.php?f=21&mode=post&sid=$sessionid";
$opties = "mode=reply&f=3&t=66&subject=$subject&message=$message&post=$post&sid=$sessionid&lastclick=$lastclick&creation_time=$creation_time&form_token=$form_token&pass_token=passthrutoken";
curl_setopt($ch, CURLOPT_URL,$pagina); // set url to post to
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 600000); // times out after Ns
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // times out after Ns
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_POST, 1); // set POST method
curl_setopt($ch, CURLOPT_POSTFIELDS, $opties); // add POST fields
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIE, session_name().'='.$sessionid);
$result = curl_exec($ch);
// tussendoor
echo 'Klaar met posten...<br>';
echo $result;
?>
ini_set("safe_mode", false);
// eerst phpbb3-zooi inladen
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
//include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
//include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
//include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
ini_set("safe_mode", false);
// functie read_header (voor cUrl)
function read_header($ch, $string)
{
global $location; #keep track of location/redirects
global $cookiearr; #store cookies here
global $ch;
# ^overrides the function param $ch
# this is okay because we need to
# update the global $ch with
# new cookies
$length = strlen($string);
if(!strncmp($string, "Location:", 9))
{ #keep track of last redirect
$location = trim(substr($string, 9, -1));
}
if(!strncmp($string, "Set-Cookie:", 11))
{ #get the cookie
$cookiestr = trim(substr($string, 11, -1));
$cookie = explode(';', $cookiestr);
$cookie = explode('=', $cookie[0]);
$cookiename = trim(array_shift($cookie));
$cookiearr[$cookiename] = trim(implode('=', $cookie));
}
$cookie = "";
if(trim($string) == "")
{ #execute only at end of header
foreach ($cookiearr AS $key=>$value)
{
$cookie .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
return $length;
}
// verkrijg string tussen 2 tags
function tussen($string, $start, $end)
{
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
// haal gegevens op uit database
$sql = "
SELECT
user_id,
username,
STR_TO_DATE( user_birthday, '%e-%m-%Y' ) AS geboortedatum,
(YEAR( NOW( ) ) - YEAR( STR_TO_DATE( user_birthday, '%e-%m-%Y' ) ) ) AS leeftijd
FROM phpbb_users
WHERE
DAYOFMONTH( STR_TO_DATE( user_birthday, '%e-%m-%Y' ) ) = DAYOFMONTH( NOW( ) )
AND
MONTH( STR_TO_DATE( user_birthday, '%e-%m-%Y' ) ) = MONTH( NOW( ) )
";
// maak bericht
$result = mysql_query($sql);
$i = 0;
if($result === false)
{
echo 'Fout tijdens het ophalen van de gegevens';
}
else
{
//meerdere berichten om deze willekeurig te laten genereren.
$bericht = array(
"Namens het gehele Beheerder-team:\n\n[b]Gefeliciteerd![/b]\n",
"Ook vandaag zijn er weer jarigen! Het Beheerder-team wil deze van harte feliciteren \n\n",
"Alweer een jaar ouder! \n\n[b]Gefeliciteerd forumleden! [/b]\n",
"Gefeliciteerd en een fijne dag toegewenst van het Beheerder-team! \n\n",
"Een fijne dag toegewenst jarigen! \n\n",
"De Beheerders willen de onderstaande jarigen van harte feliciteren! \n\n",
"We zingen 'Er is er een jarig' voor iedereen! \n\n",
"Hiep Hiep Hoera voor de jarigen! \n\n",
"Dat wordt trakteren voor de onderstaande leden. Gefeliciteerd! Weer een jaar erbij! \n\n",
"De leden hieronder zijn vandaag jarig! Gefeliciteerd namens de beheerders! \n\n",
"Alle felicitaties voor diegene die hun geboortedag herdenken. \n\n",
"Van harte gefeliciteerd en nog vele veilige kilometers toegewenst! \n\n"
);
$random = rand (0,11);
$message = $bericht[$random];
while ($data = mysql_fetch_assoc($result))
{
$message .= $data['username'] . ' met je ' . $data['leeftijd'] . 'e verjaardag.' . "\n";
$i++;
}
}
if($i == 0)
{
echo 'Geen jarigen vandaag';
die();
}
// maak overige gegevens klaar
setlocale(LC_ALL, 'nl_NL');
$maand = strftime("%B");
// WAT MOETEN WE VULLEN OP posting.php?
$poster_naam = 'Hoofdbeheerder';
$poster_wachtwoord = 'had je gedacht ;). Goed dat je er naar kijkt hoor.';
$subject = 'Re: Felicitatie Topic';
$message = htmlentities($message);
$post = 1; // posten?
$lastclick = time() - 11;
$creation_time = time() - 11;
// $form_token ... komt later
// curl starten
$ch = curl_init();
echo 'Gegevens zijn succesvol uit de database gehaald<br>';
echo 'Begin aan inloggen met cUrl()<br>';
// 1 INLOGGEN
$pagina = "http://www.zundappforum.com/ucp.php?mode=login";
$opties = "username=$poster_naam&password=$poster_wachtwoord&login=true";
curl_setopt($ch, CURLOPT_URL,$pagina); // set url to post to
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 600000); // times out after Ns
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // times out after Ns
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_POST, 1); // set POST method
curl_setopt($ch, CURLOPT_POSTFIELDS, $opties); // add POST fields
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIE, session_name().'='.session_id());
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
$result = curl_exec($ch);
// tussendoor
$sessionid = tussen($result, 'sid=', '" />');
$form_token = sha1($creation_time . '083feb423c3e6a0a' . 'postform' . $sessionid);
echo 'form-tooken: '.$form_token.'<br>';
echo 'Succesvol ingelogd als '.$poster_naam.'<br>';
echo 'Huidige sessie-id: '.$sessionid.'<br>';
echo 'Begin met posten van bericht<br>';
// 2 POST MAKEN (in juiste topic etc)
$pagina = "http://www.zundappforum.com/posting.php?f=21&mode=post&sid=$sessionid";
$opties = "mode=reply&f=3&t=66&subject=$subject&message=$message&post=$post&sid=$sessionid&lastclick=$lastclick&creation_time=$creation_time&form_token=$form_token&pass_token=passthrutoken";
curl_setopt($ch, CURLOPT_URL,$pagina); // set url to post to
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 600000); // times out after Ns
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // times out after Ns
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_POST, 1); // set POST method
curl_setopt($ch, CURLOPT_POSTFIELDS, $opties); // add POST fields
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIE, session_name().'='.$sessionid);
$result = curl_exec($ch);
// tussendoor
echo 'Klaar met posten...<br>';
echo $result;
?>
Thanks voor de uitleg over het "niet illegaal zijn".
Ik vond het best een vervelende reactie van - Mark -
Dacht dat ik iets verkeerd had gedaan ofzo... Moeilijk zulke forums, dan denken mensen soms heel andere dingen dan je zelf bedoeld. En natuurlijk nog vervelender als een persoon iets negatiefs zegt, en niets bijdraagt aan de oorspronkelijke vraag :)
Maar goed, in ieder geval bedankt voor jou hulp!!
Groet,
Sjef
Edit:
Ondertussen nog een reactie met VEEL code erin :-)
Thanks Eddy Erkelens !!! Ik ga er meteen naar kijken
Ondertussen nog een reactie met VEEL code erin :-)
Thanks Eddy Erkelens !!! Ik ga er meteen naar kijken
Gewijzigd op 22/11/2012 20:48:08 door sjef dresen
Ik vond al snel iets: http://www.phphulp.nl/php/forum/topic/inloggen-op-externe-webpagina-via-curl/87086/