0%

自動每日登入 iT邦幫忙 取得活動點數

前言

許多論壇都擁有活動點數制度,「iT邦幫忙」也不意外的擁有這項功能,其中有一項是每天登入可以加 2 點活動點數,但不知道是 Bug 還是故意的,竟然需要先登出再登入,有了登入的動作才會計算當天登入的活動點數,很不符合常理。

因此利用爬蟲技能寫了一個專案,每天到指定時間會自動完成登入動作,讓我就算沒有登入這個動作,也可以得到活動點數,雖說這個點數量不多,但就是想要抵抗這個 Bug。

詳細登入問題也有人提請官方修正,可參考 關於IT邦登入時點數的問題

成果

  • GitHub
  • 實際成效
    成果圖成果圖

環境

  • Windows 10
  • python 3.8.5
  • beautifulsoup4 4.9.3
  • requests 2.25.1

環節觀察

在動手爬蟲之前,必須先觀察在登入計算活動點數時,會經過哪些步驟與所需資訊,觀察時請記得使用開發人員工具 (F12) 來查看資訊流動。

登入

第一步至 iThome會員登入頁面 任意輸入一組帳號,按下登入按鈕然後查看封包,會看到有三個欄位分別為 _tokenaccount 還有 password

登入所需欄位登入所需欄位

accountpassword 我們理解,但是 _token 的值從何而來呢?到開發人員工具的 Elements 頁籤搜尋 _token,就可以找到它所在位置,原來是在登入表單內的一個隱藏欄位 (hidden input)!

_token 的位置_token 的位置

實作登入功能

知道登入需要甚麼資訊,且資訊在哪裡可以取得,就可以開始規劃要如何利用爬蟲來做登入功能。

  1. 先取得 _token 欄位的值。
  2. _tokenaccountpassword 一起 POSThttps://member.ithome.com.tw/login

需要注意的是,這些過程中的 Cookie 需要被維護,也就是每個 Request 都必須是同一個 Session,否則 _token 值無效。強大的 requests 套件已經幫我們準備好 Session 物件來處理這些事情,讓我們不用手動轉移 Cookie 到不同的 request 之中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 從 sAccount.json 檔案讀取帳密資料
s_account = json.load(open("./sAccount.json", "r", encoding="utf-8"))

# 更改 User-Agent 標頭以免被阻擋
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"}
# 製作 Payload,有三個欄位分別為 _token、account 與 password
loginPayload = {'account': s_account['account'], 'password': s_account['password'], '_token':''}
# 建立一個 Session 物件幫我們維護 Coookie 的運行
sess = requests.Session()
# 將 User-Agent 標頭修改為我們所給的值
sess.headers.update(headers)

# 先取得 _token 值
url = "https://member.ithome.com.tw/login"
response = sess.get(url)
bsObj = bs(response.text, "html.parser")
loginToken = bsObj.find('input', {'name':'_token'}).attrs['value']
# 把 _token 值存到我們之前建立的 Payload 內
loginPayload['_token'] = loginToken

# 對登入頁面 POST 一次,就可以順利登入囉
url = "https://member.ithome.com.tw/login"
response = sess.post(url, data=loginPayload)

sAccount.json 內容如下,只需填入對應的帳號密碼

1
2
3
4
{
"account": "",
"password": ""
}

到這裡,登入功能已經完成了。但假如真的去運行這個程式碼,你會發現雖然成功登入,可是並沒有取得想要的到的每日登入活動點數,這個是因為登入與取得點數的功能是分開運行的。

每日登入活動點數

再讓我們觀察一下取得活動點數的關鍵在哪裡。先進入 iT邦幫忙,再點擊登入按鈕,這次需要輸入正確的帳號密碼,並且觀察開發人員工具中的封包,將會看到其實在成功登入後,從 會員中心 跳轉回 iT邦幫忙 之前還有其他封包被傳送,可以猜測這些封包就是用來激活每日登入的條件

每日登入關鍵封包每日登入關鍵封包

也就是說當我們的爬蟲成功登入後,需要發出 GET https://member.ithome.com.tw/oauth/authorize?client_id=ithelp&redirect_uri=https://ithelp.ithome.com.tw/users/callback&response_type=code 請求,來取得這天的每日登入活動點數。

實作取得點數功能

這是最簡單的部分,只需要在登入之後加上下面兩行程式,就可以達到效果了

1
2
url = "https://member.ithome.com.tw/oauth/authorize?client_id=ithelp&redirect_uri=https://ithelp.ithome.com.tw/users/callback&response_type=code"
response = sess.get(url)

到這裡,概念與實作講解完畢,當然除登入並取得點數外,還可以加一些功能例如確認是否真的登入或者是是否有錯誤發生的判斷。

可以到我的 GitHub 上參考 完整原始碼

每日自動登入

將腳本寫好,就可以來讓它納入我的排程內啦!我使用的作業系統是 Windows 10,使用內建的排程系統就可以完成,這裡來說說如何設定排程每天自動登入

啟動檔 bat

要用排程之前,最好的習慣是將啟動腳本寫成 bat 檔

1
2
cd /d %~dp0
python "%~dp0login.py" >> "%~dp0log.log"
  • %~dp0:bat 檔案所在目錄的絕對路徑。

創建排程

開啟 Task Schedular,並建立一個排程 Action -> Create Task...

建立排程建立排程

設定排程的時間點 (每天下午 3:36) 與要執行的 bat 檔案

設定排程設定排程

測試排程

設定完之後,在排程清單中找到剛剛建立的排程,點擊右鍵 -> Run 讓它實際運作一次來當作測試,若有正常運作可以在與 bat 檔案相同目錄下找到 log.log 檔,若 log 無問題並有顯示登入成功,表示排程可以正常運作囉

測試排程與 log 檔測試排程與 log 檔

心得

這個是我在 2021/04/08 時開發的一個小專案,早在 2020 初次加入 iT邦幫忙 這個大家庭時就發現這個 Bug,雖然當時也有看到有人反應此問題,但都沒有下文,因此在較空閒時完成這個一直未了的小心願。最一開始的初衷只是想要解決這個生活小煩惱,同時以學習的態度來開發這個專案。

然而這個 Bug 在 2021/05/12 時小財神宣布已經根除 (關於IT邦登入時點數的問題),真是皆大歡喜。得知這個訊息的第一個想法是這個專案好像沒有用了,但其實我們還是一樣可以繼續排程,若是哪天較忙忘記瀏覽論壇,可讓爬蟲代替我們每天取得點數。

2022/02/22 更新

已將專案修改為能夠透過 GitHub Action 自動排程,因此讀者只需要直接 Fork 此專案,並添加對應的 secrets 環境變數,即可使用此專案的自動登入功能!接下來將補充說明如何使用 Fork 並透過 Action 排程與運行此專案。

Fork 且執行 Workflow

  1. 專案頁面中點擊 Fork,看到 forked from weirenxue/ithelp-login-script 即為 Fork 成功!

    Fork iThelp 自動登入專案Fork iThelp 自動登入專案

  2. 將 iThelp 帳號密碼加入 secrets 環境變數,變數名稱需要完全相同 (注:任何存在 secrets 環境變數中的數值都是加密過的,因此可以放心輸入)

    新增 Secrets 環境變數新增 Secrets 環境變數

  3. 因為此專案來源為 Fork,GitHub 預設關閉透過 Fork 而來的 Repo 其 Action 功能與 Workflow,因此需要手動啟用

    啟用 GitHub Action啟用 GitHub Action

    啟用 Workflow啟用 Workflow

  4. 最後只需要手動執行 Workflow 即可測試是否能正常地自動登入 iThelp 論壇

    手動啟動 Workflow手動啟動 Workflow

    Workflow 執行完成Workflow 執行完成

    確認自動登入成功確認自動登入成功

排程 Workflow

Workflow 可以透過 GitHub Action schedule 來描述何時該執行,即排程的做法。當指定的時間到來,則可以直接在 GitHub 上運行,不用額外開機器去執行,非常方便!

目前專案的排程設定可以在 .github/workflows/main.yml 中找到,預設為每日的 12 點執行此 Workflow

1
2
schedule:
- cron: "0 12 * * *"

這裡指的是 UTC+0 的時間,所以 GitHub Action 12 點 (UTC+0) 對應到台灣時間為晚上 8 點 (UTC+8)。

若讀者想要自定義排程時間,這裡提供相對應的時間說明供讀者參考,讀者可以在 Fork 後的專案自行更改!

1
2
3
4
5
6
7
8
9
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *
很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵