PHP CURL POST Возвращает bool (false) - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблема с кодом, и мне нужна ваша помощь. У меня есть этот сайт, который создает учетную запись IPTV

http://thgss.com/

Этот сайт зависит от трех страниц, прежде чем его можно будет загрузить.На второй странице "http://thgss.com/index.php?p=download2" и после ввода кода с картинки.

POST-запрос отправляется на http://thgss.com/index.php?p=download3'

со следующими данными:'done = true & submit = Download + Now'

заголовок запроса

POST /index.php?p=download3 HTTP/1.1
Host: thgss.com
Connection: keep-alive
Content-Length: 29
Cache-Control: max-age=0
Origin: http://thgss.com
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://thgss.com/index.php?p=download2
Accept-Encoding: gzip, deflate
Accept-Language: ar,en-US;q=0.9,en;q=0.8
Cookie: PHPSESSID=imbdp791tqal3fq8ifa80till1
done=true&submit=Download+Now

Ссылка на файл m3u находится в заголовке ответа в местоположении

HTTP/1.1 302 Found
Date: Tue, 18 Dec 2018 04:56:17 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.24
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
location: http://24.thgss.com:8000/get.php?username=37441545108977&password=37441545108977&type=m3u&output=mpegts
Content-Length: 2584
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

Мой код хорошо работает на локальном сервере

Но при загрузке его на удаленный сервер появляется сообщение об ошибке " bool (false) "

Я хочу, чтобы вы мне помогли проверьте мой код

мой код

function getUserIP() {
    if( array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
        if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')>0) {
            $addr = explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);
            return trim($addr[0]);
        } else {
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
    }
    else {
        return $_SERVER['REMOTE_ADDR'];
    }
}
$ip = getUserIP() ;

$data = 'done=true&submit=Download+Now';
$headers = array(
    $data,
    'Content-Type: application/x-www-form-urlencoded',
    'Referer: http://thgss.com/index.php?p=download2',
    'X-Forwarded-For: '. $ip
);

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'http://thgss.com/index.php?p=download3');
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_HEADER, 1);
curl_setopt($curl_handle,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36');
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($curl_handle);
curl_close($curl_handle);
var_dump($response);

1 Ответ

0 голосов
/ 18 декабря 2018

помогите мне получить URL местоположения из заголовка ответа

Вам нужно получить информацию из вашего запроса Curl и получить оттуда заголовок.

Вот ваш код:

$ip = getUserIP() ;

$data = 'done=true&submit=Download+Now';
$headers = array(
    $data,
    'Content-Type: application/x-www-form-urlencoded',
    'Referer: http://thgss.com/index.php?p=download2',
    'X-Forwarded-For: '. $ip
);

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'http://thgss.com/index.php?p=download3');
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_HEADER, 1);
curl_setopt($curl_handle,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36');
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($curl_handle);
curl_close($curl_handle);
var_dump($response);

Перед вашим curl_close добавьте следующее:

$curl_info = curl_getinfo($curl_handle);

Затем вы можете использовать preg_match, чтобы найти заголовок вашего местоположения:

$headers = substr($response, 0, $curl_info["header_size"]);
preg_match('#Location: (.*)#', $headers, $location);

Затем вы должны найти свой заголовок Location в $location, вероятно, $location[1].

На заметке, это имя пользователя и пароль, которые вы отправляете в заголовке?

Редактировать:

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

Чтобы помочь вам отладить любые ошибки с фактическим запросом скручивания, до curl_close вы можете добавить:

$errs = curl_error($curl_handle);

$errs теперь предоставит вам любые причины, по которым запрос curl может быть неудачным.Пример ошибки:

«Невозможно подтвердить подлинность сертификата однорангового узла с помощью известных сертификатов CA»

Более подробную информацию можно найти в документации: http://php.net/manual/en/function.curl-error.php

Редактировать 2:

После того, как вы сказали, что у вас проблема с тайм-аутом, я теперь замечаю, что вы использовали 2 секунды: curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); ...

Попробуйте увеличитьтаймаут:

curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($curl_handle, CURLOPT_TIMEOUT, 30);

Вы также можете использовать 0, который должен ждать бесконечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...