Published on

【メモ】ニコ生のコミュニティフォローを自動で解除するやつ

目次

すげーいまさら感&需要ないと思いますがニコ生でフォローしているコミュニティを自動で解除するプログラムです。

なぜつくった?
一括フォロー解除の機能が公式にない機能で一個ずつ解除するのが手間で自動化したかった、なんかプログラムかきたかったから。断捨離。

公式的には面倒なら課金してね(プレミアムに課金すれば上限解放)というスタンスなのでそれを邪魔してしまう形になるのでそのへんすみません。
というか今はアカウントフォローの流れになってるのでそんなに邪魔にならないですよね。

ということで

※超絶手抜きコードです。

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import NoSuchElementException

#ヘッドレスにしたいとき
options = Options()
options.add_argument('--headless')

driver = webdriver.Chrome()
#  Selenium 経由でブラウザを操作する
driver.get('https://account.nicovideo.jp/login')
print(driver.current_url)

mail_tel = driver.find_element_by_name("mail_tel")
password = driver.find_element_by_name("password")
mail_tel.send_keys("ログインID")
password.send_keys("パスワード")
driver.find_element_by_id("login__submit").click()
print(driver.current_url)
time.sleep(2)
owner_find = 0

while True:
  driver.get('https://com.nicovideo.jp/community?page=1')
  print(driver.current_url)
  nana = driver.find_element_by_css_selector("body > main > div > div.followCommunityListResult > ul > li:nth-child(1) > div.profile > div.nameAndCreateTime > div.name > a")
  print(nana.text)
        # WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)
  
  if owner_find == 0:
      driver.find_element_by_css_selector("body > main > div > div.followCommunityListResult > ul > li:nth-child(1) > div.profile > div.nameAndCreateTime > div.name > a").click()
    # content = driver.find_element_by_css_selector('div.name')
  
  else:
      print(owner_find)
      driver.find_element_by_css_selector("body > main > div > div.followCommunityListResult > ul > li:nth-child("+ str(owner_find) +") > div.profile > div.nameAndCreateTime > div.name > a").click()
        
  time.sleep(3)

  
  try:
      driver.find_element_by_css_selector("body > header.area-communityHeader > div > div.communityRegist > a").click()
      print(driver.current_url)

      time.sleep(1)
        
      driver.find_element_by_class_name("leave_submit").click()
      time.sleep(2)
  except NoSuchElementException:  #spelling error making this code not work as expected
    owner_find += 1
   

driver.quit()

  
    

mail_telとpasswordの部分はそれぞれのアカウントのものに変えてください。
ファイル名をnico_com_unfollw.py のように適当な名前で保存して使えます。

実行すると、以下のような動作になります。

  1. ブラウザが自動で立ち上がりニコニコにログイン
  2. コミュティフォローの一覧ページが開く
  3. 一番最初(左上)のコミュティページへ飛ぶ
  4. フォロー解除ボタンを押す
  5. 確認ボタンを押す
  6. 2に戻って繰り返す

ちょっとした解説

seleniumをつかうのでchrome_driverを使います。
selenium のインストール

pip install selenium

ちなみにインストールした chrome_driverとお使いのchromeドライバーのバージョンが違うとエラーになります。

macのローカルでpip installでパス通したはずなのになんかエラーがでるという状況だったので以下のコマンドでバージョンが合いました。

brew cask install chromedriver

dockerの場合はバージョン合わせの必要がないです。

docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:4.0.0-alpha-7-prerelease-20200905

そして上記のコードを適当なファイルとして保存して、環境を整え実行する。

python  nico_com_unfollw.py

フォロー解除ボタンがないとき(自コミュ)は一覧にもどって2番目以降を取得します。

なんかきっちり動いてない感があってあまいですが、まあ目的は達成できたのでよしとしたいです。
途中で止めたいときはコンソールで ctrl (control)+c で強制終了できると思います。

ヘッドレスモードにするとブラウザが立ち上がらず裏で動いてくれまして、途中で惜しくなって辞めたくなる気持ちが抑えられます。

試したことのメモ

最初はScrapyで試しました。
が、Cookieがうまく渡らずページまたぐとログインフォームにリダイレクトされる繰り返しでめんどくさくなって辞めました。
コールバック関数にCookieが渡らないやつ

次に、BeautifulSoup4で試しました。
こちらはすんなりログインからのコミュページ一覧に飛べ、フォロー解除ボタンまでスクレイピングできました。
が、最後のフォロー解除確認ページでうまくフォームのPOSTができない。
必要であろう値のtime,commit_key,commit をセットしてrequest.postするも完了ページに飛ばず、面倒で断念。

というわけでseleniumで上記を考える必要なくページ遷移だけする形で終了しました。