今日も前日に引き続きNIKKEI COMPASSの話です。
NIKKEI COMPASSの企業ページ
NIKKEI COMPASSには企業ごとにページがあります。例えばこれ。
- https://www.nikkei.com/compass/company/vY3qnB6pPA7rnrngA9vuVW
- https://www.nikkei.com/compass/company/7EzLoVatSjMdcrX8Zfp4BD
これらのページを作るにあたり、日経はvY3qnB6pPA7rnrngA9vuVWとか、テレ東は7EzLoVatSjMdcrX8Zfp4BDとか。各企業にIDを振る必要がありました。どのようなIDがよいでしょうか。
最初に検討したのは日経社内で元々使っていた企業IDです。それがこれです。日経会社コードと呼ばれたりします。
- https://www.nikkei.com/nkd/company/?nik_code=0018752
- https://www.nikkei.com/nkd/company/?nik_code=0013766
ところが日経会社コードが振られているのは一部の企業だけで、全企業に振られているわけではありませんでした。NIKKEI COMPASSの企業ページは全企業を対象としているので、これでは足りません。証券コードも上場企業にだけ振られているIDで、やはり全企業にはありません。
次に検討したのが法人番号です。日本には全ての法人に番号が振られていて、これがユニークなIDとして使えます。国税庁法人番号公表サイトや、gBizINFOで調べることができます。日経なら3010001033086で、テレ東なら5010401018940です。はじめはこの番号をURLに使おうとしました。しかし、最終的にはスクレイピングによる過負荷を避けるために採用は見送られました。
IDの作り方
そこでNIKKEI COMPASS内で新たにIDを振り直すことにしました。それが冒頭のvY3qnB6pPA7rnrngA9vuVWとか、7EzLoVatSjMdcrX8Zfp4BDとかです。UUIDをBase58でエンコードしているのでランダムなIDです。
企業情報はこのIDではなく法人番号や先の日経会社コードで取ってくるので、IDと法人番号や日経会社コードとの変換表が必要です。また、法人は日々増えるので変換表も常に更新する必要があります。find-or-createで対応しましょう。
COMPASSではORMにPrismaを使っています。ID発番部分をコードにすると下記のようになります。
const nikkei = await prisma.corporation.upsert({
where: { number: "3010001033086" },
create: { id: generate() },
update: {},
});
nikkei.id // => "vY3qnB6pPA7rnrngA9vuVW"
IDのCOMPASS外での利用
独自のIDを発番してからしばらく経った頃。COMPASSとは無関係のサービスがCOMPASSの企業ページにリンクを張ることになりました。このサービスはもちろんCOMPASSの企業ページのURLも独自IDも知りません。分かるのは各企業の法人番号だけです。このサービスのために、法人番号をCOMPASS独自IDに変換する内部向けのAPIを作り、提供することになりました。
こうすればよかったかも
法人番号をそのまま使ったり、単純に変換して使うのはスクレイピングの観点からNGでした。しかしソルトを使ってハッシュ化すれば、ソルトを知らない人には謎のIDのまま、COMPASSのパートナーにはソルトを提供してAPIリクエストなしでIDの変換をしてもらうことが可能でした。
よさそうなOSS実装もありました。
もちろんソルトが流出すると元も子もないというリスクはありますが、独自IDの発番が必要な方はCOMPASSの轍を踏まず、ぜひハッシュ化IDの利用を検討してみてください。