0
3

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 1 year has passed since last update.

【Python】Instagramで任意のアカウントを自動フォローする

Posted at

初めに

 現在までの記事で、seleniumを用いたログイン、instaloaderを用いたフォロワー全件取得を行ってまいりました。
 ことすたぐらむフォロー機能1の最後の工程として、任意のアカウントのプロフィールにアクセスし、フォローする機能を実装したいと思います。
 この工程で、instaloaderで取得した、アカウントをフォローすることができます。
 ではまず、ソースコードを記載します。

ソースコード

main.py
import argparse
from instagram import Instagram
from instagram import INSTAGRAM_ID,INSTAGRAM_PASSWORD

if __name__ == '__main__':

    #IDとpasswordをコマンドライン引数から取得する
    parser = argparse.ArgumentParser()
    parser.add_argument('id')
    parser.add_argument('password')
    #コマンドライン引数を解析する
    account = parser.parse_args()

    #IDをmodelに送り、オブジェクトを作成する。
    instagram = Instagram()
    INSTAGRAM_ID = account.id
    INSTAGRAM_PASSWORD = account.password

    #ログイン
    instagram.login()
    
    #自動フォロー
    #フォローするアカウントをセット
    follow_account = フォローするアカウント
    instagram.show_profile_page(follow_account)
    #フォロー(フォローしていない、かつ、フォロワーにいない場合)
    result = instagram.follow()
instagram.py
from lib2to3.pgen2 import driver
from pickletools import floatnl
from unittest import loader

import instaloader
from time import sleep

from drivers import Driver

#IDとpasswordを定義
INSTAGRAM_ID = ''
INSTAGRAM_PASSWORD =''

logger = logging.getLogger('sns.instagram')


class Instagram(Driver):
    def __init__(self):
        super(Instagram, self).__init__()
        self.page = None
        #フィールドに値をセット
        #idとpasswordDBからを取得する

    #インスタグラムにログインを行う
    def login(self):
        try:
            #インスタグラムにアクセス
            self.get('https://www.instagram.com/accounts/login/')
            sleep(3)
            #ログインフォームを探し、入力する。
            sign_box = self.find_element_by_tag_name('form')
            sign_box.find_element_by_name('username').send_keys(INSTAGRAM_ID)
            sign_box.find_element_by_name('password').send_keys(INSTAGRAM_PASSWORD)
            #ログインボタン押下
            login_btn = sign_box.find_element_by_xpath('//button[@type="submit"]')
            login_btn.click()
            logger.info('login succeeded')
            sleep(3)
            #ダイアログを閉じる
            dialog_box = self.find_element_by_xpath('//div[@role="dialog"]')
            btn = dialog_box.find_element_by_tag_name('button')
            btn.click()
        except Exception:
            pass

    #プロフィール画面上でフォローを行う
    def follow(self):
        main = self.find_element_by_tag_name('main').find_element_by_tag_name('header')
        try:
            button = main.find_element_by_xpath('//button[normalize-space()="フォローする"]')
            button.click()
            self.notify(self.page)
            logger.info('follow succeeded')
            return 1
        except:
            logger.info('follow faild')
            return 0

    #プロフィール画面に移動(引数:アカウント名)
    def show_profile_page(self, id):
        self.get('https://www.instagram.com/{}/'.format(id))

順に解説していきます。

Instagramにログイン

 こちらは以前の記事で解説したとおりです。

プロフィール画面に移動

 ではログイン後、任意のアカウントのプロフィール画面に移動しましょう。
 Instagramのプロフィール画面のURLは以下のようになっています。

InstagramのプロフィールURL
https://www.instagram.com/ユーザーID/

Instagram.pyでアクセスするコードは以下のようになっています。

Instagram.py
    #プロフィール画面に移動(引数:アカウント名)
    def show_profile_page(self, id):
        self.get('https://www.instagram.com/{}/'.format(id))

{}の中に.format(id)でmain.pyから渡されたユーザーIDを入れています。

自動でフォローする

 プロフィール画面に移動できたら、あとはフォローボタンをクリックするだけです。
 Instagram.pyでは以下のコードになっています。

Instagram.py
    #プロフィール画面上でフォローを行う
    def follow(self):
        main = self.find_element_by_tag_name('main').find_element_by_tag_name('header')
        try:
            button = main.find_element_by_xpath('//button[normalize-space()="フォローする"]')
            button.click()
            self.notify(self.page)
            logger.info('follow succeeded')
            return 1
        except:
            logger.info('follow faild')
            return 0

 Instagramでフォローボタンはmainのheaderブロックの中にあります。

instagram.py
main = self.find_element_by_tag_name('main').find_element_by_tag_name('header')

 xpathでボタンを指定します。

instagram.py
button = main.find_element_by_xpath('//button[normalize-space()="フォローする"]')

 フォローボタンには前後に全角スペースが入っているようなので、normalize-space()で空白を削除します。
 ここで「フォローする」で指定しているは以下の理由によるものです。

・フォローされているアカウントをフォローしない(フォローされている場合には「フォローバックする」と表示される)
・フォローしている場合ボタンをクリックしない

 こちらの条件を指定するために参考資料ではif文を使用していましたが、こちらの方がスッキリします。

 最後にフォローボタンをクリックします。

instagram.py
button.click()

終わりに

 以上で任意のアカウントをフォローできました。
 ことすたぐらむフォロー機能1の要件を満たすために必要な工程は残り以下のとおりです。

・有効フォロウィーのリストをデータベースから取得する。
・有効フォロウィーのフォロワーを取得したのち、Instagram.pyにユーザーIDを引き渡す。
・フォローしたアカウントと日付をデータベースに登録する。

 データベース関連は、後日djangoの記事で記載いたします。
 次の記事では実際に動かすことのできる、ソースコードの解説と実行方法を投稿しようと思います。

 参考資料は以下のとおりです。

0
3
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?