きっかけ
自分の note の記事とスキされた数を一覧で取得したいと思ったのがきっかけ。
調べてみると note はAPIが提供されていて、JSON 形式で取得できることが分かった。
私はMacユーザなので、慣れている JXA (JavaScript for Automation) で作成した。JXAは Apple Script の JavaScript 版のようなもの。
汎用的にして、好きな作者の記事一覧を
最初は自分用だったが、 note のユーザーIDを入力して、お気に入りの作者の一覧を取得できるようにして、ソースを公開することにしました。
出力項目は
"タイトル","スキされた数","公開日","記事へのリンク"
です。
ソースコード
備忘録も兼ねてソースを公開します。
NoteContent.scpt
// note.com から、好きな作者の記事一覧を csv 形式のファイルに出力します。
// 起動するとユーザーIDを聞いてきますので、NoteのユーザーIDを入力します。
// ファイル名は「ユーザーID_NoteContents.csv」で、デスクトップに出力されます。
// 内容は "ニックネーム","ノート記事数","フォロー数","フォロワー数" と
// "タイトル","スキされた数","公開日","記事へのリンク" です。
//
var app = Application.currentApplication()
app.includeStandardAdditions = true
try {
var res = app.displayDialog('出力するNoteのユーザーID', {
defaultAnswer: 'YOUSER_ID'
}).textReturned;
} catch(e) {
throw new Error('ユーザーIDが取得できませんでした')
}
const userID = res
const baseURL = '"https://note.com/api/v2/creators/' + userID
var URL = baseURL + '"'
var ans = app.doShellScript('curl -s ' + URL)
var jsonData = JSON.parse(ans)
var noteCount = jsonData.data.noteCount // note 記事数
var contentsData = ''
// 作者情報 (不要なら記事情報まで削除)
contentsData += '"ニックネーム","ノート記事数","フォロー数","フォロワー数"\n'
contentsData += '"' + jsonData.data.nickname + '"' // ニックネーム
contentsData += ',"' + noteCount + '"' // ノート記事数
contentsData += ',"' + jsonData.data.followingCount + '"' // フォロー数
contentsData += ',"' + jsonData.data.followerCount + '"' // フォロワー数
contentsData += ',\n"==============================="\n'
// 記事情報
contentsData += '"タイトル","スキされた数","公開日","記事へのリンク"\n'
for (let i = 1 ; i <= (noteCount / 6) + 1 ; i++) {
URL = baseURL + '/contents?kind=note&page=' + i + '"'
ans = app.doShellScript('curl -s ' + URL)
jsonData = JSON.parse(ans)
if (jsonData.data.contents == []) {
app.displayDialog('no content')
} else {
for (let j = 0 ; j < jsonData.data.contents.length ; j++) {
contentsData += '"' + jsonData.data.contents[j].name + '"' // タイトル
contentsData += ',"' +jsonData.data.contents[j].likeCount + '"' // スキ数
contentsData += ',"' + jsonData.data.contents[j].publishAt + '"' // 公開日
// 記事へのリンク
contentsData += ',"https://note.com/' + userID + '/n/' + jsonData.data.contents[j].key + '"'
contentsData += '\n'
}
}
}
path = app.pathTo("desktop",{from:"user domain"}) + "/" + userID + "_" + "NoteContents.csv"
try {
f = app.openForAccess(path, {writePermission:true})
app.setEof(f, {to:0})
app.write(contentsData, {to:f, as:"text"})
} catch(e){
console.log(e)
app.displayAlert(e.toString())
} finally {
app.closeAccess(f)
}
app.displayDialog('投稿記事数:' + noteCount + '件 出力完了しました。')
とりあえず動いたというレベルで、恥ずかしいコードですが公開しますので、ご意見・ご指摘をいただければ喜びます。