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


背景

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

很多大佬利用Github的Action自動執行的模式,實現了很多好東西。加上.net 5平台剛剛發布,因此才有這個項目

項目鏈接

https://github.com/yinghualuowu/GenshinDailyHelper (已經無了)

https://github.com/yinghualuowu/GenshinDailyHelper.Docs

簽到邏輯

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

  1. 綁定角色(獲取角色信息)
  2. 查詢是否簽到
  3. 執行簽到

獲取角色接口

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

  1. 通過瀏覽器登錄米哈游論壇 https://bbs.mihoyo.com/ys/
  2. F12,打開開發者工具 -> Network 點擊進入
  3. 刷新網頁,找到以下的位置,復制Cookie后放在記事本或其它可以保存的地方
  • 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<

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM