ファイルアップロードにおけるfilekey取得までの記述について(①)のその後があれば解決したかもしれませんが、私も同じところで、躓いています。
下記のように書いたのですが、respの戻り値が空となってしまいます。
解決策がわかる方がいらっしゃいましたらご教示ください。
(①でのマルチパートのアップロードの指摘に関しては、ここやここを参考にしました。)
#!/usr/bin/python
_*_ coding: utf-8 _*_
import requests
URL = “https://xxxxxxx.cybozu.com:443”
API_TOKEN = “APP TOKEN”
class KINTONE:
def UploadToKintone(self, url, apiToken):
img = open(‘image.jpg’, ‘rb’)
files={‘file’:(‘image.jpg’,img,‘image/jpeg’)}
headers = {“X-Cybozu-API-Token”: apiToken ,‘X-Requested-With’: ‘XMLHttpRequest’, ‘Content-Type’: ‘application/json’}
resp=requests.post(url+“/k/v1/file.json”,files=files,headers=headers)
if __name__ == ‘__main__’:
knt=KINTONE()
resp=knt.UploadToKintone(URL, API_TOKEN)
print resp
resp=none
追記:監査ログを見ると、
Application Severity Action Result Error Code Note
Authentication Information login (API k) FAILED attempted login: userName=XXXXX
となっているので、認証が出来ていないようです。
Authorizationヘッダーを色々変えてみたのですが、どれもだめでした。
監査ログの部分が当該リクエストに対するものであれば、文字通り認証だと思います。その際APIトークン利用であればuserNameはAdministratorですよね(Administrator自身を変更されていれば別ですが)。ログインに失敗とのことですので、トークンが本当に有効化されているかを確認するのと、X-Cybozu-Authorizationに指定を一旦変えてリクエストを通せるかを確認して切り分けてみてはいかがでしょうか。
また、レスポンスが空というのも不思議ですので、respはresp.textが正味のレスポンスだったと思いますので、Requestsのドキュメントをしっかりチェックしつつ、確認してみてください。さらに、気になったのは、Content-Typeはapplication/jsonではなくて、少なくともmultipart/form-dataなると思います(Requestsモジュールを使うと吸収してくれますが)。
最後に、ほぼベタ書きのPython2.7のスニペットがこちらにありますので参考になれば。リンクにあったkintone用の3rdパーティモジュールはPython3.xベースですが、自己解決が難しそうであればモジュールを利用されることをオススメします。
Ryu Yamashita様
ご回答有り難うございます。
respの戻り値が空→classでreturnの指定していませんでした。
監査ログエラー→認証をX-Cybozu-Authorizationとし、base64のエンコードにwindows版のデータからpythonでエンコードしたものに変更したら監査ログエラーがでなくなりました。
下記のコードでfilekeyを取得することが出来ました。
#!/usr/bin/python
_*_ coding: utf-8 _*_
import requests
URL = “https://xxxxxxx.cybozu.com:443”
KNT_PASS = “xxxxxxxxxxxxx” #“ログインネーム:パスワード” をbase64でエンコード
class KINTONE:
def UploadToKintone(self, url, knt_pass):
img = open(‘image.jpg’, ‘rb’)
files={‘file’:(‘image.jpg’,img,‘image/jpeg’)}
headers = {“X-Cybozu-Authorization”: knt_pass ,‘X-Requested-With’: ‘XMLHttpRequest’}
resp=requests.post(url+“/k/v1/file.json”,files=files,headers=headers)
return resp
if __name__ == ‘__main__’:
knt=KINTONE()
resp1=knt.UploadToKintone(URL, KNT_PASS)
print resp1.text
return は私も見逃していました。認証情報を変えて通ったということは、やはりAPIトークンの指定周辺だったということですね。APIトークンの設定が上手くいってなかった可能性がありそうに感じました(アプリの保存を行っていない等)。
ひとまず切り分けないし、成功ケースに辿り着かれて良かったです。
system
(system)
クローズされました:
7
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。