背景
眾所周知,原神的簽到福利是需要下載app才可以領取的。但像我這種一般不怎么刷論壇的人,每天點開app簽到很麻煩。
很多大佬利用Github的Action自動執行的模式,實現了很多好東西。加上.net 5平台剛剛發布,因此才有這個項目
項目鏈接
https://github.com/yinghualuowu/GenshinDailyHelper (已經無了)
https://github.com/yinghualuowu/GenshinDailyHelper.Docs
簽到邏輯
根據米游社的抓包記錄,簽到邏輯如下
- 綁定角色(獲取角色信息)
- 查詢是否簽到
- 執行簽到
獲取角色接口
binding/api/getUserGameRolesByCookie?
這個接口將返回賬戶角色信息,重要的有角色區域,角色 uid,角色昵稱,角色等級
查詢簽到情況
event/bbs_sign_reward/info?
如果已經簽到則不執行簽到,雖然允許重復簽到。
執行簽到
event/bbs_sign_reward/sign?
注意:執行簽到需要帶上額外的請求頭部,這里不做介紹,可以在上面或者最下面的鏈接有源碼
接口返回碼參考
/// <summary> /// 判斷返回碼 /// </summary> /// <returns></returns> public virtual string CheckOutCode() { Task.Delay(3 * 1000).Wait(); 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失效能第一時間通知到我,因此任何異常都會被拋出並構建失敗。

相關參考
https://github.com/y1ndan/genshin-impact-helper
該項目支持多號簽到,但各位旅行者愛惜羊角包,不要濫用>3<

