将棋ウォーズで3rd Pary検討アプリによる棋譜取り込みが出来なくなったとされる件について

非技術者向け

  • 検討アプリで棋譜の取り込みが出来なくなったのは将棋ウォーズのアップデートに起因するが、検討アプリ側の修正で対処可能なはずなので寝て待つべし。
  • なお、そもそも将棋ウォーズからの棋譜の取り込みは、各検討アプリの独自解析により実現されていたものであり (グレーゾーン) 、それに対して将棋ウォーズが配慮する責務はないので、今回の件で将棋ウォーズを責めるのはお門違いである1

技術者向け

既存の取り込み機能を開発できるような人には、殊更な説明は不要と思われるが、一応簡単に。

  • 棋譜シェアページの刷新を行った様子。
    • Reactを使うようになっている。
    • ページへのアクセス制限は特に変わってなさそう。 (セッション不要でcurlでも取れる。)
  • それに伴い、従来の (おそらくテンプレートエンジンでレンダリングされていた) 棋譜文字列をJavaScriptに渡す部分のコードが無くなり、とある divdata-react-props 属性にJSONで渡すようになっている。
  • 雑な curl | grep はできなくなった一方、データについては構造化されて扱いやすくなった。

JSON部の取得サンプル:

import argparse
import urllib.request
import json
from html.parser import HTMLParser

args_parser = argparse.ArgumentParser()
args_parser.add_argument('url')
args = args_parser.parse_args()

req = urllib.request.Request(args.url)
with urllib.request.urlopen(req) as res:
    doc = str(res.read(), encoding='utf-8')


class RecordParser(HTMLParser):
    data = None

    def handle_starttag(self, tag, attrs):
        for attr in attrs:
            if attr[0] == 'data-react-props':
                self.data = attr[1]


record_parser = RecordParser()
record_parser.feed(doc)

if record_parser.data is None:
    exit(1)

print(record_parser.data)

  1. 零細サービスにおいて、公式APIを提供していない (欲しいが) にもかかわらず、3rd Partyでエコシステムを形成されるのは、スクレイピングの過負荷や販促物との競合という観点で迷惑である一方、その利便性によりアクティブユーザを確保できるという意味で有り難くもあったりする。今回、スクレイピングに対して非互換の実装変更が入ったが、後述のようにアクセス制限レベルは変わっていないことからして、全く配慮していないというわけではないと思われる (対局履歴ページのような制限強化も可能だったわけで) ので、まぁそんなに責めんであげたってください、と思う次第。