😸

Notionで文献管理がしたい

2023/04/25に公開

どうした?

文系の大学院生で、ふだんNotionで文献管理をしています。
ひとそれぞれ文献のなにを管理したいかは異なると思うのですが、私は文献に出会ったらとりあえず、「タイトル」「URL」「citation(引用文献一覧のところで記載する指定の書き方です)」の3つをnotionにぶちこみたいのです。(こんな感じ↓)
image.png

なので、参考になる論文に出会うたびに、まず、タイトルをコピーして、Notionを開いて新規ページを作って、タイトルペーストして、次にURLコピペして、、、。そして最後に、citationについては、以下の画像みたいに、タイトルをいれると(緑)、自動生成してくれる(黄色)サイトに行って、生成してもらってからそれをコピペして、、、!と面倒な日々を送っています。

image.png
https://www.scribbr.co.uk/referencing/generator/apa/

というわけで、ワンクリックで「タイトル」「URL」「citation」をnotionのDBにぶち込みたいな!と思いました。

材料

1.https://developers.notion.com/
notionにぶちこむ!は話題のnotion apiで出来そうですね。

2.https://citeas.org/api
citationは、、、?とおもっていたらこちらも、成形済みのcitationを返してくれるAPIを見つけたのでこちらを使えばいけそうっぽい勇気がみなぎってきました。なにで検索させるのがいいのかなあと思ったのですが、URLで検索させるのがよさそうなのでそうします。(さっきからURLURLと言っているのですが、論文のURLはURLといってもただのURLではなくて(?)、doiと呼ばれ、識別番号的に機能しています)

DOIは、Web上の電子文献と一対一に対応しているコードです。商品に対するバーコードや、書籍に対するISBNコードと同類、と考えれば分かりやすいでしょうか。
https://www.chem-station.com/blog/2008/07/-doi.html

3.php
言語はどれを使えばいいか全くわからなかったのですが、触ったことあるのがC#とPHPしかなくて、ググったら、PHPだったらなんかいけそうな香りを感じたのでPHPでいってみることにしました。xamppインストールしました。

できたもの

なにもないnotionDBですがあ~
image.png

実在する論文のdoi(URL)を入力して「新規追加」ボタンを押すとお~
image.png

タイトルと、doiと、citation(、と、おまけで要約!)が一発で入った~~!
 ※なんか変なタグとか若干混ざっちゃってますがこれから頑張ってきれいにしていきます
image.png

アプリ側は申し訳程度に何かつぶやいている、一応完了画面。
image.png

やったこと

index.html

1.フォームを表示して、入力内容をinsert.phpに投げる

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
	<title>reftion</title>
</head>
<body>
	<form action="insert.php" method="post">
		<label for="doi">doi:</label>
		<input type="text" id="doi" name="doi" size="50"><br><br>
		<input type="submit" value="新規追加">
	</form>
</body>
</html>

insert.php

1. CiteAPIから情報をもらう

<?php
  define('REF_DOI', 'https://api.citeas.org/product/'.$_REQUEST['doi']); 
  $header = [
        "Content-Type: application/json",
      ];
  $ch = curl_init(REF_DOI);
  curl_setopt_array($ch,
      [
        CURLOPT_RETURNTRANSFER  => true,
        CURLOPT_HTTPHEADER      => $header,
      ]
    );
    $res_cite = curl_exec($ch);
    if (curl_errno($ch)) {
      $error = curl_error($ch);
      echo $error;
    }
    curl_close($ch);

    //受け取ったデータを成形
  $res_cite_array= json_decode($res_cite, true);
  $notion_cite_title=$res_cite_array['name'];
    $notion_cite_doi=$_REQUEST['doi'];
    $notion_cite_abs=$res_cite_array['metadata']['abstract'];
    $notion_cite_citation=$res_cite_array['citations']['0']['citation'];

2.Notionにデータを送る

    define('NOTION_TOKEN', 'secret_XYZ');
    define('NOTION_TABLE', 'ABCDE'); 

    $header = [
      "Authorization: Bearer ".NOTION_TOKEN,
      "Content-Type: application/json",
      "Notion-Version: 2022-06-28"
    ];
 
    $post_data = [
      "parent"=> ["database_id"=> NOTION_TABLE],
      "properties"=> [
        "title"=> [
          "title"=> [
            [
              "text"=> [
                "content"=>$notion_cite_title
              ]
            ]
          ]
        ],
                "doi"=> [
                  "url"=> $notion_cite_doi
                ],
                "abstract"=> [
                    "rich_text"=> [
                      [
                        "text"=> [
                          "content"=>$notion_cite_abs
                        ]
                      ]
                    ]
                  ],
                  "citation"=> [
                    "rich_text"=> [
                      [
                        "text"=> [
                          "content"=>$notion_cite_citation
                        ]
                      ]
                    ]
                  ],
              
      ]
    ];
   
    $ch = curl_init("https://api.notion.com/v1/pages");

    curl_setopt_array($ch,
      [
        CURLOPT_RETURNTRANSFER  => true,
        CURLOPT_HTTPHEADER      => $header,
        CURLOPT_POST            => true,
        CURLOPT_POSTFIELDS      => json_encode($post_data),
      ]
    );
   
    $res_notion = curl_exec($ch);
    
    if (curl_errno($ch)) {
      $error = curl_error($ch);
      echo $error;
    }
   
    curl_close($ch);
  
    //受け取ったデータを成形
  $res_notion_array= json_decode($res_notion, true);

3. 画面表示

  echo '<pre class="text-light">';
  echo $res_cite_array['name'].'を登録しました。'."\n";
  echo $res_notion_array['url'].'からアクセスしてください。';
  echo '</pre>';

?>

今後やりたいこと

  • まぎれっちゃってるタグ(イタリック体の<i>など)を早急にどうにかしたいざます
  • secret_keyをDBにもたせたい
  • 完了画面の、新規作成したページのURLをボタンor押せるリンクにしたい
  • in-text citation(文章のなか引用するときに、「AはBである(田中, 1998)」と書くときの「(田中, 1998)」のフォーマットのことです!いちいち書くのが面倒なのでコピペできるようにしておきたいのですが、今回使ったAPIには生成済みのin-text citationはなかったので、自分で作らなあかんです)
  • タイトルでも検索できるといいですよね。APIの仕様書にはkeywordでも検索可と書いてあったのですが、使い方がよくわからなかったので、改めて確認してみる
  • エラー画面を美しく
  • いつか、ほかの人にも使ってもらえる形でおいておけると嬉しい、だってこれ、めちゃくちゃ便利(私には!!!)

追記

続きです。

https://qiita.com/haruchann/items/0762c9b87526b4177207

参考

https://online-world.jp/blog/contents/?id=21

GitHubで編集を提案

Discussion