Instagram Graph APIの審査から承認まで

##2019/10/30 補足
Instagram基本表示API（Instagram Basic Display API）がリリースされました。普通にInstagramアカウントで連携できるそうです。
https://developers.facebook.com/docs/instagram-basic-display-api

限定的な用途であったり、個人ユーザー向けであれば、こちらの方が簡単かと思います。アクセストークンの有効期限が1時間かつリフレッシュトークンがなさそうなので、都度都度の認証になりそうですが。

#Instagram Graph APIとは？
[Instagram Graph API](https://developers.facebook.com/docs/instagram-api/?locale=ja_JP)はFacebook Graph APIの一部です。Instagram Graph APIは、Instagramに投稿されたユーザーのデータをアプリやサービスを構築するために使用できます。サービスや商品と統合したいAPIアクセス許可を選択して、Instagram APIを効果的に活用し、ビジネスが目的を達成できるようにします。

APIへのアクセス許可は、現在はInstagramのプロアカウント（ビジネスアカウントまたはクリエイターアカウント）でのみ使用できます。通常の個人アカウントでは使用できません。ビジネスプロフィールについての詳細は[こちら](https://www.facebook.com/business/help/897631030335607)。

Instagram Graph APIはFacebookアカウントを利用します。[旧InstagramAPI](https://www.instagram.com/developer/)はInstagramアカウントでのOauth認証が可能でしたが、こちらはInstagramアカウントでのログイン機能は開発できません。

##Instagram Graph APIのメリット
旧InstagramAPIは画像が640pxですが、Instagram Graph APIは画像サイズは1080pxにサイズが上がっています。動画の方はチェックしていないため不明です。その他については利用していないため、特に確認してません。

##アカウントとページのリンク構造について
Facebookアカウントが管理するFacebookページを取得して、FacebookページとリンクしたInstagramアカウントのデータにアクセスする仕組みです。ユーザー側の連携手順は面倒になりましたが、FacebookのAPIプラットフォームに載せることで開発や運用の効率は高くなりますし、個人情報保護と収益化を兼ねた取り組みとしても理解できます。

覚えておきたい仕様は以下の4つです。

・Facebookでは同一人物は複数アカウントを作成できない（というルール）
・Facebookページは1つのFacebookアカウントで複数作成できる
・Facebookページは複数のFacebookアカウントで管理できる
・FacebookページとInstagramアカウントは相互に1つだけリンクできる

##FacebookページとInstagramアカウントのリンク方法
設定方法は2種類あります。スマートフォンとPCで異なると認識しておくとスムーズです。個人アカウントでもリンクはできますが、APIからInstagramアカウントのデータを取得するにはプロアカウント（ビジネスアカウントまたはクリエイターアカウント）にする必要があります。

・Instragramアプリの設定画面からFacebookページをリンクする（[公式ヘルプ](https://www.facebook.com/help/instagram/502981923235522?helpref=related)）
・PCのFacebookページの設定画面からInstagramアカウントをリンクする（[公式ヘルプ](https://www.facebook.com/help/1148909221857370)）

Instragramアプリからは個人アカウントをビジネスアカウントまたはクリエイターアカウントに変更できますが、Facebookページの設定画面からは個人アカウントをビジネスアカウントに変換することしかできません。2019年10月初旬時点では以下のバグも存在しているため、特に理由がない限りはInstragramアプリからFacebookページにリンクする方法を案内しましょう。

・`instagram_business_account`が出力されないバグについて
Facebookページの設定画面からInstagramアカウントと連携した場合、`instagram_business_account`が出力されない場合があります。この問題の回避方法として、Facebookページの設定画面でInstagramのビジネスアカウントを個人アカウントに変換して、その後に再びビジネスアカウントに変更する裏技があります。ただし、[insights](https://developers.facebook.com/docs/instagram-api/reference/media/insights)のデータが個人アカウントへの変換時に消えてしまうので注意してください。
※同じ値の`connected_instagram_account`は取得できますが、画像は取得できません

##Facebookアプリに必要なアクセス許可
Facebook Graph APIを利用するには[Facebook Developers](https://developers.facebook.com/)からFacebookアプリの登録が必要ですが、FacebookアカウントのFacebookページの情報を取得して、FacebookページとリンクしたInstagramアカウントの情報を取得するには、追加でいくつかのアクセス許可が必要になります。

開発する[Facebookアプリ](https://developers.facebook.com/apps/)に`instagram_basic`のアクセス許可が必要です。また、[Facebookアプリのレビュープロセス](https://developers.facebook.com/docs/apps/review)に従って、アプリレビューを申請する必要があります。用途に応じて、様々なアクセス許可がありますが詳細は[こちら](https://developers.facebook.com/docs/facebook-login/permissions/?locale=ja_JP)。
※`manage_pages`のアクセス許可はなくても実装できます。ただし、グラフAPIエクスプローラーでユーザーが管理するFacebookページをチェックするのに不便なので、テスト時にはグラフAPIエクスプローラーで追加しておくと楽です。

##利用するAPIとテスト方法
Facebookアプリを作成していれば、[グラフAPIエクスプローラー](https://developers.facebook.com/tools/explorer/)を利用して、各APIからのレスポンスをテストできます。頑張れば非エンジニアでも使えます（多分）。

・FacebookページのIDを取得するには[User Accounts API](https://developers.facebook.com/docs/graph-api/reference/user/accounts/)を使用します
・InstagramアカウントのIDを取得するには[Page API](https://developers.facebook.com/docs/instagram-api/reference/page
)を使用する
・Instagramに投稿したフィードを取得するには[Media API](https://developers.facebook.com/docs/instagram-api/reference/user/media)を使用します

#アプリレビューについて
作成したFacebookアプリには、`default`、`email`、および`pages_show_list`のアクセス許可は最初から承認されていますが、その他のアクセス許可を追加するにはアプリレビューが必要です。詳しくは[こちら](https://developers.facebook.com/docs/facebook-login/review?locale=ja_JP)。

##審査にかかる時間
Facebookアプリの審査には約5日かかると記載がありましたが、実際には2日程度で返信がありました。概ね夜間に返信がありましたが、時差によるものと予想しています。結果はこまめにアプリレビュー画面をチェックしてください。

##審査結果に関する質問
リジェクトされた場合にはFacebook Direct Supportに問い合わせが可能になります。問い合わせはFacebookメッセンジャーを経由してチャット形式で行うことができます。

問い合わせへの回答はテンプレートを使用しているためか、回答になっていない場合があります（ありました）。例えば、質問を無視してAPIのドキュメントを見るようにという回答が来た場合は、それには該当しないことを伝えて再び問い合わせをしましょう。ちなみに技術的な内容でアプリのレビューの範疇ではない場合はDeveloper Community Forumを使うように促されます。

回答例）

>As it turns out this is outside the scope of App Review.

##テストユーザーについて
**Facebookアプリで作成できるテストユーザーで作成したFacebookページからは`Instagram_business_account`が取得できません**。また、InstagramアプリからテストユーザーではFacebookにログインできません。

そのため、レビュワーがテストユーザーを利用してしまうと必ずテストに失敗してしまいます。レビュワーはテストユーザーに関する仕様を把握していないため、必ずリアルアカウントを利用するように指示しましょう。

指示の例）

>When creating a Facebook page using a Facebook Test Users account, In Facebook Graph API, `Instagram_business_account` is not responded even if linked to IG business account from Facebook page setting.You need a real Facebook account instead of Facebook Test-users account. DO NOT USE Facebook Test Users account for this review.

##開発環境について
ライブモードのアプリに権限を追加する場合、デフォルトのURLが本番環境のURLになってしまうため、コメントでは開発環境のURLを指示しても本番環境のURLを使用されてしまい、リジェクトされる可能性があります（されました）。本番環境ではなく開発環境のURLを使用するようにわかりやすく指示しておきましょう。

指示の例）

>PLEASE USE `https://test.hogehoge.com/`.
>DO NOT USE `https://www.hogehoge.com/`.

##言語について
レビュー申請時のテキストは英語で提出した方が安全です。日本語でも提出可能ですが、多くの場合は機械翻訳されたテキストで審査されるため、内容が誤解されることがあります。レビューは提出した手順と動画によって、かなり厳密に実施されるため、レビュワーが手順を理解できなくなるとリジェクトされる可能性があります（されました）。

また、審査時にFacebookのレビュワーがGoogle翻訳を使用している場合があります。日本語のサイトの場合、翻訳によって画面の崩れが発生していると、UI上の問題からリジェクトされる可能性があります（されました）。ブラウザで英語に翻訳してみて、その場合のメニューやボタンの名称がどうなるかをチェックしておきましょう。

レビュワーがFacebookのテストユーザーとサービスのテストユーザーを混同して、ログインできないと判断した場合にもリジェクトされます（されました）。サービス側のテストユーザーがある場合はわかりやすく指示しておきましょう。

フィードバック例）

>アプリでアクセス許可の使用を承認を得るには、Facebook側で機能をテストする必要があります。テストを行うのにユーザーアカウント(Facebookログインとは別のもの)が必要な場合は、Facebookのレビュアーが使用するためのテスト用の認証情報とパスワードをご提供ください。

##動画について
PCとスマートフォンで表示できるサイトでは両方の動画も必要になります。スマートフォンでの動画だけを撮影して提出すると、PCの画面キャプチャ付きでコメントと共にリジェクトされます（されました）。

フィードバック例）

>スクリーンキャストとノートでは有効な使用例が提供されていますが、アプリにログインしたところ、この使用例を確認できませんでした。リクエストしたアクセス許可が正しくアプリに統合されていることを確認したうえでレビューに再提出し、チームがテストを完了できるようにしてください。

MacならiPhoneでも繋いでQuickTimePlayerで録画して、iMovieで軽く編集しましょう。音声も字幕も不要ですが、やる気のないバイトが見ても操作方法がわかるようにするとスムーズです。

##承認後
「自分のアクセス許可と機能」で`instagram_basic`が「承認済みのアイテム」に表示されていれば、アクセス許可が取得できます。お試しあれ。

##大変お世話になった記事
https://qiita.com/yukihirai0505/items/047de69e3e51698d0ba7
https://qiita.com/yukihirai0505/items/034646f29af053221b89