前回まででCUIでの自動でいいねする機能は出来上がりました。
今回は操作性を上げるためにもGUIで実装していきたいと思います!
GUIというのはグラフィックユーザーインターフェースのことで、コマンドプロンプト上で動かすCUIとは違いユーザーが扱いやすいようにウィンドウやボタン、アイコンなどが用意されたインターフェースです。
今回作成するGUIにはPython標準搭載のtkinterを使用します。(読み方はティーキンターらしいです。)

いよいよこのInstagram自動いいねアプリ作りの大詰めですよ!
準備はよろしいでしょうか?

はい!がんばります!
tkinterでのGUIアプリケーション作成
tkinterはPythonのGUIアプリケーションを作成するときに便利なGUIアプリケーションフレームワークです。
他にも代表的なフレームワークにはkivyやPyQtやwxPythonなどがあります。

フレームワーク?なにそれおいしいの?

フレームワークというのはアプリケーションなどのソフトウェアを作るときに、より簡単に作成できるように予めよく使う機能などが詰め込まれた便利な仕組みです。
このtkinterを使うことで簡単にGUIアプリケーションを作成することができます。
GUIアプリケーションの画面づくり
まずはtkinterで画面づくりからしていきましょう。
今回作るアプリケーションの画面の構成は以下のようにします。


せっかくなので、コードを読みやすくするために、GUI部は別ファイルにしてみましょう!

えーと、ファイルを別に作ってメインのファイルで読み込むんですね!
tkinterのコードは別のファイル「instagram_nice__gui.py」に書いていくようにしましょう。
もちろん同じファイルに書いても問題ございません。
ただ、別ファイルに書くことであとの修正が簡単になったり、読みやすくなるのでメリットはたくさんあります。
まずは手始めにフォームの箇所を作ってみましょう。
import tkinter
# tkinterメイン
if __name__ == '__main__':
#windowの設定
root = tkinter.Tk() # tkinterの読み込み
root.title('Instabot') # アプリケーションのタイトル
root.geometry('450x370') # ウィンドウのサイズ
#tkinter設定
LOGIN_X = 20
LOGIN_Y = 20
#ログインフォーム
loginId_lbl = tkinter.Label(text='Login Id')
loginId_lbl.place(x=LOGIN_X, y=LOGIN_Y)
loginId_txt = tkinter.Entry(width=10)
loginId_txt.place(x=LOGIN_X+100, y=LOGIN_Y)
password_lbl = tkinter.Label(text='Password')
password_lbl.place(x=LOGIN_X, y=LOGIN_Y+30)
password_txt = tkinter.Entry(width=10)
password_txt.place(x=LOGIN_X+100, y=LOGIN_Y+30)
# メインループ
root.mainloop()
「instagram_nice__gui.py」のファイルで14行目からが実際に画面にパーツを配置しているところです。
tkinter.Labelで画面に文字を表示させられます。
tkinter.Entryでは文字を入力するフォームを用意できます。
入力したログインIDやパスワードのデータはloginID_txt, password_txtを参照することで使うことができます。
10行目からは画面のどこに配置させるかの設定値を事前に決めています。ウィンドウの左上を(0, 0)として配置されることになります。
それではこのまま「instagram_nice__gui.py」を実行してみると以下のようにログインフォームのパーツが画面に表示されます。


こんなに簡単に画面って作れるんだネ!
残りのGUI画面の準備(パラメータ・開始ボタン・ハッシュタグ)

この調子で一気に画面を完成させましょう!
import tkinter
#Startを押した時の動作
def start():
print("Start!")
# tkinterメイン
if __name__ == '__main__':
#windowの設定
root = tkinter.Tk() # tkinterの読み込み
root.title('Instabot') # アプリケーションのタイトル
root.geometry('450x370') # ウィンドウのサイズ
#tkinter設定
FORM_X = 20
FORM_Y = 20
PARAM_X = 20
PARAM_Y = 100
START_X = 20
START_Y = 300
TAG_X = 260
TAG_Y = 20
#ログインフォーム
loginId_lbl = tkinter.Label(text='Login Id')
loginId_lbl.place(x=FORM_X, y=FORM_Y)
loginId_txt = tkinter.Entry(width=10)
loginId_txt.place(x=FORM_X+100, y=FORM_Y)
password_lbl = tkinter.Label(text='Password')
password_lbl.place(x=FORM_X, y=FORM_Y+30)
password_txt = tkinter.Entry(width=10)
password_txt.place(x=FORM_X+100, y=FORM_Y+30)
#パラメータ項目
niceMax_lbl = tkinter.Label(text='最大いいね回数')
niceMax_lbl.place(x=PARAM_X, y=PARAM_Y)
niceMax_txt = tkinter.Entry(width=10)
niceMax_txt.place(x=PARAM_X+100, y=PARAM_Y)
niceMaxU_lbl = tkinter.Label(text='回')
niceMaxU_lbl.place(x=PARAM_X+200, y=PARAM_Y+5)
interval_lbl = tkinter.Label(text='いいね間隔')
interval_lbl.place(x=PARAM_X, y=PARAM_Y+30)
interval_txt = tkinter.Entry(width=10)
interval_txt.place(x=PARAM_X+100, y=PARAM_Y+30)
intervalU_lbl = tkinter.Label(text='秒')
intervalU_lbl.place(x=PARAM_X+200, y=PARAM_Y+35)
hourS_lbl = tkinter.Label(text='稼働時間(始)')
hourS_lbl.place(x=PARAM_X, y=PARAM_Y+90)
hourS_txt = tkinter.Entry(width=10)
hourS_txt.place(x=PARAM_X+100, y=PARAM_Y+90)
hourSU_lbl = tkinter.Label(text='時')
hourSU_lbl.place(x=PARAM_X+200, y=PARAM_Y+95)
hourE_lbl = tkinter.Label(text='稼働時間(終)')
hourE_lbl.place(x=PARAM_X, y=PARAM_Y+120)
hourE_txt = tkinter.Entry(width=10)
hourE_txt.place(x=PARAM_X+100, y=PARAM_Y+120)
hourEU_lbl = tkinter.Label(text='時')
hourEU_lbl.place(x=PARAM_X+200, y=PARAM_Y+125)
#ハッシュタグ
hashTag_lbl = tkinter.Label(text='ハッシュタグ')
hashTag_lbl.place(x=TAG_X, y=TAG_Y)
TAG_NUM = 10 # ハッシュタグの数
tag_txt = []
for tn in range(TAG_NUM):
tag_txt.append(tkinter.Entry(width=15))
tag_txt[tn].place(x=TAG_X+10, y=TAG_Y+30*(tn+1))
#ボタンの生成
start_btn = tkinter.Button(root, text='Start', command=start)
start_btn.place(x=START_X, y=START_Y)
# メインループ
root.mainloop()
34行目からのパラメータ項目はログインフォームのところと同じ”Label”と”Entry”で構成しています。
60行目からのハッシュタグの項目についても同様ですが、同じ”Entry”が並ぶためfor文で簡単に記載しています。
69行目からのボタンの生成では”Button”を使っています。こちらの”Button”はcommand要素で押したときに実行できるメソッドが指定できます。
今回はテスト代わりに3行目にstartメソッドを用意して、押したら「Start!」と表示されるものを仮でおいています。
これを実行すると以下のような画面が出てきます。これで画面の用意は完了です。


おおおー!もう完成してるみたい!!

あと一歩ですね!この画面と前回までで作ってきた自動いいねの機能を紐付けて上げる必要があります。とりあえずテストでStartボタンを押してみてください。

Startボタンを押すと、実行しているターミナル上に「Start!」と表示されました。ちゃんと機能しているようですね。
自動いいね機能を紐付ける

ではこれで最後です!
第2回までで実装してきた機能を今回のGUIに紐づけていきましょう!

いよいよ完成するんだネ!楽しみだ!
第2回までで作った「instagram_nice.py」をそのまま使って実装してみましょう。
import instagram_nice
#Startを押した時の動作
def start():
# いいねの動きに対するパラメータ
#ログインIDの指定
if loginId_txt.get() != '':
username = loginId_txt.get()
else:
print('Login IDが入力されていません。')
return
#パスワードの指定
if password_txt.get() != '':
password = password_txt.get()
else:
print('Passwordが入力されていません。')
return
#最大いいね回数の指定
if niceMax_txt.get() != '':
nice_max = int(niceMax_txt.get())
else:
niceMax_txt.insert(tkinter.END,"900")
nice_max = int(niceMax_txt.get())
#いいね間隔の指定
if interval_txt.get() != '':
interval = int(interval_txt.get())
else:
interval_txt.insert(tkinter.END,"40")
interval = int(interval_txt.get())
# 時刻の指定
if hourS_txt.get() != '':
s_hour = int(hourS_txt.get())
else:
hourS_txt.insert(tkinter.END,"7")
s_hour = int(hourS_txt.get())
if hourE_txt.get() != '':
e_hour = int(hourE_txt.get())
else:
hourE_txt.insert(tkinter.END,"22")
e_hour = int(hourE_txt.get())
# ハッシュタグの登録
taglist = []
for tn in range(TAG_NUM):
if tag_txt[tn].get() != '':
taglist.append(tag_txt[tn].get())
if len(taglist) == 0:
print('ハッシュタグが入力されていません。')
return
print('ユーザーネーム:%s' % username)
print('パスワード:%s' % password)
print('最大いいね回数:%d回' % nice_max)
print('いいね間隔:%d秒' % interval)
print('稼働時間帯:%d時~%d時' % (s_hour, e_hour))
print(taglist)
# いいねの回数(いいね最大回数をタグ数に平等に分ける)
nice_num = int(nice_max / len(taglist))
# Chrome Driverを起動
driver = webdriver.Chrome('./chromedriver')
time.sleep(1)
# ログイン
instagram_nice.login(username, password, driver)
# 現在の時刻を取得
now = datetime.datetime.now()
# いいねループ処理
while 1:
# いいね可能時間ならば自動いいね実行
if instagram_nice.time_comp(now, s_hour, e_hour) == 1:
# ハッシュタグを切り替えながらいいねを押す動作を繰り返す
for tag in taglist:
# ハッシュタグで検索
instagram_nice.tagsearch(tag, driver)
# いいね
instagram_nice.pushnice(nice_num, interval, driver)
print("いいね完了!")
break
# いいね可能時間外ならば何もしない
else:
print("時間外です。")
time.sleep(1800)
1行目 まずは「instagram_nice.py」をimportします。
これでこれまで実装してきた機能をそのまま使うことができます。
3行目からは、もともと「instagram_nice.py」のmain部分に書いていたコードからGUI画面で入力された値を使えるように変更したものです。
tkinterのEntry要素に入力された値は7行目のように.get()を使うことで取得できます。
これによって「ユーザーネーム」「パスワード」「最大いいね回数」「いいね間隔」「稼働時間」「ハッシュタグ」を取得します。
あとはこれまでと同じ処理です。
「instagram_nice__gui.py」を実行してみると画面が出てきて、そこに必要な情報を入力すると自動いいねが開始されます。



お疲れさまでした!これでInstagramの自動いいねロボットは完成です!
今後は自分なりにカスタマイズしてみてください!
コメント