Выдернуть страницу из аккаунта - задачка на php - Форум успешных вебмастеров - GoFuckBiz.com - Страница 2
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB88.6852
BTC/USD68838.4804
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 15.12.2010, 03:31
Start Post: Выдернуть страницу из аккаунта - задачка на php 
  #11
drivehunter
AdCoin Россия
 
Аватар для drivehunter
 
Регистрация: 10.07.2008
Сообщений: 455
Бабло: $40675
Отправить сообщение для drivehunter с помощью Telegram
Question

Народ, помогите плз - перечитал кучу всего про POST/GET запросы на php, но скрипт работает тока наполовину.

Суть в том, что нуна залогиниться на сайте и выдернуть стату из аккаунта, чтоб распарсить. Кусок скрипта:

PHP код:
if ($fp fsockopen('site.com'80$errno$errstr10)) {
    
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)" ничо не выводит.

Подскажите ченить или ткните носом в нормальный док.
drivehunter вне форума  
Старый 15.12.2010, 18:23   #12
ar4ibas
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"? точно не скажу нада тестить

а вобще такое нада на курле делать там всего пару строк
ar4ibas вне форума  
Старый 15.12.2010, 18:30   #13
Foma
Кролик
 
Аватар для Foma
 
Регистрация: 15.08.2007
Сообщений: 297
Бабло: $37345
По умолчанию

Точно, у него же в конце нету \r\n\r\n
После "Cookie: PHPSESSID=*******************************
Foma вне форума  
Старый 16.12.2010, 04:46   #14
drivehunter
AdCoin Россия
 
Аватар для drivehunter
 
Регистрация: 10.07.2008
Сообщений: 455
Бабло: $40675
ТС -->
Отправить сообщение для drivehunter с помощью Telegram
автор темы ТС По умолчанию

> А то фразу "GET запрос не отправляется" можно понять по разному
ну да, наерна фигню я сказал

думаю, он отправляется - куда ему деваться?
но сервер ответ не возвращает на 2-й запрос/fputs.

на 1й запрос возвращает ответ, на 2й - нет. очевидно во 2м запросе ошибка.

> поставь Referer: http://site.com/login.html
> после Cookie "\n\n" или "\r\n\r\n"? точно не скажу нада тестить

реферер я выдрал тот, который браузер передает.
после Cookie двойной \n\n ставил уже - никакой разницы.
но все-таки счас еще раз попробую
drivehunter вне форума  
Старый 16.12.2010, 05:00   #15
ragelord
программист
 
Регистрация: 28.06.2007
Сообщений: 33
Бабло: $4940
По умолчанию

Если код в первом посте актуальный - мягко говоря непонятно, в какой момент ты парсишь куку и отправляешь её во второй запрос. Если ты пишешь два запроса в одно соединение последовательно, то во-первых протокол должен быть HTTP/1.1, (1.0 просто не поддерживает множественные запросы в одном соединении), во-вторых ты натыкаешься на проблему определения ответа сервера. Еще рекомендую обратить внимание на значение поля Content-Length - если ты передаёшь меньше, чем указал в поле - сервер будет продолжать ждать ввода.

Самое простое и на мой взгляд правильное будет использовать curl (примеры тут: http://www.askapache.com/htaccess/se...-php-curl.html) или, если тебе нравится играться в сокеты, сделать два соединения - в первое послать POST запрос, разобрать ответ (выцепить куку) и уже потом создать второе соединение и заслать туда куку.
ragelord вне форума  
Старый 16.12.2010, 12:58   #16
incognito
Senior Member
 
Аватар для incognito
 
Регистрация: 08.07.2007
Сообщений: 177
Бабло: $34565
По умолчанию

ТС попробуй через cUrl
PHP код:
<?php
function get_html($url,$referer,$post) {
    
$ch curl_init($url);
    
curl_setopt($chCURLOPT_USERAGENT'Opera/9.80 (Windows NT 5.1; U; en-US) Version/10.63');
    
curl_setopt($chCURLOPT_REFERER$referer);
    if (
$post!=''){
        
curl_setopt($chCURLOPT_POSTTRUE);
        
curl_setopt($chCURLOPT_POSTFIELDS$post);
    }else {
        
curl_setopt($chCURLOPT_POSTFALSE);
    }
    
curl_setopt($chCURLOPT_FOLLOWLOCATIONTRUE); 
    
curl_setopt($chCURLOPT_HEADERTRUE);
    
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
    
curl_setopt($chCURLOPT_COOKIEJAR"cookie/cookie.txt");
    
curl_setopt($chCURLOPT_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);
?>
incognito вне форума  
Старый 16.12.2010, 13:49   #17
ar4ibas
Senior Member
 
Регистрация: 11.11.2009
Сообщений: 362
Бабло: $71310
По умолчанию

кстати может быть такая хуйня что после первого запроса сервер рвет коннект. посмотри в ответе сервера на первый запрос заголовок Connection
ar4ibas вне форума  
Старый 16.12.2010, 15:45   #18
Carlos
Юниор
 
Регистрация: 27.03.2008
Сообщений: 11
Бабло: $3255
По умолчанию

drivehunter, может выложишь весь код скрипта, который пост и гет делает? а то трабл может быть не в тех кусках, что ты показал. я как раз недавно такой скрипт писал, без curl, все нормально работает.
Carlos вне форума  
Старый 17.12.2010, 05:27   #19
drivehunter
AdCoin Россия
 
Аватар для drivehunter
 
Регистрация: 10.07.2008
Сообщений: 455
Бабло: $40675
ТС -->
Отправить сообщение для drivehunter с помощью Telegram
автор темы ТС По умолчанию

incognito, спасибо, бро! твой код работает!

только я чуток видоизменил, добавил $cookie

PHP код:
function get_html($url$referer$post$cookie) {
    
$ch curl_init($url); 
    
curl_setopt($chCURLOPT_USERAGENT'Opera/9.80 (Windows NT 5.1; U; en-US) Version/10.63'); 
    
curl_setopt($chCURLOPT_REFERER$referer); 
    if (
$post!=''){ 
        
curl_setopt($chCURLOPT_POSTTRUE); 
        
curl_setopt($chCURLOPT_POSTFIELDS$post); 
    }else { 
        
curl_setopt($chCURLOPT_POSTFALSE); 
    } 
    
curl_setopt($chCURLOPT_FOLLOWLOCATIONTRUE);  
    
curl_setopt($chCURLOPT_HEADERTRUE); 
    
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE); 
    
curl_setopt($chCURLOPT_COOKIEJAR$cookie); 
    
curl_setopt($chCURLOPT_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($chCURLOPT_COOKIEJAR"cookie/cookie.txt"); 
    
curl_setopt($chCURLOPT_COOKIEFILE"cookie/cookie.txt"); 
я пральна понял, что нуна выдрать куку из кеша браузера, положить ее в свою папку и указать путь к файлу куки вот в этих 2х строчках?

просто засомневался, что curl_setopt тут читает/пишет файл..
drivehunter вне форума  
Старый 17.12.2010, 10:22   #20
Painkiller
Senior Member
 
Регистрация: 09.01.2010
Адрес: ☭
Сообщений: 203
Бабло: $39450
По умолчанию

1. все что тебе нужно знать есть в rfc 2068, он на русском есть.
2. курл сам читает/записывает куки.
Painkiller вне форума  
Старый 17.12.2010, 17:06   #21
incognito
Senior Member
 
Аватар для incognito
 
Регистрация: 08.07.2007
Сообщений: 177
Бабло: $34565
По умолчанию

Цитата:
походу еще 1 вопрос:
если сессия в $cookie устареет, то скрипт логинится перестанет, так?
как это исправить?

ты писал:

PHP код:
curl_setopt($chCURLOPT_COOKIEJAR"cookie/cookie.txt"); 
    
curl_setopt($chCURLOPT_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($chCURLOPT_COOKIEJAR"cookie/cookie.txt"); 
curl_setopt($chCURLOPT_COOKIEFILE"cookie/cookie.txt"); 
указывают где будут лежать куки и cUrl самостоятельно ими оперирует(создаст файл запишет в него куки и затем будет передавать серверу и сохранять новые от сервера).

Последний раз редактировалось incognito; 17.12.2010 в 17:21. Причина: edit
incognito вне форума  
Закрытая тема