プログラミングでアイドルの応援を自動化しよう(Pythonでブラウザ制御)
こんにちは、今回はPythonというプログラミング言語を使ってアイドルの応援を自動化しようという記事です。
さすがに「推しメンがツイートすると自動でふぁぼしてクソリプを飛ばす」まではいきませんが…
今回は「CHEERZというサイトでチアする作業」を自動化します。
アイドル好きならご存知かと思いますのでサイトの仕様は省略します。
このwebアプリは如何に日ごろからチアしているかでいざと言うときにデフォルトで所持できるチア数に結構差が出ますよね。(レベルの概念)
ただイベント期間外や全然投稿がないとチアする気が起きなかったり忘れていたり…
「毎日決まった繰り返し作業」=プログラムの出番です!
(プログラムでの操作はサイトやサービスによっては禁止されていますので個人の責任でお願いします。チアーズは利用規約に目を通しましたが特に記載なしでした)
今回は比較的に初心者でも扱いやすいプログラミング言語「Python」で作成しましたので基礎的な知識があれば簡単にできるしいろいろと応用できるかとおもいます!
さてまずはwebブラウザから情報を取得したり制御するための下準備です。
anacondaにてpipコマンドでseleniumをインストールします。
pip install selenium
次はChromeDriver を http://chromedriver.chromium.org/downloads からダウンロードします。保存先はコード内でパスを指定するので自由ですがpyファイルと同じディレクトリ内が分かりやすいと思います。(今回のコードも同じディレクトリ内にある前提です)
準備が終わり、いよいよコードを書いていきます!
pyファイルの上部でまずは必要なものをインポートします。
from selenium import webdriver
次はchromeの起動や制御です。
#chromedriverのPATHを指定(本ファイルと同じフォルダの場合)
driver_path = './chromedriver'
# Chrome起動
driver = webdriver.Chrome(driver_path)
#アクセスするURL
driver.get('https://cheerz.cz/')
ひとまずこれでchromedriverを使ってchromeを立ち上げ指定されたURLを開くプログラムの完成です。
そして次はユーザー情報等を記載しておきます、ログインが必要なサイトですがあくまで個人で作って動かす前提なのでコード内に直接メールアドレス、パスワードなど必要な情報を書き込みます。
#ユーザー情報
mail = " ここに登録しているメアド"
password = " ここにパスワード"
target_id = "13645"
3つめのtarget_idはチアしたいユーザーのIDです。
アカウントのトップページを開きURLのartistの後ろについてる数値がIDです。
https://cheerz.cz/artist/13645
↑個人のページに飛んだときのURL
ちなみに今回は自分の好きなアイドルで作ってます、ステラシュガレットのせかいちゃん
(気になった方は是非! ! !)
今でこんな感じ。
from selenium import webdriver
#ユーザー情報
mail = "個人のメールアドレス"
password = "個人のパス"
target_id = "13645"
# chromedriverのPATHを指定(本ファイルと同じフォルダの場合)
driver_path = './chromedriver'
# Chrome起動
driver = webdriver.Chrome(driver_path)
#アクセス
driver.get('https://cheerz.cz/')
この下にトップページにアクセスしてからの処理を書いていきます。
具体的には
ログインボタンを探す→クリック→テキストエリアを探す→テキストエリアにメアドとパスワード入力→ログインボタンを探す→クリック
です!
#ログインボタンを探す
class_elems = driver.find_elements_by_class_name("btn")
for elem in class_elems:
if elem.text == "LOGIN":
elem.click()
break
driver.implicitly_wait(10)
#ログイン実行
print("ログイン作業中")
elems = driver.find_element_by_name("email")
elems.send_keys(mail)
elems = driver.find_element_by_name("password")
elems.send_keys(password)
driver.implicitly_wait(10)
elems = driver.find_element_by_css_selector(".submit")
elems.click()
find_element_by_nameやfind_elements_by_class_nameで開いているブラウザ内から対象の文字が含まれている要素を探しています。
デヘロッパーツールを使って
キャプチャでマウスポインタが消えてますが実際にクリックするとそこの要素をchromeが教えてくれます。
この情報を元にクラス名などで検索して自分が実際に取り出したい要素だけが該当するようにコードを書きます。
class_elems = driver.find_elements_by_class_name("btn")
for elem in class_elems:
if elem.text == "LOGIN":
elem.click()
ちなみにこの部分はクラス名btnで複数個取り出して文言がLOGINのものをクリックしてます。(正直、「複数個取得して何番目をクリック」とか動けばなんでもいいです笑 あとで見直したときにわかりにくかったりが欠点ですが!)
これでログインの自動化まで完了です。
これ動かしていてからバグることに気づいたので後づけしたものなんですがプログラムの動きが早すぎて読み込み前に処理を実行してしまうので
time.sleep (1)
などで画面遷移の際は意図的に処理を止めたほうがいいです。
本当は「読み込みが完了したら」という条件分岐もできますがすこしややこしくなるし大体このwaitはさむだけで動くので今回はこれでいきます。
driver.get("https://cheerz.cz/artist/" + target_id)
driver.implicitly_wait(20)
class_elems = driver.find_elements_by_class_name("item")
print("最新の投稿に遷移します")
class_elems[0].click()
次ははじめに定義したtarget_idで画面遷移します。
ここでID付きのURLで直リンしてもいいですけど、のちのちIDを変えたり、IDを選択できる機能も追加したりなどの可能性もあるので!
なんかさっきとは別のwait処理ですね…
書いてて気がつきましたがまあどのメソッド使ってるかの違いだけで、処理を止めてるということには大差ないのでこれでいきます!←
3行目はクラス名itemで検索しています。
投稿はすべてitemクラスで管理されてるようでした
[]内の添え字番号で任意の投稿をクリックできます。
今回は最新のものにチアしたいので0で固定します。
class_elems = driver.find_element_by_class_name("cheerLink")
start_search = re.search('する',class_elems.text)
start =3 + int(start_search.start())
end_search = re.search('/',class_elems.text)
end = end_search.start();
count = int(class_elems.text[start:end])
この辺めっちゃコード汚いですけどこれは技術不足です、たぶん。
チアするボタンや所持しているポイントを取得しています。
if count == 0:
print("ポイントがないので処理を終了します")
else:
for i in range(count):
time.sleep (1)
class_elems = driver.find_element_by_class_name("cheerLink")
class_elems.click()
取得した所持ポイントの情報を元にポイントが0になるまで繰り返します。
終了の際はprintで終了文言をだしておきます。
最後は
driver.quit()
でchromedriverを閉じましょう。
これで「ブラウザを立ち上げログイン、最新の投稿にポイントがなくなるまでチアする」が完成です。
あとは定時で自動起動したいので
schedule.every().day.at("09:00").do(exe)
schedule.every().day.at("16:00").do(exe)
schedule.every().day.at("23:00").do(exe)
で時刻をセットしてこれ以外のメソッドをdefでまとめます。
するとこの時刻になるとdef内を実行してくれます。
わかりやすいようにprintで実行内容を出力させたりと改良を加えて
import time
import schedule
from selenium import webdriver
import re
def exe():
#ユーザー情報
mail = "メアド"
password = "パス"
target_id = "13645"
#nano
#id = "4278"
# chromedriverのPATHを指定(本ファイルと同じフォルダの場合)
driver_path = './chromedriver'
# Chrome起動
driver = webdriver.Chrome(driver_path)
# Googleにアクセス
driver.get('https://cheerz.cz/')
#ログインボタンを探す
class_elems = driver.find_elements_by_class_name("btn")
for elem in class_elems:
if elem.text == "LOGIN":
elem.click()
break
driver.implicitly_wait(10)
#ログイン実行
print("ログイン作業中")
elems = driver.find_element_by_name("email")
elems.send_keys(mail)
elems = driver.find_element_by_name("password")
elems.send_keys(password)
driver.implicitly_wait(10)
elems = driver.find_element_by_css_selector(".submit")
elems.click()
print("-------------読み込み中--------")
time.sleep (1)
print("ユーザーページに遷移します")
driver.get("https://cheerz.cz/artist/" + target_id)
driver.implicitly_wait(20)
class_elems = driver.find_elements_by_class_name("item")
print("最新の投稿に遷移します")
class_elems[0].click()
class_elems = driver.find_element_by_class_name("cheerLink")
start_search = re.search('する',class_elems.text)
start =3 + int(start_search.start())
end_search = re.search('/',class_elems.text)
end = end_search.start();
print("-------------------------------")
print("所持ポイントは"+class_elems.text[start:end] + "です" )
print("-------------------------------")
count = int(class_elems.text[start:end])
if count == 0:
print("ポイントがないので処理を終了します")
else:
for i in range(count):
time.sleep (1)
print(str(i+1) + "回目のクリック")
class_elems = driver.find_element_by_class_name("cheerLink")
class_elems.click()
print("合計" + str(i+1) + "回クリックしました")
driver.quit()
#自動で実行
schedule.every().day.at("09:00").do(exe)
schedule.every().day.at("16:00").do(exe)
schedule.every().day.at("23:00").do(exe)
while True:
schedule.run_pending()
time.sleep(1)
これでアイドルの応援を自動化完了!
あとはパソコンをスリープにならない設定に切り替えてつけっぱなしにしておけば永遠にチアしてくれます!!!!!