背景
眾所周知,原神的簽到福利是需要下載app才可以領取的。但像我這種一般不怎麼刷論壇的人,每天點開app簽到很麻煩。
很多大佬利用Github的Action自動執行的模式,實現了很多好東西。加上.net 5平臺剛剛釋出,因此才有這個專案
專案連結
https://github.com/yinghualuowu/GenshinDailyHelper
簽到邏輯
根據米遊社的抓包記錄,簽到邏輯如下
- 繫結角色(獲取角色資訊)
- 查詢是否簽到
- 執行簽到
獲取角色介面
binding/api/getUserGameRolesByCookie?
這個介面將返回賬戶角色資訊,重要的有角色區域,角色 uid,角色暱稱,角色等級
查詢簽到情況
event/bbs_sign_reward/info?
如果已經簽到則不執行簽到,雖然允許重複簽到。
執行簽到
event/bbs_sign_reward/sign?
注意:執行簽到需要帶上x-rpc-device_id,不然會提示請到APP進行簽到
介面返回碼參考
/// <summary> /// 判斷返回碼並延遲 /// </summary> /// <returns></returns> public virtual string CheckOutCodeAndSleep() { Random ran = new Random(); int randKey = ran.Next(500, 2000); Thread.Sleep(randKey); // -1還是-100表示登入失敗 switch (Retcode) { case 0:return "執行成功"; case -5003:return "已經簽到"; default:throw new GenShinException($"請求異常{Message}"); } }
Action執行邏輯
在.github/workflows中,主要配置了有
name: genshenDailyChekin
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch: # 手動觸發
schedule: # 計劃任務觸發
- cron: '10 16 * * *' # cron表示式,Actions時區是UTC時間,所以要往前推8個小時,如上表示每天0點10分
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# 設定伺服器時區為東八區
- name: Set time zone
run: sudo timedatectl set-timezone 'Asia/Shanghai'
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.100
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Run
env:
Cookie: ${{secrets.Cookie}}
run: dotnet run -p ./GenshinDailyHelper ${Cookie}
Cookie抓取
- 通過瀏覽器登入米哈遊論壇 https://bbs.mihoyo.com/ys/
- 按
F12
,開啟開發者工具 -> Network
點選進入 - 重新整理網頁,找到以下的位置,複製Cookie後放在記事本或其它可以儲存的地方
程式碼實現
程式碼主要由HttpClient進行請求,實現較為簡單。並沒有有意處理異常。
/// <summary> /// 對外做出請求 /// </summary> /// <param name="uri">請求介面</param> /// <param name="method">請求方式</param> /// <param name="content">請求資料實體</param> /// <returns>返回實體物件<see cref="T"/></returns> private async Task<T> ExecuteRequest<T>(Uri uri, HttpMethod method, HttpContent content = null) { using var requestMessage = BuildHttpRequestMessage(uri, method, content); var response = await Client.SendAsync(requestMessage); var rawResult = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject<T>(rawResult); return result; }
執行結果
由於功能簡單,輸出的日誌結果也儘量的直觀,為了確保Cookie失效能第一時間通知到我,因此任何異常都會被丟擲並構建失敗。
該專案支援多號簽到,但各位旅行者愛惜羊角包,不要濫用>3<