外部からkintoneのAPI叩いてみた

らら
らら

はじめに

前回、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

関連記事