はじめに

researchmap は、日本の研究者が業績を管理・公開するためのプラットフォームです。論文や講演などの業績を登録するだけでなく、科研費(共同研究・競争的資金等の研究課題)との紐付けを行うことで、研究課題ごとの成果一覧を集約できます。

この紐付けについて、APIやCSVインポートでの一括設定ができないか調べたところ、調査した限りでは現時点ではWeb UIからの手動操作に限られるようでした。そこで、Playwrightによる自動化を試みました。

紐付けの方法を調べる

researchmapでは、業績データの一括登録はJSONLやCSVファイルのインポートで可能です。一方、科研費と業績の紐付けについては、調査した限り、一括インポートでは設定できないようでした。

API設計書での確認

researchmap v2 API設計書を確認すると、以下のフィールドはすべて「更新不可」と記載されています。

research_projects(科研費)側:

  • rm:published_paper_id(紐づいた論文の業績ID)→ 更新不可
  • rm:presentation_id(紐づいた講演の業績ID)→ 更新不可
  • rm:work_id(紐づいたWorksの業績ID)→ 更新不可

業績(論文・講演等)側:

  • rm:research_project_id(紐づいた科研費ID)→ 更新不可

実際に検証

念のため、JSOLNインポートで identifiers.research_project_id を指定して検証しました。

{"insert":{"type":"presentations","id":"52101757"},"merge":{"identifiers":{"research_project_id":["51361068"]}}}

結果:インポート自体は「完了」と表示されましたが、紐付けは反映されませんでした。このフィールドは無視されるようです。

Web UIでは可能

一方、researchmapのWeb UI(編集画面)では、業績ごとに「共同研究・競争的資金等の研究課題」のプルダウンから科研費を選択して紐付けることができます。

この操作は1件ずつ手動で行う必要があり、件数が多いと手間がかかります。

Playwrightで自動化する

Web UIでの手動操作を、Playwrightを使って自動化するPythonスクリプトを作成しました。

仕組み

  1. .env ファイルからresearchmapのログイン情報を読み込み
  2. Playwrightでブラウザを起動し、自動ログイン
  3. 各業績の編集ページ(/{slug}/{type}/{id}/edit)に移動
  4. selectize.jsで実装されたプルダウンから、対象の科研費を自動選択
  5. 「決定」ボタンをクリックして保存
  6. 既に紐付け済みの業績は自動スキップ

編集画面のHTML構造

researchmapの編集画面では、科研費のプルダウンはselectize.jsで実装されています。

<select name="data[PublishedPapersIndex][_source][identifiers][research_project_id][]"
        class="form-control selectized"
        multiple="multiple"
        style="display: none;">
  <option value="50040755" selected="selected">TEIを中心とした高度な歴史テキスト構築</option>
</select>

実際の <select> は非表示で、selectize.jsが生成するカスタムUIで操作します。Playwrightでは以下のようにselectize入力をクリックし、ドロップダウンからオプションを選択します。

# selectize の入力エリアをクリックしてドロップダウンを開く
selectize_input = page.locator(f'#{selectize_id}-selectized')
await selectize_input.click()

# ドロップダウンから該当の科研費を選択
option = page.locator(f'.selectize-dropdown .option[data-value="{project_id}"]')
await option.click()

# 「決定」ボタンで保存
submit = page.locator('button[name="save"][type="submit"]')
await submit.click()

紐付け設定ファイル

紐付け対象はJSONファイルで管理します。

{
  "research_project_id": "50040755",
  "research_project_title": "TEIを中心とした高度な歴史テキスト構築",
  "achievements": [
    ["published_papers", "52107631", "テキストが拓くデジタルアーカイブの可能性"],
    ["published_papers", "52101821", "源氏かるたに香りで迫る多感覚情報フローモデル"],
    ["presentations", "51796134", "Technical Implementation of Digital Systems"],
    ["works", "36900480", "デジタル延喜式"]
  ]
}

使い方

# インストール
pip3 install playwright
python3 -m playwright install chromium

# .env に認証情報を設定
echo 'RESEARCHMAP_LOGIN_ID=your_id' >> .env
echo 'RESEARCHMAP_PASSWORD=your_password' >> .env

# ドライラン(確認のみ)
python3 scripts/link_research_project.py config.json --dry-run

# 実行
python3 scripts/link_research_project.py config.json

# 動画録画付きで実行
python3 scripts/link_research_project.py config.json --record

実行結果

ログイン中...
✓ ログイン完了

科研費「TEIを中心とした高度な歴史テキスト構築」(50040755) への紐付け
対象: 10件

[1/10] published_papers/52107631
  ✓ 科研費を選択
  ✓ 保存完了
[2/10] published_papers/52101821
  ✓ 科研費を選択
  ✓ 保存完了
...
[10/10] works/36900480
  ✓ 科研費を選択
  ✓ 保存完了

==================================================
成功: 10
スキップ(済): 0
失敗: 0

2回目以降の実行では、紐付け済みの業績は自動でスキップされます。

[1/10] published_papers/52107631
  - 既に紐付け済み(スキップ)

デモ動画

まとめ

  • researchmapの科研費と業績の紐付けは、調査した限りAPI・JSONL・CSVインポートでは設定できなかった(フィールドが「更新不可」)
  • Web UIの編集画面からは設定可能だが、1件ずつの手動操作が必要
  • Playwrightでブラウザ操作を自動化することで、一括紐付けを行った
  • --record オプションで操作の動画録画も可能