お詫び(2020年4月12日現在)
現時点において、インスタグラムのセキュリティに変化があり、本内容は通用しない可能性が高いです。お詫び申し上げます。近日中に記事を削除します。
はじめに
数日前に
Pythonによる自動化の結果、ニューヨーク中でタダメシが食えるようになったエンジニアの話
こちらの記事を読んで衝撃をうけ、思った。
「・・・これやりてぇ・・・」
記事を要約すると「インスタグラムのアカウント運営をPythonで書いたプログラムで完全自動化して、経済的な対価を得よう」みたいなことだ。元記事は英語で下記のリンクから読んでみてほしい。
How I Eat For Free in NYC Using Python, Automation, Artificial Intelligence, and Instagram
記事内で参照されている、自動運営されているというアカウントは
これで、正直、よくこういうの見るな・・・という印象ではあるが、一見して、自動化されているとは思えない。
https://www.instagram.com/p/BwiHTjel7IJ/基本的には、ニューヨークの綺麗な写真が投稿されているが、時々こういう #sponsored とタグのついた投稿があり、これがタダ飯ということなのだろう。
さて、これを、一日プロジェクトでやっていきたいと思う。
方針
基本的には、こういうときは、小さな課題に分解して、ひとつずつ潰していくやり方が良いなと思っている。あんまり考えずに、一気にやりたくもなるが、問題が複雑すぎると、一気にやりきれず後で後悔するケースが多い。問題を分解して潰しながらやっていくと、確実に進捗が残るので、好きです。
さて、ざっと課題を整理すると
- テーマ選定の作成
- アカウントの作成
- ロゴの作成
- インスタグラムへのプログラム経由投稿
- 画像選定
- コメントハッシュタグ
- 定期実行
の7個程度になるかなと思う。
ここで、この記事は、やりながら書いていることを断っておきたい。ぶっちゃけると、すでにロゴ作成までは終わっている。これは、記録として公開したら面白いかな・・・?と思って、ロゴ作成まで追いつこうと思って書いているのが正直なところ。
言語は、Pythonでやっていきたい。
では、インスタグラムアカウントの運営自動化をやっていく!
##1. テーマ選定の作成
正直タダメシ狙うというのは、難しいかなと思っているので、単純に今興味があってインスタ映えしそうなテーマであれば何でも良いと思う。個人的に好きな、ウイスキー、日本酒、ワインの3つが候補にあがったが、あまり深い理由なく、ワインをテーマとすることにした。
名前は「WineMania(@winemania2019)」
https://www.instagram.com/winemania2019/
日本人のワイン好きをテーマにしてみた。ちょっとマーケットが小さすぎるかもしれない。
2. アカウントの作成
ここは、ハック要素ゼロなので、普通にインスタグラムのWeb版から作っていきましょう。
3. ロゴの作成
最近は、
このlaunchaoという無料のロゴジェネレーターがお気に入りです。お気に入りのフォントとアイコンをポチポチするだけで、無限にロゴを提案してくれます。
できたものがこちら。3分でできました。
4.インスタグラムへのプログラム経由投稿
ようやくプログラムを書くところに入ってきました。
ライブラリ選定
残念ながら公式のAPIを使ってということは、規約上難しいので、うまくハックする必要があります。幸いインスタグラム界では、第三者による非公式APIを利用した、インスタ操作プログラムがたくさんあります。その中から
・Python
・投稿ができる
・簡単に使えそう
・Starがたくさんついている
・メンテナンスがされている
・(あわよくば)ドキュメントが充実している
という点から選んでいきます。
そこで・・・ドン!
instagram_private_api
https://github.com/ping/instagram_private_api
このを使うことにしました。Starも700以上ありますし、最新の更新も数ヶ月以内です。ちょっと物足りないですが、15分ほどググった中ではベターだったので、これを採用して先に進むことにします。
インストール
インストールしていきます。Pythonやpipなどの環境が入っていることは前提としますね。一応自分は、pythonのバージョンは、anaconda3-4.1.1を使っています。
pip install instagram_private_api
Hello world
Hello world的なことをします。下記のIDとパスワードは上で作成したアカウントのものに差し替えてください。
from instagram_private_api import Client, ClientCompatPatch
user_name = '<インスタグラムアカウントのID>'
password = '<パスワード>'
api = Client(user_name, password)
results = api.feed_timeline()
で、
python bot.py
エラーなく、動くかなと思います。
投稿のテスト
from instagram_private_api import Client, ClientCompatPatch
from PIL import Image
import io
import urllib.request
user_name = '<インスタグラムアカウントのID>'
password = '<パスワード>'
api = Client(user_name, password)
# 画像のURL
url = "https://user-images.githubusercontent.com/5179467/57978324-23e4b000-7a46-11e9-8b04-4d16e97a702c.jpg"
# 画像データを取得する
img_in = urllib.request.urlopen(url).read()
img_bin = io.BytesIO(img_in)
img = Image.open(img_bin)
# 画像を投稿する
api.post_photo(img_bin.getvalue(), (img.width, img.height))
画像は、そのまま使っていただいてもOKです。jpgじゃないと駄目なようです。
すると
投稿されます!
とても簡単ですね。
5. 画像選定
ここは、モラル的な問題もあるので、どうかなと思うが、元記事では、当初有名アカウントを選定し、そこから著作権をケアするために、引用でうまくやっていたとのこと。ただ、この記事でそれをやるとウルトラ炎上しそうなので、ぐっとこらえて、フリーの画像サイトUnsplashから利用することにします!
※注意ですが、Unsplashの画像を使って本番で運用する気はありませんので、あしからず!あくまでも、実装のテストに使うだけです。
Unsplash
https://unsplash.com
APIキーを取得しておいてください。
ざっとしたみたいな感じの関数にしました。
from unsplash.api import Api
from unsplash.auth import Auth
def fetch_image_url():
client_id = "<UnsplashのClientID>"
client_secret = "<UnsplashのClientSecret>"
auth = Auth(client_id, client_secret, '', code='')
api = Api(auth)
check_count = 0
# 画像の縦横比が一定以下じゃないと(極端な縦長は駄目)いけないので、チェックする
while True:
check_count += 1
# wineの箇所をお好みのキーワードに変更してください
random_photo = api.photo.random(query='wine')
image_url = random_photo[0].urls.raw + "?fit=crop&w=500"
img_in = urllib.request.urlopen(image_url).read()
img_bin = io.BytesIO(img_in)
img = Image.open(img_bin)
width = img.width
height = img.height
ratio = height / width
if ratio <= 1.2:
break
elif check_count >= 10:
image_url = None
break
return image_url
UnsplashのAPIを使ってランダムに画像のURLを取得する関数です。
query='wine'の箇所を変えると好きなカテゴリーの画像になります。
6. コメントハッシュタグ
今回は、3個程度のハッシュタグを選定してつけるだけにします。コメントはもっと凝ったほうがいいのですが、時間がかかりそうなので将来の課題とします。こういうのは細かいところにこだわらずに、一度一気通貫させることが大事だと思います。
ワインがテーマなので、
#wine #ワイン #ワイン好き
あたりでしょうか。
投稿に関しても下記のように関数化しました
from instagram_private_api import Client, ClientCompatPatch
from PIL import Image
import io
import urllib.request
def post_image(image_url, comment=''):
user_name = '<インスタグラムアカウントのID>'
password = '<パスワード>'
api = Client(user_name, password)
# 画像のURL
url = image_url
# 画像データを取得する
img_in = urllib.request.urlopen(url).read()
img_bin = io.BytesIO(img_in)
img = Image.open(img_bin)
# 画像を投稿する
aapi.post_photo(img_bin.getvalue(), (img.width, img.height), caption=caption)
では、画像の取得から投稿までを行ってみます。
tags = '#wine #ワイン #ワイン好き'
image_url = fetch_image_url()
if image_url == None:
print('Sorry, good image not found!')
else:
post_image(image_url, tags)
これらを実行すると
いい感じに投稿することができました。
https://www.instagram.com/p/Bxoqo50FJcA/
ここで確認いただけると思います。
7. 定期実行
さて、最後の定期実行ですが・・・お詫びですが、個人的に時間切れになってしまったので、宿題にしたいと思います!
選択肢としては
・自分でサーバーを立ててcronで定期実行する
・AWS Lambdaなどのサーバーレス環境を使って定期実行する
・ローカルで定期的に手動で実行する
などあると思いますが、個人的には、AWS Lambdaなどのサーバーレス環境をうまく使うのが良いかなと思っています。後は定期実行すれば、インスタグラムの自動運用アカウントの管制です。
まとめ
さて、いかがだったでしょうか。結構さくっと一気通貫(定期実行はできませんでしたが・・・)できたかなと思います。みなさんもぜひやってみてください。