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

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

```python: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にログイン
　こちらは[以前の記事](https://qiita.com/fishyamamoto/items/3bc909051d13207f885d)で解説したとおりです。
### プロフィール画面に移動
　ではログイン後、任意のアカウントのプロフィール画面に移動しましょう。
　Instagramのプロフィール画面のURLは以下のようになっています。
```html:InstagramのプロフィールURL
https://www.instagram.com/ユーザーID/
```
 Instagram.pyでアクセスするコードは以下のようになっています。
```python:Instagram.py
    #プロフィール画面に移動(引数:アカウント名)
    def show_profile_page(self, id):
        self.get('https://www.instagram.com/{}/'.format(id))
```
 {}の中に.format(id)でmain.pyから渡されたユーザーIDを入れています。
### 自動でフォローする
　プロフィール画面に移動できたら、あとはフォローボタンをクリックするだけです。
　Instagram.pyでは以下のコードになっています。
```python: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ブロックの中にあります。
```python:instagram.py
main = self.find_element_by_tag_name('main').find_element_by_tag_name('header')
```
　xpathでボタンを指定します。
```python:instagram.py
button = main.find_element_by_xpath('//button[normalize-space()="フォローする"]')
```
　フォローボタンには前後に全角スペースが入っているようなので、normalize-space()で空白を削除します。
　ここで「フォローする」で指定しているは以下の理由によるものです。

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

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

　最後にフォローボタンをクリックします。
```python:instagram.py
button.click()
```
# 終わりに
　以上で任意のアカウントをフォローできました。
　ことすたぐらむフォロー機能1の要件を満たすために必要な工程は残り以下のとおりです。

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

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

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

https://tech.fragment.co.jp/python/twitter-instagram-follow-like/