外部サイトからkintoneへのデータ入力について

お世話になります。

外部サイトのお問い合わせフォームで入力・送信された情報をkintoneに直接蓄積できないかと考えているのですが、クロスドメイン制約というもので実現は無理という認識でよいのでしょうか?

どうにかして外部サイトのお問い合わせフォームの情報を手でkintoneへ入力する手間を省きたいのですが、知識が浅く、良い方法が思い浮かびません。

稚拙な質問ですが、知恵をお貸しいただけると幸いです。

よろしくお願いいたします。

Kohei Hasebe様
cstapの落合です。

弊社では、外部サイトのお問い合わせフォームなどで入力・送信された情報をkintoneに直接蓄積できるフォームクリエイターというサービスを提供しております。
もし手っ取り早く実現したい場合は、ご参考ください。
http://fc.kintoneapp.com/

クロスドメイン制約は、ブラウザの機能となります。現在はほとんどすべてのブラウザが対応しており、JavaScriptで回避することは難しいです。
もしサーバーのプログラムを編集できるなら、サーバーにPOSTされたデータをREST APIでkintoneに登録することは可能です。

参考になりますでしょうか?

落合様

回答ありがとうございます。

「もしサーバーのプログラムを編集できるなら」というのはお問い合わせフォームを設置してあるサーバーにPHPなど任意のプログラムをFTP接続で設置できるかということでしょうか?

だとすると以下の質問の回答内容を実現するといったことになるのでしょうか?
https://cybozudev.zendesk.com/hc/communities/public/questions/200892824-PHP-%E3%81%8B%E3%82%89%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E6%9B%B4%E6%96%B0?locale=ja

的外れなことを聞いていたら申し訳ありません。

Kohei Hasebe様

そのような認識で大きく違わないです。
PHPなど任意のプログラムでサーバーからkintoneにHTTP通信を行うことで、実現できます。

もしPHPで記述する場合は、サンプルをお渡しすることも可能ですので、お気軽にお申し付けください。

落合様

回答ありがとうございます。
PHPに触れる機会が比較的多いため、可能であればPHPで実現したいと考えております。

気軽に依頼してよいものかとても迷うのですが、サンプルをいただけると非常に助かります。

ぜひよろしくお願いいたします。

Kohei Hasebe様

以下、それぞれfile_get_contents, HTTP_Request2, Guzzleを利用したサンプルとその説明になります。
良ければ参考にしてください。

http://firestorage.jp/download/9c3d92b01ad5d3fa144a116d5ab3a2031d2830d9
http://firestorage.jp/download/4e84e264896664fdf417624c3d1d350b837983fc
http://firestorage.jp/download/4283858b84c14d399de0e96edcf33e78b60d85ba

落合様

ありがとうございます。
参考にさせていただき、今からチャレンジしてみます。

実現できたときや分からないことがあった際は質問させていただければと幸いです。
本当にありがとうございます。

Kohei Hasebe様

わからない点がありましたらお気軽にご質問ください!

落合様

お世話になっております。
頂いたHttpRequest2_20140623.docxを参考にPEARのHTTP_Request2を利用して実現を考えていますが、現状うまくいっていません。

エラーは以下のものとなっています。
status: 520 cybozu error: CB_AU01 body: {“message”:“ログインしてください。”,“id”:“1505999166-1065547041”,“code”:“CB_AU01”}

なんとなく、接続がうまくいってないんだなーという感じです。

そこで「レコードを最大100件取得した結果をダンプ出力する」サンプルプログラムに関していくつか質問があります。


$request->setHeader($header);にある$headerの中身に関する記載がないのですが、REST APIの認証設定について.docxにあるリクエストヘッダを記載すればよろしいのでしょうか?

以下現在設定しているリクエストヘッダ
$header = array(
"Host: " . $subDomain . “.cybozu.com:443”,
“Content-Type: application/json”,
"X-Cybozu-Authorization: " . base64_encode($loginName . ‘:’ . $password),
);


$request->setUrl(“https://” . $subDomain . “.cybozu.com/k/v1/form.json”);となっていますが、レコードを取得するためにはform.jsonをrecord.jsonに変換した方がよいのでしょうか?

Kohei Hasebe様


すいません。$headerの定義が抜けていますね・・・

②レコードの一括取得でしたらrecords.jsonを利用します。

簡単にやるなら以下のような感じです。

<?php

// 初期設定
require_once ‘HTTP/Request2.php’;

// 認証設定
$subDomain = “your-subdomain”;
$loginName = “your_login_name”;
$password = “your_password”;

// アプリID
$appId = 336;

// リクエストヘッダ
$header = array(
"Host: " . $subDomain . “.cybozu.com:443”,
“Content-Type: application/json”,
"X-Cybozu-Authorization: " . base64_encode($loginName . ‘:’ . $password)
);

// リクエスト作成
$request = new HTTP_Request2();
$request->setHeader($header);
$request->setUrl(“https://” . $subDomain . “.cybozu.com/k/v1/records.json”);
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setBody(json_encode(array(“app” => $appId)));
$request->setConfig(array(
‘ssl_verify_host’ => false,
‘ssl_verify_peer’ => false
));

// レスポンス取得
$response = $request->send();
if ($response->getStatus() != “200”) {
echo sprintf(“status: %s”, $response->getStatus());
echo sprintf(“cybozu error: %s”, $response->getHeader(‘x-cybozu-error’));
echo sprintf(“body: %s”, $response->getBody());
die;
}

$data = json_decode($response->getBody(), true);
var_dump($data);

参考になりますでしょうか?

落合様

回答ありがとうございます。

とても参考になっております。
現状、status: 520 cybozu error: CB_AU01が消えませんが、もう少し試行錯誤してみます。

Kohei Hasebe様

おそらくheaderに問題があるのかと思います。

$request->setHeader($header);
していない場合や
"X-Cybozu-Authorization: " . base64_encode($loginName . ‘:’ . $password)
が$headerにない場合などに起こるかと思います。

落合様

お世話になっております。
更新しているファイルと閲覧しているURLを見違えていました…(/ω\)

無事にデータを取得できました。ありがとうございます。

明日以降、お問い合わせフォームに組み込んでデータの登録にチャレンジしてみます。

また何かありましたら質問させていただけると幸いです。
本当にありがとうございました。

Kohei Hasebe様

問題が解決したようで良かったです!

お問い合わせフォームのデータ登録だとレコードの登録(1件)を利用するかと思います。
レコードの登録(1件)は、record.jsonをPOSTでリクエストします。
https://cybozudev.zendesk.com/hc/ja/articles/202166160#step1

HTTP_Request2で行うとしたらこんな感じです。

// リクエスト作成
$request = new HTTP_Request2();
$request->setHeader($header);
$request->setUrl(“https://” . $subDomain . “.cybozu.com/k/v1/record.json”);
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setBody(json_encode(array(“app” => $appId, “record” => $record)));
$request->setConfig(array(
‘ssl_verify_host’ => false,
‘ssl_verify_peer’ => false
));

メソッドはPOSTに指定する
$request->setMethod(HTTP_Request2::METHOD_POST);

$recordは[“フィールドコード” => [“value” => (フィールド値)], ・・・]という感じの配列です。
$request->setBody(json_encode(array(“app” => $appId, “record” => $record)));

また何かありましたらお気軽にご質問ください!

落合様

お世話になっております。
登録についてですが、無事にできました。
ありがとうございます!

ただ一点、フィールドコードが日本語のものをPOSTすると「不正なJSON形式です」と返ってきてしまうエラーがどうしても解決できませんでした。

こちらに関してjson_encodeを行う際に何か特別な設定を行うことで回避可能なものなのでしょうか?

Kohei Hasebe様

無事登録ができたようで良かったです!

フィールドコードが日本語の時に不正なJSONだと言われるのは、文字コードが原因となっている可能性が高いかと思います。
PHPはUTF-8で記述していますでしょうか?

落合様

おかげ様で本当に助かりました。

PHPファイルはUTF-8のBOMなしで記述しております。

UTF-8のBOMなしですか。。。
ということは別の問題ですね。

私の環境(PHP5.5.12)では問題ないので、なにかしらあるのでしょう・・・

・json_encode後の文字列をデコードして確認する
・JSON_UNESCAPED_UNICODEをjson_encodeのオプションにセットしてみる
とかいろいろ試してみてください。

お力になれずに申し訳ありません。

落合様

お力添えありがとうございます。
既にその二つも試しましたが、うまくいきませんでした。。。

PHPは5.4.29です。

今後何か進展がありましたら、こちらにて報告させていただきます。
細かいフォローをしていただき、本当にありがとうございました。

いえいえ(^^)
また何かありましたらお気軽にご質問ください!