質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

解決済

PHPからシェルスクリプトを実行する際にコンソール上では成功するが、外部からWebhookでPostするとエラーになる

T-Moriyama
T-Moriyama

総合スコア0

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

1回答

0評価

0クリップ

3732閲覧

投稿2018/01/23 18:06

編集2022/01/12 10:58

###前提・実現したいこと
ここ数日でシェルスクリプトやPHPを触り始めた全くの素人です。
GoogleホームとNatureRemoのAPI使ってエアコンをワンフレーズで制御したい。
IFTTTを使用しGoogleアシスタントをトリガーにWebhookからpostし
ラズベリーパイのPHPで受け取って、シェルスクリプトからAPIで制御したい。
Webhookから直接APIを送信したかったが、Webhookでは認証トークンをヘッダーに追加することができなかった為
このような変則的な方法を試しています。

###発生している問題・エラーメッセージ
ラズベリーパイのコンソール上でcurlを叩くと正常に動作するが、外部からWebhook
で発信するとシェルスクリプトがエラーを吐いて機能しない

(apache2のエラーログ) [Wed Jan 24 02:00:47.277031 2018] [:error] [pid 559] [client xxx.xxx.xxx.xxx:xxxxx] PHP Notice: Undefined index: temp in /var/www/html/aircon.php on line 3 sh: 1: Syntax error: Unterminated quoted string
(ブラウザから http://{myurl}/aircon.php で表示される項目) NULL NULL NULL string(178) " エアコンを モードで 度の 風向き 風量 で起動!! {"temp":"0","mode":"auto","vol":"auto","dir":"auto","button":"","updated_at":"2018-01-24T04:44:37Z"}"

###該当のソースコード

PHP

// 2018/1/25 22:00 修正しました。 <?php $mode = isset($_POST["mode"])?$_POST["mode"]:"暖房"; $temp = isset($_POST["temp"])?$_POST["temp"]:"24"; $button = isset($_POST["button"])?$_POST["button"]:"power-off"; $json_string = file_get_contents('php://input'); $filename = "php_input.txt"; file_put_contents($filename, $json_string, FILE_APPEND); $mode = $_POST["mode"]; $temp = $_POST["temp"]; $button = $_POST["button"]; echo $temp,$mode,$button; var_dump($temp,$mode,$button); $output = shell_exec('/bin/sh /home/pi/test.sh "'.$mode.'" "'.$temp.'" "'.$button.'"'); var_dump($output); ?>

bash

#!/bin/sh echo "$1 $2 $3" case "$1" in "オート" | "自動" ) if [ "$2" -ge "-5" -a "$2" -le"5" ] then mode="auto" temp="$2" dir="auto" vol="auto" else mode="auto" temp="0" dir="auto" vol="auto" fi ;; "クーラー" | "冷房" ) if [ "$2" -ge "19" -a "$2" -le "32" ] then mode="cool" temp="$2" dir="auto" vol="auto" else mode="auto" temp="0" dir="auto" vol="auto" fi ;; "ドライ" ) if [ "$2" -ge "-2" -a "$2" -le "2" ] then mode="dry" temp="$2" dir="auto" vol="auto" else mode="auto" temp="0" dir="auto" vol="auto" fi ;; "ヒーター" | "暖房" ) if [ "$2" -ge "14" -a "$2" -le "30" ] then mode="warm" temp="$2" dir="auto" vol="auto" else mode="auto" temp="0" dir="auto" vol="auto" fi ;; * ) mode="auto" temp="0" dir="auto" vol="auto" ;; esac echo "エアコンを $mode モードで $temp 度で 風向き $dir 風量 $vol で起動!!" curl -X POST "https://api.nature.global/1/appliances/{id}/aircon_settings" \ -H "accept: application/json" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "temperature=$temp&operation_mode=$mode&air_volume=$vol&air_direction=$dir&button=$3" \ -k --header "Authorization: Bearer {token}"
IFTTTの設定 Googleアシスタント(トリガー) Say a phrase with both a number and a text ingredient:「エアコンを$#度でつけて」 Webhook(アクション) URL: http://raspi-url.jp/aircon.php Method: POST ContentType: appricaton/x-www-form-urlencoded Body: -d "temp={{NumberField}}&mode={{TextField}}&button=power-on"

###試したこと
ルーターのポートは開放されていることを確認
ラズベリーパイのコンソール上で
$ curl -X POST "http://localhost/aircon.php" -H "Content-Type: application/x-www-form-urlencoded" -d "temp=26&mode=暖房&button=power-on"
と打ち込むと意図した動作を行う
Windowsのコマンドプロンプトから同じcurlを入力するとechoで出力する文字が文字化けするので文字のエンコードが原因か?
IFTTTでWebhookではなくメールやメッセージに送るアクションだと"暖房 27"などと表示され文字化け無し

###補足情報(言語/FW/ツール等のバージョンなど)
NatureRemo Cloud API
http://swagger.nature.global/

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

otn
otn

2018/01/24 01:33

var_dump($output); の出力結果はありますか?
T-Moriyama
T-Moriyama

2018/01/24 04:31

すみません。これがどこに出力されているのかわかりません。ブラウザから当該phpを表示すると、シェルスクリプトからechoで出力した文字が表示されます。
otn
otn

2018/01/24 04:36

ブラウザ表示内容を「そのまま」質問に追記してください。
T-Moriyama
T-Moriyama

2018/01/24 04:50

ありがとうございます。問題・エラーメッセージ等の項目に追加しました

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。