Instagramにプログラムで自動ログインする【Python + Selenium】

Instagramにプログラムで自動ログインする【Python + Selenium】 プログラミング

インスタは、怪しい業者のツールであふれていますね。
自動いいね、自動フォローなどを代わりにやるようです。

このことに関しては、個人的には思うところはあります。
でも、この記事ではそれは置いておきます。

この記事では、インスタにプログラムで自動ログインする方法を解説します。
プログラム言語は、Pythonです。

本記事の内容

  • Instagramへプログラムで自動ログインすることのリスク
  • Instagramへ自動ログインするために必要なモノ
  • Instagram自動ログインの仕様
  • 【サンプルコード】Instagram自動ログイン

それでは、上記に沿って解説していきます。

Instagramへプログラムで自動ログインすることのリスク

結論から言うと、自動ログイン自体は何も問題ありません
ログインした後に、自動いいね、自動フォローをしたら、規約違反になります。

Instagram利用規約
「いいね!」、フォロー、シェアを人為的に集めたり、

この部分ですね。
規約に違反すると、アカウントが停止されることがあるようです。

でも、業者(サードパーティ)の自動ツールがあふれかえっているのです。
それも、株式会社などが普通に広告を打って販売しています。
みなさん、この状況をどう思いますか?

私は、異常だと感じます。
おっと、この件について語ると長くなるのでこの辺で。

インスタへの自動ログインという本題に戻りましょう。
とにかく、自動ログインだけなら何も問題はありません。

そのため、安心して試してみてください。
純粋に技術的にも面白いですし、勉強にもなります。

ただし、サブ垢でやることをおススメします。
業者ツールに警戒しているInstagramに狙われる可能性もゼロではないでしょう。

あと、誤解のないように伝えておきます。
個人的には、法を犯さない限りは規約なんて無視してもいいという考えです。

実際、上記の記事のように規約違反のスクレイピングをしています。
でも、これはあくまで公開されている情報をスクレイピングしているだけです。

日本の法律的には、何も問題ありません。
規約なんて、一民間企業が勝手に作ったルールに過ぎません。

その代わり、アカウント停止などはその一民間企業が自由に行う権利があります。
垢バンに文句を言う人がいますけど、「文句を言うなら使うな」と言いたいです。

それでも、不安だと思う方は次の記事をご覧ください。
今回の自動ログインとも少しは関係があります。

Instagramへ自動ログインするために必要なモノ

Instagramへ自動ログインするために必要なモノは、以下。

  • Instagramアカウント(ログインID、パスワード)
  • Python(プログラム言語)
  • Selenium
  • ChromeDriver

説明していきます。

Instagramアカウント(ログインID、パスワード)

自動ログインするためには、ログインするためのInstagramアカウントが必要です。
ただし、利用するアカウントには注意してください。

先ほども言いましたけど、サブ垢でやることをおススメします。
これも上記で書きましたが、垢バンはサービス提供側の自由な権利です。

まっとうに利用していても、垢バンされることはあるかもしれません。
それに文句を言ってもいいでしょうが、裁判しても負けるでしょう。

所詮は、一民間企業の無料サービスなので。
有償なら、万が一でしょうけど。

それでも、返金して終わりでしょうね。
それぐらい、アカウントなんて儚いモノだと考えた方が身のためです。

Python(プログラム言語)

エンジニアであれば、Pythonを学ぶことをおススメします。
本当に役に立つプログラム言語だと思います。

Selenium

Instagramに自動ログインするためには、必須の技術です。
Instagramは、他の大手サービス同様にボット対策をしています。

そのため、Seleniumなしでは手も足も出ません。
Seleniumとは、ブラウザを操作するためのツールです。

よって、Seleniumを動かすと実際にブラウザが動きます。
その際、動かすブラウザを指定できます。

しかし、この記事ではChromeのみで説明します。
自動化プログラムを書こうとする人が、Chromeをインストールしてないはずはありません。

でも、MacならSafariのみの人がいるかもしれませんね。
その場合は、Chromeをインストールしてください。

Linuxサーバーということになれば、また話は変わってきます。
その際は、次の記事を参考にしてください。

ChromeDriver

上記のSeleniumは、あくまでブラウザを操作するためのツール(ライブラリ)です。
そのため、実際のブラウザが必要だと説明しました。

ただ、このままだとSeleniumはChrome(ブラウザ)を操作できません。
SeleniumとChromeでは、直接に会話ができないのです。

そこで、通訳となるWebドライバーが必要となります。
Chromeの場合は、ChromeDriverです。

このChromeDriverについては、次の記事で説明しています。
Seleniumのインストール方法も書いてあります。

Instagram自動ログインの仕様

ポイントは、以下の3つ。

  • ログインフォームが表示されるまで待つ
  • ログインボタンがクリック可能になるまで待つ
  • ログインボタンをクリックする

すべてSeleniumに関わる技術的なポイントとなります。
Python自体のロジックに関しては、説明しません。
つまり、プログラムを細かくは説明しないということです。

では、各ポイントを説明していきます。

ログインフォームが表示されるまで待つ

まずは、Instagramのログイン画面へアクセス。
https://www.instagram.com/accounts/login/

Instagramログインフォーム

ログインしていなければ、上記のログインフォームが表示されます。
基本的には、Seleniumでアクセスするとブラウザの情報を共有しません。

どういうことか言うと、クッキーなどの情報は残らないと言うことです。
つまり、ログインが維持されないということになります。

もちろん、維持することも可能です。
しかし、Seleniumを使う場合は残さないようにします。

よって、Pythonでこの画面にアクセスするとログインフォームが出ていることになります。
ただし、このログインフォームは静的コンテンツではありません。
動的コンテンツなのです。

JavaScriptにより、表示されているということですね。
なぜ、Instagramはこんなことをしているのか?

ツール対策です。
動的コンテンツにしておけば、それだけで一段階防御のレベルが上がります。
だからこそ、Seleniumを使つ必要があります。

このような防御策が、Instagramのサイトにはたくさん実施されています。
それを攻略していく必要があるのです。

ログインボタンがクリック可能になるまで待つ

ユーザーID(電話番号、ユーザーネーム、メールアドレス)とパスワードをしないとログインボタンを押せません。

Instagramログインボタン無効

このときのhtmlタグは以下。

「disabled」が付いていることが確認できます。

これも防御策の一つです。
まあ、それ以前にユーザビリティ向上の一環でしょうけどね。
結果的に、ツールからの防御になっているということです。

Instagramログインボタン有効

ユーザーIDとパスワードを入力すると、このように押せるようになります。
よって、この作業をプログラム上で実現する必要があります。

この作業とは、ユーザーIDとパスワードの入力のことです。
これだけでは終わりません。

入力作業が終わった後、ログインボタンが押せるようになるまで待つ必要があります。
「disabled」が、buttonタグから除去されるまで待つということです。

以上をまとめると、以下の処理をプログラムで実現する必要があります。

  • ユーザーIDとパスワードの入力
  • ログインボタンが有効になるまで待つ

ログインボタンをクリックする

ログインボタンを押すのは、定型的なコーディングで対応できます。
問題は、ログインが成功したかどうかの判別です。

ログイン失敗には何種類かあります。
下は、パスワード間違いの場合です。

Instagramログインエラー

いずれにせよ、エラーは同じ画面で表示されます。
Ajaxでログインチェックをしているということです。

ログイン成功時には、別のページに遷移します。
遷移(ログインチェック)には、若干の時間がかかります。
そのため、3秒間待つように対応しています。

遷移先のURLは、状況によって異なるでしょう。
ただ、少なくともログインページのURLとは違うことは確実です。

それを利用して、ログイン成功かどうかを判別します。
詳細は、実際のソースを見てください。

【サンプルコード】Instagram自動ログイン

2020年10月31日時点では、自動ログインができています。
htmlタグを変更されたら、動かなくなる可能性はありますのでご注意を。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

DOMAIN_BASE = "https://www.instagram.com/"
CHROMEDRIVER = "chromedriver.exeのパス"
LOGIN_ID = "電話番号、ユーザーネーム、メールアドレス"
PASSWORD = "パスワード"

def get_driver():
      
    # ヘッドレスモードでブラウザを起動
    options = Options()
    #options.add_argument('--headless')
    # ブラウザーを起動
    driver = webdriver.Chrome(CHROMEDRIVER, options=options)
     
    return driver

# twitterログイン
def do_login(driver):
    # ログインURL
    login_url = DOMAIN_BASE + "accounts/login/"
    driver.get(login_url)
    
    # 電話、メールまたはユーザー名のinput要素が読み込まれるまで待機(最大10秒)
    elem_id = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.NAME, "username"))
    )
     
    try:
        # パスワードのinput要素
        elem_password = driver.find_element_by_name("password")
   
        if elem_id and elem_password:
            # ログインID入力
            elem_id.send_keys(LOGIN_ID)
         
            # パスワード入力
            elem_password.send_keys(PASSWORD)
             
     
            # ログインボタンクリック
            elem_btn = WebDriverWait(driver, 10).until(
                EC.visibility_of_element_located((By.XPATH, '//*[@id="loginForm"]/div/div[3]/button'))
            )
            
            actions = ActionChains(driver)
            actions.move_to_element(elem_btn)
            actions.click(elem_btn)
            actions.perform()

            # 適当(3秒間待つように対応しています)
            time.sleep(3)

            # 遷移
            # 遷移後のURLでログイン可否をチェック
            perform_url = driver.current_url
             
            if perform_url.find(login_url) == -1:
                # ログイン成功
                return True
            else:
                # ログイン失敗
                return False
              
        else:
            return False
    except:
        return False  

if __name__ == "__main__":
      
    # Driver
    driver = get_driver()
    # ログイン
    login_flg = do_login(driver)
     
    print(login_flg)
    driver.quit()

DOMAIN_BASE以外は、各自で変更してください。

DOMAIN_BASE = "https://www.instagram.com/"
CHROMEDRIVER = "chromedriver.exeのパス"
LOGIN_ID = "電話番号、ユーザーネーム、メールアドレス"
PASSWORD = "パスワード"

上記のサンプルコードは、ヘッドレスモードではありません。
ヘッドレスモードとは、ブラウザが目に見えずに起動する状態を言います。

つまり、現状はブラウザが実際に動く(入力・クリック・遷移)のを確認できます。

# ヘッドレスモードでブラウザを起動
options = Options()
#options.add_argument('--headless')

ヘッドレスモードにするには、上記コードの「#」を除去してください。

では、コードの説明をしておきます。

変更した情報が適切であれば、ログインまで行うはずです。
成功すればTrue、失敗すればFalseが表示されます。

ソースの詳細は、コメントを見てください。
上記で挙げた3つのポイントを注意して確認してください。

以上で、Instagramへの自動ログインの解説を終わります。

タイトルとURLをコピーしました