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

123 4
AutoBlogger
На сайте с 05.10.2011
Offline
121
#11
bukachuk:
Надо сравнить VERBOSE с FOLLOW_LOCATION и этим эмулятором перехода, сравнить какие куки когда выдаются, какие адреса когда открываются итд то есть полностью два процесса сравнить логи. Да и ваше правильно подметили. Но логи вам это и покажут

Вот с VERBOSE:

> POST /login HTTP/1.1

User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0

Host: www.site.com

Accept: */*

Referer: http://www.site.com/login

Cookie: STGSHYTEFG=E1320FD3211D6AAFD65ABC19...

Content-Length: 86

Content-Type: application/x-www-form-urlencoded

* upload completely sent off: 86 out of 86 bytes

< HTTP/1.1 302 Found

< Cache-Control: private

< Content-Type: text/html; charset=utf-8

< Location: /account_page

< Server: Microsoft-IIS/7.5

* Replaced cookie STGSHYTEFG="899227A88B4B3C8992..." for domain www.site.com, path /, expire 0

< Set-Cookie: STGSHYTEFG=899227A88B4B3C8992...; path=/; HttpOnly

< Date: Mon, 04 Nov 2013 15:54:55 GMT

< Content-Length: 137

<

* Ignoring the response-body

* Connection #0 to host www.site.com left intact

* Issue another request to this URL: 'http://www.site.com/account_page'

* Violate RFC 2616/10.3.3 and switch from POST to GET

* Re-using existing connection! (#0) with host (nil)

* Connected to (nil) (50.56.211.113) port 80 (#0)

> GET //account_page HTTP/1.1

User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0

Host: www.site.com

Accept: */*

Referer: http://www.site.com/login

Cookie: STGSHYTEFG=899227A88B4B3C8992...

< 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="3yadwkzanursnnypckx3bt0y" for domain www.site.com, path /, expire 0

< Set-Cookie: ASP.NET_SessionId=3yadwkzanursnnypckx3bt0y; path=/; HttpOnly

< Date: Mon, 04 Nov 2013 15:54:55 GMT

< Content-Length: 42550

<

* Connection #0 to host (nil) left intact

* Closing connection #0

Как видно, в случае с cURL (CURLOPT_FOLLOWLOCATION = true) и куки ставятся другие и редирект тоже другой. В случае с эмутятором кука всего одна и редирект сразу идет на 404 (см. заголовки на предыдущей странице).

Как бы научить эмулятор делать то же самое?

---------- Добавлено 04.11.2013 в 20:13 ----------

Я это сделал (через костыль). Почитал заголовки и просто заменил POST на GET и все заработало :)

🪄 www.cyberseo.net - плагин для создания автоблогов под WordPress, с поддержкой OpenAI GPT, Anthropic Claude, Google Gemini, Llama, Mistral, Midjourney, FLUX, Stable Diffusion | 📣 Импорт RSS / XML / JSON/ CSV / HTML
bukachuk
На сайте с 07.09.2008
Offline
97
#12

Подхватывайте куки руками, и в заговоке потом передавайте. А ну опоздал, оказывается все просто было:D

Программирование PHP,Mysql (/ru/forum/934470)
B1
На сайте с 13.12.2012
Offline
28
#13

1) в хидере "Location" внутренний адрес, пробуйте добавить к нему хост и правельно передать через CURLOPT_URL.

2) как бы при редиректе на до закрыть текущее соединение curl, и по новой инициировать.

bukachuk
На сайте с 07.09.2008
Offline
97
#14
bashkir102:
1) в хидере "Location" внутренний адрес

Там по другому не бывает, это же заголовки http

B1
На сайте с 13.12.2012
Offline
28
#15
bukachuk:
Там по другому не бывает, это же заголовки http

обратного я не утверждал.

ТС делает так curl_setopt($ch, CURLOPT_URL, $redirect_url) где $redirect_url = "/account_page"

TF-Studio
На сайте с 17.08.2010
Offline
334
#16

Дайте уже ссылки - явно роще и быстрее будет

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
FollowLocation
На сайте с 19.07.2013
Offline
12
#17

bukachuk, бывает. Это же редирект. Закрывать соединение для редиректа вовсе не обязательно. А преобразовать урл к абсолютному можно так:

function curl_flollow_exec($ch, $redirects = 0) {
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 !== '') {
$download_url = curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL);
$redirect_url = abs_url ($redirect_url, $download_url);
curl_setopt($ch, CURLOPT_URL, $redirect_url);
return curl_flollow_exec($ch, $redirects);
}
}
}
return $data;
}

function abs_url ($link, $base_url) {

if (!$link) return $base_url;

$parse_url = parse_url($link);
$base = parse_url($base_url);
$host_url = $base['scheme'] . "://" . $base['host'];

if ($parse_url['scheme']) {
$abs_url = $link;
} elseif ($parse_url['host']) {
$abs_url = "http://" . $link;
} else { // ссылка относительная
if (preg_match("!^/!", $link)) {
$abs_url = $host_url . $link;
} elseif (preg_match("!^(\.\./)+!", $link, $tt0)) {
$num = preg_match_all("!\.\./!", $tt0['0'], $tt1);
preg_match("!(.*)/(?:.+?/){{$num}}$!", dirname($base['path']) . "/", $tt2);
$abs_url = $host_url . $tt2['1'] . "/" . preg_replace("!^(\.\./){{$num}}!", "", $link);
} elseif (preg_match("!^\./!", $link)) {
$abs_url = $host_url . dirname($base['path']) . substr($link, 1);
} else {
$abs_url = $base_url . ((preg_match("!/$!", $base_url))?"":"/") . $link;
}
}

return $abs_url;

}
bukachuk
На сайте с 07.09.2008
Offline
97
#18
TF-Studio:
Дайте уже ссылки - явно роще и быстрее будет

ТС уже решил проблему ;)

dkameleon
На сайте с 09.12.2005
Offline
386
#19

я бы грешил на парсер заголовков.

может у вас там с урлом выпарсивается \r или что-то в этом духе, что редиректу не проходит.

к тому же браузеры безболезненно обрабатывают относительные редиректы, а как курл себя поведет - хз...

ПС. уххх проспал :)

Дизайн интерьера (http://balabukha.com/)
B1
На сайте с 13.12.2012
Offline
28
#20
AutoBlogger:
---------- Добавлено 04.11.2013 в 20:13 ----------

Я это сделал. Почитал заголовки и просто заменил POST на GET и все заработало!

Всем спасибо.

у ТС заработало.

123 4

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