Я пытаюсь получить фид из моей учетной записи Reddit, используя PHP cURL. В результате мне нужно сохранить свои куки, в настоящее время я пытаюсь сделать это с помощью файла cookies.txt в формате Netscape, но они не применяются к странице. Я думаю, что я должен делать что-то глупое.
Конечный результат Я надеюсь, что страница будет автоматически авторизована в Reddit для меня перед отображением, но я надеюсь узнать, прежде чем перейти к более сложным вещам.
<?php
//format cookies.txt file by adding semi colons to the end of new lines if they aren't already there and removing colons added to #'s
$cookies = file_get_contents('.\cookies.txt');
$cookies = str_replace("\n",";\n",$cookies);
$cookies = str_replace("#;","#",$cookies);
$cookies = str_replace(";;",";",$cookies);
file_put_contents("./cookies.txt", $cookies);
//set user agent and url + initiate
$user_agent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36";
$url = 'http://www.reddit.com';
$c = curl_init($url);
//My options
$options = array(
CURLOPT_CUSTOMREQUEST =>"GET", //set request type post or get
CURLOPT_POST =>false, //set to GET
CURLOPT_USERAGENT => $user_agent, //set user agent
CURLOPT_COOKIEFILE =>".\cookies.txt", //set cookie file
CURLOPT_COOKIEJAR =>".\cookies.txt", //set cookie jar
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
curl_setopt_array( $c, $options );
//curl_setopt(... other options you want...)
$html = curl_exec($c);
if (curl_error($c))
die(curl_error($c));
// Get the status code
$status = curl_getinfo($c, CURLINFO_HTTP_CODE);
curl_close($c);
//get html
echo $html;
?>
Здесь есть несколько вопросов. Давайте разберемся с ними по одному.
Первый, Вы заявляете, что хотите, чтобы этот скрипт регистрировал вас в Reddit. Предположительно, это PHP-скрипт, доступный через Интернет, и ваша цель — установить куки в вашем браузере, когда вы посещаете эту страницу.
Проблема 1: Это может быть невозможно, если значения файлов cookie зависят от IP-адреса (и, возможно, других факторов), для которых файл cookie был создан. Я не знаком с тем, как Reddit обрабатывает сессии, поэтому я не могу ответить на это. Если значения cookie-файлов могут быть разделены между любыми компьютерами, тогда все готово.
Проблема 2: Вы не отправляете заголовки (включая файлы cookie) в свой браузер, но я подозреваю, что вы просто еще не достигли этой точки. Когда вы доберетесь туда, вы можете сделать это с header()
или же setcookie()
.
второй, Есть некоторые синтаксические проблемы с вашим кодом.
Ты используешь \
в качестве разделителя каталогов. Это проблематично, потому что одна обратная косая черта сама по себе является побег персонаж. Хотя символы предшествуют \
не избежали (исключая \n
), это не очень хорошая привычка.
Все, что сказал, вы должны использовать DIRECTORY_SEPARATOR вместо.
Вы смешиваете одинарные кавычки ('
) и двойные кавычки ("
). В PHP это имеет значение. Прочитайте документацию на строки для дополнительной информации.
Вы также смешиваете слеш (/
) и обратная косая черта (\
) для ваших путей к каталогам.
Итак, теперь нам нужно определить несколько вещей, и это поможет нам отладить, если вы предоставите свой файл cookie. Зашифруйте значения, чтобы мы не смогли захватить ваш сеанс.
Что на самом деле возвращается в curl?
Что выводится в ваш браузер?
Когда были созданы значения cookie? Возможно, срок действия файла cookie истек.
cURL может самостоятельно обрабатывать создание и обработку файла cookie. Я бы порекомендовал исключить код, который вы написали до //set user agent and url + initiate
, Следующим шагом является обеспечение того, чтобы cookies.txt
существует, и пользователь, выполняющий ваш сценарий, имеет соответствующие разрешения для доступа к файлу (760, 770 или 660 должны быть тем, что вам нужно, если вы запускаете это в Linux).