rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

Instagram Grahp API+Twitter APIでInstagramの投稿をTwitterに連携するツールを作ってみた

タイトルの通りなのだが。
あまりきれいな実装じゃないけどgithubも公開にしたので興味ある方はどうぞ↓
https://github.com/rmblankslash/Instagram2TwitterBatch

また、本ツールの実装過程で、Instagram Graph APIを触る機会があり、そこで知ったいくつかの情報をQiitaにまとめた。
こちらもまあ、興味ある方はどうぞ↓
https://qiita.com/rm_blank_slash/items/70e96f14715633fb9966


 

つくった背景

はじめに

Instagramを始めてから、悩んでいたことがいくつかあった。

  1. PCからInstagramに投稿できない
  2. Instagramの投稿がTwitterに連携されない


基本的に「自分の使い方に合わない」というのが主な不満点なのだが、せっかく始めたからにはこの運用を改善したい。
なので、まずはここの問題に対するソリューションwを検討することにした。
ちなみに、「なるべく手間をかけずに解決したい」が原点にある。
趣味プログラマーとしての好奇心から「API使ってガリガリ書いたら解決するかな…最悪それだな…」と思ってはいたが(しかも結局その方向性に帰着したが)、それは手間(工数)がかかるので最終手段にするつもりだった。
なので、手ごろな部分で解決できる手段はないか、と、数日間いろいろ模索していたのだった。

運用上の課題1.PCからInstagramに投稿できない

書いた通りなのだが、PCから投稿できないのが面倒だなーと思っていた。
基本的にインスタには自分で描いた「絵」(実際には落書きレベルだが)しか投稿するつもりがなく、絵はPCで描いてるので、PCで描き終わってからインスタ~って流れが理想的なのだが、Twitterのように、Web版のインスタUIには投稿機能が付いていない(閲覧専用。コメントとかいいねはできる)。
「もしかしてわざわざPCからスマホに絵の画像送ってスマホから毎回投稿するようにしなけりゃならんのか…?」と思って恐怖を感じていた。

いくつか探してたらGoogle ChromeのInstagram拡張機能を見つけた。
おおっこれでPCからも投稿できるぞ!よかった!と思って一旦この問題は解決したかに見えた。
事実、一時的にこの問題は解決した期間があり、これで運用乗り切れるぞ、と思っていた。

しかしこの拡張機能は複数画像の投稿(いわゆる、「アルバム」投稿)に対応していなかった。
それまでは単一画像の投稿しかしてなかったのでこれで十分だったが(これが「解決したかに見えた」状態)、複数画像を投稿したくなって、これがまた課題化した。
それまでのところ、複数画像の投稿をしたいケースはなかったが、インスタグラムを投稿していく中で、その必要性が出てきた(って、自分の投稿の趣味の問題なんだけどね)
で、また振り出しに戻った。

そんな中、マイクロソフトストアから落とせるインスタグラムアプリというのの存在を知った。
上述したGoogle Chrome 拡張に比べ、UIがスマホアプリのものに近く、しかも複数画像投稿に対応している!
PCからの投稿にあたっては、これが一番使い勝手がよさそうだな、と、これで問題が解決したかに見えた。
…と思ったら2/28夜くらいの複数画像ができなくなっている(投稿してもエラーになる)ことに気づき(ググった感じ同じ症状が他の人にも出ていたらしく、1月くらいからもうできなくなってたらしいが)、翌2/29に見たら投稿機能自体消滅しているという状況になっており、結果的にこのツールも使うことはなくなってしまった…
(まあこの辺の機能が充実したらまた使うかもしれないが)
この時点で「手軽な解決手段」に関してはネタ切れになった。
ついに「API使って自分で書く(コーディング)するしかないな…」に陥って、面倒だったがAPIを探し始めた。
これは後述の別課題2.の続きとしてまとめて書かせていただく。

運用上の課題2.Instagramの投稿がTwitterに連携されない

基本的に主な生息場はTwitterであり、Instagramは「絵」を投稿するだけの場にするつもりだったので、SNSの使い方としては、Instagramは「オプション」になる。
よって、「TwitterInstagramもやってるが、Instagram側のアカウントがわからない人」というのが少なからず存在していた。
Twitterと同じ人だとしても、アイコンが少し違ったり名前(HN)が少し違うだけでもはや別人なので、「Twitterと同じ人」の判断がつかない(逆に言えばごく少数の「Twitterとアイコンもアカウント名も同じで人」に関しては「Twitterで交流のある人」だと判断がついたのでフォローした)
そうした人たちに向けて、「TwitterからInstagramへの動線」を整えたかった。
これが本課題である。

恐らく、インスタをスマホだけで使っている過半数の人が設定しているように、インスタ→Twitterのアプリ連携をさせていると、インスタの投稿をTwitterに投げてくれるが、知ってる限りではキャプションとインスタ投稿へのリンクのみで、肝心の画像を連携させることができなかった。
あと上に書いたようなアプリ(Google Chrome拡張やマイクロソフトのインスタアプリ)を使うと、仮にインスタ→Twitterにアプリ連携の承認設定をしていても、なぜかTwitterに投稿データが連携されなかった(多分アプリ経由の投稿しか処理しないつくりになってるんだろう、と予想。ここは深く追跡していない)

で、いくつか探したときに見つけたのが、有名な(?)IFTTTだった。
Hatena Blogの更新データをGoogleやYahoo等の各種検索サービスに配信をするためにはこれが必須なので、Hatena Blog運用開始時にアカウントは取得済だったので、これを使うことに全く抵抗感はなかった(要するに「手軽」だった)。
すでに該当する既存のアプレット(インスタ→Twitter連携)はいくつかあったので、さっそく使ってみた。
が、いくつか実験してみて、以下の課題があることを知った。

  • インスタの投稿のキャプションが全角140字(Twitterの投稿制限)を超えている場合、エラーになる
  • 複数画像の投稿に対応していない

他の人の、インスタ→Twitterのアプリ連携の投稿記録を見る限りでは、キャプションが長すぎる場合、最終文字を「…」にしてぶっちぎってる節があったので、IFTTTを使ってもそうなるだろうと、勝手に想像していた。
しかし実際のところはそんな気の利いた事はしてくれず、「とにかくそのままTwitterにぶん投げる」精神のようで、無作為にキャプションを連携させることは不可能だと知った。。
勿論キャプションが常に140字以内に収まるように投稿時に気を付けるという運用回避もできるのだが、そんなことに気を使いたくないし、そもそも140字より長い文章を投稿したい(クソネタだが…)からこそインスタを選んでいる節もあるので、ここは譲りたくなかった。
※なお、ここでしきりに「140字」と言っているのは、あくまで「Twitterの投稿制限」を表面的に伝わりやすくしているだけである。
 「どこまでを1字とするか」は非常に難しい問題で、かつ、その判定はTwitterの仕様に準ずるので、これだけ読んで「140字」を個々の解釈に当てはめないようにしていただきたいです。

また、IFTTTは「複数画像の投稿」に対応していなかった。
どういう仕組みを組んでいるのか知らないが、2画像投稿は完全にシカトされ、1画像投稿のみ処理対象になる。
なんでわざわざシカトするんだよと思ったが、そういう仕組みなんだから仕方ない。
この点においても、IFTTTが完全に自分の理想とする運用に合ったツールではないと思い知るに至ったのである。

他にもいくつか探したが、これといった手軽な手段と思える解決策を見つけることができず、かつ、探してるうちにだんだんと、「こんなに探してるくらいなら最早APIで自分で実装したほうが早そうだな」という思考に行き着いていった。
実際には、1.の最後に書いた「手詰まりでもうAPI以外に頼るところがない」にたどり着くより、2.でこの結論にたどり着くほうが先だったが、とにかくここで、1.2.の課題解決の行き場としてAPIを求めることで一致した。

APIの使用を検討する

最初は、APIを使ってインスタに投稿後、その投稿データを使って(画像やキャプション、リンク等)Twitterにも投稿」をやろうとしていた。
厳密に言えば「インスタの投稿をTwitterへ連携」ではなくで「同じ投稿を少し形を整形してインスタとTwitterの両方に投稿」だが、Twitterからインスタへの動線をつくるという点においては要件を満たしている。
そして暗黙的に、この時点で「インスタのAPIを使えば複数画像の投稿もできる」と信じきっていた。
この実装さえできれば1.2.を同時に解決できる、と意気込んで調査を開始した。

で、Instagram Graph API使い始めようと思っていくつかトライしたんだが、まあこれがスンゴイ面倒くせえのなんの。
2019年末~2020年2月時点はまさに「旧APIからInstagram Graph APIへの以降の過渡期」らしくて、情報がいろいろ錯綜していたのもそれに拍車をかけていたが。
自分で画面操作していた感じ、「あなたが本人であることを証明する公的な文書のアップロードが必要」とか「APIを使ってるところを動画に撮ってそれのアップロードが必要」とか、糞面倒くさいことが山ほど出てきた。
この辺まできて一度「だせーけどこんな面倒くせーことすんならもう運用カバーでいいや…」と断念する。

しかし、Webデザイナー系の方の記事を見てみると、別にそんなもん特に必要もなく使えてる節がある。
で、実際やってみたら本当に使えた。
拍子抜けしてしまった。
むしろアプリレビューで承認だなんだつってたのってやらなくてもいいんですか?と思えてしまう。
もうちょっとよく調べてみたら、いわゆる「開発者モード」と「ライブモード」では少し扱いが違うようだ(公式にそのことが書いてある…英語だけど)。
要するに「自作のアプリの中で不特定多数にFacebook App(Instagram Graph API)を使わせる場合アプリレビューが必要」ってことなのかな。
この辺は整理できていない。
とにかく自分のローカルマシンからInstagram Graph APIを叩くことには成功したのでヨシとする。

ところがせっかく行き着いたInstagram Graph APIだが、またもや課題を抱えていた。
それはInstagram Graph APIでは複数画像を投稿できない(みたい)」だ。
これは冒頭書いた「インスタのAPIを使えば複数画像の投稿もできる」という、API使用を検討する前に抱いていた自分の勝手な盲信が悪いのだが、とにかくAPIを使ったとしても複数画像投稿はできないようだった。
「できないようだった」というのは、厳密には、本記事執筆時点でインスタAPIを用いての投稿自体に成功したためしがないからだ。
ただ、Instagram Graph APIのRefernceを読む限りでは、
1.インターネット上にある画像URLをパラメータにmediaをコール
2.1.で返ってきたmedia_idをもとにmedia_publishをコール
なので、1つの画像につき1回の投稿にしか対応できない、と読み取った。

1.→2.の流れはTwitter APIで画像付きのTweetをpostするときと同じだが、Twitter APIのように、複数画像を投稿する場合、カンマ区切りで複数の画像のmedia_idを指定できる、という仕様になってるようには読み取れない。
なので、単一画像の投稿しかできないのだろう、と理解した。

どうやら調べる限りでは旧APIは投稿機能自体が備わっていなかったようなので(旧APIは触ったことないのでネットで見た記事情報を頼りにしているだけだが)それに比べれば大分マシのようだが、それでも個人的に利用する面においてこれは課題になった。

行き着いたソリューション

この時点で、上述した機能仕様APIを使ってインスタに投稿後、その投稿データを使って(画像やキャプション、リンク等)Twitterにも投稿」は実現できない、という形になった。
ではどうするか?

少しダサいのだが、「インスタへの投稿後、Twitterへの連携対象データをInstagram Graph APIで拾ってきて、中身を整形した後、Twitter APITwitterに投稿する」に帰着した。
前置きがだいぶ長くなったが、これが今回作ったツールの正体である。

個人的にはInstagramには画像以外投稿するつもりがないので、動画は処理対象外にしてもよかったのだが、(なので作った当初はTwitter APIのmedia uploadも静止画のみに対応しているシンプル版しか使っていなかった)もしかしたら今後動画をアップロードしたくなるかもしれないし、そのときに大改造するのも面倒だな、と思ったので、せっかくだから実装した。
5秒程度の短い動画だが、このツールを使ってTwitterに流せたことまでは確認できた。

「PCからInstagramへの複数画像投稿」は今のところ実現手段がないが、スマホから複数画像を投稿して、Twitterに流せたことも確認した。
なお、Twitterの1Tweetへの画像添付は4つまでなので、Instagramの複数画像も、最初の4つだけが連携対象になる。

Instagram Graph APIの、特に投稿データを取得する系のAPIは、Twitterのように複雑なパラメータを入れられない。
せいぜい「件数制限」のみだった。
「最大でも10K件までしか返しません」という記述を見つけたが、APIの実効レート制限もある中で、とてもじゃないがそんなに拾うつもりは全くなく(むしろ「1回の投稿ごとに実行する」運用を心がけるつもりだったので、それだけなら10Kどころか直近の1件だけでも十分、と思っていたくらいだったので)、そういう意味でもこの「件数制限」は取り入れることにした。
とりあえず5件を対象とするようにした。

出来ればTwitterみたいにsinceとuntilを使って投稿日時のフィルタリングがかけられると良かったのだが、そういう機能は保持していないようだったので仕方ない。
ただ、Instagramの各投稿データには、投稿した日時を示すtimestampを持っているので、特定の日時以降のデータを処理したいケースを考え、引数で特定の日時をもらって、取得したデータのtimestampと比較し、「引数の日時より後に投稿されたデータか」を判定するロジックをいれた。
あまり見た目の良い実装ではないが、まあ、意図せず大量処理されるよりはマシだろう。

というか、そういう意味ではInstagramの取得データ件数も1件でも良かったのだが、こっちはInstagram Graph APIの挙動を制御する部分で、「取得件数制限を1にしても”絶対に1件だけは返す”ことを保証するものではない」というのを考慮に入れなければならないので(そういう旨の記述がcursor base page nationのlimitパラメータの説明で書かれている)、とりあえず大事をとって5件にしておいた。
まあ、ハードコーディングしてはいるが、定数にしてるだけなので簡単に変えられるが…

余談

TwitterInstagram動線について

Twitter上における、邦ロック・IT・その他の交友関係と、Instagramでもつながっておきたい、という思いがあり、TwitterInstagramへの動線を検討したのだが。
この動線、作ったにはいいが、”少なくとも私は”そこまで有効活用できないな、という結論に達した。

というのも、私は、Instagramの利用目的として

  1. 自分が描いた絵を載せるプラットフォームにする
  2. Instagramアカウントしかない邦ロック界の有名人(ホリエアツシやウブさん)の情報キャッチ

の2つを挙げていたのだが、2.はアカウントさえあれば極端な話Instagramに何かを投稿する必要性はなく(閲覧できればそれでいい)、したがってTwitterから動線を作る意味がない。
かといって投稿するコンテンツが1.のように、今まで広い交友関係を築いてきた、テナーやハイエイタス等の邦ロック関連・IT関連とはまるで違う方向性に進んでしまっているので、仮にTwitterに流したとしても、「Twitterの交友関係」が興味を持つことが(基本的には)ない(はずである)。
確かに、「ライブ行きました」みたいな投稿をして、それをTwitterに流すほうが、食いつきはいいよな、と、よく考えればそれは当たり前なのだが、作りきるまでそうしたことに気づかなかった。
これは初期のマーケティング戦略に誤りがあった…ということだろう。

まあ最後のほう、半分くらいは、趣味プログラマーの自己満足に近いところがあったので、実装できただけで満足なところはあるが、(実際の機能性-TwitterからInstagram流入するユーザー-が、いようがいまいが関係ない)生かしきれなかったというのはIT人としての反省材料かなあ、と思った。
Instagramの使い方(1.のようなコンテンツを投稿する)について、Twitterとの差別化を図るために、余計なことを考えすぎたせいだろう。
逆に言えばInstagramのコンテンツは独創性が高いともいえるので(ポジティブシンキングは重要だ!)、そっちのほうで交友関係を広げていく、というのも考え方によってはアリかもしれないな、と思った。

Instagram APIについて

Twitter APIは使ったことがあったので、基本的にそれに類する機能は持ってるんだろうなと、使う前から勝手に想像してしまっていたことが、今回、実装するうえでは仇になった気がする。
要するにInstagramAPIに対する期待値が高すぎた。
柔軟な検索機能、UIと同じ投稿機能、そうしたものは当然備わっているんだろうと、勝手に思っていた。
ふたを開けてみると全然そんなことはなくて、思ったよりも使いづらかった。

Instagram APIが2020年3月末で運用終了らしいので、現時点(2020年2月末)ではまさに「旧APIからInstagram Graph APIへの移行の過渡期」にあたるのだが、こうしたタイミングであることも、Instagram Graph APIの機能性の乏しさの背景にあるのかな、と思った。
(要するにもう少し待ってればもっと機能性が充実するのでは、という予想)
例えば、投稿機能自体は旧APIでも持っていなかったのに対し、Instagram Graph APIでは備わっているらしいので、昔に比べれば機能性は拡充しているのだろう。
正直に言うとTwitter APIに比べてInstagram Graph APIのほうが使いづらいのは間違いないので、両方を使ってるユーザーとしては、同等の機能性を有することを望むが、よく考えてみれば、両者はサービスとしては全然異なるものなので、同等の機能性を有するはずがないのだ。
まあ、この辺は温かい目で見守っていきたい。

それにしたって

PCからInstagramへの投稿手段が限定されすぎている気がする。
これにはInstagramの何か強い意志というかサービスのスタンスみたいなものを感じる。
API使うのだって一般的じゃないし、組み入れたフリーソフトでも誰かが作らない限り実行できないので、基本的に「PCからは投稿するな」という無言のメッセージのようなものを感じてしまう。
スマートデバイス向けのサービス」というスタンスでもあるのだろうか。
この辺の不自由さは、正直サービスの窓口を狭めているだけのような気がするが…
まあ個人の都合でどうこう言ってもしょうがないので、いいか。。