Qiitaでフォロバするのがめんどくさい。自動化してみよう。

# 初めに
私はなぜか、初めのころ、Qiitaでフォロバは絶対にする！
とか思ってたらしく、今、フォローを477回もしているのですね。
数としてはまったく大したことないですが、毎回、フォローしてくださった人フォロバして…
っていうのははっきり言ってもう面倒くさくなってきてしまった。（だったらやるなよ）でもやり返さないのはやだもん！

というわけで、今回はPythonでQiitaでのフォロバ機能を作成します。

# What you need
・・・英語っていいね。頭良く感じれるのは私だけかな？

1. Python
1. Selenium(use in Python)
1. developer tool

# 何をしたいの？
1. Qiitaにログインする
1. 私をフォローしてくれている人の一覧ページへ行く
1. 私がその人をフォローしていなかったらフォローする

# コードを書いて！
って誰かに頼むのもいいかもだけど、自分でモノが作れるから楽しいんですよね。

今回、大きなところは「ログイン」ですね。
Cookieを使用します。

今回は、ログイン機能の部分のみ解説します。
他のコードは普通のスクレイピングと似たり寄ったりなので（・＿・）

§ ログイン機能
```python:code.py
def login(secure_token, session_key):
    global driber

    driber.add_cookie({
        "name"     :  "secure_token",
        "value"    :  secure_token,
        "Domain"   :  ".qiita.com",
        "Expires"  :  "Fri, 11 Mar 2044 21:35:06 GMT",
        "HttpOnly" :  "true",
        "Secure"   :  "true"
    })
    driber.add_cookie({
        "name"     : "user_session_key",
        "value"    : session_key,
        "Domain"   : ".qiita.com",
        "Expires"  : "Tue, 11 Mar 2025 21:51:15 GMT",
        "HttpOnly" : "true",
        "Secure"   : "false"
    })
````

seleniumでのcookieの扱い方は、[こちら取説](https://www.selenium.dev/ja/documentation/webdriver/interactions/cookies/)を参照してみてください。

上記の関数は、
```python
login(
secure_token="<your secure_token>",
session_key="<your session_key>"
)
````
というふうにして呼び出します。

さて、問題の引数ですが、これはブラウザのデベロッパーツールで確認できます。
今回はFirefoxでのやり方のみ解説させていただきます。

:::note warn
この際、事前にQiitaにはログインしといてください。
:::


CONTROL + SHIFT + I　のショートカットキーでデベロッパーツールを開けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/7dd54636-2b23-6fd3-fa22-4742c697c0bc.png)

のようになるので、上部のヘッダーから、「ストレージ」を選択し、左のバーからCookieを選択、そして、[ https://qiita.com ] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/e3879b95-e04a-d9de-8ceb-af88118565fa.png)

な感じになります。
上のイメージに表示されているCookieの内、secure_tokenとuser_session_keyをログイン時に必要とします。
ので、この二つの値（イメージでは赤く塗りつぶしてある部分です）をそれぞれ、先ほどのログイン関数の引数として使います。

以上。ログインについてでした。


§ スクレイピング＆フォロバ（というか、全てのコード）

コメントにて、さりげない解説をいたします。

```python:code.py
from selenium import webdriver
from selenium.webdriver.common.by import By

import time as timer

qiitaLink = "https://qiita.com/"

driber = webdriver.Firefox()

driber.get(qiitaLink)  # qiitaのホームページへ
timer.sleep(5.0)

def login(secure_token, session_key):
    global driber

    driber.add_cookie({
        "name"     :  "secure_token",
        "value"    :  secure_token,
        "Domain"   :  ".qiita.com",
        "Expires"  :  "Fri, 11 Mar 2044 21:35:06 GMT",
        "HttpOnly" :  "true",
        "Secure"   :  "true"
    })
    driber.add_cookie({
        "name"     : "user_session_key",
        "value"    : session_key,
        "Domain"   : ".qiita.com",
        "Expires"  : "Tue, 11 Mar 2025 21:51:15 GMT",
        "HttpOnly" : "true",
        "Secure"   : "false"
    })

def followback():
    global driber

    # フォロワー一覧ページへ
    page = "https://qiita.com/chi1180/followers?page="
    driber.get(page + "1")
    timer.sleep(6.0)

    # ポップアップが表示され、要素の重なりによってボタンが押せずエラーになるため、そやつを消す
    popup_btn = driber.find_element(By.CLASS_NAME, "coins-close-button")
    if popup_btn: popup_btn.click()
    timer.sleep(2.0)

    # ページ数を取得
    page_count = int(driber.find_element(By.CLASS_NAME, "style-1l61mdd").find_element(By.TAG_NAME, "span").text.split(" / ")[1])

    # ページごとにチェック、フォロバ
    for i in range(page_count):
        page_num = i + 1

        driber.get(page + str(page_num))
        timer.sleep(5.0)

        # フォローボタンを取得
        followers = driber.find_elements(By.CLASS_NAME, "style-1fojn88")

        # フォローする
        for follower in followers:
            follower.click()

            # 連続でフォローすると、時たまフォローに失敗しましたと言わるるので、間隔を開ける
            timer.sleep(0.5)


# 関数呼び出し
login(secure_token=my_sequre_token, session_key=my_session_key)
followback()

driber.quit()

## わぁ～～～
## コード書いてる際に気づいたのですが、[driber]は[driver]ですね。たぶん。
## 直すのはめんどくさい！べつにいいだろぉ？
````

# 最後に
はい、以上がQiitaの自動フォロバ機能です。
Windowsであれば、タスクマネージャーで定期実行させたりとか、してみてもいいかもしれませんね～

で、このプログラムですが、ちょっと嫌だな～というのが、前回スクレイピングしたページもスクレイピングするってところなんですよね。
まぁ、Pythonはファイルの読み込み、書き出しも簡単に記述できるので、やる気になったら実装してみましょうか。今はもうめんどくさくなってきましたがな。

以上です。
最後までよんでくれてありがとお！