Страница 3 из 3

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

Добавлено: Вс мар 16, 2025 4:22 pm
Logrus
https://snipp.ru/php/curl#link-post-zapros

curl_setopt($ch, CURLOPT_HEADER, false);
заголовки не отключены и выдает их вместо нужного, но вообще при вопросе показывали б и ваши ответы ...

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

Добавлено: Вс мар 16, 2025 8:31 pm
John
Скрипт из примера 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

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

Простите, если излагаю невнятно, из меня программер как из г.. пуля ((

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

Добавлено: Пн мар 17, 2025 1:43 am
Logrus
error:400
судя по этому, косяк в вашем запросе какой-то

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

Добавлено: Пн мар 17, 2025 3:23 am
V.A.S.t
А если так

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

<?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/

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

Добавлено: Вт мар 18, 2025 9:54 am
JackOfShadows
Чудес не бывает. Поставьте какой-нибудь fiddler/tcpdump/wireshark/что там ещё сейчас актуально и сравните, что отправляется из Хрома и что из php.

https://confluence.atlassian.com/kb/how ... 64332.html

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

Добавлено: Ср мар 19, 2025 12:49 pm
John
Уважаемые форумчане! Огромное спасибо за ответы и рекомендации!
Победил я эту заразу, оказывается нужно было еще передавать значение "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 запроса
Для полного счастья еще нужно будет обновлять статус объекта (вкл/выкл), но пока и так сойдет ))))

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

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

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

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

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

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