|
| Дата |
|
USD/RUB | 88.4375 | BTC/USD | 67828.5337 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
15.12.2010, 03:31
|
Start Post: Выдернуть страницу из аккаунта - задачка на php
|
AdCoin Россия
Регистрация: 10.07.2008
Сообщений: 455
Бабло: $40675
|
Народ, помогите плз - перечитал кучу всего про POST/GET запросы на php, но скрипт работает тока наполовину.
Суть в том, что нуна залогиниться на сайте и выдернуть стату из аккаунта, чтоб распарсить. Кусок скрипта:
PHP код:
if ($fp = fsockopen('site.com', 80, $errno, $errstr, 10)) {
fputs($fp, "POST /login.html HTTP/1.0\n".
"User-Agent: $useragent\n".
"Referer: http://site.com/login.html\n".
"Cookie: PHPSESSID=****************************\n".
"Content-Type: application/x-www-form-urlencoded\n".
"Content-Length: 25\n\n".
"login=LOGIN&password=PASS");
fputs($fp, "GET /stat.html HTTP/1.0\n".
"Host: site.com\n".
"User-Agent: $useragent\n".
"Referer: http://site.com/\n".
"Cookie: PHPSESSID=*******************************");
echo '<pre>';
while(!feof($fp)) echo fgets($fp);
echo '</pre>';
fclose($fp);
}
Первый fputs нормально логинится в аккаунт, возвращает "302 Found" и "Location: ./stat.html".
Дальше остается загрузить этот самый stat.html и вот тут затык - GET-запрос не отправляется, хоть ты тресни - кучу вариантов перепробовал уже.
Соответственно и результат хост не возвращает - отладочный "echo fgets($fp)" ничо не выводит.
Подскажите ченить или ткните носом в нормальный док.
|
|
|
15.12.2010, 18:23
|
#12
|
Senior Member
Регистрация: 11.11.2009
Сообщений: 362
Бабло: $71310
|
fputs($fp, "GET /stat.html HTTP/1.0\n".
"Host: site.com\n".
"User-Agent: $useragent\n".
"Referer: http://site.com/\n".
"Cookie: PHPSESSID=*******************************");
поставь Referer: http://site.com/login.html
после Cookie "\n\n" или "\r\n\r\n"? точно не скажу нада тестить
а вобще такое нада на курле делать там всего пару строк
|
|
|
15.12.2010, 18:30
|
#13
|
Кролик
Регистрация: 15.08.2007
Сообщений: 297
Бабло: $37345
|
Точно, у него же в конце нету \r\n\r\n
После "Cookie: PHPSESSID=*******************************
|
|
|
16.12.2010, 04:46
|
#14
|
AdCoin Россия
Регистрация: 10.07.2008
Сообщений: 455
Бабло: $40675
ТС -->
|
ТС
> А то фразу "GET запрос не отправляется" можно понять по разному
ну да, наерна фигню я сказал
думаю, он отправляется - куда ему деваться?
но сервер ответ не возвращает на 2-й запрос/fputs.
на 1й запрос возвращает ответ, на 2й - нет. очевидно во 2м запросе ошибка.
> поставь Referer: http://site.com/login.html
> после Cookie "\n\n" или "\r\n\r\n"? точно не скажу нада тестить
реферер я выдрал тот, который браузер передает.
после Cookie двойной \n\n ставил уже - никакой разницы.
но все-таки счас еще раз попробую
|
|
|
16.12.2010, 05:00
|
#15
|
программист
Регистрация: 28.06.2007
Сообщений: 33
Бабло: $4940
|
Если код в первом посте актуальный - мягко говоря непонятно, в какой момент ты парсишь куку и отправляешь её во второй запрос. Если ты пишешь два запроса в одно соединение последовательно, то во-первых протокол должен быть HTTP/1.1, (1.0 просто не поддерживает множественные запросы в одном соединении), во-вторых ты натыкаешься на проблему определения ответа сервера. Еще рекомендую обратить внимание на значение поля Content-Length - если ты передаёшь меньше, чем указал в поле - сервер будет продолжать ждать ввода.
Самое простое и на мой взгляд правильное будет использовать curl (примеры тут: http://www.askapache.com/htaccess/se...-php-curl.html) или, если тебе нравится играться в сокеты, сделать два соединения - в первое послать POST запрос, разобрать ответ (выцепить куку) и уже потом создать второе соединение и заслать туда куку.
|
|
|
16.12.2010, 12:58
|
#16
|
Senior Member
Регистрация: 08.07.2007
Сообщений: 177
Бабло: $34565
|
ТС попробуй через cUrl
PHP код:
<?php
function get_html($url,$referer,$post) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 5.1; U; en-US) Version/10.63');
curl_setopt($ch, CURLOPT_REFERER, $referer);
if ($post!=''){
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}else {
curl_setopt($ch, CURLOPT_POST, FALSE);
}
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie/cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie/cookie.txt");
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$content_html = get_html('http://site.com/login.html','http://site.com/','login=LOGIN&password=PASS');
$content_html = get_html('http://site.com/stat.html','http://site.com/login.html','');
echo htmlspecialchars($content_html);
?>
|
|
|
16.12.2010, 13:49
|
#17
|
Senior Member
Регистрация: 11.11.2009
Сообщений: 362
Бабло: $71310
|
кстати может быть такая хуйня что после первого запроса сервер рвет коннект. посмотри в ответе сервера на первый запрос заголовок Connection
|
|
|
16.12.2010, 15:45
|
#18
|
Юниор
Регистрация: 27.03.2008
Сообщений: 11
Бабло: $3255
|
drivehunter, может выложишь весь код скрипта, который пост и гет делает? а то трабл может быть не в тех кусках, что ты показал. я как раз недавно такой скрипт писал, без curl, все нормально работает.
|
|
|
17.12.2010, 05:27
|
#19
|
AdCoin Россия
Регистрация: 10.07.2008
Сообщений: 455
Бабло: $40675
ТС -->
|
ТС
incognito, спасибо, бро! твой код работает!
только я чуток видоизменил, добавил $cookie
PHP код:
function get_html($url, $referer, $post, $cookie) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 5.1; U; en-US) Version/10.63');
curl_setopt($ch, CURLOPT_REFERER, $referer);
if ($post!=''){
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}else {
curl_setopt($ch, CURLOPT_POST, FALSE);
}
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$data = get_html ($siteurl.'/login.html', $siteurl, $logindata, $cookie);
$data = get_html ($siteurl.'/stat.html', $siteurl.'/login.html', '', $cookie);
echo $data;
походу еще 1 вопрос:
если сессия в $cookie устареет, то скрипт логинится перестанет, так?
как это исправить?
ты писал:
PHP код:
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie/cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie/cookie.txt");
я пральна понял, что нуна выдрать куку из кеша браузера, положить ее в свою папку и указать путь к файлу куки вот в этих 2х строчках?
просто засомневался, что curl_setopt тут читает/пишет файл..
|
|
|
17.12.2010, 10:22
|
#20
|
Senior Member
Регистрация: 09.01.2010
Адрес: ☭
Сообщений: 203
Бабло: $39450
|
1. все что тебе нужно знать есть в rfc 2068, он на русском есть.
2. курл сам читает/записывает куки.
|
|
|
17.12.2010, 17:06
|
#21
|
Senior Member
Регистрация: 08.07.2007
Сообщений: 177
Бабло: $34565
|
Цитата:
походу еще 1 вопрос:
если сессия в $cookie устареет, то скрипт логинится перестанет, так?
как это исправить?
ты писал:
PHP код:
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie/cookie.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie/cookie.txt");
я пральна понял, что нуна выдрать куку из кеша браузера, положить ее в свою папку и указать путь к файлу куки вот в этих 2х строчках?
просто засомневался, что curl_setopt тут читает/пишет файл..
|
скрипт логинится при каждом запуске и сохраняет куки в файл по пути "cookie/cookie.txt" (для винды нужно указывать полный путь от диска)
PHP код:
$data = get_html ($siteurl.'/login.html', $siteurl, $logindata, $cookie); - логинимся $data = get_html ($siteurl.'/stat.html', $siteurl.'/login.html', '', $cookie); - грузим страницу статистики
а что ты в переменной "$cookie" передаешь???
а эти строки
PHP код:
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie/cookie.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie/cookie.txt");
указывают где будут лежать куки и cUrl самостоятельно ими оперирует(создаст файл запишет в него куки и затем будет передавать серверу и сохранять новые от сервера).
Последний раз редактировалось incognito; 17.12.2010 в 17:21.
Причина: edit
|
|
|
|