利用.NET 5和Github Action 自動執行米遊社原神每日簽到福利
阿新 • • 發佈:2020-11-17
背景
眾所周知,原神的簽到福利是需要下載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<