連絡帳にゃ

Last-modified: 2022-07-09 (土) 06:09:49

本スレを麻雀に直接関係ない話で汚すのもあれだから連絡とか周知に使うためのページおいとくにゃ

以下どうぞにゃ

  • ProtoBuf の Proto を使ったデシリアライズで行き詰まったにゃ。
    example message.png
    • WebSocket メッセージの0バイト目が0x02または0x03の場合は3バイト目から最後まで,0バイト目が0x01の場合は1バイト目から最後までを データ型(H~Z,Req・Resを除く)一覧にゃ#Wrapper 型のメッセージとしてデコードできるにゃ. 0x02 のメッセージをデコードしたら name に API 名が入っているはずなので,その API のリクエストデータ型で今度は data をデコードできるにゃ. 0x03 のメッセージは name が空文字列だけどメッセージ番号が同じ 0x02 メッセージが先に来ているはずだから,そいつのレスポンスデータ型で data をデコードできるにゃ. 0x01 のメッセージは name にメッセージ型名が入っているはずなので,そのメッセージ型で data をデコードできるにゃ. (TODO: 後で 全 API メッセージに共通の仕様にゃ に反映するにゃ)
    • できたにゃ!
      通信内容の Base64文字列をそのまま流せばデシリアライズできるようになったにゃ。
      あとは「通信内容を開始~終了までテーブルに記録」と「テーブルのデータを自動で順番にデシリアライズ」ができれば、牌譜データを読むのに時間をそそげそうにゃ。
      chromeでHARを保存してまとめて抜き出せばできそうだし、ひとまずそれでやってみようかにゃ。
  • たぶん二人しかこのwiki触ってないように見えるんにゃけど、どうやって解析を進めてるにゃ? APIの共通仕様に従って Protocol Buffer のバイトだけ16進数文字列で抽出するスクリプトとかあれば便利にゃ?
    • mitmproxy の scripting 機能を使って WebSocket メッセージをデコードするスクリプトを書くと便利と思うにゃ. Windows 版 mitmproxy で scripting 機能が使えるか試したことがない(Python 実行環境が要るかも知れない)ので後で試してうまくいったらスクリプトを共有しますにゃ.
    • Python でいけそうだと思った勢いのまま、上のコメントを見る前にコンバーターのようなものをゴリゴリ書いちゃったにゃ。API名を読み取ってプロトバフのデシリアイスまで自動化できそうな気もするにゃ。
  • 以下は 2021/01/26 時点の情報にゃ. https://takayama-lily.github.io/mjsoul/api.html の情報は古くて,新たに判明したと思われる API 情報を追加した .proto ファイルが GitHub にいくつかあるにゃ.でも,にゃーが探しただけで GitHub 上に雀魂 API の .proto ファイルが11個も見つかるのでこれら複数の .proto ファイルに散らばった情報を統合する必要がありそうにゃ.とりあえず .proto ファイルの差分をうまく検出するスクリプトを書いて複数の .proto ファイルを比較しまくって抽出した新規の情報をこの Wiki に統合していくにゃ.
    • 2021/01/26 時点で GitHub に散在している複数の雀魂 API の .proto ファイルの新旧の関係を内容を比較して整理してみたにゃ.
    • majsoul-proto-gh.20210126.png
    • 整理して分かったこととして, enntwo/majgg-api/ms/protocol.protooscarfzs/pymjsoul/proto/combined/lq_dhs.proto の2つの .proto ファイルの内容をマージすれば 2021/01/26 時点で最強の雀魂 API .proto ファイルが出来上がるはずにゃ.
    • ということで上の2つの .proto をマージして 2021/01/26 時点で最強の雀魂 API .proto ファイルを作ってみたにゃ. filemahjongsoul.proto.20210126.fixed この .proto ファイルの内容はまだ Wiki には未反映にゃ. .proto ファイルのフィールドの index を変えるとデコードに失敗するのを忘れていたのでアップロードした .proto ファイルではうまく動かないにゃ.フィールドの index を修正して再アップロードするにゃ.修正して再アップロードしたにゃ.
      • おびただしい量にゃ。。。グッジョブにゃ。バイト0とAPI名から適切なフォーマットを求めて自動的にデシリアライズできそうにゃね。該当なしか失敗で --devode_raw オプションを使うにゃ。RPCの仕様を勉強するところからになるけどにゃあ。
  • 書くの忘れてたけれど Protocol Buffers のメッセージは対応する .proto ファイルがなくても protoc というコンパイラがあればデコードできるにゃ. https://github.com/protocolbuffers/protobuf/releases から protoc のバイナリを落として --decode_raw というオプションを使えば良いにゃ. .proto ファイル無しでデコードするとフィールド名は分からないので値の意味を推測するのはより難しくなるにゃ.というか, GitHub とかに落ちている雀魂 API の .proto ファイルはおそらく最初に .proto ファイルが無い状態で --decode_raw するところから始めてそこからリバースエンジニアリングでフィールド名を決めていったものではないかと思うにゃ.
  • この情報は助かったにゃ。Basa64 の文字列を貼れば protoc ファイルなしでデシリアライズできるようにはなったにゃ。ひとまず、すでに解説してくれてるAPIのパケットを読んでみるにゃ。
  • 更新お疲れ様にゃ。前にデータベース化するところで手が止まったって言ってた猫にゃ? 自分もHARから情報を抜いてJSON化までは自動化できたんにゃけど、スプレッドシートかデータベースに脳死で流し込めるようなライブラリとかがなくて困ったにゃ。最終的にはどうせ牌譜として読みやすい形にするために自力で構造を考えることになるだろうから、最初からそうしたほうがいいのかにゃあ。そっちも目標は牌譜としてる使えるデータにすることにゃ?
    • mitmdump で websocket をリアルタイムに抜き出してなんとかなったにゃ。とりあえ、牌譜パケットか対局パケットから、対局を再現できるようなプログラムを組んでみるにゃ。そうすれば牌譜データベースのフォーマットが決められそうにゃ。
  • 定数に関する情報を定数一覧にゃにまとめて,各メッセージ型の説明ではそっちを参照するように編集したにゃ.
  • リストにもprotoにもないメッセージ「fetchSelfGamePointRank 」を見つけたから名前だけ一覧に記載しておいたにゃ。
  • ブラウザでメッセージを傍受する方法があるにゃ。conditional breakpoint を rpcCall 関数に追加するにゃ。敷居がかなり低くなると思うから、ウィキに強い猫がページを作ってほしいにゃ!他人任せ猫にゃ。
  • ランク制限がある交流の間みたいな部屋のデータの残骸を見つけたにゃ。cfg.desktop.matchmode.map_[1] と [2] と [29] を見るにゃ!初期の雀魂でしか実装されてないのかにゃ?詳しい人は教えてくれにゃ。
    • [1]は「銅の間4人1局戦」(通常はプレイ不可能)、[2]は「銅の間4人東風戦」、[29]は「交流の間4人東風戦」だにゃ。「ゲームメタモード」を見るにゃ。
  • 初心1のアカウントでAPI叩いたら self_rank が594万だったにゃ。もうすぐ600万IDにゃ!?めでたいにゃ!
  • 「コイン余剰のため入場不可。もっと適した部屋に参加しましょう。初心者狩りはいけませんよ」game.Tools.strOfLocalization(102) で出るにゃ。cfg.desktop.matchmode の glimit_ceil が関係してるようだけど、これ以上は分からないにゃ。