クリスマス行動調査報告をしたかった2024【InstagramAPI】

:::note
この記事は [Wano Group Advent Calendar 2024](https://qiita.com/advent-calendar/2024/wano-group) 25日目（最終日:xmas-tree:）の記事です
:::
昨日は @ktat さんの [Google Cloud の請求先アカウントごとにメールの送信先を変える - あるいはGoogleのUIへの愚痴](https://qiita.com/ktat/items/660e1aeea9c250aa7068) が公開されていますので、こちらもぜひご覧ください:point_up:

# アドカレ最終日…！
みなさんこんにちは！アドカレ12日目にもおりました @rom1000_onigiri です:qiitan:
WanoGroupのアドカレも本日で締めとなります:clap:
締めのテーマはクリスマスにちなんで、InstagramAPIを使って巷の人間たちは誰とどう過ごしているのかをざっくり調査してみました。

…結果は不問としてください（最後まで読んでみてください）

# 調査方法
[InstagramAPI](https://developers.facebook.com/products/instagram/apis/?locale=ja_JP)を用いる。
今回は **APIを叩いたその時間から24時間以内の、特定のハッシュタグがついた投稿** を取得する。
特定のハッシュタグの種類は、以下とする。
- `#クリスマス #デート`
- `#クリスマス #友達`
- `#クリスマス #家族`
- `#クリスマス #バイト`
- `#クリスマス #仕事`
- `#クリスマス #ぼっち`

## Instagramアカウントの準備
※アカウントを持っていない場合は新規登録をすること
### アカウントタイプの切り替え
APIをしようするにはビジネスアカウントでないといけないので切り替えの対応が必要となる。
1. その他 > アカウントの種類とツール > プロアカウントに切り替える
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/e359b536-1822-e982-21a3-7747608329f9.png)
        2. ビジネスを選択
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/81da1160-0381-691c-ed1e-70d08e1663b2.png)
        3. これ以降は適当に（連絡先情報は入力しなくても進める）
        4. 完了
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/c6c5caa7-2b14-e65a-1305-ab81e462432b.png)

## Facebookアカウントの準備
※アカウントを持っていない場合は新規登録をすること
### ページの作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/d0b0d66a-3202-db7b-c4b8-f985fa378220.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/6b971c5b-2cc9-4165-2769-ea710545e61c.png">![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/276eb7b8-c29d-4fd2-f4d0-591b548484db.png)

## InstagramアカウントとFacebookアカウントの連携
### Facebook側から連携
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/ea543dfd-bfb5-66b5-da8c-dd0b4bc88262.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/3e6808a6-96f1-e658-97da-49e2acc9d2e8.png)

Instagramのプロアカウントが候補に出てくるので、それを選択すると承認リクエストポップアップが出るのでログイン。
![スクリーンショット 2024-12-25 8.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/4e90e67d-533e-7eb1-ec15-1826440c8585.png)

このモーダルが出たら連携完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/2fc13d24-7876-c43d-0941-e36232785a75.png)

:::note warn
FacebookとInstagramを連携すると、Facebook側でInstagram側のDMが見られる設定になるので、複数人でFacebookの運用をしている場合は注意すること
（ただし「受信箱でInstagramメッセージへのアクセスを許可する」をOFFにした場合を除く）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/875bba32-752b-2d40-cd78-deaa5b1e1272.png)
:::

### Facebookアプリを作成する
#### Meta for Developersに登録
https://developers.facebook.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/ca08979d-e66e-f54c-7660-83dd5ad86204.png)
基本的に、案内に沿って登録すれば問題なかった。
#### アプリの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/6af6e78d-52ae-29b5-2a85-4500a0c14a8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/07fc8bab-aca9-dee1-ed8a-57b780cc3094.png)
基本的に、案内に沿って登録すれば問題ないが、
ユースケースは **その他** を選択し、次の項目で **ビジネス** を選択すること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/8d18b710-4e89-9e17-8f2f-d405c7d5880d.png)
次のセクションで **ビジネスポートフォリオ** が設定できるようになっているので、前項で連携したInstagramアカウントを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/2891f909-1661-833a-28f5-25279fae4a7e.png)
この画面になったらアプリ作成完了。

## トークンを取得する
### 1つ目：有効期限1時間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/6c3114cb-3c0b-343a-66a7-642a716337a7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/604bc4ad-c052-0946-1d36-9d42e4e50c99.png)
アクセス許可で以下の項目を追加して、アクセストークンを生成。
- instagram_basic
- instagram_manage_comments
- instagram_manage_insights
- instagram_manage_messages
- instagram_content_publish
- business_management
- pages_show_list
- pages_read_engagement

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/03b9ddf9-acd7-faa8-c9eb-20b0e47303ce.png)

### 2つ目：有効期限2ヶ月
トークンが生成された横にあるinfoマークの押下すると詳細情報が表示される。
下の方にある「アクセストークンツールで開く」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/c12426c3-a87c-bf40-25e1-cb43bda940bd.png)

遷移したページの一番下にある「アクセストークンを延長」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/fc3fa5e9-ad77-a0e5-1baf-c1dd108c1449.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/b8b21691-7b37-fc0b-5648-a8f6c366439f.png)
延長完了。

### 3つ目：有効期限無制限
前項の画像右端にある「デバッグ」を押下し、遷移先のページ上部にあるトークンをコピー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/17a2ebb6-01af-a6a2-b852-995f36755918.png)

先ほどのグラフAPIエクスプローラーに戻り、コピーしたトークンを貼り付ける。
次にGETするURL部分を `me/accounts` に置き換える。
最後に「送信」を押下し、期限無制限の最終アクセストークンが発行される。（ ~~ここまで長えよ。。~~ ）
このトークンを使用してAPI叩くので、控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/3d84caac-a208-25d7-2e0a-68b67ddad479.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/d6e0e360-536a-13b4-777d-47619660fb12.png)

## ビジネスアカウントIDの取得
グラフAPIエクスプローラのGETするURLに `me?fields=accounts{instagram_business_account}` と入力し「送信」を押下。
このIDも使用するので控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/a7394b7b-d832-91fe-4a6b-68c10da725aa.png)

## 特定のハッシュタグがついた投稿を取得する

:::note warn
ハッシュタグAPIには下記の制限がある
- 1週間で取得できるハッシュタグは **30個** まで
    - 人気投稿APIと最新投稿API合わせて30個まで
- （今回は使用しないが）画像情報は **8時間** で無効になる
:::

### ハッシュタグIDを取得する
グラフAPIエクスプローラのGETするURLに下記のクエリを当てはめていき、ただひたすら送信 → ID控え。
- エンドポイント
    - `ig_hashtag_search`
- user_id パラメータ
    - 控えておいてあるビジネスアカウントのID
- q パラメータ
    - 取得したいハッシュタグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/1870b9ce-af30-a761-d610-2f57d8f3e493.png)

<table>
  <caption>各ハッシュタグID</caption>
  <thead>
    <tr>
      <th>ハッシュタグ</th> <th>ID</th>
    </tr>
  </thead>
  <tr>
    <td>クリスマス</td> <td>17844009163028327</td>
  </tr>
  <tr>
    <td>デート</td> <td>17843869810054283</td>
  </tr>
    <tr>
    <td>友達</td> <td>17841563827122291</td>
  </tr>
    <tr>
    <td>バイト</td> <td>17841564262102268</td>
  </tr>
    <tr>
    <td>仕事</td> <td>17841564040106788</td>
  </tr>
    <tr>
    <td>家族</td> <td>17841563074128611</td>
  </tr>
    <tr>
    <td>ぼっち</td> <td>17843731684035203</td>
  </tr>
</table>

### ハッシュタグIDから投稿データを取得する
前項同様、グラフAPIエクスプローラのGETするURLに下記のクエリを当てはめていき送信
- エンドポイント
    - `${ハッシュタグID}/recent_media`
- user_id パラメータ
    - 控えておいてあるビジネスアカウントのID
- access_token パラメータ
    - 控えておいてあるアクセストークン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/f4632cb6-69c2-1ce3-a18b-07307707c7c6.png)

:::note
画像では投稿idのみ取得しているが、 `fields` パラメータにいいね数やコメント数などを入れることによって他の情報を取得することもできる
取得できる情報の詳細は [公式リファレンス](https://developers.facebook.com/docs/instagram-platform/instagram-graph-api/reference/ig-hashtag/recent-media#reading) へ
:::

# 調査結果
limitが強制的に50件になってしまう罠 + リクエスト数上限の関係で、すべてのハッシュタグ投稿数を調査することはできなかった。
結果、調査失敗として終了する。 ズコーーーーッ

## 総評
総投稿数は取得できなかったが、デートしているアカウントは少なくとも300以上いた（ひたすらpagingのnextURLを叩いた）

<br>
アドベントカレンダーの最後の最後に、毒にも薬にもならない内容で締めてしまい、本当に申し訳ございませんでしたー！！！！
<img src="https://64.media.tumblr.com/6996104cf1b155e1307e7a310643b50d/tumblr_nkrhyh7pN51rruop4o1_500.gifv">

# 備考
無念な結果に終わったが、自分はこれから予約していたクリスマスケーキとチキンを取りに行き、豪華なクリスマスディナーを :man: :heart: 1人と :cat2: 2匹で過ごすので、特に悔しさなどはない。　…ないいぃ！！！！！！！！！


# PR
現在、Wanoグループ / TuneCore Japan では人材を募集しています。興味のある方は下記をご参照ください:information_desk_person:

Wano | [Wano Group JOBS](https://group.wano.co.jp/jobs/)
TuneCore Japan | [TuneCore Japan JOBS](https://www.tunecore.co.jp/jobs)