{
"$type": "site.standard.document",
"content": [
{
"$type": "app.myblog.markdown",
"lang": "ja",
"markdown": "# note記事をとってくるようにしてみた\n\nどうするとブログを書くのが楽になるのかなぁというを考えていました。\n\nとりあえず、流行りのAIを使ってサクッとnoteのRSSから記事を作成するようにしてみました。\n\n投稿数が一気に増えてしっかり更新している人みたいになりました。\n\n今回のコードは限りなくCursorに書いてもらったものになります。\n\nymlの方は雑に微調整しましたが、jsの方は完全に手を入れていないコードです。\n\n画像とかどうなるんだろう?というぎもんがあるんですが、とりあえず、動いているのでいつか直すということでみなかったことにします。\n\n```yaml\nname: フィードを取得してマークダウンに変換\n\non:\n schedule:\n - cron: \"0 * * * *\" # 毎時実行\n workflow_dispatch: # 手動実行用\n\njobs:\n fetch-and-convert:\n runs-on: ubuntu-latest\n steps:\n - name: リポジトリをチェックアウト\n uses: actions/checkout@v4\n\n - name: Node.jsをセットアップ\n uses: actions/setup-node@v4\n with:\n node-version: \"20\"\n\n - name: 必要なパッケージをインストール\n run: npm install rss-parser turndown\n\n - name: RSSフィードを取得してマークダウンに変換\n run: |\n node .github/scripts/fetch-rss.js\n\n - name: 変更があるか確認\n id: check_changes\n run: |\n git diff --quiet content/blog || echo \"changes=true\" >> $GITHUB_OUTPUT\n\n - name: ブランチを作成\n if: steps.check_changes.outputs.changes == 'true'\n run: |\n git config --global user.name 'GitHub Action'\n git config --global user.email 'action@github.com'\n BRANCH_NAME=\"rss-feed-update-$(date +%Y%m%d-%H%M%S)\"\n git checkout -b $BRANCH_NAME\n git add content/blog/\n git commit -m \"RSSフィードから新しい記事を追加\"\n git push origin $BRANCH_NAME\n echo \"branch_name=$BRANCH_NAME\" >> $GITHUB_OUTPUT\n id: create_branch\n\n - name: Pull Requestを作成\n if: steps.check_changes.outputs.changes == 'true'\n uses: peter-evans/create-pull-request@v7\n with:\n token: ${{ secrets.GITHUB_TOKEN }}\n commit-message: RSSフィードから新しい記事を追加\n title: RSSフィードから新しい記事を追加\n body: |\n このPRはRSSフィードから自動的に生成された新しい記事を追加します。\n branch: ${{ steps.create_branch.outputs.branch_name }}\n base: main\n```\n\n```jsx\nconst fs = require('fs');\nconst path = require('path');\nconst Parser = require('rss-parser');\nconst TurndownService = require('turndown');\n\nconst parser = new Parser({\n customFields: {\n item: [\n ['content:encoded', 'content']\n ]\n }\n});\n\nconst turndownService = new TurndownService({\n headingStyle: 'atx',\n codeBlockStyle: 'fenced'\n});\n\n// 画像のURLを保持するように設定\nturndownService.keep(['img']);\n\nasync function fetchAndConvert() {\n try {\n const feed = await parser.parseURL('https://wtr.io/rss?f=full_text');\n\n for (const item of feed.items) {\n // リンクからファイル名を生成\n const urlPath = new URL(item.link).pathname;\n const pathSegments = urlPath.split('/');\n const fileName = pathSegments[pathSegments.length - 1] + '.md';\n const filePath = path.join('content', 'blog', fileName);\n\n // ファイルが既に存在する場合はスキップ\n if (fs.existsSync(filePath)) {\n console.log(`ファイルは既に存在します: ${fileName}`);\n continue;\n }\n\n // 日付をフォーマット\n const pubDate = new Date(item.pubDate);\n const formattedDate = pubDate.toISOString().split('T')[0];\n\n // HTMLをマークダウンに変換\n const content = item.content || item.description;\n const markdown = turndownService.turndown(content);\n\n // 指定されたテンプレートに従ってマークダウンファイルを作成\n const fileContent = `+++\ntitle = \"${item.title}\"\ndate = \"${formattedDate}\"\ntags = [\"note\"]\ncanonicalUrl = \"${item.link}\"\n+++\n\n${markdown}\n`;\n\n fs.writeFileSync(filePath, fileContent);\n console.log(`新しいファイルを作成しました: ${fileName}`);\n }\n } catch (error) {\n console.error('エラーが発生しました:', error);\n process.exit(1);\n }\n}\n\nfetchAndConvert();\n```"
}
],
"path": "/blog/3mmcuyffkyaet",
"publishedAt": "2025-02-28T00:00:00Z",
"site": "https://wtr.app",
"tags": [
"misc",
"GithubAction"
],
"textContent": "note記事をとってくるようにしてみた\n\nどうするとブログを書くのが楽になるのかなぁというを考えていました。\n\nとりあえず、流行りのAIを使ってサクッとnoteのRSSから記事を作成するようにしてみました。\n\n投稿数が一気に増えてしっかり更新している人みたいになりました。\n\n今回のコードは限りなくCursorに書いてもらったものになります。\n\nymlの方は雑に微調整しましたが、jsの方は完全に手を入れていないコードです。\n\n画像とかどうなるんだろう?というぎもんがあるんですが、とりあえず、動いているのでいつか直すということでみなかったことにします。\n\nname: フィードを取得してマークダウンに変換\n\non:\n schedule:\n - cron: \"0 * * * *\" # 毎時実行\n workflow_dispatch: # 手動実行用\n\njobs:\n fetch-and-convert:\n runs-on: ubuntu-latest\n steps:\n - name: リポジトリをチェックアウト\n uses: actions/checkout@v4\n\n - name: Node.jsをセットアップ\n uses: actions/setup-node@v4\n with:\n node-version: \"20\"\n\n - name: 必要なパッケージをインストール\n run: npm install rss-parser turndown\n\n - name: RSSフィードを取得してマークダウンに変換\n run: |\n node .github/scripts/fetch-rss.js\n\n - name: 変更があるか確認\n id: check_changes\n run: |\n git diff --quiet content/blog || echo \"changes=true\" >> $GITHUB_OUTPUT\n\n - name: ブランチを作成\n if: steps.check_changes.outputs.changes == 'true'\n run: |\n git config --global user.name 'GitHub Action'\n git config --global user.email 'action@github.com'\n BRANCH_NAME=\"rss-feed-update-$(date +%Y%m%d-%H%M%S)\"\n git checkout -b $BRANCH_NAME\n git add content/blog/\n git commit -m \"RSSフィードから新しい記事を追加\"\n git push origin $BRANCH_NAME\n echo \"branch_name=$BRANCH_NAME\" >> $GITHUB_OUTPUT\n id: create_branch\n\n - name: Pull Requestを作成\n if: steps.check_changes.outputs.changes == 'true'\n uses: peter-evans/create-pull-request@v7\n with:\n token: ${{ secrets.GITHUB_TOKEN }}\n commit-message: RSSフィードから新しい記事を追加\n title: RSSフィードから新しい記事を追加\n body: |\n このPRはRSSフィードから自動的に生成された新しい記事を追加します。\n branch: ${{ steps.create_branch.outputs.branch_name }}\n base: main\n\nconst fs = require('fs');\nconst path = require('path');\nconst Parser = require('rss-parser');\nconst TurndownService = require('turndown');\n\nconst parser = new Parser({\n customFields: {\n item: [\n ['content:encoded', 'content']\n ]\n }\n});\n\nconst turndownService = new TurndownService({\n headingStyle: 'atx',\n codeBlockStyle: 'fenced'\n});\n\n// 画像のURLを保持するように設定\nturndownService.keep(['img']);\n\nasync function fetchAndConvert() {\n try {\n const feed = await parser.parseURL('https://wtr.io/rss?f=full_text');\n\n for (const item of feed.items) {\n // リンクからファイル名を生成\n const urlPath = new URL(item.link).pathname;\n const pathSegments = urlPath.split('/');\n const fileName = pathSegments[pathSegments.length - 1] + '.md';\n const filePath = path.join('content', 'blog', fileName);\n\n // ファイルが既に存在する場合はスキップ\n if (fs.existsSync(filePath)) {\n console.log(`ファイルは既に存在します: ${fileName}`);\n continue;\n }\n\n // 日付をフォーマット\n const pubDate = new Date(item.pubDate);\n const formattedDate = pubDate.toISOString().split('T')[0];\n\n // HTMLをマークダウンに変換\n const content = item.content || item.description;\n const markdown = turndownService.turndown(content);\n\n // 指定されたテンプレートに従ってマークダウンファイルを作成\n const fileContent = `+++\ntitle = \"${item.title}\"\ndate = \"${formattedDate}\"\ntags = [\"note\"]\ncanonicalUrl = \"${item.link}\"\n+++\n\n${markdown}\n`;\n\n fs.writeFileSync(filePath, fileContent);\n console.log(`新しいファイルを作成しました: ${fileName}`);\n }\n } catch (error) {\n console.error('エラーが発生しました:', error);\n process.exit(1);\n }\n}\n\nfetchAndConvert();",
"title": "note記事をとってくるようにしてみた",
"updatedAt": "2026-05-20T21:47:07Z"
}