Обработка json POST

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Logrus
Сообщения: 2109
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 316 раз
Поблагодарили: 466 раз

Re: Обработка json POST

Сообщение Logrus » Вс мар 16, 2025 4:22 pm

https://snipp.ru/php/curl#link-post-zapros

curl_setopt($ch, CURLOPT_HEADER, false);
заголовки не отключены и выдает их вместо нужного, но вообще при вопросе показывали б и ваши ответы ...
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
John
Сообщения: 43
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 14 раз
Поблагодарили: 1 раз

Re: Обработка json POST

Сообщение John » Вс мар 16, 2025 8:31 pm

Скрипт из примера https://snipp.ru/php/curl#link-post-zapros написал вот так и вставил в свой php

Код: Выделить всё

<?php
$url = 'http://192.168.0.118:8081/zeroconf/switches';

$headers = ['Content-Type: application/json']; // заголовки нашего запроса

$post_data = [ // поля нашего запроса
	'sequence' => '1742028997742',
	'deviceid' => '10022b943a',
	'selfApikey' => '88361d6a-74b0-4241-8965-a9b25d3b17f8',
	'iv' => 'NjAzMjk2NjM2MzcwNjk0NA==',
	'encrypt' => true,
	'data' => 'R9jey0dlgbLaU58wNhJHZ2bQ9rtN1wFv8S5vDYnOMhFKOJYmhQQqmriL8OSaJFUx',
];

$data_json = json_encode($post_data); // переводим поля в формат JSON

$curl = curl_init();
// curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);

$result = curl_exec($curl); // результат POST запроса
?>
При вызове его из сценария выдает результат "{\"sequence\":\"1742028997742\",\"seq\":27,\"error\":400,\"encrypt\":true}"

В Charles показывает

title 1
category_id 0
description
code_code_type 0
xml
add_device_id 0
code $data = array(
'sequence' => '1742028997742',
'deviceid' => '10022b943a',
'selfApikey' => '88361d6a-74b0-4241-8965-a9b25d3b17f8',
'iv' => 'NjAzMjk2NjM2MzcwNjk0NA==',
'encrypt' => true,
'data' => 'R9jey0dlgbLaU58wNhJHZ2bQ9rtN1wFv8S5vDYnOMhFKOJYmhQQqmriL8OSaJFUx',
);

$ch = curl_init('http://192.168.0.118:8081/zeroconf/switches/');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_encode($res, JSON_UNESCAPED_UNICODE);
print_r($res);

edit_run 1
run_hours 00
run_minutes 00
subm Сохранить
id 65
view_mode edit_scripts
edit_mode
mode update
pd cGFuZWw6e2FjdGlvbj1zY3JpcHRzfQ%3D%3Dpz_
md scripts
inst adm

И снова ничего не происходит

Простите, если излагаю невнятно, из меня программер как из г.. пуля ((
Logrus
Сообщения: 2109
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 316 раз
Поблагодарили: 466 раз

Re: Обработка json POST

Сообщение Logrus » Пн мар 17, 2025 1:43 am

error:400
судя по этому, косяк в вашем запросе какой-то
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
V.A.S.t
Сообщения: 296
Зарегистрирован: Сб май 11, 2019 6:35 pm
Откуда: Иркутск
Благодарил (а): 16 раз
Поблагодарили: 68 раз

Re: Обработка json POST

Сообщение V.A.S.t » Пн мар 17, 2025 3:23 am

А если так

Код: Выделить всё

<?php
$url = 'http://192.168.0.118:8081/zeroconf/switches';

$post_data = [ // поля нашего запроса
	'sequence' => '1742028997742',
	'deviceid' => '10022b943a',
	'selfApikey' => '88361d6a-74b0-4241-8965-a9b25d3b17f8',
	'iv' => 'NjAzMjk2NjM2MzcwNjk0NA==',
	'encrypt' => true,
	'data' => 'R9jey0dlgbLaU58wNhJHZ2bQ9rtN1wFv8S5vDYnOMhFKOJYmhQQqmriL8OSaJFUx',
];

$data_json = json_encode($post_data); // переводим поля в формат JSON

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, Array('Content-Type: application/json;charset=UTF-8'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);

$result = curl_exec($curl); // результат POST запроса
print_r($result);
?>
Если также выдаст "{\"sequence\":\"1742028997742\",\"seq\":27,\"error\":400,\"encrypt\":true}", то проверяйте запрос/
Вот что говорит Нейропоиск Яндекса по этому поводу:
"Ошибка 400 в Sonoff может возникать при отправке запроса с неправильным значением параметра «switch».
Чтобы настроить яркость света, он должен быть включён, поэтому при отправке запроса с «switch»: «off» будет сообщено об ошибке «400» как о неудачной операции."

А вот что говорит документация: - 400: The operation failed and the request was formatted incorrectly. The request body is not a valid JSON format.

Если честно, смущает 'encrypt' => true. Я так понимаю, это тупо скопированный с eWelink запрос. Я бы посоветовал разобраться с протоколом и отправлять запросы без шифрования. Вот тут подробнейшее описание:
https://sonoff.tech/diy-developer/
За это сообщение автора V.A.S.t поблагодарил:
John (Ср мар 19, 2025 1:19 pm)
Рейтинг: 1.16%
JackOfShadows
Сообщения: 108
Зарегистрирован: Ср янв 09, 2019 8:37 pm
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Обработка json POST

Сообщение JackOfShadows » Вт мар 18, 2025 9:54 am

Чудес не бывает. Поставьте какой-нибудь fiddler/tcpdump/wireshark/что там ещё сейчас актуально и сравните, что отправляется из Хрома и что из php.

https://confluence.atlassian.com/kb/how ... 64332.html
За это сообщение автора JackOfShadows поблагодарил:
John (Ср мар 19, 2025 1:18 pm)
Рейтинг: 1.16%
John
Сообщения: 43
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 14 раз
Поблагодарили: 1 раз

Re: Обработка json POST

Сообщение John » Ср мар 19, 2025 12:49 pm

Уважаемые форумчане! Огромное спасибо за ответы и рекомендации!
Победил я эту заразу, оказывается нужно было еще передавать значение "Accept" без него девайс отказывался принимать запрос в нужном виде.
Вот итог, может кому пригодится:
Оборудование Sonoff Dual R3, поля запроса отловлены с помощью Charles и Wireshark
Создаем два сценария на вкл и на выкл, наверняка можно и в одном все условия прописать, но мои познания тут закончились ))

Код: Выделить всё

$url = 'IP адрес устройства';
$headers = ['Content-Type: application/json; charset=utf-8']; // заголовки нашего запроса

$post_data = [ // поля нашего запроса
	'sequence' => 'ловим значение в Charles',
	'deviceid' => 'ловим значение в Charles',
	'selfApikey' => 'ловим значение в Charles',
	'iv' => 'ловим значение в Charles',
	'encrypt' => true,
	'data' => 'ловим значение в Charles',
];

$data_json = json_encode($post_data); // переводим поля в формат JSON

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array (
	"Accept: application/json",
	"Content-Type: application/json"
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);

$result = curl_exec($curl); // результат POST запроса
Для полного счастья еще нужно будет обновлять статус объекта (вкл/выкл), но пока и так сойдет ))))
За это сообщение автора John поблагодарил:
JackOfShadows (Ср мар 19, 2025 1:12 pm)
Рейтинг: 1.16%
V.A.S.t
Сообщения: 296
Зарегистрирован: Сб май 11, 2019 6:35 pm
Откуда: Иркутск
Благодарил (а): 16 раз
Поблагодарили: 68 раз

Re: Обработка json POST

Сообщение V.A.S.t » Чт мар 20, 2025 3:26 am

John писал(а):
Ср мар 19, 2025 12:49 pm
Уважаемые форумчане! Огромное спасибо за ответы и рекомендации!
Победил я эту заразу, оказывается нужно было еще передавать значение "Accept" без него девайс отказывался принимать запрос в нужном виде.
Всё-таки я не понимаю, зачем заниматься реверс-инжинирингом, если есть подробнейшее описание API? Там же прямо конкретные запросы прописаны...
JackOfShadows
Сообщения: 108
Зарегистрирован: Ср янв 09, 2019 8:37 pm
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Обработка json POST

Сообщение JackOfShadows » Чт мар 20, 2025 11:57 am

V.A.S.t писал(а):
Чт мар 20, 2025 3:26 am
John писал(а):
Ср мар 19, 2025 12:49 pm
Уважаемые форумчане! Огромное спасибо за ответы и рекомендации!
Победил я эту заразу, оказывается нужно было еще передавать значение "Accept" без него девайс отказывался принимать запрос в нужном виде.
Всё-таки я не понимаю, зачем заниматься реверс-инжинирингом, если есть подробнейшее описание API? Там же прямо конкретные запросы прописаны...
Можно ссылку, где написано про accept?
V.A.S.t
Сообщения: 296
Зарегистрирован: Сб май 11, 2019 6:35 pm
Откуда: Иркутск
Благодарил (а): 16 раз
Поблагодарили: 68 раз

Re: Обработка json POST

Сообщение V.A.S.t » Пн мар 24, 2025 10:07 am

JackOfShadows писал(а):
Чт мар 20, 2025 11:57 am
Можно ссылку, где написано про accept?
Ссылку я давал выше. А то, что скопировано с общения приложения с устройством - это немного другое. И шифрование и accept. А вообще, предлагаю самостоятельно изучить протокол. Я его не изучал и не могу рассказать, как он работает, но явно проще, чем отправлять непонятные строки устройству...
Ответить