40
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

インスタグラムアカウントの運営をPythonで自動化してみた

Last updated at Posted at 2019-05-19

お詫び(2020年4月12日現在)

現時点において、インスタグラムのセキュリティに変化があり、本内容は通用しない可能性が高いです。お詫び申し上げます。近日中に記事を削除します。

はじめに

数日前に

Pythonによる自動化の結果、ニューヨーク中でタダメシが食えるようになったエンジニアの話

こちらの記事を読んで衝撃をうけ、思った。

「・・・これやりてぇ・・・」

記事を要約すると「インスタグラムのアカウント運営をPythonで書いたプログラムで完全自動化して、経済的な対価を得よう」みたいなことだ。元記事は英語で下記のリンクから読んでみてほしい。

How I Eat For Free in NYC Using Python, Automation, Artificial Intelligence, and Instagram

記事内で参照されている、自動運営されているというアカウントは

スクリーンショット 2019-05-19 11.24.32.png

これで、正直、よくこういうの見るな・・・という印象ではあるが、一見して、自動化されているとは思えない。

スクリーンショット 2019-05-19 11.27.24.png https://www.instagram.com/p/BwiHTjel7IJ/

基本的には、ニューヨークの綺麗な写真が投稿されているが、時々こういう #sponsored とタグのついた投稿があり、これがタダ飯ということなのだろう。

さて、これを、一日プロジェクトでやっていきたいと思う。

方針

基本的には、こういうときは、小さな課題に分解して、ひとつずつ潰していくやり方が良いなと思っている。あんまり考えずに、一気にやりたくもなるが、問題が複雑すぎると、一気にやりきれず後で後悔するケースが多い。問題を分解して潰しながらやっていくと、確実に進捗が残るので、好きです。

さて、ざっと課題を整理すると

  1. テーマ選定の作成
  2. アカウントの作成
  3. ロゴの作成
  4. インスタグラムへのプログラム経由投稿
  5. 画像選定
  6. コメントハッシュタグ
  7. 定期実行

の7個程度になるかなと思う。

ここで、この記事は、やりながら書いていることを断っておきたい。ぶっちゃけると、すでにロゴ作成までは終わっている。これは、記録として公開したら面白いかな・・・?と思って、ロゴ作成まで追いつこうと思って書いているのが正直なところ。

言語は、Pythonでやっていきたい。

では、インスタグラムアカウントの運営自動化をやっていく!

##1. テーマ選定の作成
正直タダメシ狙うというのは、難しいかなと思っているので、単純に今興味があってインスタ映えしそうなテーマであれば何でも良いと思う。個人的に好きな、ウイスキー、日本酒、ワインの3つが候補にあがったが、あまり深い理由なく、ワインをテーマとすることにした。
名前は「WineMania(@winemania2019)」
https://www.instagram.com/winemania2019/

日本人のワイン好きをテーマにしてみた。ちょっとマーケットが小さすぎるかもしれない。

2. アカウントの作成

ここは、ハック要素ゼロなので、普通にインスタグラムのWeb版から作っていきましょう。

3. ロゴの作成

最近は、

このlaunchaoという無料のロゴジェネレーターがお気に入りです。お気に入りのフォントとアイコンをポチポチするだけで、無限にロゴを提案してくれます。

icon-above-font.png

できたものがこちら。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じゃないと駄目なようです。
すると

スクリーンショット 2019-05-19 16.15.17.png

投稿されます!
とても簡単ですね。

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)

これらを実行すると

スクリーンショット 2019-05-19 16.16.51.png

いい感じに投稿することができました。

https://www.instagram.com/p/Bxoqo50FJcA/
ここで確認いただけると思います。

7. 定期実行

さて、最後の定期実行ですが・・・お詫びですが、個人的に時間切れになってしまったので、宿題にしたいと思います!

選択肢としては
・自分でサーバーを立ててcronで定期実行する
・AWS Lambdaなどのサーバーレス環境を使って定期実行する
・ローカルで定期的に手動で実行する

などあると思いますが、個人的には、AWS Lambdaなどのサーバーレス環境をうまく使うのが良いかなと思っています。後は定期実行すれば、インスタグラムの自動運用アカウントの管制です。

まとめ

さて、いかがだったでしょうか。結構さくっと一気通貫(定期実行はできませんでしたが・・・)できたかなと思います。みなさんもぜひやってみてください。

40
53
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?