MJの牌譜
MJの牌譜のお話です。
以前、MJの牌譜について研究したことがあります。ネット麻雀の優れたところの1つに、「牌譜の共有」があると思います。ですが、MJの牌譜の共有がやや大変。天鳳や雀魂が1対局につきURL1つで済むのに対し、MJは1局ごとにURLを保存しないと多数の対局を残すことができないのです。
①
② ↓
③ ↓
④ ↓
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(または②の赤丸右クリック「リンクのアドレスをコピー」の結果)を貼り付けます。
あとは、貼り付けたURLを選択した状態で、作成したマクロを実行します。
選択したセルの右側に、全対局の牌譜リプレイURLが出力されます。
1対局で1URLというわけにはいきませんが、とりあえず、簡単に牌譜を残す方法は確保することができました。一仕事終えて私が満足しているところに、チームメイトの【T-の】さんからアドバイスをもらいます。「URLを解析すると色々な情報が抜き出せる」と。
「おお!!これは面白そう!」と、解析を始めます。和了点やリーチ、副露、役などの様々な情報も抜き出せるし、何より牌譜をねつ造できる!!
ということで、ねつ造した牌譜がコチラになります。たかはる、本当に頼りになる男です。