curl login, download cookies and redirect

vasilev

Registered
здравейте,

опитвам се да направя curl логин скрипт който да редиректва на даден url - през който сме се логнали с curl..
проблема е че всеки сайт е различен, някой имат Javascript, други Login submit. Естествено няма как да се направи за всички но поне за повечето може..
логвам се и взимам всички hidden полета, тъй като повечето сайтове ги проверяват. след това ги добавям към user/pass и запазвам cookитата.
сайтът се появява но тук въпросът е с редиректа..
направя ли редирект, губя сесията.

има ли някакъв начин да я запазя ?
 
Как така се губи редиректа?
Използваш ли?
PHP:
CURLOPT_FOLLOWLOCATION => true,
Значи ти си създай клас за обработка на curl пък после си описвай за всеки сайт по отделно какв ти е нужно за логване.
 
здравей,
използвам да .. но не редиректва.
ясно че ще се опишат да, аз се опитвам първо един да подкарам след това ще се описва.
като тест опитах тук да влезна, влизам но отворя ли страницата или направя ли header location web-tourist.. нямам сесия.
това е кода:

PHP:
$file='cookies.txt';
$ch = curl_init();
curl_setopt_array($ch, array(
  CURLOPT_HEADER => false,
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_URL =>$url,
  CURLOPT_REFERER=>$url,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_POST =>1,
  CURLOPT_CONNECTTIMEOUT => 3,
  CURLOPT_TIMEOUT=>3,
  CURLOPT_COOKIEFILE=>$file,
  CURLOPT_COOKIEJAR=>$file,
  CURLOPT_POSTFIELDS=>"login=true&username=".$user."&password=".$pass.$webfields,
  CURLOPT_USERAGENT => 'demo user agent..'
));
$result= curl_exec ($ch);
curl_close ($ch);
echo $result;
 
Защо хедър локация ще ползваш? Просто използваш същият код и подаваш другите страници от които искаш да сваяш инфо.
PHP:
<?php
$url = "http://web-tourist.net/forum/login.php";
$file='cookies.txt';

$ch = curl_init();
$array = array(
  CURLOPT_HEADER => false,
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_URL =>$url,
  CURLOPT_REFERER=>$url,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_POST =>1,
  CURLOPT_CONNECTTIMEOUT => 3,
  CURLOPT_TIMEOUT=>3,
  CURLOPT_COOKIEFILE=>$file,
  CURLOPT_COOKIEJAR=>$file,
  CURLOPT_POSTFIELDS=>"login=true&username=".$user."&password=".$pass.$webfields,
  CURLOPT_USERAGENT => 'demo user agent..'
);

curl_setopt_array($ch, $array);
$result1= curl_exec ($ch);

$array[CURLOPT_URL] = "http://web-tourist.net/forum/viewtopic.php?p=671188#671188";
curl_setopt_array($ch, $array);
$result2= curl_exec ($ch);

curl_close ($ch);

// echo $result1;
echo $result2;
 
въпроса е че при curl, кукитата остават на сървъра а не в твоя браузър. затова правиш пост форма на твоя сървър и постваш към уеб сайта.
по този начин все едно постваш от сайта.
някой сайтове ползват js и няма как да стане, но повечето които ползват post форма е ок.
за всеки случай, преди това трябва да вземеш hidden полетата от тази форма и да ги включиш в твоята.. ако все пак искат други input данни :)
 
vasilev каза:
въпроса е че при curl, кукитата остават на сървъра а не в твоя браузър. затова правиш пост форма на твоя сървър и постваш към уеб сайта.
по този начин все едно постваш от сайта.
някой сайтове ползват js и няма как да стане, но повечето които ползват post форма е ок.
за всеки случай, преди това трябва да вземеш hidden полетата от тази форма и да ги включиш в твоята.. ако все пак искат други input данни :)
Така както го обясняваш нещо не ми става ясно какво имаш предвид. Прати малко код да те разбера по-добре и някакъв пример. :?:
 
така по-ясно ли е :)



PHP:
$thisurl = htmlspecialchars($_GET['url']);
$user=htmlspecialchars($_GET['user']);
$pass=htmlspecialchars($_GET['pass']);
$userfield=htmlspecialchars($_GET['userfield']);
$passfield=htmlspecialchars($_GET['passfield']);
$postbut=htmlspecialchars($_GET['postbut']);
$curl = curl_init($thisurl);
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL =>$thisurl
));
$output = curl_exec($curl);
curl_close($curl);
$dom = new DOMDocument;
$dom->loadHTML($output);
    $hidden_inputs = array();
    $nodes = $dom->getElementsByTagName('input');
   $i=0;
    foreach($nodes as $node) {
        if($node->hasAttributes()) { 
            foreach($node->attributes as $attribute) {
                if($attribute->nodeName == 'type' && $attribute->nodeValue == 'hidden' && !empty($node->getAttribute('value'))) { 
                  $webfields.="<input type='hidden' name='".$node->getAttribute('name')."' value='".$node->getAttribute('value')."'>";
                  $i++;
                } 
            }
        }
    }


HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>sss</title>
</head>
<body>
<form id="loginForm" name="loginForm" method="post"  action="<?php echo $thisurl;?>">
<input name="<?php echo $userfield;?>" type="hidden" value="<?php echo $user;?>" />
<input name="<?php echo $passfield;?>" type="hidden" value="<?php echo $pass;?>"  />
<?php echo $webfields; ?>
<input type="hidden" name="<?php echo $postbut;?>" value="true" />
 <input type="hidden" name="login" value="true" /> 
  <input type="submit" name="submit" id="sbm" style="display:none;" value="true">
</form>
<script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js"></script>  
<script type="text/javascript">$(function() { $("#sbm").click(); });</script>     
</body></html>
 
Глупости на търкалета. Нали подаваш POSTFIELDS, не е нужно да правиш твоя форма. Просто, когато подаваш POSTFIELDS трябва да си сигурен, че URL-а ти води до файла, който приема формата на сайта. От там трябва да ти се запазят кукика.
Когато използваш curl кукитата се запазват във файл, когато ползваш COOKIEJAR. Кукита не се пазят на сървъра.
Следващата стъпка е да не подаваш повече POSTFIELDS и да подаваш COOKIEFILE, за да използваш нужните сесии, за да знае сървъра, че вече си влязъл в системата.

Тази седмица ми върви на curl проблеми по форумите. :D
 
..ок , а може ли пример ? :)
аз тествах доста но все същото става накрая. curl изкарва резултата но това не ми помага. аз не искам да изкарвам резултата а да влезна в сайта през моя браузър.
 
За толкова години не научи ли как работи http?

Бисквитките трябва да се пращат от БРАУЗЕРЪТ от който искаш да си логнат. За да стане постановката която си замислил трябва бисквитките от сървъра на който пускаш curl да стигнат до браузера. При това с коректни атрибути и формат.
Най-лесено ще е ако се направи плъгин, който да запише бисквитките локално след успешното им получаване.

Но като ти чета постовете ...
 
Към автора:
Добре де, толкова ли не можeш да осъзнаеш какво си създал? В нета има толкова много коментирано за cURL и за логването, толкова много въпроси има тук и готов код ти се мъчиш да създадеш нещо, което е нелогично. В първият ми пост ти пратих примерен код хе така за идеята:

PHP:
<?php

$url = "http://web-tourist.net/forum/login.php";

$file='cookies.txt';



$ch = curl_init();

$array = array(

  CURLOPT_HEADER => false,

  CURLOPT_RETURNTRANSFER => 1,

  CURLOPT_URL =>$url,

  CURLOPT_REFERER=>$url,

  CURLOPT_FOLLOWLOCATION => true,

  CURLOPT_SSL_VERIFYPEER => false,

  CURLOPT_POST =>1,

  CURLOPT_CONNECTTIMEOUT => 3,

  CURLOPT_TIMEOUT=>3,

  CURLOPT_COOKIEFILE=>$file,

  CURLOPT_COOKIEJAR=>$file,

  CURLOPT_POSTFIELDS=>"login=true&username=".$user."&password=".$pass.$webfields,

  CURLOPT_USERAGENT => 'demo user agent..'

);



curl_setopt_array($ch, $array);

$result1= curl_exec ($ch);



$array[CURLOPT_URL] = "http://web-tourist.net/forum/viewtopic.php?p=671188#671188";

curl_setopt_array($ch, $array);

$result2= curl_exec ($ch);



curl_close ($ch);



// echo $result1;

echo $result2;


Редирект не ти е нужен, с вече логнат потребител и създадени бисквитки само ще подаваш адреса на следващата страница, която искаш и от там нататък сваляш кода на страницата или каквото там ти трябва.
https://stackoverflow.com/questions/20049393/using-php-curl-to-login-to-my-websites-form
Коментар 9 е много приятен пример за код. Разгледай го и прочени малко за идеята на cURL. Не ти трябва да създаваш лична форма от която да пращаш инфото. Така обезсмисляш всичко. Например ако постнеш формата с cURL и тя постне към адреса зареденото в нея инфо, то ти постваш директно от твоят браузър, не от този въведен с cURL и така нататък. Просто е излишно да постваш с curl така. Драсни си един js с document.getElementById('submit buton id').click и не се занимавай с глупости. :)
 
Хубаво е пътя до cookie файла да е абсолютен, също - моля ви подавайте пост данни чрез масив, в пъти по-четимо и подредено е.

FOLLOWLOCATION не е задължително да го има. При някои сайтове, FOLLOWLOCATION може да прецака бисквитките и да прекъсне записването им.

@vasilev, не мога да ти разбера логиката. Искаш да виждаш самата страница ли в браузъра? Ако е така, не виждам смисъла в това, което правиш със cURL.
 
Revelation каза:
Хубаво е пътя до cookie файла да е абсолютен, също - моля ви подавайте пост данни чрез масив, в пъти по-четимо и подредено е.

FOLLOWLOCATION не е задължително да го има. При някои сайтове, FOLLOWLOCATION може да прецака бисквитките и да прекъсне записването им.

@vasilev, не мога да ти разбера логиката. Искаш да виждаш самата страница ли в браузъра? Ако е така, не виждам смисъла в това, което правиш със cURL.

Не съм тествал дали кода работи, просто го постнах за идеята и обяснението. Създал съм си цял клас да ми управлява всичката работа с cURL, като с него постигам страхотна производителност. :lol:
 
за да си спестим още коментари и размишления, покажете ми готов код който работи - както бях помолил.
подаваш потребител/парола към този сайт и след това влизаш по менютата в нов прозорец (на който домейна да е web-tourist.net а не собствен уебсайт).
потребител/парола/user input field name/password input field name/submit button name - всичките тези ги имате в база.
както обясних целта не е да тегля код, а да се логна и да избегна писането на пароли всеки път.

най мразя да ми философства някой. "не научи ли", "днеска ми е дошло само на curl проблеми" .. за толкова постове които съм писал, аз никога не съм се обеснявал на някой. като иска съдействие и аз знам, просто му давам отговора а не поствам допълнителен въпрос!
помолих за код. ако имате - дайте. ако нямате - не си правете труда да наливате поредния коментар в базата !

от всички, само dakata си прави труда да покаже някакъв код.
но както казах той(кода) не върши работа. Върши ако искаш да отваряш всеки път remote сайт през твоя .. но трябва да се оправи css/js тъй като не се вижда нищо. ако искаш да постнеш коментар, не съм сигурен че ще работи. тоест по добре е да си си на remote сайта..
 
Ми няма как код да върши работа, след като никой не може да схване какво точно искаш да направиш.
Хората се опитват да ти обяснят как да направиш web proxy но в случая то няма да свърши работа. А на мен не ми се за занимава да давам готови решения на ....

Щом за толкова години (съдейки по регистрацията ти) не си схванал основни неща за http то по-добре е да зарежеш програмирането и да се насочиш към нещо друго - земеделие, животновъдство ...
 
хайде пак да прочетем коментарите и да си зададем въпроса трябва ли ми web proxy или не :)
трябва ли ми коментар или код ? :)
имаме ли работещ код за това което обеснявам или не ? :)
много if-ове станаха..

пак повтарям, дайте да се фокусираме върху код, не върху това кой какво знае, от колко време е регистриран, колко код е изписал, колко книги е прочел, колко филми е изгледал. не мерим нищо тука.

няма смисъл да добавям изречението .. "ти понеже много коментари имаш". просто ще си замълча.. разправял съм се с такива като теб преди 15 години когато имаше MIRC и си чесахме пръстите че ни сърбяха много.. сега ги чешем с код, за което всъщност и помолих тук.
 
Отговор вече ти дадох, кое тоно не ти е ясно от него?

Изкаш готов код? И аз искам много неща ама йок. Вместо да се обясняваш като ... вземи и се опитай да схванеш какво ти казвам. Ако не успееш да го разбереш питай.
 
ttta каза:
Отговор вече ти дадох, кое тоно не ти е ясно от него?

Изкаш готов код? И аз искам много неща ама йок. Вместо да се обясняваш като ... вземи и се опитай да схванеш какво ти казвам. Ако не успееш да го разбереш питай.

//off: uphero? version 2?
 

Горе