Instagramの自動いいね機能を実装してみた

まえがき

Instagramマーケティングについて思う日々

半年前くらい?に元リクルート・元Googleなどと経歴詐称をして、ネットで大炎上した竹花高騎さんのことを思い出しました。実際にどこまで詐称していたのかはよく分からないので、詐称の真偽は置いておきます。

竹花高騎さんが経営していた株式会社Limでは、Instagramを使ったマーケティングを支援していたそうで(現在閉鎖中?)、自動いいね機能や自動フォローなどの機能があるそうでした。

 

気になってFacebookが公開しているAPIを調べてみたのですが、Facebookは2018年頃からAPIの公開を制限しており、2021年8月時点では自分が調べた限りだと殆どのAPIの公開はしていない状況です。

投稿予約などはFacebook・Instagramクリエイタースタジオ、分析関連はビジネスインサイトツール、いずれもFacebookが公式に公開しているツールであり、APIの公開を制限した代わりにFacebook自身がマーケティングに活用できるツールを提供する方向に切り替えているようです。

Google検索で「Instagram ツール」と調べても、殆どが分析に関連するツールで、おそらくビジネスインサイトツールだけでは気づけないようなポイントを発見できるようなものだと推察しました。

企業向けには限定的にAPIを公開しているのか、もしくはもっと人力で何かをしているのか詳細はよく分かりませんが、少なくとも現在ではInstagramの自動いいねツールを販売している企業はなく、SNSでの集客は大変そうだなぁ~と思った今日このごろだったわけです。

Instagramの自動いいね機能に関する情報

そんな中で、「Instagramの自動いいね機能って、普通にスクレイピングで実装できんのかね?」ということを思ったので、夏休みの自由研究を兼ねて久々にPythonで遊んでみたわけです。

その前にリサーチをと思ってググり散らかしていたら、意外にもたくさんヒットしました。

 

ちゃいろハックブログ

こんにちは。インスタでフォロワーを増やしたいですよね! そのためには自分のアカウントと共通の系統のアカウントに対してフォ…

本記事では、インスタで自動いいねする方法を紹介します。Python(Selenium)を使えば、アプリ・ツールを使わずに…

ANGツール

seleniumを使用したインスタグラムの自動いいねツールのソースコードを公開します。当ツールは、2021/6/8(火)…

 

なんだよ!すでにたくさんあるんかい!

って思ったわけですが、どれもそのままコピペしてもうまく機能しませんでした。

なので今回は以下の3点を紹介したいと思います。

  1. 簡単にコードの紹介
  2. コードのポイント
  3. やってみて思ったこと

実装したコード

コードの紹介

まず初期設定。いろいろなモジュールを入れます。

上から、ブラウザ上の操作を制御するselenium関連のものと、サイト上のソースを抜き出すBeautifulSoup、あとは諸々細かいものと最後に完了メールを送るためのもの。

from selenium import webdriver 
from selenium.common.exceptions import WebDriverException 
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.chrome.options import Options 
from bs4 import BeautifulSoup 
import time 
import random 
import urllib.parse 
import smtplib 
from email.mime.text import MIMEText 
from email.utils import formatdate

次にChromeDriverを入れます。ChromeDriverの前に記載されているtime.sleepは後で話します。

print("待機中") 
time.sleep(random.randint(10, 1000)) 

#Chrome Driverの起動 
driver = webdriver.Chrome('###ファイルパス###')

そしてログインします。最初にChromeDriverで指定のURLにアクセスし、seleniumで特定のnameを持っているカラムにユーザー名とパスワードを記入。

最後に特定のclassを持っているボタンをクリックする流れです。

#ログイン 
driver.get('https://www.instagram.com/accounts/login/?source=auth_switcher') 
print("instagramにアクセスしました。") 
time.sleep(1) 

#メアドと 、パスワードを入力 
driver.find_element_by_name('username').send_keys('###ユーザー名###') 
time.sleep(1) 
driver.find_element_by_name('password').send_keys('###パスワード###') 
time.sleep(1) 

#ログインボタンを押す 
driver.find_element_by_class_name('L3NKy ').click() 
time.sleep(random.randint(2, 10)) 
print("instagramにログインしました。") 
time.sleep(1)

で、ここから結構書き方が雑になります。関数組めばよかったんですが、とりあえず直感的に書いてみた後で関数にしようと思っていたのですが、別に自分しか使わないからいいやと・・・(言い訳)

successとfailedはメール送信用です。

#ループ基礎設定 
instaurl = 'https://www.instagram.com/explore/tags/' 
tags = ['###いいねしたいタグ###'] #最大5つくらいがいいかも。複数選択の場合はコンマで区切る。 
success = 0 
failed = 0 
raw_body = []

さて雑なコードが来ます。とりあえずループさせまくります。(説明すら面倒になっている)

「for i in range(0, 5)」の5の部分、ちゃんとtagsの値をlengthで取得せいって思いました。エンジニアじゃないのであしからず・・・

非エンジニアの方のために、この「5」という数字は一つ前のtagsに入れたタグの個数を入れてください。

#ループ開始 
for i in range(0,5): 
    driver.get(instaurl + tags[i]) 
    time.sleep(random.randint(2, 10)) 
    print("listtagより、tagで検索を行いました。") 
    time.sleep(random.randint(10, 15)) 

    #最新の投稿を移動 print("ページソースを取得します。") 
    html = driver.page_source.encode('utf-8') 
    soup = BeautifulSoup(html, 'lxml') 
    links = soup.find_all('a') 
    urls = [] 
    for link in links: 
        urls.append(link.get('href'))
 
        #投稿ページにアクセス&いいね 
        for j in range(9,random.randint(10, 13)): 
            try: driver.get('https://www.instagram.com'+ urls[j])
                time.sleep(random.randint(5,10))
                driver.find_element_by_class_name('fr66n').click()
                print("投稿へのいいねが完了しました。") 
                success = success + 1 
                time.sleep(random.randint(5,10)) 
                driver.get(instaurl + tags[i]) 
                time.sleep(random.randint(5,10)) 
            except WebDriverException: 
                print("エラーが発生しました。") 
                failed = failed + 1 

    raw_body.append('TagNo->'+str(i)+'\nsuccess->;'+str(success)+'\nfailed->;'+str(failed)+'\n\n') 
    success = 0 
    failed = 0

で、最後にgmailでメール送信です。メール送信が不要の場合は、ココは不要です。

#結果メールの送信 
FROM_ADDRESS = '###送信元メールアドレス###' 
MY_PASSWORD = '###パスワード###' 
TO_ADDRESS = '###宛先メールアドレス###' 
BCC = '' SUBJECT = 'Instagram auto like result' 
BODY = raw_body[0]+raw_body[1]+raw_body[2]+raw_body[3]+raw_body[4] 

def create_message(from_addr, to_addr, bcc_addrs, subject, body): 
    msg = MIMEText(body) 
    msg['Subject'] = subject 
    msg['From'] = from_addr 
    msg['To'] = to_addr 
    msg['Bcc'] = bcc_addrs 
    msg['Date'] = formatdate() 
    return msg 

def send(from_addr, to_addrs, msg): 
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587) 
    smtpobj.ehlo() 
    smtpobj.starttls() 
    smtpobj.ehlo() 
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD) 
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string()) 
    smtpobj.close() 

if __name__ == '__main__': 
    to_addr = TO_ADDRESS 
    subject = SUBJECT 
    body = BODY 
    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body) 
    send(FROM_ADDRESS, to_addr, msg) 

driver.close() 
exit()

コードのポイント

にしかた
我ながら雑なコードと雑な紹介だったけど、コードのポイントを紹介するぜ
まずポイントっていうか、そもそもSeleniumの話なんですが、Seleniumは特定のnameやid、classに対してアクションができるので(少なくとも自分の理解では)
fr66n」というclassを持っているボタン=いいねボタンに対してクリックという操作をしているわけです。
他サイトでのコード紹介では、同じように特定のclassを使って最新の投稿を取得していたのですが、それができなかったんですよ。(理由は割愛)
なので、このコードではBeautifulSoupを使って投稿一覧ページからリンクURLの一覧を抜き出し、上から10番目~13番目の投稿に対していいねをする仕様になっています。
なぜならタグ検索して最初に表示される1番目~9番目のリンクは、最新投稿ではなくおすすめ投稿だからです。
▼ここの部分の話です。
#最新の投稿を移動 
print("ページソースを取得します。") 
html = driver.page_source.encode('utf-8') 
soup = BeautifulSoup(html, 'lxml') 
links = soup.find_all('a') 
urls = [] 
for link in links: 
    urls.append(link.get('href')) 

    #投稿ページにアクセス&いいね 
    for j in range(9,random.randint(10, 13)):

あとは時折挟まれているtime.sleeprandom.randintです。

これで操作ごとに微妙に時間差を発生させることで、Instagramにbotだと思われないように工夫をしています。

最序盤で「time.sleep(random.randint(10, 1000))」が出てきたのも、これをbatファイルで自動化することを想定しており、Windowsで自動化機能を使うと時間をランダムに設定ができないので、プログラム起動時に若干の時間差をつけているという感じです。

やってみた感想

運用して1週間くらいでアカウント停止

にしかた
ズコーーーーッとコケる音が聞こえた気がするぜ
はい、上記のものとほぼ同じコードで運用したら1週間くらいでアカウント停止くらいました。

すぐに自動いいね機能をストップさせて、パスワード変えて再認証したらアカウントは復旧しました。

多分問題は、設定したタグが多すぎたことと、1日の実行回数が多すぎたことです。アカウント停止くらった時は1日100いいね以上つける仕様でした。

 

なので設定するタグを減らし、1日の実行回数も減らし、且つ元々ランダムで操作停止するコードは入れていたのですが、更にランダムで停止する時間やタイミングを増やしました。

結果、上述のコードを1日4回実行しても今のところ運用はできています。運用期間は1ヶ月くらいで、1日のいいね数は20~30ほど。(いいねの回数もランダムにしているので)

自動いいねしてもめちゃくちゃフォロワーが増えるわけでもない

サブ垢でこの自動いいねを実行しているのですが、毎日20~30いいねしているからといってフォロワーが急激に増えるわけでもないです。

最近だと2~3日に1回、「いいねありがとうございます!フォローしていただけると励みになります!」みたいなメッセが送られてくるようになったので、一応リーチの数は増えているのかなと言い聞かせています。

正直、アカウント停止される可能性もあるので、そこまでして実装するメリットもないんじゃないかなと思いました。

私のサブ垢みたいな弱小アカウントがやっても意味ないのかな?

最後に

最後に注意事項ですが本コードを使って何かしらの損害が発生したとしても、私は一切の責任を取りません。自己責任でお願いします。

 

にしかた
インスタグラマーへの道のりは長いぜ!