Pythonで始めるDropboxAPI

2,295 views

Published on

旭川オープンソースコミュニティ11月勉強会
だいぶ適当です!

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,295
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
15
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Pythonで始めるDropboxAPI

  1. 1. Pythonで始める DropboxAPIDaisuke Igarashi <planset@gmail.com>
  2. 2. ppyytthhoonn?
  3. 3. ppyytthhoonn?
  4. 4. pythonってなに?
  5. 5. プログラミング言語
  6. 6. >>> print ‘Hello world!’Hello world!
  7. 7. >>> for i in range(5):... print “Hello world!”...Hello world!Hello world!Hello world!Hello world!Hello world!
  8. 8. >>> for i in range(5):... if i == 3:... print "aho"... else:... print "Hello world!"...Hello world!Hello world!Hello world!ahoHello world!
  9. 9. pythonとは• オープンソース• スクリプト言語• オブジェクト指向• Guido van Rossum によって1991年 くらいに開発された
  10. 10. python事例• linux(red hat)のいろいろ anaconda, virt-managerなど• Trac, Ploneなどのウェブもの。• DropboxなどのサービスやSDK• googleでも割と使われている。 開発者がgoogle勤務。
  11. 11. なんでpython?
  12. 12. 毎年少なくとも一つの言語を学習する
  13. 13. プログラミング言語歴• さらっと Delphi(object pascal)、アセンブラ、 php、perl、ruby、html、javascript、 java• わりとしっかり c/c++、VisualBasic、VB.NET
  14. 14. プログラミング言語歴• さらっと Delphi(object pascal)、アセンブラ、 php、perl、ruby、html、javascript、 java• わりとしっかり c/c++、VisualBasic、VB.NET
  15. 15. プログラミング言語歴• さらっと Delphi(object pascal)、アセンブラ、 php、perl、ruby、html、javascript、 java• わりとしっかり c/c++、VisualBasic、VB.NET
  16. 16. 今日話すこと•python入門•Dropbox APIを使ってみよう
  17. 17. Python入門•pythonの特徴•pythonの基本•pythonの色々
  18. 18. Python入門•pythonの特徴•pythonの基本•pythonの色々
  19. 19. インデント
  20. 20. インデント インデント インデント
  21. 21. インデント インデント インデント
  22. 22. インデントここ インデント ここ インデント
  23. 23. たとえば、Cでは(丁寧にかけば)
  24. 24. int testfunc(int x, int y){ if (x + y == 0) { return true; } else { return false; }}
  25. 25. int testfunc(int x, int y){ if (x + y == 0) { return true; } else { return false; }}
  26. 26. int testfunc(int x, int y){ if (x + y == 0) { return true; } else { return false; }}
  27. 27. pythonでは
  28. 28. def testfunc(x, y): if x + y == 0: return True else: return False
  29. 29. def testfunc(x, y): if x + y == 0: return True else: return False
  30. 30. def testfunc(x, y): if x + y == 0: return True else: return False
  31. 31. def testfunc(x, y): z = 1 x = z + y return x
  32. 32. def testfunc(x, y): z = 1 x = z + y return x
  33. 33. あ。ずれちゃった
  34. 34. File "dame.py", line 6 return x ^IndentationError: unindent does not matchany outer indentation level意訳:インデントがずれてるじゃねーかばかやろー!
  35. 35. そんなpythonなため
  36. 36. pythonキモイ
  37. 37. でも
  38. 38. こうは書かないよね?int testfunc(int x, int y){if (x==0){return true;}else{return false;}}
  39. 39. だったらそう書かなきゃ動かないようにすればい いじゃん
  40. 40. 思想
  41. 41. pythonの思想• 言語自身の機能を最小限に。• 誰が書いても同じ機能は同じような実装 になるように。• 文書化の重視
  42. 42. pythonの思想• 言語自身の機能を最小限に。• 誰が書いても同じ機能は同じような実装 になるように。• 文書化の重視
  43. 43. 文書化といっても• ドキュメントを書け• コメントを書け
  44. 44. 文書化といっても• ソースに書いても、API仕様書にかかな きゃだめだったり• ドキュメントを書いても結局メンテされ なかったり
  45. 45. pythonでは言語レベルで サポート
  46. 46. sample.pydef add(x, y): """ xとyを加算します。 ただし、結果が3の倍数の場合、ahoを返します。 例)x=15、y=5の場合 >>> add(15, 5) 20 例)x=10、y=2の場合 >>> add(10, 2) aho """ return x + y if (x + y) % 3 != 0 else ahoif __name__ == __main__: import doctest doctest.testmod()
  47. 47. >>> help(sample)Help on module sample:NAME sample - # -*- coding: utf-8 -*-FILE /path/to/sample.pyFUNCTIONS add(x, y) xとyを加算します。 ただし、結果が3の倍数の場合、ahoを返します。 例)x=15、y=5の場合 >>> add(15, 5) 20 例)x=10、y=2の場合 >>> add(10, 2)
  48. 48. if __name__ == __main__: import doctest doctest.testmod()
  49. 49. sample.pydef add(x, y): """ xとyを加算します。 ただし、結果が3の倍数の場合、ahoを返します。 例)x=15、y=5の場合 >>> add(15, 5) 20 例)x=10、y=2の場合 >>> add(10, 2) aho """ return x + y if (x + y) % 3 != 0 else ahoif __name__ == __main__: import doctest doctest.testmod()
  50. 50. # python sample.py -vTrying: add(15, 5)Expecting: 20okTrying: add(10, 2)Expecting: ahook1 items had no tests: __main__1 items passed all tests: 2 tests in __main__.add2 tests in 2 items.2 passed and 0 failed.Test passed.
  51. 51. つまり、 コメントがドキュメントであり コメントがテストであり、かつ信頼できるコードのサンプルになる。
  52. 52. ちなみにちゃんとテストをしたいなら unittest パッケージ が標準でついてます
  53. 53. 電池が付属しています
  54. 54. Python入門•pythonの特徴•pythonの基本•pythonの色々
  55. 55. 変数
  56. 56. 整数、実数•宣言は必要ないです•x = 1•y = 1.1•x++ はない!
  57. 57. 配列•変更不可能な配列•変更可能な配列
  58. 58. 変更不可能な配列•a = ‘igarashi‘ # 文字列•c = (1, 2, 3) # タプル
  59. 59. 変更不可なので•a = ‘igarashi‘ # 文字列•a[2] = ‘3’
  60. 60. 変更不可なので•a = ‘igarashi‘ # 文字列•a[2] = ‘3’ できません!
  61. 61. 変更可能な配列•d = [1, 2, 3] # リスト
  62. 62. 変更可能なので•d = [1, 2, 3] # リスト•d[0] = 10•>>> d [10, 2, 3]
  63. 63. 辞書• dic = {name: yamada, age: 20}• ‘name’ in dic # True• del dic[‘age’] # 削除• キーは変更できない値なら何でも良い。
  64. 64. 集合•g = set([1,2,3,2,1])•>>> g set([1,2,3])
  65. 65. True False•is_true = True•if is_true: print “hello”
  66. 66. 注意点
  67. 67. pythonでは
  68. 68. 全て参照渡しです
  69. 69. なのでー
  70. 70. >>> x = 1>>> x = x + 1>>> print x2
  71. 71. >>> x = 1 1 x>>> x = x + 1 1+1 2 x x>>> print x2
  72. 72. >>> x = 1 1 x 1+1 まちがい>>> x = x + 1 2 x x>>> print x2
  73. 73. >>> x = 1 x 1>>> x = x + 1 1 x × 2>>> print x2
  74. 74. >>> var1 = 1>>> var2 = var1この時点では同じオブジェクトを指している。>>> var1 = 2v1だけ新しいオブジェクトを参照する。>>> var12>>> var21
  75. 75. >>> var1 = [1, 2, 3]>>> var2 = var1この時点で同じオブジェクトを指している。>>> var1.append(4)v1だけに新しい要素を追加したつもりが・・・>>> var1[1, 2, 3, 4]>>> var2[1, 2, 3, 4]
  76. 76. 制御構文
  77. 77. if, elif, elseif x == 1: print Aelif x == 2: print Belse: print C
  78. 78. forfor i in [1,2,3,4,5]: print ifor i in range(1, 6): print i
  79. 79. whilei = 0while i<10: i += 1 print ibreak,continueもつかえるよ。
  80. 80. try, withtry: lines = [] with open("infile.txt", "r") as f: lines = f.readlines()except: print error raisefinally: print o wa ri
  81. 81. 関数、クラス
  82. 82. 関数def testfunc(x, y): return x + ytestfunc(10, 2)
  83. 83. 関数def testfunc(): print “hoge” returntestfunc()
  84. 84. 関数def testfunc(): print “hoge” returntestfunc()
  85. 85. 関数def testfunc(): print “hoge” returntestfunc
  86. 86. 関数def say(): print “hoge”>>> hogehoge = say>>> hogehoge()“hoge”
  87. 87. 無名関数>>> add = lambda x,y:x + y>>> add(1, 2)3
  88. 88. クラスclass Human(object): name = age = 0 def __init__(self, name, age): self.name = name self.age = age def say(self): print hoge
  89. 89. クラスclass Human(object): name = age = 0 def __init__(self, name, age): self.name = name self.age = age def say(self): print hoge
  90. 90. クラスclass Human(object): name = age = 0 def __init__(self, name, age): self.name = name self.age = age def say(self): print hoge
  91. 91. クラスclass Human(object): name = age = 0 def __init__(self, name, age): self.name = name self.age = age def say(self): print hoge
  92. 92. できればこう書きたい?class Human(object): name = age = 0 def __init__(name, age): self.name = name self.age = age def say(): print hoge
  93. 93. こう考えてみるobj = Hoge()obj.age = 20obj.name = hoge
  94. 94. こう考えてみるdef initialize(obj, age, name): obj.age = age obj.name = nameobj = Hoge()initialize(obj, 20, hoge)
  95. 95. こう考えてみるclass Hoge(): def initialize(obj, age, name): obj.age = age obj.name = nameobj = Hoge()Hoge.initialize(obj, 20, hoge)
  96. 96. こう考えてみるclass Hoge(): def initialize(obj, age, name): obj.age = age obj.name = nameobj = Hoge()obj.initialize(20, hoge)
  97. 97. こう考えてみるclass Hoge(): def __init__(obj, age, name): obj.age = age obj.name = nameobj = Hoge(20, hoge)
  98. 98. こう考えてみるclass Hoge(): def __init__(self, age, name): self.age = age self.name = nameobj = Hoge(20, hoge)
  99. 99. 便利な書き方
  100. 100. コメント# コメントdef func(): 関数のドキュメント print Hello world!
  101. 101. コメント>>> help(func)Help on function func in module __main__:func() 関数のドキュメント
  102. 102. 値の比較>>> x = 5>>> 1 < x < 10True>>> x < 10 < x*10 < 100True
  103. 103. 値を入れ替え>>> a = 10>>> b = 5>>> a, b = b, a>>> a, b(5, 10)
  104. 104. 戻り値を分けて入れる>>> a, b = b, aこれができるのは、リスト代入(タプル代入)のおかげ>>> ip1, ip2, ip3, ip4 = ‘192.168.0.1’.split(‘.’)ip1 = 192, ip2 = 168, ip3 = 0, ip4 = 1
  105. 105. 配列のインデックス>>> items = [‘A’, ‘B’, ‘C’]>>> for index,item in enumerate(items):>>> print index, item0 A1 B2 C
  106. 106. 後置if>>> i = 2>>> “hoge” if i%2==0 else “fuga”hoge>>> i = 1>>> “hoge” if i%2==0 else “fuga”fuga
  107. 107. map>>> items = [1,2,3,4,5]>>> map(str, items)[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]>>> map(lambda x:x*x, items)[1, 4, 9, 16, 25]
  108. 108. リスト内包表記result = [do_something(i) for i in range(0, 10)]
  109. 109. リスト>>> t = [1,2,3,4,5]>>> t[1]2
  110. 110. リスト>>> t = [1,2,3,4,5]>>> t[-1]5>>> t[1:4][2,3,4]>>> t[2::-1][3,2,1]
  111. 111. リスト>>> [1,2,3]+[4,5,6][1,2,3,4,5,6]>>> [1,2,3]*3[1,2,3,1,2,3,1,2,3]
  112. 112. イテレータ>>> i = iter(abc)>>> next(i)a>>> next(i)b>>> next(i)c>>> next(i)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration
  113. 113. ジェネレータ・ジェネレータはイテレータを 簡単に生成するためのもの
  114. 114. ジェネレータdef generator2(): i = 0 while True: yield i i += 1>>> g = generator2()>>> next(g)0>>> next(g)1
  115. 115. ジェネレータfor i in generator2(): print i
  116. 116. Python入門•pythonの特徴•pythonの基本•pythonの色々
  117. 117. 色々というかウェブ開発
  118. 118. WEBフレームワーク
  119. 119. しっかり•Django•pylons(Pyramid)•google app engine•tornado
  120. 120. さくっと•Flask•他にも山ほど。
  121. 121. 稼働環境
  122. 122. ウェブサーバ•apache •wsgi•nginx •fcgi•lighttpd •gunicorn
  123. 123. PaaS•heroku • DjangoZoom•dotcloud •OpenShift•fluxflex •Cloud Foundry•google app engine
  124. 124. 学習
  125. 125. 学習する価値• 基本はc/php/vb/perlと同じだけど、各 所で色々違っておもしろいよ。• なにより書きやすい。
  126. 126. 学習する価値• rubyでウハウハしてるなら別に良いかも• 採用曲線の頂点(後は下るだけ)• むしろ今からならjavascriptがいいかも
  127. 127. おすすめ• 公式ドキュメントのチュートリアル
  128. 128. おすすめ• Flaskのドキュメント
  129. 129. Python入門•pythonの特徴•pythonの基本•pythonの色々
  130. 130. 今日帰ったら•手洗い•うがい•pythonインストール
  131. 131. ふぅ
  132. 132. 今日話すこと•python入門•Dropbox APIを使ってみよう
  133. 133. Dropbox APIを つかってみよう•DropboxAPIとは•oauthとは•APIにアクセスしてみよう
  134. 134. Dropbox APIを つかってみよう•DropboxAPIとは•oauthとは•APIにアクセスしてみよう
  135. 135. DropboxAPIとは
  136. 136. DropboxAPIとは
  137. 137. DropboxAPIとは
  138. 138. APIでできること•アカウント情報の取得•ファイルのアップロード•ファイルのダウンロード•検索、共有、サムネイル取得
  139. 139. APIでできること•ファイルのコピー•フォルダの作成•ファイルの移動•ファイルの削除
  140. 140. 詳しくは
  141. 141. でもね
  142. 142. すぐには使えません
  143. 143. OAuth
  144. 144. OAuthおーおーす
  145. 145. OAuthとは•API認可の方法•認証(Authentication)ではな く•認可(Authorization)
  146. 146. OAuthとは•twitterとかfacebookとか•もちろんDropboxも
  147. 147. なぜ認可?
  148. 148. たとえば•dropboxのAPIを使ってサービ スを提供するサイトがあって•これを利用しようとします
  149. 149. 利用者 サービス提供サイトあんたのサービス使わせてよ! dropbox
  150. 150. 利用者 サービス提供サイトいいけど、dropboxのアクセスに必要なユーザー名とパスワードを教えてちょ dropbox
  151. 151. 利用者 サービス提供サイトユーザー名とパスワードを入力 dropbox
  152. 152. 利用者 サービス提供サイト ユーザー名&パスワード データのやりとり dropbox
  153. 153. 利用者 サービス提供サイト ユーザー名&パスワード dropbox サービス提供サイトがアカウント情報を 持つことが問題!
  154. 154. OAuthだと
  155. 155. 利用者 サービス提供サイトあんたのサービス使わせてよ! dropbox
  156. 156. 利用者 サービス提供サイト使いたいって人がいるんだけど、許可してくれない? dropbox
  157. 157. 利用者 サービス提供サイト dropboxそれは本人に聞いてみないと!あのサービス提供サイトがあなたのデータにアクセスしたいって言うんだけどいい?
  158. 158. 利用者 サービス提供サイト dropboxいいともー!
  159. 159. 利用者 サービス提供サイト アクセストークン いいってさー よかったねー dropbox
  160. 160. 利用者 サービス提供サイト アクセストークン dropbox アカウント情報をサービス提供サイトに 預ける必要がなくなる。
  161. 161. 認可API•/oauth/request_token•/oauth/authorize•/oauth/access_token
  162. 162. Dropbox APIを つかってみよう•DropboxAPIとは•oauthとは•APIにアクセスしてみよう
  163. 163. 1.登録•Dropboxにアプリ登録する•consumer key•consumer secret key
  164. 164. 1.登録https://www.dropbox.com/developers
  165. 165. 1.登録
  166. 166. 1.登録
  167. 167. 1.登録
  168. 168. 1.登録consumer keyconsumer secret key
  169. 169. 2.リクエストトークン•/oauth/request_token•cosumer keyとsecretを使う•必要な情報を固めてPOST•リクエストトークンを取得
  170. 170. 2.リクエストトークンここがめんどう
  171. 171. 2.リクエストトークン•oauth_consumer_key•oauth_signature_method•oauth_timestamp•oauth_nonce•oauth_version•oauth_signature
  172. 172. 2.リクエストトークンこれをPOST!
  173. 173. 2.リクエストトークン•成功するとリクエストトークンを 返してくれる•oauth_token_secret•oauth_token
  174. 174. 3.認証/認可URL•/oauth/authorize+トークン•利用者がURLにアクセスして許可 する
  175. 175. 3.認証/認可URL
  176. 176. 4.アクセストークン•/oauth/access_token•consumer keyとsecretを使う•リクエストトークンも使う•アクセストークンを取得
  177. 177. 4.アクセストークン•POSTする方法は リクエストトークン取得時+ リクエストトークンを投げる
  178. 178. 4.アクセストークン•成功するとアクセストークンを返 してくれる。•oauth_token_secret•oauth_token•uid
  179. 179. 5.APIの利用•アクセストークン•consumer keyとsecretを使う•各種APIへアクセス
  180. 180. じつは•oauthは非常に面倒 oauth2策定中 実装してるところもある facebook GraphAPI
  181. 181. つまり
  182. 182. 今更OAuth1.0とか覚えなくていい え・・・、じゃあ、今までのスライドは何のために・・・
  183. 183. そこで
  184. 184. Dropbox APIを つかってみよう• DropboxAPIとは• oauthとは• APIにアクセスしてみよう•めんどくさいのでSDKを使う
  185. 185. DropboxSDKとは
  186. 186. SDKを使うと
  187. 187. 1.登録 consumer key
  188. 188. SDKのクラスを作る
  189. 189. 2.リクエストトークン取得
  190. 190. 3.認可用URL作成
  191. 191. 4.アクセストークン取得
  192. 192. 5.APIの利用
  193. 193. 5.APIの利用
  194. 194. 5.APIの利用
  195. 195. 5.APIの利用
  196. 196. 5.APIの利用
  197. 197. 5.APIの利用
  198. 198. Dropbox APIを つかってみよう文字列だけの画面見てもよくわからないからわかりやすいの見せろよ!
  199. 199. こんなの作ってみるdropboxフォルダのファイル一覧
  200. 200. 環境構築# mkvirtualenv dropboxtest...開発用の仮想環境が準備される。(dropboxtest)# pip install flask dropbox dotcloud...必要なパッケージがインストールされる。
  201. 201. flaskサンプル1
  202. 202. flaskサンプル1
  203. 203. flaskサンプル2
  204. 204. flaskサンプル2
  205. 205. アプリ作成
  206. 206. アプリ作成
  207. 207. アプリ作成
  208. 208. アプリ作成
  209. 209. デプロイ
  210. 210. デプロイ
  211. 211. まとめ
  212. 212. まとめ•pythonはキモくない
  213. 213. まとめ•pythonはキモくない•ライブラリで面倒なことも楽勝
  214. 214. まとめ•pythonはキモくない•ライブラリで面倒なことも楽勝•フレームワークもいい感じ
  215. 215. まとめ•pythonはキモくない•ライブラリで面倒なことも楽勝•フレームワークもいい感じ•稼働環境も増えてきた
  216. 216. pythonするなら
  217. 217. いまがチャンス!
  218. 218. 以上です。ありがとうございました。 おつかれさまでした。

×