初めに
現在までの記事で、seleniumを用いたログイン、instaloaderを用いたフォロワー全件取得を行ってまいりました。
ことすたぐらむフォロー機能1の最後の工程として、任意のアカウントのプロフィールにアクセスし、フォローする機能を実装したいと思います。
この工程で、instaloaderで取得した、アカウントをフォローすることができます。
ではまず、ソースコードを記載します。
ソースコード
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()
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は以下のようになっています。
https://www.instagram.com/ユーザーID/
Instagram.pyでアクセスするコードは以下のようになっています。
#プロフィール画面に移動(引数:アカウント名)
def show_profile_page(self, id):
self.get('https://www.instagram.com/{}/'.format(id))
{}の中に.format(id)でmain.pyから渡されたユーザーIDを入れています。
自動でフォローする
プロフィール画面に移動できたら、あとはフォローボタンをクリックするだけです。
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ブロックの中にあります。
main = self.find_element_by_tag_name('main').find_element_by_tag_name('header')
xpathでボタンを指定します。
button = main.find_element_by_xpath('//button[normalize-space()="フォローする"]')
フォローボタンには前後に全角スペースが入っているようなので、normalize-space()で空白を削除します。
ここで「フォローする」で指定しているは以下の理由によるものです。
・フォローされているアカウントをフォローしない(フォローされている場合には「フォローバックする」と表示される)
・フォローしている場合ボタンをクリックしない
こちらの条件を指定するために参考資料ではif文を使用していましたが、こちらの方がスッキリします。
最後にフォローボタンをクリックします。
button.click()
終わりに
以上で任意のアカウントをフォローできました。
ことすたぐらむフォロー機能1の要件を満たすために必要な工程は残り以下のとおりです。
・有効フォロウィーのリストをデータベースから取得する。
・有効フォロウィーのフォロワーを取得したのち、Instagram.pyにユーザーIDを引き渡す。
・フォローしたアカウントと日付をデータベースに登録する。
データベース関連は、後日djangoの記事で記載いたします。
次の記事では実際に動かすことのできる、ソースコードの解説と実行方法を投稿しようと思います。
参考資料は以下のとおりです。