はじめに
前回、kintoneをちょっと使ってみたので・・
今回は、外部からアクセスできるのか・・試してみた・・・
レコードを取得してみる。
下記を使ってみる・・
https://cybozu.dev/ja/kintone/docs/rest-api/records/get-records/
今回も、自分のPCからアクセスするのでPerlで・・・書いてみる・・
筆者は、PCにPerl入れているので、変換PGだったり、バッチをPerlで書いているので・・
まずは、kintone APIではトークンとID パスワード認証の接続があるようで、
トークンの場合、アカウントの権限でレコードの制御している場合、当然、無視されます・・
ログイン方式では、アカウントの権限で設定によって取得レコードが制限されます。
今回は、そのあたりも検証してみます。。
サンプルは営業支援サポートパックの顧客管理に接続しています。
下記では、コメントでトークン認証、ID パスワード認証の2つを試しました・・
パスワード認証では、レコードにユーザー権限をkintoneで設定したので許可されたものだけ表示されるのか
試しました。正しく権限通り設定したものだけ表示されました。
HTTP::Request->newがGETであることに注意
保存はUTF8で保存
#!/usr/bin/perl
use Encode;
use MIME::Base64;
use LWP::UserAgent;
use HTTP::Request;
use JSON;
use Data::Dumper;
my $kintone_subdomain = "あなたのkintoneサブドメイン名";
my $kintone_appid = '顧客管理のアプリID';
my $kintone_token = 'トークン文字列を記述';
my $kintone_id = "ユーザーのログインID";
my $kintone_pass = "ユーザーのパスワード1";
my $auth = encode_base64("$kintone_id:$kintone_pass");
my $basic_auth = "basic $auth";
my $ua = LWP::UserAgent->new;
my $kintone_host = $kintone_subdomain.".cybozu.com:443";
$ua->default_header('Host' => $kintone_host);
$ua->default_header('Content-Type' => "application/json");
# $ua->default_header('X-Cybozu-API-Token' => $kintone_token); #トークン認証
$ua->default_header("X-Cybozu-Authorization" => $auth); #ID パスワード認証
# $ua->default_header("Authorization" => $basic_auth);
my $url = 'https://' . $kintone_subdomain. '.cybozu.com/k/v1/records.json';
my %reqdata = ();
$reqdata->{'app'} = $kintone_appid ;
my $json = encode_json($reqdata);
$json = decode_utf8($json);
my $req= HTTP::Request->new('GET', $url);
$req->content($json);
my $res = $ua->request($req);
my $content = $ua->request($req)->content;
if ($res->is_success) {
print $res->code."\n";
$json = encode_utf8($content);
$json_perl = decode_json($json) ;
foreach my $records (@{$json_perl->{records}}) {
print $records->{'顧客名'}->{value}."\n";
}
} else {
print "ERROR"."\n";
print $res->code."\n";
print $content."\n";
}
レコードを更新してみる。
https://cybozu.dev/ja/kintone/docs/rest-api/records/update-record/
ぐ。。PerlのJSON・・・か・・
おさらい・・w
JSONは下記で・・・
{
"app": "顧客管理のアプリID",
"record": {
"name": {
"value": "a1"
},
"name1": {
"value": "b"
},
"name2": {
"value": "c"
}
}
}
Perl変数からJSONテキスト・・・
my $output_data = {
app => $cybozu_appid,
record => {
"name" => {
value => "a",
},
"name1" => {
value => "b",
},
"name2" => {
value => "c",
}
}
};
my $json_text = encode_json( $output_data ) ;
Perl変数からJSONテキスト
my %test_data = ();
$test_data->{'app'} = $kintone_appid;
my %rec = ();
$rec->{name}->{value} = "テスト";
$rec->{name1}->{value} = "テスト";
$rec->{name2}->{value} = "テスト";
$test_data->{'record'} =$rec;
my $json_text = encode_json( $test_data ) ;
$json_text = decode_utf8($json_text);
APIの1件書き込みテスト
保存はUTF8で保存
#!/usr/bin/perl
use MIME::Base64;
use LWP::UserAgent;
use Encode;
use HTTP::Request;
use JSON;
use Data::Dumper;
my $kintone_subdomain = "あなたのkintoneサブドメイン名";
my $kintone_appid = '顧客管理のアプリID';
my $kintone_token = 'トークン文字列を記述';
my $kintone_id = "ユーザーのログインID";
my $kintone_pass = "ユーザーのパスワード1";
my $kintone_host = $kintone_subdomain.".cybozu.com:443";
my $ua = LWP::UserAgent->new;
$ua->default_header('Host' => $kintone_host);
$ua->default_header('Content-Type' => "application/json");
$ua->default_header('X-HTTP-Method-Override' => "GET");
$ua->default_header('X-Cybozu-API-Token' => $kintone_token); #トークン認証
# $ua->default_header("X-Cybozu-Authorization" => $auth); #ID パスワード認証
# $ua->default_header("Authorization" => $basic_auth);
my $url = 'https://' . $kintone_subdomain. '.cybozu.com/k/v1/record.json';
my %reqdata = ();
$reqdata->{'app'} = $kintone_appid ;
$reqdata->{'id'} = 19;
my $json = encode_json($reqdata);
$json = decode_utf8($json);
my $req= HTTP::Request->new('GET'=> $url);
$req->content($json);
my $res = $ua->request($req);
my $content = $ua->request($req)->content;
if ($res->is_success) {
print $res->code."\n";
$json = encode_utf8($content);
$json_perl = decode_json($json) ;
} else {
print "ERROR"."\n";
print $res->code."\n";
print $content."\n";
exit;
}
my %test_data = ();
$json_perl->{record}->{"顧客名"}->{value}= "戸田ネットソリューションズ変更します。";
$test_data->{'app'} = $kintone_appid;
$test_data->{'id'} = 19;
my %rec = ();
$rec->{"顧客名"}->{value} = $json_perl->{record}->{"顧客名"}->{value};
$rec->{"郵便番号"}->{value} = $json_perl->{record}->{"郵便番号"}->{value};
$rec->{"部署名"}->{value} = $json_perl->{record}->{"部署名"}->{value};
$rec->{"メールアドレス"}->{value} = $json_perl->{record}->{"メールアドレス"}->{value};
$rec->{"担当者名"}->{value} = $json_perl->{record}->{"担当者名"}->{value};
$rec->{"住所"}->{value} = $json_perl->{record}->{"住所"}->{value};
$rec->{"TEL"}->{value} = $json_perl->{record}->{"TEL"}->{value};
$rec->{"FAX"}->{value} = $json_perl->{record}->{"FAX"}->{value};
$test_data->{'record'} =$rec;
my $json_text = encode_json($test_data);
$json_text = decode_utf8($json_text);
my $req_post= HTTP::Request->new(PUT => $url);
$req_post->content($json_text);
$res_post = $ua->request($req_post);
my $result = $ua->request($req_post)->as_string;
if ($res_post->is_success) {
print $res_post->code;
# print $result;
} else {
print $res_post->code;
# print $result;
}
ポイント
GETしたデータをそのまま、PUTすると怒られます。。PUT用のフォーマットへ変換が必要と、書き換えできない項目もある。。。
X-HTTP-Method-Overrideを指定
読み込み書き込みがGETとかPUTとかを見落としている(HTTP::Request->new)の指定
record.jsonとrecords.jsonとか・・
本家のAPI取説わかりずらい・・・
さいごに。。
いろいろな言語やっていると・・細かい仕様がわすれてる・・
関連
kintoneつかってみた
記事
https://www.omakase.net/blog/2023/06/kintone-use.html