Есть специалисты по cURL-у?

1 234
B1
На сайте с 13.12.2012
Offline
28
#31

<?php
$url = "http://www.site.com/login";
$host = "www.site.com";
$data = "UserName=test@mail.ru&Password=123456&CreatePersistentCookie=true";

$fh = fopen('curl.out', 'a');

function curl_flollow_exec($ch, $redirects = 0) {
global $host; // что бы не парсить реферер

curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$data = curl_exec($ch);

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (($http_code == 301 || $http_code == 302) && ++$redirects < 10) {

preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches);
if (isset($matches[2])) {
$redirect_url = trim($matches[2]);
if ($redirect_url !== '') {
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_URL, $host.$redirect_url);
return curl_flollow_exec($ch, $redirects);
}
}
}
return $data;
}

function curl_post($url, $data) {
global $fh;

$ch = curl_init();

curl_setopt($ch, CURLOPT_STDERR, $fh);
curl_setopt($ch, CURLOPT_VERBOSE, 1);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0 Iceweasel/16.0');
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$result = curl_flollow_exec($ch);
curl_close($ch);

return $result;
}

echo curl_post($url, $data);
fclose($fh);

?>

тоже решил заморочиться, все сработало нормально.

verbose:

* About to connect() to www.site.com port 80 (#0)
* Trying 50.56.211.113... * connected
* Connected to www.site.com (50.56.211.113) port 80 (#0)
> POST /login HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0 Iceweasel/16.0
Host: www.site.com
Accept: */*
Referer: http://www.site.com/login
Content-Length: 74
Content-Type: application/x-www-form-urlencoded

< HTTP/1.1 302 Found
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Location: /sna****/followingplus
< Server: Microsoft-IIS/7.5
* Added cookie siteFORMAUTH="C3C99C1733A....." for domain www.site.com, path /, expire 1384861666
< Set-Cookie: siteFORMAUTH=C3C99C1733AF......; expires=Tue, 19-Nov-2013 11:47:46 GMT; path=/
< Date: Mon, 04 Nov 2013 20:47:46 GMT
< Content-Length: 140
<
* Connection #0 to host www.site.com left intact
* Re-using existing connection! (#0) with host www.site.com
* Connected to www.site.com (50.56.211.113) port 80 (#0)
> GET /snatches/followingplus HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0 Iceweasel/16.0
Host: www.site.com
Accept: */*
Referer: http://www.site.com/login
Cookie: siteFORMAUTH=C3C99C1733AFE4......

< HTTP/1.1 200 OK
< Cache-Control: no-cache, no-store, must-revalidate
< Pragma: no-cache
< Content-Type: text/html; charset=utf-8
< Expires: -1
< Vary: Content-Encoding
< Server: Microsoft-IIS/7.5
* Added cookie ASP.NET_SessionId="l0zatrxduaeuj2......." for domain www.site.com, path /, expire 0
< Set-Cookie: ASP.NET_SessionId=l0zatrxduaeu.......; path=/; HttpOnly
< Date: Mon, 04 Nov 2013 20:47:46 GMT
< Content-Length: 42319
<
* Connection #0 to host www.site.com left intact
* Closing connection #0
FollowLocation
На сайте с 19.07.2013
Offline
12
#32

bashkir102, решение подходит только для частного случая, когда location указывается относительно запрашиваемого урла.

B1
На сайте с 13.12.2012
Offline
28
#33

FollowLocation, так и есть.

ну если локатион укажет на другой домен. надо рвать текущее соединение и инициировать curl по новой.

пробовал делать и такое решение.

function curl_send($url, $data, $referer = '', $is_redirect = false, $redirects = 0) {

global $fh, $host;

$ch = curl_init();

curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_STDERR, $fh);


curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0 Iceweasel/16.0');
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');

if ($data != false && $is_redirect != true) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}

$data = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (($http_code == 301 || $http_code == 302) && ++$redirects < 10) {

preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches);
if (isset($matches[2])) {
$redirect_url = trim($matches[2]);
if ($redirect_url !== '') {
curl_close($ch);
$redirect_url = $host.$redirect_url; // надо проверять на текущий хост, если не ведет на другой домен
return curl_send($redirect_url, false, $referer, true, $redirects);
}
}
}

curl_close($ch);
return $data;
}

код надо дорабатывать, логика понятна. соединение рвется при редиректе и конектится по новой.

AutoBlogger
На сайте с 05.10.2011
Offline
115
#34

Да, это работает и мой костыль тоже, но получить универсальное решение так и не получилось. Я имею в виду код эмулятора, который бы самостоятельно пробегался по редиректам и давал такой же результат, как cURL c FOLLOWLOCATION. Например, в случае с данным конкретным сайтом.

🪄 www.cyberseo.net - плагин для создания автоблогов под WordPress, с поддержкой искусственного интеллекта OpenAI GPT-4, Anthropic Claude, Google Gemini Pro, DALL·E 3 и Stable Diffusion XL | 📣 Импорт RSS / XML / JSON/ CSV / HTML в WooCommerce: https://bit.ly/3EyYQp4
AutoBlogger
На сайте с 05.10.2011
Offline
115
#35

Ни у кого предложений нет?

1 234

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий