モナレッジに投稿した自分の記事を全件取得する【bash】
一応できた。でも更新ができない。
ブツ
実行
ADDRESS='モナレッジに登録した自分のモナコイン用アドレス'
NAME='Shell.Monaledge.MyArticles.Downloader.20221010174354'
git clone
./run.sh $ADDRESS
monaledge.db
というSQLite3ファイルに一括保存される。
実行時間
リクエストするたび1秒スリープする。サーバ負荷対策。このため全件取得にかかる時間は以下の通り。
記事件数 + (記事件数 / 10) 秒 + 1
もし記事数が100件なら111秒かかる。10分の1になっているのはmyArticles
で10件ずつ記事を取得するから。+1
はmyInfo
の分。あとは記事数だけarticle
を発行して本文を取得する。よってこれだけ時間がかかる。
マークダウンとして保存
もしマークダウンファイルとして保存したいなら、上記を実行したあとに以下を実行する。
./file.sh
すると./md
配下に記事ID.md
というファイルで記事が保存される。
---
title: "タイトル"
date: 作成日時
lastmod: 更新日時
categories: ["カテゴリ名"]
---
本文
フロントマターにタイトルや日時、カテゴリをセットした状態になる。
日時は2022-05-10T09:37:51.045Z
のような値。
カテゴリ名は暗号通貨
やIT技術
など。
タイトルや本文はモナレッジの編集画面で登録したままのテキスト。マークダウン。
ちなみに実装はfile.sh#L40にあるとおり、ファイル出力にSQLite3のファイル入出力関数writefile()
を使っている。こんな便利な関数まであるとは。
テキストエディタで編集
select edit(content, 'vim') from articles where id = 452;
記事IDの本文を取得し、vim
で編集する。SQLite3のedit()
関数で可能。第一引数に本文、第二引数にエディタコマンドを指定する。
エディタをGUIで試してみたらmousepad
は成功したが、pluma
は本文が表示されなかった。成功するかどうかはエディタ次第なのかな?
DB確認
CLIモード
sqlite3 monaledge.db
sqlite>
テーブル名一覧
.tables
articles categories comments users
スキーマ一覧
select sql from sqlite_master;
CREATE TABLE articles(
id integer not null primary key,
article_id integer not null unique,
created text not null,
updated text not null,
title text not null,
--sent_mona decimal not null,
--sent_mona integer not null,
sent_mona text not null,
access integer not null,
ogp_path text not null,
category integer not null,
content text
)
CREATE TABLE comments(
id integer not null primary key,
comment_id integer not null unique,
article_id integer not null,
created integer not null,
updated integer not null,
user_id integer not null,
content text not null,
foreign key (article_id) references articles(article_id)
)
CREATE TABLE users(
id integer not null primary key,
user_id integer not null unique,
address text not null unique,
created integer not null,
updated integer not null,
name text not null,
icon_image_path text
)
CREATE TABLE categories(
id integer not null primary key,
name text not null unique
)
集計
DBにすると一瞬で集計できる。
記事数
> select count(*) from articles;
172
私はモナレッジで172記事も書いたらしい。
自分以外のコメント一覧
select content from comments where user_id != 92;
92
は私のユーザID。今まで41件もコメントをいただきました。感謝。
> select count(*) from comments where user_id != 92;
41
頂いたモナ総額
> select sum(sent_mona) from articles;
19.602588
これまでで19.6モナ頂きました。ありがとうございます<(__)>
コード
run.sh
lib.sh
file.sh
モナレッジAPIを解析してみたときに見つけたmyInfo
,myArticles
,article
のAPIを叩いて入手したJSONデータをDBに登録する。
sqlite3とjqコマンドを使った。SQL構文のところで苦労した。文字列はシングルクォートするけど数値はしないとか。テキストの中身にシングルクォートがあるかもしれないからエスケープするとか。それをSQL文に組み立てるとか。それをbash構文内でやるとか。あとJSON内の文字列エスケープもjq
の-r
でやる。そうした細かい所とその合わせ技に苦労した。
課題
- DBを更新できないDBを更新できない
- スリープ時間は何秒にするか
DBを更新できない
現状、実行するたびにDBファイルを削除してすべてのデータを取得し直すしかない。とても効率が悪い。サーバ負荷もムダに高い。
理想はDBにない分だけを最少リクエストで取得したい。存在しない記事はもちろん、更新された既存記事もよしなにやってほしい。そのへんをシェルスクリプトで実装しようとするとかなり大変なので、Pythonで書いたほうがよさそう。
スリープ時間を何秒にするか
サーバが落ちぬようスリープは必要。ただ、何秒にすべきかは謎。
スリープは1回あたり1秒で足りるのか? ググってみたが明確な解答はなかった。長いほどサーバにやさしいので1秒は厳しいかもしれない。サーバ負荷に関してはC10K問題や岡崎図書館事件があるのは知ってるけど、具体的なスリープ時間については情報がない。サーバ性能や同時アクセス数などの状況次第なので当然だろうけど。いつも悩む所。せめて目安でもあれば。
このツールはバックアップ目的だし、バックグラウンドで走らせるだけならスリープ時間をもっと長くしても問題ないはず。でも1秒より短くしたらヤバそう。きっと1秒/1回が下限値だろう。ツールが完成したら長めにしようかな。5秒/1回くらい? 俺たちは雰囲気でスリープしてる。