[備忘録]iPhoneでマークアップした単語orフレーズを、ChatGPTへ質問→回答をNotionへ自動登録

以前の記事:https://qiita.com/YukiOshamanbe/items/33e9a14bf99e5412ec42
上記の作業でChatGPTへの質問・回答のコピーは無料ではできないため一旦保留としていたのだが、iPhoneのショートカットとiPhone用ChatGPTアプリを使用すれば、無料でChatGPTの処理も含めて単語帳への追加が行えることが分かったので、記録しておく。

## ショートカットについて
iPhoneのショートカットというデフォルトアプリがあるのだが（おそらくかなり多くの人にとって既知の存在）、これを利用すると、iPhone上で様々な操作が一括で行えるようになる。簡単に言うと視覚的にスクリプトを組めるアプリと思ってもらえれば。今までアイコンを目にはしていたが、まったく触ったことがなかった。もしかしたら筆者のような初～中級のエンジニアには同じような人がいるのではなかろうか。もちろんこのアプリの中でChatGPTのアプリを呼び出すorブラウザでChatGPTにアクセスするでき、なおかつ受け取った回答をショートカット内で他のアプリに渡すことが可能なのだ。つまりopenaiのAPI不使用でChatGPTとの対話が可能ということ。

## 今回の目的
前回の記事で作成したPythonスクリプトを少し改良し、標準入力ではなく引数で辞書登録文字列を受け取るよう変更する。そうすることでショートカット内で、

ChatGPTに調べたいフレーズを質問
↓
受け取った回答を引数にPythonスクリプト実行
↓
辞書登録

を行えるはず。
またショートカットは共有シートに項目として追加できるらしいので、実際の使用例としては下記のようにしたい。

気になるフレーズをタップしてマーク
↓
共有ボタンでショートカット実行
↓
辞書登録完了

これで目的の学習言語のネットの記事や新聞アプリでの記事、youglishなど動画サービスの字幕から気になるフレーズが出たら、その場で辞書登録が可能になる・・・はず！

## Pythonスクリプトの変更
今回もまったく知らないのでChatGPTに質問する。助けて！ChatGPT！

ChatGPT「argperseを使え」
私「かしこまりました」

```python:引数で辞書登録文字列受け取り
import re
import argparse
import notion_client import Client

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Add a new item to Notion database")
    parser.add_argument('input_text', type=str, help='Input text for the Notion page')
    args = parser.parse_args()

    # NotionのページURL
    url = "https://www.notion.so/98b679b4a61a4024b89539cc6ba06d7d?v=6a32407018e34045a930cfc401d5332e"

    # Notionのページにアクセスするためのクライアントを作成
    token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    client = Client(auth=token) 
    database_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

    # 入力されたテキストを処理
    section_dict = extract_sections_from_text(args.input_text)

    # テキストを新規ページとして追加
    add_row_to_notion_database(database_id, section_dict)

```

ありがとう、ChatGPT。すぐに組めました。ほんとはトークンとかdatabase_idとかをマジックナンバーじゃなくて、環境変数なり、設定ファイルなりで管理したいのだが後回し。とりあえずとにかく動かしたい（初心者あるある）。

## Pythonista3の環境構築
iPhoneでPythonを実行する環境はPythonista3をインストールします（有料）。129krとかだったので、日本円だと2000円くらい。でもPython環境をiPhoneにつくれるし、サブスクでもないので購入。

Pythonista3には標準ライブラリ程度しか元々入っていないのだが、下記記事を参考にしてpipできるようにした。
参照:https://qiita.com/maboy/items/cef5dee13d5b2e9ac843

そしてnotion_clientをインストール。


## ChatGPT用プロンプトの編集
変更要件は以下2点
1.ChatGPTに入力文字列のエラー判定をしてもらう
2.精確性を上げるため調整

前回のプロンプトではスウェーデン語以外の入力時もChatGPTはなにかしらの回答（ロシア語を入れるとロシア語のフレーズの説明を返してきた）を返してきていたので、今回はそういったものをエラーとして処理したい。そのため、入力されたフレーズがスウェーデン語かどうかはChatGPTに判断してもらい、違う場合はエラー用回答を返すよう指示。精確性の調整は不要だった指示を削除した。

```text:新しいChatGPTプロンプト
#Instruction:

If “ここにショートカット実行時に値代入” Is not Swedish phrases or words, answer “It’s not Swedish”, otherwise tell me about it like the following:

Phrase:
[newline answer,  write the phrase which I asked]

Frequency of use:
 [newline answer, choose one of the following four to express the frequency on a scale of 1-10  (heads-up being 8){Not very often (frequency 1-2), Moderately (frequency 3-5), Often (frequency 6-8), Very often (frequency 9-10)}].

Meaning:
[newline answer (just give the meaning briefly: (e.g.) hisnande would be breathtaking, amazing, wonderful)]

Etymology:
[newline answer]

Collocation:
[new line in answer (this vocabulary + commonly used vocabulary: (e.g.) if you want to teach adrenalindriven, use adrenalindriven (this vocabulary) + äventyr (commonly used vocabulary) or adrenalindrivna (this vocabulary) + sport (often used together)] 

Example sentences:
Example sentences: [insert a new line in the sentence (Answer the sentence that native speakers are most likely to use in a conversation, without “”.]

Other important points:
[newline answer (points for use in conversation, similar expressions, answer both)]
```

## iPhoneのショートカットの作成
私がMacを持っていれば、PC上で組めるので楽々だったのだろうが残念ながら持っていないので、iPhone上でポチポチ作業。初めて触ってみたが、視覚的にスクリプトを組めるのは面白い。これはプログラミングの初級者の勉強にもいいのでは？複雑な文法の理解は不要なので、直観的に組み立てていける。ただ如何せん操作がしづらい。処理の並び替えする際に、タップ長押しのドラッグ引っ張ってスクロールしていくのはさすがになんとかならんのだろうか。

ちなみに下記（スクショが複数枚に渡っているのはご愛敬）のように組んだ。
<img width="50%" alt="shortcut1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/bab4f551-0a31-795b-57d6-fc3ca37db507.jpeg">

まずは共有シートから文字列を受け取り、それをChatGPTプロンプトに組み込み。

<img width="50%" alt="shortcut1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/5d725687-cabb-1825-d15c-a6065b42efc9.jpeg">

そのテキストをChatGPTに投げる。ChatGPTから戻り値があった場合かつエラー値でなかった場合にChatGPTの回答文字列の改行を\nに置換。そのままPythonスクリプトに変数で渡すとうまくいかなかったため、改行の変換は必要なよう。そして置換後の文字列をPythonスクリプトに渡してあげる。Pythonista3で当該スクリプトを起動し引数で置換後文字列を渡す。

<img width="50%" alt="shortcut1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/de5b191f-0092-7311-3ac4-52c1dafe8cd1.jpeg">

回答がエラー値だった場合はalertでその旨を表示。値が返ってこなかった時ってタイムアウトのエラーとかかな？何回か動かしたが、このエラーは拾えず。タイムアウトの設定をこちらでしてあげなければならなかったのか？これは課題として後でやります。

## 動かす
さあ、実際に使用してみます。まずはスウェーデン語のニュースサイトで知らないフレーズをマークアップ、メニューから「share」をタップ

<img width="50%" alt="shortcut1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/ad7e8271-b502-5f84-efaf-8fd62c82d1bf.png">

共有シートに今回作成した「Add_newvocab」が入っているのを確認し、タップして起動。

<img width="50%" alt="shortcut1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/0c4facd1-4f9d-f03f-bb25-7b2277b8bfc4.jpeg">

iPhoneの画面上部にショートカット処理中の表示が出ました。完了すると勝手に消えるけど、上スワイプで消してもいい。処理は続くようだ。

<img width="50%" alt="shortcut1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/350f6c06-b6c4-a31d-096c-2e2725eb3f9f.png">

うまく登録できた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/9bef9f84-a2f6-1799-57ab-f38609434440.png)

## まとめ
かなり便利になった。わざわざコピぺの必要もなく、スウェーデン語のテキストを読んでいる時にその場で単語帳まで一括で登録できる。これで復習も手軽にでき、なおかつ自分の単語帳がより広くカバーできるようになっていく。ChatGPTの精度としては、やや回答の書き方や、内容の深さにバラつきが出る時があるが、どうしようもないミスみたいなのは、ほぼ発生していない。もうiPhoneの基本処理で入れてほしいレベル。しかも私はスウェーデン語で書いたが、プロンプトを変えれば何語でも対応可能だ。