[わ]

note記事をとってくるようにしてみた

note記事をとってくるようにしてみた

どうするとブログを書くのが楽になるのかなぁというを考えていました。

とりあえず、流行りのAIを使ってサクッとnoteのRSSから記事を作成するようにしてみました。

投稿数が一気に増えてしっかり更新している人みたいになりました。

今回のコードは限りなくCursorに書いてもらったものになります。

ymlの方は雑に微調整しましたが、jsの方は完全に手を入れていないコードです。

画像とかどうなるんだろう?というぎもんがあるんですが、とりあえず、動いているのでいつか直すということでみなかったことにします。

name: フィードを取得してマークダウンに変換

on:
  schedule:
    - cron: "0 * * * *" # 毎時実行
  workflow_dispatch: # 手動実行用

jobs:
  fetch-and-convert:
    runs-on: ubuntu-latest
    steps:
      - name: リポジトリをチェックアウト
        uses: actions/checkout@v4

      - name: Node.jsをセットアップ
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: 必要なパッケージをインストール
        run: npm install rss-parser turndown

      - name: RSSフィードを取得してマークダウンに変換
        run: |
          node .github/scripts/fetch-rss.js          

      - name: 変更があるか確認
        id: check_changes
        run: |
          git diff --quiet content/blog || echo "changes=true" >> $GITHUB_OUTPUT          

      - name: ブランチを作成
        if: steps.check_changes.outputs.changes == 'true'
        run: |
          git config --global user.name 'GitHub Action'
          git config --global user.email '[email protected]'
          BRANCH_NAME="rss-feed-update-$(date +%Y%m%d-%H%M%S)"
          git checkout -b $BRANCH_NAME
          git add content/blog/
          git commit -m "RSSフィードから新しい記事を追加"
          git push origin $BRANCH_NAME
          echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT          
        id: create_branch

      - name: Pull Requestを作成
        if: steps.check_changes.outputs.changes == 'true'
        uses: peter-evans/create-pull-request@v7
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          commit-message: RSSフィードから新しい記事を追加
          title: RSSフィードから新しい記事を追加
          body: |
            このPRはRSSフィードから自動的に生成された新しい記事を追加します。            
          branch: ${{ steps.create_branch.outputs.branch_name }}
          base: main
const fs = require('fs');
const path = require('path');
const Parser = require('rss-parser');
const TurndownService = require('turndown');

const parser = new Parser({
    customFields: {
        item: [
            ['content:encoded', 'content']
        ]
    }
});

const turndownService = new TurndownService({
    headingStyle: 'atx',
    codeBlockStyle: 'fenced'
});

// 画像のURLを保持するように設定
turndownService.keep(['img']);

async function fetchAndConvert() {
    try {
        const feed = await parser.parseURL('https://wtr.io/rss?f=full_text');

        for (const item of feed.items) {
            // リンクからファイル名を生成
            const urlPath = new URL(item.link).pathname;
            const pathSegments = urlPath.split('/');
            const fileName = pathSegments[pathSegments.length - 1] + '.md';
            const filePath = path.join('content', 'blog', fileName);

            // ファイルが既に存在する場合はスキップ
            if (fs.existsSync(filePath)) {
                console.log(`ファイルは既に存在します: ${fileName}`);
                continue;
            }

            // 日付をフォーマット
            const pubDate = new Date(item.pubDate);
            const formattedDate = pubDate.toISOString().split('T')[0];

            // HTMLをマークダウンに変換
            const content = item.content || item.description;
            const markdown = turndownService.turndown(content);

            // 指定されたテンプレートに従ってマークダウンファイルを作成
            const fileContent = `+++
title = "${item.title}"
date = "${formattedDate}"
tags = ["note"]
canonicalUrl = "${item.link}"
+++

${markdown}
`;

            fs.writeFileSync(filePath, fileContent);
            console.log(`新しいファイルを作成しました: ${fileName}`);
        }
    } catch (error) {
        console.error('エラーが発生しました:', error);
        process.exit(1);
    }
}

fetchAndConvert();

#misc #GithubAction