ひでぼ~blog

C#ときどきゲーム

FFXIVQuickLauncherのソースを読んでみる

サードパーティ製のFF14のランチャーにFFXIVQuickLauncherというものがあります。 公式のランチャーよりもシンプルで、クライアントの起動が速い、Discordとの連携機能があるとかいろいろと便利らしいです。

f:id:hideb3:20210831190603p:plain
FFXIVQuickLauncherを起動した直後の画面

公式のランチャーと同じようにスクエニIDとパスワードを入れてログインしてゲームスタートなんですが、 非公式のツールにIDとパスワードを入力するのはけっこう怖いです。なので、ログイン~ゲームクライアント起動の流れがどんな感じの実装になってるのか見てみました。ソースコードGitHubで公開されていて、C#WPFで作られてます。

github.com

ログイン

おそらくメインのログイン処理はOAuthLoginRegisterSessionです。 System.Net.WebClientを使ってHTTPS通信をしていて、リクエストヘッダーには専用のユーザーエージェント、リファラを設定しています。 リクエストパラメータのSTOREDというパラメータがミソっぽいです。

using var client = new WebClient();

client.Headers.Add("User-Agent", _userAgent);
client.Headers.Add("Cache-Control", "no-cache");
client.Headers.Add("Accept", "image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*");
client.Headers.Add("Accept-Encoding", "gzip, deflate");
client.Headers.Add("Accept-Language", "en-US,en;q=0.8,ja;q=0.6,de-DE;q=0.4,de;q=0.2");
client.Headers.Add("Referer",
    $"https://ffxiv-login.square-enix.com/oauth/ffxivarr/login/top?lng=en&rgn={region}&isft=0&cssmode=1&isnew=1&issteam=" + (isSteam ? "1" : "0"));
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

var response =
    client.UploadValues("https://ffxiv-login.square-enix.com/oauth/ffxivarr/login/login.send",
        new NameValueCollection //get the session id with user credentials
        {
            {"_STORED_", GetStored(isSteam, region)},
            {"sqexid", userName},
            {"password", password},
            {"otppw", otp}
        });

認証用のURLに対して、ID、パスワード、ワンタイムパスワードなどのパラメータを添えてHTTPリクエストを投げています。URLのドメインスクエニのものなので安心そうでした。 最終的に認証が成功すると、レスポンスからセッションIDが取れ、クライアントの起動処理に移行します。

クライアントの起動

ログインで取得したセッションIDを使ってクライアントを起動しています。 実装はLaunchGameにあります。 ArgumentBuilderを使っているのでおそらくクライアントのexeを実行するのに必要な諸々の引数を組み立てています。その中には先ほど取得したセッションIDも含まれています。 ランチャーを介さずにクライアントを直接実行してもエラーになるのはこれが原因っぽいですね。

f:id:hideb3:20210831193230p:plain
ランチャーを介さずにexeを実行するとこうなる

その後、組み立てた引数を使ってクライアントのexeを実行します。 特に問題なければこれでクライアントが立ち上がり、ゲーム画面が表示されます。

まとめ

流石にオープンソースなだけあって変な通信をしているとかはなさそうでした。 良きFF14ライフを。