読者です 読者をやめる 読者になる 読者になる

PythonでVimeo APIにさわる

日本語の情報がたぶんほぼなくて不便なのでほんの触りだけ。

公式サイトでアプリケーションを登録して、OAuthを使って認証して、特定のURL (https://api.vimeo.com/*) にgetやpostなどでリクエストを送るとjsonが返ってくるといった具合で使える。twitterとかと同じ感じのあれです。

公式でライブラリが用意されているのでOAuthが何なのかわからなくても使える。僕はよくわかってない。

ビデオのアップロードもできるみたいだけどちょっと別枠なようなので触らない。

アプリケーションの登録

アプリケーションの登録は以下の開発者用のページから。My AppsCreate a new app → フォームを埋めて Create App する。

Vimeo Developer API

アプリケーションの登録が済むと、MyAppsに個別のアプリケーションへのリンクが出てくるので開き、そこから Authentication を開いて認証に使う情報をメモする。必要なのは Client IdentifierClient Secrets

f:id:ptnc17:20170326160514p:plain

アプリケーションとして必要なのはその2つだけだけど、開発用に個別のユーザごとに発行される アクセストーク というのも取得する。下の方に Generate an Access Token というのがあり、そこで作成できる。

Scopes はアクセス権限みたいなものらしい。リファレンスを見るとどの操作にどのスコープが必要かそれぞれ書いてあるので、必要なスコープがあればここでオンにしたアクセストークンを使う。

ここで表示された Your new Access token も先の2つに加えてメモしておく。

PyVimeo

インストール

今回はVimeoから公式で配布されているPyVimeoというライブラリを使った(やることは認証してURLを叩くだけなのでなくてもいいのかも)。PyVimeoはPython3でも使える。インストールにはpipを使う。

$ pip install PyVimeo

ライブラリはPython以外のものもある様子。

試す

実際に試してみる。エンドポイント(URL)とパラメータは以下のページにまとめられていた。

VimeoAPI Endpoints

基本的な流れは以下のような感じ(githubのREADMEからほぼ転載)。

import vimeo

# 認証して初期化
client = vimeo.VimeoClient(
    token=YOUR_ACCESS_TOKEN,
    key=YOUR_CLIENT_ID,
    secret=YOUR_CLIENT_SECRET)

# "/me"というエンドポイントへのリクエストを作成
about_me = client.get("/me")

# 正しくレスポンスを受け取れたか確認
assert about_me.status_code == 200

# jsonメソッドで辞書を取得
print(about_me.json())

VimeoClientの初期化にはアプリケーション登録時にメモした情報を使う。

基本的にはrequestsモジュールに投げてるだけっぽいので、APIのドキュメントを見てわからないことがあればrequestsの方のドキュメントを見るとよさそう。

使用例いろいろ

引数やステータスコードドキュメントに載ってた。コード中のpprintは出力がちょっときれいになる素敵なprint (from pprint import pprint)。

自分がフォローしているユーザを取得 (getの例)

ドキュメント: /me/following

# デフォルトのパラメータ
res = client.get("/me/following")
if res.status_code == 200:
    pprint(res.json())

# 100人ずつ表示, 1ページ目
res = client.get("/me/following?per_page=100&page=1") 
if res.status_code == 200:
    pprint(res.json())

自分のアルバムを作成 (postの例)

ドキュメント: /me/albums

res = client.post(
    "/me/albums",
    data={'name': "test", 'description': "testのアルバム"})
if res.status_code == 201: # ドキュメントは200になってた
    pprint(res.json())

特定のユーザがフォローしているユーザを取得

ドキュメント: /users/{user_id}/following

res = client.get("/users/36042443/following")
if res.status_code == 200:
    pprint(res.json())

特定のユーザがアップロードしているビデオを取得

ドキュメント: /users/{user_id}/videos

res = client.get("/users/36042443/videos")
if res.status_code == 200:
    pprint(res.json())

特定のビデオの情報を取得

ドキュメント: /videos/{video_id}

res = client.get("/videos/177597973")
if res.status_code == 200:
    pprint(res.json())

ページネーション

全データを取得するときは返り値の中にあるpagingを使う。コードはこれで適切なのかよくわからないけど動いた。どれくらい待てばいいのかも謎なのでとりあえず1分待ってる。

import time, pickle

def save_my_following():
    per_page = 100
    cur_uri = "/me/following?per_page={}&page=1".format(per_page)
    last_uri = ""
    data = []

    # cur_uriがlast_uriに一致するまでページをめくる
    while True:
        print("cur_uri: {}".format(cur_uri))

        # データを取得してリストdataに入れる
        following_res = client.get(cur_uri)
        assert following_res.status_code == 200
        following = following_res.json()
        data.extend(following['data'])

        # 初回のみlast_uriを代入
        if cur_uri == "/me/following?per_page={}&page=1".format(per_page):
            last_uri = following['paging']['last']
            print("last_uri: {}".format(last_uri))

        # 終了条件
        if cur_uri == last_uri:
            print("end")
            break

        # 次のページへ
        cur_uri = following['paging']['next']
        print("next_uri: {}".format(cur_uri))

        # 負荷がかからないようにちょっと待つ
        print("suyari...")
        time.sleep(60)

    # pickleで保存しておく
    with open("my_following.pickle", "wb") as f:
        pickle.dump(data, f)
広告を非表示にする