Pythonによるファイルのアップロード

ファイルアップロードにおける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トークンの設定が上手くいってなかった可能性がありそうに感じました(アプリの保存を行っていない等)。

 

ひとまず切り分けないし、成功ケースに辿り着かれて良かったです。

Ryu Yamashita

ありがとうございました。