1. 程式人生 > >利用.NET 5和Github Action 自動執行米遊社原神每日簽到福利

利用.NET 5和Github Action 自動執行米遊社原神每日簽到福利

背景

眾所周知,原神的簽到福利是需要下載app才可以領取的。但像我這種一般不怎麼刷論壇的人,每天點開app簽到很麻煩。

很多大佬利用Github的Action自動執行的模式,實現了很多好東西。加上.net 5平臺剛剛釋出,因此才有這個專案

專案連結

https://github.com/yinghualuowu/GenshinDailyHelper

簽到邏輯

根據米遊社的抓包記錄,簽到邏輯如下

  1. 繫結角色(獲取角色資訊)
  2. 查詢是否簽到
  3. 執行簽到

獲取角色介面

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抓取

  1. 通過瀏覽器登入米哈遊論壇 https://bbs.mihoyo.com/ys/
  2. F12,開啟開發者工具 -> Network 點選進入
  3. 重新整理網頁,找到以下的位置,複製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<