naoya_t@hatenablog

いわゆるチラシノウラであります

Instagram APIで定形業務を自動化してみた

Instagramのフレンド・タイムライン*1に流れてくる写真の中で、like_countの下1桁が "9" のものがあれば like し、like_countを繰り上げる

というよくある定形業務をInstagram APIで自動化してみました。

最近pythonを使うことが多いので python-instagram で行ってみます。

1. Instagram APIのDeveloperサインアップ

client_id, client_secretが貰えます。これを使ってaccess_tokenを取得します。
access_tokenの取得方法は http://instagram.com/developer/authentication/ に説明があります。日本語では「5分で使い始めるInstagramAPI」辺りが分かりやすいです。
ちなみにcallback urlは自分のブログ(というか今見てるここ)にしたけど事足ります。

2. access_token取得

まず、"code"というのを取得します。
APIから"like"するにはそれ用の権限が必要なので、codeを取得する際に

https://api.instagram.com/oauth/authorize/?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=basic+comments+relationships+likes&response_type=code

のように scope を指定します。(この例ではbasic,comments,relationships,likesを申請してるけどlikesだけで今回の用途には十分なはず)
ブラウザ上でredirect_uriにリダイレクトされる際に、URLの末尾に?code=XXXXXXXXXX というのが付いてくるのでそれを使ってターミナルから

$ curl \
-F 'client_id=CLIENT_ID' \
-F 'client_secret=CLIENT_SECRET' \
-F 'grant_type=authorization_code' \
-F 'redirect_uri=REDIRECT_URI' \
-F 'code=XXXXXXXXXX' \
https://api.instagram.com/oauth/access_token

とかやってaccess_token入りのjsonをゲットします。

3. スクリプト実行

#!/usr/bin/env python

''' 定形業務自動化スクリプト by naoya_t '''

import instagram

access_token = 'MY_ACCESS_TOKEN'

def like_it_if_mod10_is_9(target_user_id):
    ''' like_countが下1桁が 9 の投稿で未likeなものを見つけたらlikeする '''
    api = instagram.client.InstagramAPI(access_token=access_token)

    users, none = api.user_follows()
    for user in users:
        recent_media, next = api.user_recent_media(user_id=user.id, count=100)
        for media in recent_media:
            if media.like_count % 10 == 9 and not media.user_has_liked:
                print "o", media.id, user.username, media.link, \
                      media.like_count,
                api.like_media(media_id=media.id)
                print "->", media.like_count + 1
            else:
                print " ", media.id, user.username, media.link, \
                      media.like_count, \
                      'Liked' if media.user_has_liked else '---'

if __name__ == '__main__':
    like_it_if_mod10_is_9(target_user_id)

このスクリプトをcrontabにでも仕掛けておけば、like_countの下1桁が 9 の未like写真を探しまわらなくても良くなります!

*1:本当は何て名前なのかは知らない