MJの牌譜

MJの牌譜のお話です。
以前、MJの牌譜について研究したことがあります。ネット麻雀の優れたところの1つに、「牌譜の共有」があると思います。ですが、MJの牌譜の共有がやや大変。天鳳や雀魂が1対局につきURL1つで済むのに対し、MJは1局ごとにURLを保存しないと多数の対局を残すことができないのです。

プレイヤーズサイト

② ↓

対局データ

③ ↓

1局データ

④ ↓

画像4

MJの牌譜の参照は上記手順で行います。一見、②のURLを共有すれば対局全体の牌譜共有が可能なように思えますが、残念ながらそれはできません。
MJの公式サイトには「※ロックされていないプレイ履歴の詳細は1週間で自動的に削除され、リプレイURLの確認やリプレイデータのダウンロードができなくなります。」と、あります。サーバー容量にも上限がありますから仕方ありません。
ロックできる牌譜にも限りがありますし、たくさんの牌譜を残すには④の画面のURL(または赤丸部分)を保存しておくしか方法がありません。③の画面の赤丸部分を右クリックでURLをコピーすることでも取得できますが、一度は②の画面に戻る必要があるので面倒です。

私は昨年行われたチーム戦で初めてMJをダウンロードしたのですが、もっと楽な方法が無いかを捜します。ネット上で見つけることができなかったので自力で調べた結果、③の画面のURLのパラメータに「&kyoku_no=1」といった数値に気付きます。どうやらこの「1」が1局目らしく、数値を変更していけば③の画面のURLを一度に作成できそうです。最初はExcelの関数などで作成していましたが、数が多いので一括処理できるようにVBAマクロを作成しました。

以下、Excelでの操作になります。
※実際に実行する場合は、VBE画面で下記の設定をしてください。
'「メニュー」→「ツール」→「参照設定」を選択。
'「Microsoft HTML Object Library」「Microsoft Internet Controls」にチェック。

Sub 牌譜URL取得()
On Error GoTo Catch
'Dim objIE As InternetExplorer
'「メニュー」→「ツール」→「参照設定」を選択。
'「Microsoft HTML Object Library」「Microsoft Internet Controls」にチェック。
   Dim objIE As InternetExplorer
   
   Dim objTag As Object
   Dim url, repURL As String
   Dim i As Integer
   
   i = 1
   url = ActiveCell.Value
   Do
       Set objIE = CreateObject("InternetExplorer.Application")
       objIE.Visible = False
       
       objIE.navigate rep_no(url, i)
       
       Call IEWait(objIE)
       Call WaitFor(0.1)
       
       repURL = ""
       
       For Each objTag In objIE.document.getElementsByTagName("a")
           If InStr(objTag.outerHTML, "browser_play") > 0 Then
               repURL = objTag
           End If
       Next
       
       objIE.Quit
       
       Set objIE = Nothing
       If repURL <> "" Then
           ActiveCell.Offset(i - 1, 1).Value = repURL
       End If
       i = i + 1
   Loop While repURL <> ""
Catch:
   MsgBox "終了"
End Sub

'kyoku_noのパラメータを変更したURLを返す関数---
Function rep_no(ByVal url As String, ByVal i As Integer)
   Dim s_, e_ As String
   Dim ret As String
   
   s_ = "kyoku_no="
   e_ = "&target"
   rep_no = Left(url, next_pos(url, s_) - 1) & i & Mid(url, InStr(url, e_))
End Function

'IEを待機する関数---
Function IEWait(ByRef objIE As Object)
   Do While objIE.Busy = True Or objIE.readyState <> 4
       DoEvents
   Loop
End Function

'指定した秒だけ停止する関数---
Function WaitFor(ByVal second As Integer)
   Dim futureTime As Date

   futureTime = DateAdd("s", second, Now)

   While Now < futureTime
       DoEvents
   Wend
End Function

・使い方
まず、Excelの任意のセルに③の画面のURL(または②の赤丸右クリック「リンクのアドレスをコピー」の結果)を貼り付けます。

画像5

あとは、貼り付けたURLを選択した状態で、作成したマクロを実行します。

画像6

選択したセルの右側に、全対局の牌譜リプレイURLが出力されます。

結果

1対局で1URLというわけにはいきませんが、とりあえず、簡単に牌譜を残す方法は確保することができました。一仕事終えて私が満足しているところに、チームメイトの【T-の】さんからアドバイスをもらいます。「URLを解析すると色々な情報が抜き出せる」と。

「おお!!これは面白そう!」と、解析を始めます。和了点やリーチ、副露、役などの様々な情報も抜き出せるし、何より牌譜をねつ造できる!!

ということで、ねつ造した牌譜がコチラになります。たかはる、本当に頼りになる男です。

画像8

この記事が気に入ったらサポートをしてみませんか?