Pythonで始める
 DropboxAPI

Daisuke Igarashi <planset@gmail.com>
ppyytthhoonn?
ppyytthhoonn?
pythonってなに?
プログラミング言語
>>> print ‘Hello world!’

Hello world!
>>> for i in range(5):
...     print “Hello world!”
...
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
>>> for i in range(5):
...     if i == 3:
...          print "aho"
...     else:
...          print "Hello world!"
...
Hello world!
Hello world!
Hello world!
aho
Hello world!
pythonとは

• オープンソース
• スクリプト言語
• オブジェクト指向
• Guido van Rossum によって1991年
 くらいに開発された
python事例

• linux(red hat)のいろいろ
 anaconda, virt-managerなど

• Trac, Ploneなどのウェブもの。
• DropboxなどのサービスやSDK
• googleでも割と使われている。
 開発者がgoogle勤務。
なんでpython?
毎年少なくとも一つの言語を学習する
プログラミング言語歴

• さらっと
 Delphi(object pascal)、アセンブラ、
 php、perl、ruby、html、javascript、
 java

• わりとしっかり
 c/c++、VisualBasic、VB.NET
プログラミング言語歴

• さらっと
 Delphi(object pascal)、アセンブラ、
 php、perl、ruby、html、javascript、
 java

• わりとしっかり
 c/c++、VisualBasic、VB.NET
プログラミング言語歴

• さらっと
 Delphi(object pascal)、アセンブラ、
 php、perl、ruby、html、javascript、
 java

• わりとしっかり
 c/c++、VisualBasic、VB.NET
今日話すこと


•python入門

•Dropbox APIを使ってみよう
Python入門

•pythonの特徴
•pythonの基本
•pythonの色々
Python入門

•pythonの特徴
•pythonの基本
•pythonの色々
インデント
インデント
  インデント
    インデント
インデント
  インデント
    インデント
インデント

ここ
     インデント
     ここ
          インデント
たとえば、Cでは
(丁寧にかけば)
int testfunc(int x, int y)
{
    if (x + y == 0)
    {
        return true;
    } else {
        return false;
    }
}
int testfunc(int x, int y)
{
    if (x + y == 0)
    {
        return true;
    } else {
        return false;
    }
}
int testfunc(int x, int y)
{
    if (x + y == 0)
    {
        return true;
    } else {
        return false;
    }
}
pythonでは
def testfunc(x, y):
    if x + y == 0:
        return True
    else:
        return False
def testfunc(x, y):
    if x + y == 0:
        return True
    else:
        return False
def testfunc(x, y):
    if x + y == 0:
        return True
    else:
        return False
def testfunc(x, y):
    z = 1
    x = z + y
    return x
def testfunc(x, y):
    z = 1
    x = z + y
  return x
あ。ずれちゃった
File "dame.py", line 6
    return x
           ^
IndentationError: unindent does not match
any outer indentation level

意訳:インデントがずれてるじゃねーかばかやろー!
そんなpythonなため
pythonキモイ
でも
こうは書かないよね?

int testfunc(int x, int y){
if (x==0){return true;}else{
return false;}}
だったらそう書かなきゃ
動かないようにすればい
    いじゃん
思想
pythonの思想


• 言語自身の機能を最小限に。
• 誰が書いても同じ機能は同じような実装
 になるように。

• 文書化の重視
pythonの思想


• 言語自身の機能を最小限に。
• 誰が書いても同じ機能は同じような実装
 になるように。

• 文書化の重視
文書化といっても



• ドキュメントを書け
• コメントを書け
文書化といっても


• ソースに書いても、API仕様書にかかな
 きゃだめだったり

• ドキュメントを書いても結局メンテされ
 なかったり
pythonでは
言語レベルで
 サポート
sample.py

def 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 'aho'

if __name__ == '__main__':
    import doctest
    doctest.testmod()
>>> help(sample)

Help on module sample:

NAME
       sample - # -*- coding: utf-8 -*-

FILE
       /path/to/sample.py

FUNCTIONS
    add(x, y)
        xとyを加算します。
          ただし、結果が3の倍数の場合、'aho'を返します。

          例)x=15、y=5の場合
           >>> add(15, 5)
           20

          例)x=10、y=2の場合
           >>> add(10, 2)
if __name__ == '__main__':
    import doctest
    doctest.testmod()
sample.py

def 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 'aho'

if __name__ == '__main__':
    import doctest
    doctest.testmod()
# python sample.py -v
Trying:
    add(15, 5)
Expecting:
    20
ok
Trying:
    add(10, 2)
Expecting:
    'aho'
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
つまり、


 コメントがドキュメントであり


 コメントがテストであり、かつ


信頼できるコードのサンプルになる。
ちなみに
ちゃんとテストをしたいなら


 unittest パッケージ


  が標準でついてます
電池が付属しています
Python入門

•pythonの特徴
•pythonの基本
•pythonの色々
変数
整数、実数

•宣言は必要ないです
•x = 1
•y = 1.1
•x++ はない!
配列


•変更不可能な配列
•変更可能な配列
変更不可能な配列


•a   = ‘igarashi‘   # 文字列

•c   = (1, 2, 3)    # タプル
変更不可なので

•a = ‘igarashi‘   # 文字列

•a[2] = ‘3’
変更不可なので

•a = ‘igarashi‘   # 文字列

•a[2] = ‘3’
 できません!
変更可能な配列



•d   = [1, 2, 3]   # リスト
変更可能なので

•d = [1, 2,   3]   # リスト

•d[0] = 10
•>>> d
 [10, 2, 3]
辞書

• dic   = {'name': 'yamada',
           'age': 20}

• ‘name’ in dic # True
• del dic[‘age’] # 削除
• キーは変更できない値なら何でも良い。
集合


•g =   set([1,2,3,2,1])
•>>> g
 set([1,2,3])
True False


•is_true = True
•if is_true:
     print “hello”
注意点
pythonでは
全て参照渡しです
なのでー
>>> x = 1
>>> x = x + 1
>>> print x
2
>>> x = 1

     1

     x
>>> x = x + 1

    1+1         2

     x          x

>>> print x
2
>>> x = 1

     1

     x


    1+1   まちがい
>>> x = x + 1

                2

     x          x

>>> print x
2
>>> x = 1

     x          1


>>> x = x + 1
                1
     x
            ×
                2
>>> print x
2
>>> var1 = 1
>>> var2 = var1

この時点では同じオブジェクトを指している。

>>> var1 = 2

v1だけ新しいオブジェクトを参照する。

>>> var1
2
>>> var2
1
>>> var1 = [1, 2, 3]
>>> var2 = var1

この時点で同じオブジェクトを指している。

>>> var1.append(4)

v1だけに新しい要素を追加したつもりが・・・

>>>   var1
[1,   2, 3, 4]
>>>   var2
[1,   2, 3, 4]
制御構文
if, elif, else
if x == 1:
    print 'A'

elif x == 2:
    print 'B'

else:
    print 'C'
for

for i in [1,2,3,4,5]:
    print i


for i in range(1, 6):
    print i
while

i = 0
while i<10:
    i += 1
    print i

break,continueもつかえるよ。
try, with

try:
    lines = []
    with open("infile.txt", "r") as f:
         lines = f.readlines()
except:
    print 'error'
    raise
finally:
    print 'o wa ri'
関数、クラス
関数

def testfunc(x, y):
  return x + y


testfunc(10, 2)
関数

def testfunc():
    print “hoge”
    return

testfunc()
関数

def testfunc():
    print “hoge”
    return

testfunc()
関数

def testfunc():
    print “hoge”
    return

testfunc
関数

def say():
    print “hoge”


>>> hogehoge = say
>>> hogehoge()
“hoge”
無名関数


>>> add = lambda x,y:x + y

>>> add(1, 2)
3
クラス

class Human(object):
    name = ''
    age = 0
    def __init__(self, name, age):
        self.name = name
        self.age = age

   def say(self):
       print 'hoge'
クラス

class Human(object):
    name = ''
    age = 0
    def __init__(self, name, age):
        self.name = name
        self.age = age

   def say(self):
       print 'hoge'
クラス

class Human(object):
    name = ''
    age = 0
    def __init__(self, name, age):
        self.name = name
        self.age = age

   def say(self):
       print 'hoge'
クラス

class Human(object):
    name = ''
    age = 0
    def __init__(self, name, age):
        self.name = name
        self.age = age

   def say(self):
       print 'hoge'
できればこう書きたい?

class Human(object):
    name = ''
    age = 0
    def __init__(name, age):
        self.name = name
        self.age = age

   def say():
       print 'hoge'
こう考えてみる


obj = Hoge()

obj.age = 20
obj.name = 'hoge'
こう考えてみる

def initialize(obj, age, name):
    obj.age = age
    obj.name = name

obj = Hoge()
initialize(obj, 20, 'hoge')
こう考えてみる

class Hoge():
    def initialize(obj, age, name):
        obj.age = age
        obj.name = name

obj = Hoge()
Hoge.initialize(obj, 20, 'hoge')
こう考えてみる

class Hoge():
    def initialize(obj, age, name):
        obj.age = age
        obj.name = name

obj = Hoge()
obj.initialize(20, 'hoge')
こう考えてみる

class Hoge():
    def __init__(obj, age, name):
        obj.age = age
        obj.name = name

obj = Hoge(20, 'hoge')
こう考えてみる

class Hoge():
    def __init__(self, age, name):
        self.age = age
        self.name = name

obj = Hoge(20, 'hoge')
便利な書き方
コメント
# コメント

def func():
    '''
    関数のドキュメント
  '''
  print 'Hello world!'
コメント

>>> help(func)
Help on function func in module __main__:

func()
    関数のドキュメント
値の比較

>>> x = 5
>>> 1 < x < 10
True

>>> x < 10 < x*10 < 100
True
値を入れ替え

>>> a = 10
>>> b = 5

>>> a, b = b, a

>>> a, b
(5, 10)
戻り値を分けて入れる

>>> a, b = b, a
これができるのは、リスト代入(タプル代入)のおかげ

>>> ip1, ip2, ip3, ip4 =
        ‘192.168.0.1’.split(‘.’)

ip1 = 192, ip2 = 168, ip3 = 0, ip4 = 1
配列のインデックス

>>> items = [‘A’, ‘B’, ‘C’]

>>> for index,item in enumerate(items):
>>>    print index, item

0 A
1 B
2 C
後置if

>>> i = 2
>>> “hoge” if i%2==0 else “fuga”
hoge

>>> i = 1
>>> “hoge” if i%2==0 else “fuga”
fuga
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]
リスト内包表記


result =
  [do_something(i) for i in range(0, 10)]
リスト


>>> t = [1,2,3,4,5]
>>> t[1]
2
リスト
>>> t = [1,2,3,4,5]

>>> t[-1]
5

>>> t[1:4]
[2,3,4]

>>> t[2::-1]
[3,2,1]
リスト


>>> [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]
イテレータ
>>> 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
ジェネレータ


・ジェネレータはイテレータを
 簡単に生成するためのもの
ジェネレータ
def generator2():
    i = 0
    while True:
        yield i
        i += 1

>>> g = generator2()
>>> next(g)
0
>>> next(g)
1
ジェネレータ


for i in generator2():
    print i
Python入門

•pythonの特徴
•pythonの基本
•pythonの色々
色々というかウェブ開発
WEBフレームワーク
しっかり

•Django
•pylons(Pyramid)
•google app engine
•tornado
さくっと


•Flask
•他にも山ほど。
稼働環境
ウェブサーバ
•apache     •wsgi
•nginx      •fcgi
•lighttpd   •gunicorn
PaaS
•heroku     • DjangoZoom
•dotcloud   •OpenShift
•fluxflex     •Cloud
             Foundry
•google app
 engine
学習
学習する価値



• 基本はc/php/vb/perlと同じだけど、各
 所で色々違っておもしろいよ。

• なにより書きやすい。
学習する価値


• rubyでウハウハしてるなら別に良いかも
• 採用曲線の頂点(後は下るだけ)
• むしろ今からならjavascriptがいいかも
おすすめ
• 公式ドキュメントのチュートリアル
おすすめ
• Flaskのドキュメント
Python入門

•pythonの特徴
•pythonの基本
•pythonの色々
今日帰ったら

•手洗い
•うがい
•pythonインストール
ふぅ
今日話すこと


•python入門

•Dropbox APIを使ってみよう
Dropbox APIを
  つかってみよう

•DropboxAPIとは
•oauthとは
•APIにアクセスしてみよう
Dropbox APIを
  つかってみよう

•DropboxAPIとは
•oauthとは
•APIにアクセスしてみよう
DropboxAPIとは
DropboxAPIとは
DropboxAPIとは
APIでできること

•アカウント情報の取得
•ファイルのアップロード
•ファイルのダウンロード
•検索、共有、サムネイル取得
APIでできること

•ファイルのコピー
•フォルダの作成
•ファイルの移動
•ファイルの削除
詳しくは
でもね
すぐには使えません
OAuth
OAuth
おーおーす
OAuthとは

•API認可の方法
•認証(Authentication)ではな
 く

•認可(Authorization)
OAuthとは


•twitterとかfacebookとか
•もちろんDropboxも
なぜ認可?
たとえば


•dropboxのAPIを使ってサービ
 スを提供するサイトがあって

•これを利用しようとします
利用者       サービス提供サイト

あんたのサービス使わせてよ!




            dropbox
利用者       サービス提供サイト


いいけど、dropboxのアクセスに必要な
ユーザー名とパスワードを教えてちょ


             dropbox
利用者       サービス提供サイト

ユーザー名とパスワードを入力




            dropbox
利用者        サービス提供サイト
           ユーザー名&パスワード


      データのやりとり


             dropbox
利用者         サービス提供サイト
            ユーザー名&パスワード




              dropbox


 サービス提供サイトがアカウント情報を
 持つことが問題!
OAuthだと
利用者       サービス提供サイト

あんたのサービス使わせてよ!




            dropbox
利用者        サービス提供サイト



使いたいって人がいるんだけど、
許可してくれない?

             dropbox
利用者      サービス提供サイト




            dropbox

それは本人に聞いてみないと!
あのサービス提供サイトがあなたのデータに
アクセスしたいって言うんだけどいい?
利用者      サービス提供サイト




          dropbox


いいともー!
利用者        サービス提供サイト
             アクセストークン

      いいってさー
      よかったねー

               dropbox
利用者      サービス提供サイト
           アクセストークン




           dropbox



 アカウント情報をサービス提供サイトに
 預ける必要がなくなる。
認可API

•/oauth/request_token
•/oauth/authorize
•/oauth/access_token
Dropbox APIを
  つかってみよう

•DropboxAPIとは
•oauthとは
•APIにアクセスしてみよう
1.登録

•Dropboxにアプリ登録する
•consumer key
•consumer secret key
1.登録


https://www.dropbox.com/
developers
1.登録
1.登録
1.登録
1.登録




consumer key
consumer secret key
2.リクエストトークン

•/oauth/request_token
•cosumer keyとsecretを使う
•必要な情報を固めてPOST
•リクエストトークンを取得
2.リクエストトークン


ここがめんどう
2.リクエストトークン
•oauth_consumer_key
•oauth_signature_method
•oauth_timestamp
•oauth_nonce
•oauth_version
•oauth_signature
2.リクエストトークン


これをPOST!
2.リクエストトークン

•成功するとリクエストトークンを
 返してくれる

•oauth_token_secret
•oauth_token
3.認証/認可URL


•/oauth/authorize+トークン
•利用者がURLにアクセスして許可
 する
3.認証/認可URL
4.アクセストークン

•/oauth/access_token
•consumer keyとsecretを使う
•リクエストトークンも使う
•アクセストークンを取得
4.アクセストークン


•POSTする方法は
 リクエストトークン取得時+
 リクエストトークンを投げる
4.アクセストークン
•成功するとアクセストークンを返
 してくれる。

•oauth_token_secret
•oauth_token
•uid
5.APIの利用

•アクセストークン
•consumer keyとsecretを使う
•各種APIへアクセス
じつは

•oauthは非常に面倒
 oauth2策定中
 実装してるところもある
 facebook GraphAPI
つまり
今更OAuth1.0とか覚えなくていい


         え・・・、じゃあ、今までのスライドは何のために・・・
そこで
Dropbox APIを
  つかってみよう
• DropboxAPIとは
• oauthとは
• APIにアクセスしてみよう
•めんどくさいのでSDKを使う
DropboxSDKとは
SDKを使うと
1.登録 consumer key
SDKのクラスを作る
2.リクエストトークン取得
3.認可用URL作成
4.アクセストークン取得
5.APIの利用
5.APIの利用
5.APIの利用
5.APIの利用
5.APIの利用
5.APIの利用
Dropbox APIを
 つかってみよう

文字列だけの画面見ても

よくわからないから

わかりやすいの見せろよ!
こんなの作ってみる
dropboxフォルダのファイル一覧
環境構築
# mkvirtualenv dropboxtest

...開発用の仮想環境が準備される。


(dropboxtest)# pip install flask dropbox dotcloud

...必要なパッケージがインストールされる。
flaskサンプル1
flaskサンプル1
flaskサンプル2
flaskサンプル2
アプリ作成
アプリ作成
アプリ作成
アプリ作成
デプロイ
デプロイ
まとめ
まとめ

•pythonはキモくない
まとめ

•pythonはキモくない
•ライブラリで面倒なことも楽勝
まとめ

•pythonはキモくない
•ライブラリで面倒なことも楽勝
•フレームワークもいい感じ
まとめ

•pythonはキモくない
•ライブラリで面倒なことも楽勝
•フレームワークもいい感じ
•稼働環境も増えてきた
pythonするなら
いまがチャンス!
以上です。
ありがとうございました。


 おつかれさまでした。

Pythonで始めるDropboxAPI