【個人開発】LINEでURLを送るとNotionに保存してくれるLINEBot「記事のストックくん」を作りました。

<img width="880" alt="stock_title.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/e281a834-aadf-8ff2-f0bc-ab651a726f3c.png">

**「この記事、後で読み返したい！」**
そんなとき、みなさんどうしてますか？

僕ははてぶやTwitter、Podcastをよく使うのですが
「今じっくり読める状態じゃないから、とりあえず保存しておきたい！」みたいなことが結構あります。

いや、ありました。このLINEBotを作るまでは…

今回は **「LINEBot 〇〇くん」第二弾「記事のストックくん」** のご紹介です。

>↓第一弾はこちら
【個人開発】ごみのお知らせをしてくれるLINEBot「ごみのお知らせくん」を作りました。
[https://qiita.com/wallkickers/items/7bf00de66f802503f957](https://qiita.com/wallkickers/items/7bf00de66f802503f957)

# 出来たもの
<img width="880" alt="stock_features.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/e92803fe-9859-a567-0ed6-5512ff482f50.png">

簡単に言うと「LINEでURLを送るとNotionに保存してくれるLINEBot」です。

### 機能

- LINEでURLを送ると、記事の「タイトル」「URL」をNotion内の特定のDBに保存
- メッセージ送信、共有に対応
- 保存の成功、失敗をメッセージで返す

# 仕組み
<img width="880" alt="stock_system.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/8cb71f84-1bdf-f380-6d21-66e11951bcc6.png">

構成は「LINEBot×API Gateway×Lambda」です。ここは以前と同じです。
違う点としては、ごみのお知らせくんはpythonを使いましたが、今回はGoを使いました。

# ソースコード

ソースはgithubに上げています。
Goは今回初めて書いたので改善点は正直めちゃめちゃあります。良ければコメントください！

[https://github.com/wallkickers/lambda_notion_api_article_stock](https://github.com/wallkickers/lambda_notion_api_article_stock)

# なぜ作ったのか

発端はnoteの方で書いたのですが、Notionに記事の情報を保存するのが手間に感じたからです。

**▼noteの記事**
[気づいたことメモしてる？下地 寛也著「考える人のメモの技術」を読んでインプット&アウトプット方法を見直す。](https://note.com/takafumi_178/n/nf2fab47b1302)

最初はNotionの中にDBを作って保存していました。
「考えたこともNotionに書けるから、めちゃめちゃ良いじゃん！」と最初は思っていたのですが…
このやり方だと「保存がめんどくさい」問題がありました。

> ▼前までの保存ステップ
1.気になる記事を見つける
2.URLをコピーする
3.Notionにデータを作ってURLを貼る
4.何の記事か分からないので、ブラウザに戻ってサイトのタイトルをコピーする
5.Notionのタイトル欄に貼る

初めはこの手順で保存していたのですが、途中でめんどうになり、
**後でまとめて保存するためにURLだけ貼っておく**ようにした結果、こうなりました。

<img width="200" alt="stock_system.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/a5d11ed5-36fa-30be-5e6d-feff73a9465e.png">


**メモ帳と変わらないッッッ！**

だったら、ブラウザの拡張機能使えばいいのでは？と思い、調べたのですが、スマホだと拡張機能使えないらしいんですよね…
それなら作るか、で作りました。

**NotionAPIで細かい条件でデータ保存できるし、LINEbotなら途中で処理も挟めるし、LINE使えばブラウザから共有も簡単だろう**と考え、今回の構成となりました。
結果、以下のステップで保存できるようになりました。

> ▼保存ステップ
1.気になる記事を見つける
2.共有を押す
3.LINEに送る

僕にとってはタイトルも同時に保存できることが高評価です。

# 工夫した点

- 手間を減らすことを追求
    これは先程書いた内容です。手間が増えると使わなくなるので、**”可能な限りシンプルに”** を心がけています。
    
- とりあえず未読に入れる
    DB上は「活用したい記事」「面白い記事」の2種類ありますが、指定しようとすると保存するときの手間が増えるので全て未読に入れるようにしています。記事を読んで考えたことを書いたら、それぞれのDBに移動します。
    
- URLやタイトルの改行、空白の削除
    LINEへの共有や\<title>タグからのタイトルの取得は少しクセがありました。例えば以下のケースに遭遇しました。
    - ブラウザからLINEに転送すると改行が入る
    - サイトによって<title>タグに要素がついている
    - <title>内に改行がある
    - ヘッダー内のContent-Typeにcharsetが設定されておらず文字化けする    

    これらは改行・空白の削除や正規表現で\<title>タグを判別することで対応しています。
    サイトによって異なるので随時改善していきます。

# 最後に
今回のLINEBotは個人用なので公開の予定はありませんが、反響があれば本LINEBotの構築手順を書きたいと思います。
（いいねやコメントいただけると嬉しいです！）


余談ですが、Twitterで「記事を後で読み返したいとき、どうしてる？」ことをツイートしたところ、友人のyudaiくんが「pocket」というアプリを教えてくれました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自分は、とりあえずPocketに突っ込んでるよ！アプリ使いやすいし、ブラウザの拡張機能からもシュッと記事をストックできるから便利！</p>&mdash; yudai (@qoo22633) <a href="https://twitter.com/qoo22633/status/1611380280006447104?ref_src=twsrc%5Etfw">January 6, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


pocketに保存しておくと、記事内の文字だけ抽出して保存してくれたり、保存した記事を音声で読み上げたりしてくれます。
なかなか良いですね...！同じく記事の保存方法に迷われている方は使ってみると良いと思います。

https://getpocket.com/ja

それでは！

### 参考記事
以下、開発の際に参考にしたサイトです。

- Go・LINEbotのsdk
[https://github.com/line/line-bot-sdk-go](https://github.com/line/line-bot-sdk-go)

- Go・LINEBotでメッセージのおうむ返しをしたい
[https://graff-it-i.com/2022/06/05/line-messaginapi-golang/](https://graff-it-i.com/2022/06/05/line-messaginapi-golang/)

- net/http、Bodyをcloseすることについて
[https://qiita.com/stk0724/items/dc400dccd29a4b3d6471](https://qiita.com/stk0724/items/dc400dccd29a4b3d6471)

- jsonをGoで扱う
[https://qiita.com/nayuneko/items/2ec20ba69804e8bf7ca3#jsonでgo](https://qiita.com/nayuneko/items/2ec20ba69804e8bf7ca3#json%E3%81%A7go)

- Goでリクエストを送る
[https://qiita.com/taizo/items/c397dbfed7215969b0a5](https://qiita.com/taizo/items/c397dbfed7215969b0a5)
[https://qiita.com/yyoshiki41/items/fc878494e19b9de93d56](https://qiita.com/yyoshiki41/items/fc878494e19b9de93d56)
[https://qiita.com/jpshadowapps/items/463b2623209479adcd88#post](https://qiita.com/jpshadowapps/items/463b2623209479adcd88#post)

- NotionAPIを使用するために必要になる「インテグレーション」について
    - [【NotionAPI 】インテグレーションが表示されない時の対処法](https://zenn.dev/syfut/articles/4906816e6e9118)

- データベースとNotionAPIのインテグレーションを接続する際に参考にした記事
    - [共有と権限設定](https://www.notion.so/ja-jp/help/sharing-and-permissions)

- スマホのchromeでは拡張機能が使えない
[https://lifelikewriter.com/iphone-ipad-android-chrome-extension/](https://lifelikewriter.com/iphone-ipad-android-chrome-extension/)