├── .gitignore ├── LICENSE ├── README.md ├── kintone_sdk4python ├── __init__.py ├── kintone_sdk.py └── sample │ └── sample.py ├── requirements.txt └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | #IDE Setting 2 | .idea/ 3 | kintone_sdk4python/__pycache__/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 sada-nishio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kintone SDK for Python 2 | kintone SDK for Python is kintone REST API Library. 3 | 4 | ##Version 5 | * 1.1.0 6 | 7 | ##Requrements 8 | * Python 3.4 or Later 9 | 10 | ##Dependency 11 | * [requests](https://github.com/kennethreitz/requests/) 12 | 13 | ##Installation 14 | ```{.bash} 15 | #install 16 | $ sudo pip install -U git+https://github.com/sada-nishio/kintone_sdk4python.git 17 | #uninstall 18 | $ sudo pip uninstall kintone-SDK-for-Python 19 | ``` 20 | 21 | ##Usage 22 | ```{.python} 23 | from kintone_sdk4python import Kintone 24 | 25 | #make class and set domain, authentication(user auth or api-token auth) 26 | kintone = Kintone() 27 | kintone.set_domain('example.cybozu.com') 28 | kintone.set_basic_auth('id', 'password') 29 | kintone.set_user_auth('login_name', 'password') 30 | kintone.set_token_auth('api-token') 31 | 32 | #get record 33 | kintone.get_record(app_id, record_id, guest_space_id) 34 | 35 | #get records 36 | kintone.get_records(app_id, query='', fields=[], all_records=False, guest_space_id='') 37 | 38 | #post record 39 | kintone.post_record(app_id, record={}, guest_space_id='') 40 | 41 | #post records 42 | kintone.post_records(app_id, records, guest_space_id='') 43 | 44 | #put record 45 | kintone.put_record(app_id, record_id, record={}, guest_space_id='') 46 | 47 | #put records 48 | kintone.put_records(app, records, guest_space_id='') 49 | 50 | #delete records 51 | kintone.delete_records(app_id, record_ids, guest_space_id='') 52 | 53 | #download file 54 | kintone.download_file(file_key='') 55 | 56 | #upload file 57 | kintone.upload_file(file_name, binary) 58 | ``` 59 | 60 | ##License 61 | MIT License 62 | -------------------------------------------------------------------------------- /kintone_sdk4python/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf_8 -*- 3 | from .kintone_sdk import Kintone 4 | 5 | __author__ = 'sada-nishio' 6 | __version__ = '1.1.0' 7 | __license__ = 'MIT License' 8 | -------------------------------------------------------------------------------- /kintone_sdk4python/kintone_sdk.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf_8 -*- 3 | 4 | try: 5 | import os 6 | import sys 7 | import base64 8 | import urllib 9 | import json 10 | import requests as req 11 | except: 12 | print("Error: can't import library") 13 | 14 | class Kintone: 15 | ''' 16 | kintone SDK for Python is kintone REST API Library. 17 | 18 | ''' 19 | #initialize 20 | def __init__(self): 21 | self.user_auth = {} 22 | self.token_auth = {} 23 | self.domain = '' 24 | self.basic_auth = {} 25 | 26 | #Request Parameters 27 | ##setting domain name 28 | def set_domain(self, domain_name): 29 | self.domain = domain_name 30 | 31 | ##setting Basic Auth information. 32 | def set_basic_auth(self, id, password): 33 | self.basic_auth = { 34 | 'id': id, 35 | 'password': password 36 | } 37 | 38 | #Method for Authentication 39 | ##setting User Information using for Authentication. 40 | def set_user_auth(self, login_name, password): 41 | self.user_auth = { 42 | 'login_name': login_name, 43 | 'password': password 44 | } 45 | 46 | ##setting API-Token Auth information. 47 | def set_token_auth(self, token): 48 | self.token_auth = { 49 | 'token': token 50 | } 51 | 52 | ##setting URL by domain and guest_space_id. 53 | def make_url(self, api, guest_space_id=''): 54 | url = '' 55 | if (not guest_space_id): 56 | url = 'https://' + self.domain + '/k/v1/' + api + '.json?' 57 | else: 58 | url = 'https://' + self.domain + '/k/guest/' + str(guest_space_id) + '/v1/' + api + '.json?' 59 | return url 60 | 61 | ##setting headers 62 | def make_headers(self, method, is_json=True): 63 | headers = { 64 | 'Host': self.domain + ':443' 65 | } 66 | #basic auth 67 | if (self.basic_auth): 68 | basic_pass = self.basic_auth['id'] + ':' + self.basic_auth['password'] 69 | headers['Authorization'] = 'Basic ' + base64.b64encode(basic_pass.encode('utf-8')) 70 | #user auth 71 | if (self.user_auth): 72 | user_pass = self.user_auth['login_name'] + ':' + self.user_auth['password'] 73 | headers['X-Cybozu-Authorization'] = base64.b64encode(user_pass.encode('utf-8')) 74 | #API-Token auth 75 | if (self.token_auth): 76 | headers['X-Cybozu-API-Token'] = self.token_auth['token'] 77 | #Content-Type 78 | if (method == 'POST' or method == 'PUT'): 79 | if (is_json): 80 | headers['Content-Type'] = 'application/json' 81 | return headers 82 | 83 | ##adding URL parameters. 84 | def make_inquiry(self, params): 85 | inquiry_string = urllib.parse.urlencode(params) 86 | return inquiry_string 87 | 88 | #Execution REST API 89 | ##Getting Record. 90 | def get_record(self, app_id, record_id, guest_space_id=''): 91 | method = 'GET' 92 | params = { 93 | 'app': app_id, 94 | 'id': record_id 95 | } 96 | try: 97 | url = self.make_url('record', guest_space_id) + self.make_inquiry(params) 98 | headers_obj = self.make_headers(method) 99 | except: 100 | err = "Error: can't make URL or request headers." 101 | return err 102 | try: 103 | resp = req.request(method, url, headers=headers_obj) 104 | return json.loads(resp.text) 105 | except: 106 | err = 'Error: failed sending request.' 107 | #print(err) 108 | return err 109 | 110 | ##Getting Records by query. 111 | def get_records(self, app_id, query='', fields=[], all_records=False, guest_space_id=''): 112 | method = 'GET' 113 | params = { 114 | 'app': app_id, 115 | 'totalCount': True 116 | } 117 | try: 118 | headers_obj = self.make_headers(method) 119 | except: 120 | err = "Error: can't make request headers." 121 | return err 122 | if len(fields) > 100: 123 | err = 'Error: fields is needed less than 100 items.' 124 | return err 125 | if (fields): 126 | i = 0 127 | for field in fields: 128 | params['fields' + '[' + str(i) + ']'] = field 129 | i += 1 130 | #All records or not 131 | limit = 500 132 | if (all_records == False): 133 | if(query): 134 | params['query'] = query + ' limit ' + str(limit) 135 | else: 136 | params['query'] = 'limit ' + str(limit) 137 | try: 138 | url = self.make_url('records', guest_space_id) + self.make_inquiry(params) 139 | except: 140 | err = 'Error: failed sending request.' 141 | return err 142 | try: 143 | resp = req.request(method, url, headers=headers_obj) 144 | return json.loads(resp.text) 145 | except: 146 | err = 'Error: Failed Sending Request.' 147 | return err 148 | else: 149 | response = { 150 | 'records': [] 151 | } 152 | offset = 0 153 | while True: 154 | if(query): 155 | params['query'] = query + ' limit ' + str(limit) + ' offset ' + str(offset) 156 | else: 157 | params['query'] = 'limit ' + str(limit) + ' offset ' + str(offset) 158 | try: 159 | url = self.make_url('records', guest_space_id) + self.make_inquiry(params) 160 | except: 161 | err = "Error: can't make URL." 162 | return err 163 | try: 164 | resp = req.request(method, url, headers=headers_obj) 165 | tmp_resp = json.loads(resp.text) 166 | #Error: 167 | if ('errors' in tmp_resp): 168 | return tmp_resp 169 | #Success: 170 | for record in tmp_resp['records']: 171 | response['records'].append(record) 172 | if len(tmp_resp['records']) < limit: 173 | break 174 | else: 175 | offset += limit 176 | except: 177 | err = 'Error: failed sending request.' 178 | return err 179 | return response 180 | 181 | ##Deleting Records 182 | def delete_records(self, app_id, record_ids, guest_space_id=''): 183 | method = 'DELETE' 184 | params = { 185 | 'app': app_id 186 | } 187 | if (len(record_ids) > 100): 188 | err = 'Error: record_ids is needed less than 100 items.' 189 | return err 190 | if (record_ids): 191 | i = 0 192 | for id in record_ids: 193 | params['ids' + '[' + str(i) + ']'] = id 194 | i += 1 195 | try: 196 | url = self.make_url('records', guest_space_id) + self.make_inquiry(params) 197 | headers_obj = self.make_headers(method) 198 | except: 199 | err = "Error: can't make URL or request headers." 200 | return err 201 | try: 202 | resp = req.request(method, url, headers=headers_obj) 203 | return json.loads(resp.text) 204 | except: 205 | err = 'Error: failed sending request.' 206 | return err 207 | 208 | ##Post Record. 209 | def post_record(self, app_id, record={}, guest_space_id=''): 210 | method = 'POST' 211 | params = { 212 | 'app': app_id 213 | } 214 | if (record): 215 | params['record'] = record 216 | try: 217 | url = self.make_url('record', guest_space_id) 218 | headers_obj = self.make_headers(method) 219 | except: 220 | err = "Error: can't make URL or request headers." 221 | #print(err) 222 | return err 223 | try: 224 | resp = req.request(method, url, data=json.dumps(params), headers=headers_obj) 225 | response = json.loads(resp.text) 226 | return response 227 | except: 228 | err = 'Error: failed sending request.' 229 | return err 230 | 231 | ##Post Records. 232 | def post_records(self, app_id, records, guest_space_id=''): 233 | if (len(records) > 100): 234 | err = 'Error: records is needed less than 100 items.' 235 | return err 236 | method = 'POST' 237 | params = { 238 | 'app': app_id, 239 | 'records': records 240 | } 241 | try: 242 | url = self.make_url('records', guest_space_id) 243 | headers_obj = self.make_headers(method) 244 | except: 245 | err = "Error: can't make URL or request headers." 246 | return err 247 | try: 248 | resp = req.request(method, url, data=json.dumps(params), headers=headers_obj) 249 | response = json.loads(resp.text) 250 | return response 251 | except: 252 | err = 'Error: failed sending request.' 253 | return err 254 | 255 | ##Put Record. 256 | def put_record(self, app_id, record_id, record={}, guest_space_id=''): 257 | method = 'PUT' 258 | params = { 259 | 'app': app_id, 260 | 'id': record_id 261 | } 262 | if (record): 263 | params['record'] = record 264 | try: 265 | url = self.make_url('record', guest_space_id) 266 | headers_obj = self.make_headers(method) 267 | except: 268 | err = "Error: can't make URL or request headers." 269 | return err 270 | try: 271 | resp = req.request(method, url, data=json.dumps(params), headers=headers_obj) 272 | response = json.loads(resp.text) 273 | return response 274 | except: 275 | err = 'Error: failed sending request.' 276 | return err 277 | 278 | ##Post Records. 279 | def put_records(self, app_id, records, guest_space_id=''): 280 | method = 'PUT' 281 | params = { 282 | 'app': app_id, 283 | 'records': records 284 | } 285 | if (len(records) > 100): 286 | err = 'Error: records is needed less than 100 items.' 287 | return err 288 | try: 289 | url = self.make_url('records', guest_space_id) 290 | headers_obj = self.make_headers(method) 291 | except: 292 | err = "Error: can't make URL or request headers." 293 | return err 294 | try: 295 | resp = req.request(method, url, data=json.dumps(params), headers=headers_obj) 296 | response = json.loads(resp.text) 297 | return response 298 | except: 299 | err = 'Error: failed sending request.' 300 | return err 301 | 302 | ##Download File 303 | def download_file(self, file_key=''): 304 | method = 'GET' 305 | if (not file_key): 306 | return 'fileKey is needed.' 307 | params = { 308 | 'fileKey': file_key 309 | } 310 | try: 311 | url = self.make_url('file') + self.make_inquiry(params) 312 | headers_obj = self.make_headers(method) 313 | except: 314 | err = "Error: can't make URL or request headers." 315 | return err 316 | try: 317 | print(url) 318 | resp = req.request(method, url, headers=headers_obj) 319 | return resp.content # this is bytes. 320 | except: 321 | err = 'Error: failed sending request.' 322 | return err 323 | 324 | ##Upload File 325 | def upload_file(self, file_name, binary): 326 | method = 'POST' 327 | try: 328 | url = self.make_url('file') 329 | headers_obj = self.make_headers(method, False) 330 | except: 331 | err = "Error: can't make URL or request headers." 332 | return err 333 | try: 334 | files = {'file': (file_name, binary, 'application/octet-stream')} 335 | resp = req.request(method, url, files=files, headers=headers_obj) 336 | return json.loads(resp.text) 337 | except: 338 | err = 'Error: failed sending request.' 339 | return err 340 | -------------------------------------------------------------------------------- /kintone_sdk4python/sample/sample.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf_8 -*- 3 | 4 | import sys 5 | import os 6 | from kintone_sdk4python import Kintone 7 | 8 | kintone = Kintone() 9 | 10 | #Authentication 11 | kintone.set_domain('example.cybozu.com') #required 12 | kintone.set_basic_auth('id', 'password') 13 | kintone.set_user_auth('login_name', 'password') 14 | kintone.set_token_auth('token') 15 | 16 | #GET 17 | app_id = 10 18 | record_id = 1 19 | ##Single Record 20 | get_record_resp = kintone.get_record(app_id, record_id) 21 | print(get_record_resp) 22 | ##Multi Records (~500 records) 23 | query = 'レコード番号 > 10' 24 | fields = ['$id', '作成日時'] 25 | get_records_resp = kintone.get_records(app_id, query, fields) 26 | print(get_records_resp) 27 | ##All Records 28 | get_all_records_resp = kintone.get_records(app_id, query, fields, all_records=True) 29 | print(get_all_records_resp) 30 | 31 | #POST 32 | post_record = { 33 | 'title': { 34 | 'value': 'title1' 35 | } 36 | } 37 | post_records = [ 38 | { 39 | 'title': { 40 | 'value': 'title1' 41 | } 42 | }, 43 | { 44 | 'title': { 45 | 'value': 'title2' 46 | } 47 | } 48 | ] 49 | ##Single Record 50 | post_record_resp = kintone.post_record(app_id, post_record) 51 | print(post_record_resp) 52 | ##Multi Records (~100 records) 53 | post_records_resp = kintone.post_records(app_id, post_records) 54 | print(post_records_resp) 55 | 56 | #PUT 57 | put_record = { 58 | 'title': { 59 | 'value': 'change_title' 60 | } 61 | } 62 | put_records = [ 63 | { 64 | 'id': 1, 65 | 'record': { 66 | 'title': { 67 | 'value': 'change_title1' 68 | } 69 | } 70 | }, 71 | { 72 | 'id': 2, 73 | 'record': { 74 | 'title': { 75 | 'value': 'change_title1' 76 | } 77 | } 78 | } 79 | ] 80 | ##Single Record 81 | record_id = 1 82 | put_record_resp = kintone.put_record(app_id, 1, put_record) 83 | print(put_record_resp) 84 | ##Multi Records 85 | put_records_resp = kintone.put_records(app_id, put_records) 86 | print(put_records_resp) 87 | 88 | #DELETE 89 | record_ids = [1, 2, 3] 90 | del_records_resp = kintone.delete_records(app_id, record_ids) 91 | print(del_records_resp) 92 | 93 | #Download File 94 | file_path = './sample.png' 95 | file_key = '20151128..........' 96 | binary = kintone.download_file(file_key) 97 | with open(file_path, 'rb') as f: 98 | f.write(binary) 99 | 100 | #Upload File 101 | file_name = 'sample.png' 102 | upload_file_resp = kintone.upload_file(file_name, binary) 103 | print(upload_file_resp) 104 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.20.0 2 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf_8 -*- 3 | from setuptools import setup, find_packages 4 | from kintone_sdk4python import __author__, __version__, __license__ 5 | 6 | setup( 7 | name = 'kintone SDK for Python', 8 | version = __version__, 9 | description = 'kintone SDK for Python.', 10 | license = __license__, 11 | author = __author__, 12 | author_email = 'cy.nishio0820@gmail.com', 13 | url = 'https://github.com/sada-nishio/kintone_sdk4python.git', 14 | keywords = 'kintone SDK for Python.', 15 | packages = find_packages(), 16 | install_requires = ['requests'] 17 | ) 18 | --------------------------------------------------------------------------------