POST работает с Postman, но не с CURL

Используя почтальон, я отправляю POST на (мои имя пользователя и пароль заполнены):

https://ssl.reddit.com/api/login?api_type=json&user=XXX&passwd=XXX&rem=True 

Я получаю ответ, содержащий модхэш и файл cookie. Затем я отправляю второй POST с почтальоном:

https://en.reddit.com/api/comment?api_type=json&text=7/1/15TEST&thing_id=t1_csa56v2

со следующими заголовками (XXX подтверждено и заполнено):

User-Agent: XXX
Cookie: reddit_session=XXX
X-Modhash: XXX

Это дает правильный ответ, но когда я пытаюсь сделать то же самое с CURL в моем PHP, он отвечает USER_REQUIRED. Я еще раз подтвердил правильность cookie и modhash.

$name = 't1_csa56v2';
$text = 'NEWEST TEST 7/2/15 12:20am';
$url = 'https://en.reddit.com/api/comment';

$modhash = 'XXX';
$cookie = 'XXX';

$headerFields = array (
    'User-Agent' => 'XXX',
    'Cookie' => 'reddit_session='.$cookie,
    'X-Modhash' => $modhash 
);

$postFields = array (
    'api_type' => 'json',
    'text' => $text,
    'thing_id' => $name
);


$field_string = http_build_query($postFields);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 3);
curl_setopt($ch, CURLOPT_POSTFIELDS, $field_string);
$response = curl_exec($ch);

Что я делаю не так? Почему я не могу получить такой же ответ?

Скриншот POSTMAN: Скриншот POSTMAN


person radleybobins    schedule 02.07.2015    source источник
comment
Вы отправляете имя пользователя и пароль в запросе с URL-адресом (это похоже на отправку запроса GET). С Curl вы отправляете POST-запрос.   -  person Neeraj Verma    schedule 02.07.2015
comment
@NeerajVerma О, извините, я забыл указать, что вы можете указать почтальону, чтобы отправить POST   -  person radleybobins    schedule 02.07.2015
comment
Но просто указать отправку POST-запроса недостаточно. Вам нужно отправить данные POST. Но здесь вы отправляете данные в URL.   -  person Neeraj Verma    schedule 02.07.2015
comment
Поэтому я добавил поля сообщения в раздел параметров URL-адреса, указанный после параметра POST, и он автоматически выдал URL-адрес, который я вставил сюда, я на 99% уверен, что именно там я добавляю параметры сообщения.   -  person radleybobins    schedule 02.07.2015
comment
Будет полезно, если вы поделитесь скриншотом запроса почтальона. Или попробуйте использовать тот же URL-адрес с запросом CURL. Поскольку использование URL с почтальоном и с CURL не одно и то же. Я имею в виду отправку данных в запросе URL при выполнении запроса CURL.   -  person Neeraj Verma    schedule 02.07.2015
comment
Добавлен скриншот @NeerajVerma   -  person radleybobins    schedule 02.07.2015
comment
Давайте продолжим обсуждение в чате.   -  person Neeraj Verma    schedule 02.07.2015


Ответы (1)


<?php 
error_reporting(E_ALL);
$name = 't1_csa56v2';
$text = 'NEWEST TEST 7/2/15 12:20am';
$url = 'https://en.reddit.com/api/comment';

$modhash = 'XXX';
$cookie = 'XXX';

$headerFields = array (
    'X-Modhash' => $modhash 
);

$postFields = array (
    'api_type' => 'json',
    'text' => $text,
    'thing_id' => $name
);



$ch = curl_init($url);
assert(curl_setopt_array($ch,
array(
        CURLOPT_AUTOREFERER => true,
        CURLOPT_BINARYTRANSFER => true,
        CURLOPT_COOKIESESSION => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_FORBID_REUSE => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_TIMEOUT => 11,
        CURLOPT_ENCODING=>"",
        CURLOPT_USERAGENT=>'XXX',
        CURLOPT_COOKIE=>'reddit_session='.$cookie,
        CURLOPT_HTTPHEADER=>$headerFields,
        CURLOPT_POST=>true,
        CURLOPT_POSTFIELDS=>$postFields,
)));
$response = curl_exec($ch);

попробуйте это .. не уверен, что именно вы делаете неправильно, но пользовательский агент должен быть установлен с помощью CURLOPT_USERAGENT , а файл cookie должен быть установлен с помощью CURLOPT_COOKIE , и вы должны позволить curl кодировать его для вас, а не использовать http_build_query , и вы должны явно установить его на запрос POST, поскольку по умолчанию это запрос GET. также следует включить отчет об ошибках E_ALL

person hanshenrik    schedule 02.07.2015
comment
большое спасибо за ответ! Мне неожиданно пришлось путешествовать вчера и сегодня, я попробую ваши советы как можно скорее, когда вернусь. Просто не хотел, чтобы вы думали, что я вас игнорирую! - person radleybobins; 03.07.2015
comment
Спасибо за это, не смог выполнить запрос, добавил пользовательский агент и сработал. - person Hugo Rocha; 24.07.2017