2017-12-19

【Python Instagram API ②】Python Instagram APIを利用際の権限についてまとめてみた



さて、【Python Instagram API ①】PythonでInstagramのAPIの認証を行うでは、InstagramのAPIを利用するための登録方法、およびアクセストークンの取得、いわゆる認証まわりのことをやってみました。




今回は公式ドキュメントを使って、どんな値が取得できるのかを調べてみたいと思います。




ある特定のタグが、何回投稿されているのかを調べる


ある特定のタグが、何回投稿されているのか調べられます。
自分の会社、飲食店のタグが何回Instagramに投稿されているのかを調べられます。
APIのエンドポイントは

https://api.instagram.com/v1/tags/{tag-name}?access_token=ACCESS-TOKEN

となっています。結果は以下のように出力されるようです。

{
    "data": {
        "media_count": 472,
        "name": "nofilter",
    }
}


ちなみにmediaとは、画像や動画などの投稿一つ一つのことを指すようです。上記の例だと、nofilterというキーワードが472回投稿されていることになります。


実際にコードを書いてみます。

api.py


import requests
access_token = "" #アクセストークン
tagName = "VR"  #検索したいキーワード
response = requests.get("https://api.instagram.com/v1/tags/{}?access_token={}".format(tagName,access_token))
print(response.text)


実行してみると、以下のような結果が返ってきました。VRという名前で130万回程度投稿されているようですね。

$ python3 api.py

{"data": {"name": "vr", "media_count": 1296573}, "meta": {"code": 200}}


最近投稿したメディアをタグから取得する


さて、何回投稿されているのか分かったら、今度はどんな投稿をしているのか知りたいですよね。そういう場合は、以下のエンドポイントを利用します。


https://api.instagram.com/v1/tags/{tag-name}/media/recent?access_token=ACCESS-TOKEN

また、以下のパラメータが必要だそうです。



  • ACCESS_TOKEN A valid access token.
  • MAX_TAG_ID Return media after this max_tag_id.
  • MIN_TAG_ID Return media before this min_tag_id.
  • COUNT Count of tagged media to return.



さっそく、使ってみましょう。例えばここ最近VRメディアを運用していて、その顧客の生活様式を知りたいなんてときに、VRイベントに来ているような潜在VR購入者層がどんなものに興味があるのか調べたいとします。


api.py

import requests
access_token = ""
tagName = "VRZONE" 
response = requests.get("https://api.instagram.com/v1/tags/{}/media/recent?access_token={}".format(tagName,access_token))
print(response.text)

しかし以下のようなエラーが。

{"pagination": {"deprecation_warning": "next_max_id and min_id are deprecated for this endpoint; use min_tag_id and max_tag_id instead"}, "data": [], "meta": {"code": 200}}

理由がよくわからないので調べてみると、どうやらsandboxモードの制限がかかっているようです。teratailの投稿にはこのように書かれていました

現行システムは 2015年11月より前に作成したClientを使っているのですが
どうやら2016年6月頃でSandboxModeになるようなので
新しくClinetの作成して利用できるかテストしている段階なのですが
アクセストークンを取得しAPIを叩いてみてもdataが空で返ってきます
{"pagination":{"deprecation_warning":"next_max_id and min_id are deprecated for this endpoint; use min_tag_id and max_tag_id instead"},"meta":{"code":200},"data":[]}
モードはSandboxModeなのですがSandboxModeでは/tags/tag-name/media/recentは利用できないのでしょうか?
また/tags/tag-name/media/recentの利用に承認が必要な場合このようなキャンペーンのWebアプリは規約違反になってしまうのでしょうか?
基本的にハッシュタグの場合、不特定多数のユーザの画像を無許可で取ってくることになるので、許可されません。以前、ほぼ同じことをやったことがありますが、ご指摘の通り新しく取得したクライアントでは、SandboxModeでも自分のアカウントの操作に関することしか投稿、検索などができませんでした。
ですので、利用申請を行うしかないものと思います。

つまり、ほかのユーザーのコメントを閲覧するためには、 APIの申請が必要になるようです。

Instagram APIの審査が必要?



2016年にアップデートがあったらしく、APIの仕様がかなり制限されたとか。APIの審査を通さなければ、かなりの機能が制限されてしまうそうですね。

APIの審査を通らなくてもSandboxモードというお試し的なものがありますが、利用できるのは自分自身を含む10人のユーザーの最新20件の投稿のみで、それ以外のアカウントや過去の投稿からはデータを引っ張ってこれません。1時間あたりの利用回数の上限も500回に制限されていて、本格的なサービスには全く不十分です。
しかし審査を通していれば、特定のハッシュタグのついた写真つきの投稿データを抽出でき、位置情報タグでの抽出などもできるので非常に活用の幅が広がります。国内でもAPIの審査を通している企業はそこまで多くありません。理由としては『単独での利用目的』では審査が通らないからです。1社のWebサイトに掲載するのみ、1回のキャンペーンに利用するのみの目的では、どんな大企業でも審査は通らないと思います。『複数の企業やユーザーがログインして使えるサービス』が望ましい、と英文の説明にも書かれています。

公式ドキュメントによると、開発者のAPIお試し機能として、Sandboxというものが存在するようで、機能拡張するためには独自の申請が必要なようです。


APIを利用するための審査の準備に関しては、Qiitaによい記事があったのでご確認ください。ただしかなり審査は面倒くさいようで、実際にアウトプットしたものを動画で見せなければならなかったりするようです。ひやぁ面倒だ。


【保存版】Instagramの審査の流れ、手順、必要なものまとめ


APIを利用するのはかなり面倒なので、スクレイピングでなんとかできないか調べてみようと思います。


追記)と思ったのですが、一応規約的にはアウトみたいです。

The ability to POST and DELETE likes, follows and comments is restricted to applications that offer business services and not consumer facing apps.
いいね!、フォロー、コメントに対するPOSTとDELETEが可能なのは業務用サービスを提供するアプリケーションに限定されており、一般向けのアプリでは利用できません。
結論からいうと、一般的には「いいね!」の追加と削除は許可されていません。
あと、developerページのチェックボックスは全く関係ありません。
The ability to POST and DELETE likes, follows and comments is restricted to applications that offer business services and not consumer facing apps.
いいね!、フォロー、コメントに対するPOSTとDELETEが可能なのは業務用サービスを提供するアプリケーションに限定されており、一般向けのアプリでは利用できません。
https://help.instagram.com/contact/185819881608116
また、「許可されていないなら、Selenium使って無理やりいいね!つけてやる」 というのはまずいことでしょうか?
スクレイピング等の自動化された手段によるコンテンツへのアクセスは検索エンジンを除き規約で禁止されています。
We prohibit crawling, scraping, caching or otherwise accessing any content on the Service via automated means, including but not limited to, user profiles and photos (except as may be the result of standard search engine protocols or technologies used by a search engine with Instagram's express consent).

規約に書いてあるということは、ユーザーでログインして実行するとBANされてもおかしくないということになりそうですね。真面目にAPIアプリを作って申請を出すか、さもなければリスクを冒してスクレイピングするかのどちらかになりそうです。

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...