Claude CodeでサッカークラブのLINEお友だち数を自動取得してみた

Claude CodeでサッカークラブのLINEお友だち数を自動取得してみた

生成AIを「試したけど業務では使いこなせない」と諦めていませんか?コードを書かない私が、Claude Codeを使ってJ1全クラブのLINE友だち数を毎日自動取得する仕組みを作ってみました。AIとの具体的な向き合い方をご紹介します。
2026.07.29

BXコンサルタント兼デザインする人のたなかです。
生成AIが身近になった今、「試したし、便利だと思ったけど業務では使いこなせない」と諦めた経験はありませんか?
ふだんコードを書かない私が、Claude Codeを使って業務を自動化した実例をご紹介します。

【この記事で紹介していること】

  • エンジニアでなくても、Claude Codeを使えば「やりたいこと」を実現できる
  • AIへの具体的な指示の出し方
  • エラーが出たときの「AIとの向き合い方」

何を、なぜ取得したいのか

弊社は、東京ヴェルディさまのスポンサーをしています。その中で、「ファンがどれくらい増えているのか」を把握するため、LINE公式アカウントの「お友だち数」を定期的に取得したいと考えました。

ただ1クラブの数字だけを見ても、それが良いのか悪いのかは判断できません。
そこで、J1の全クラブと比較できるようにしたい。また、その増減が試合結果やSNSでの話題化によってどう影響されているのかを検証するには、毎日の数字が必要になります。

ただし制約もあります。LINEの公式APIを使えば友だち数を取得できますが、これは有料かつ自社アカウントの情報しか取得できません。他クラブの数字を得ることはできないため、代わりに各クラブのLINE公式アカウントページ(公開情報)から取得する方法を採用することにしました。

こうして「J1全クラブのLINE公式アカウントのお友だち数を、毎日自動で取得する仕組み」を作ることを目的としました。

用意するもの

必要なものは以下の3点です。

  • Claude Code(別のAIツールでも代用可)
  • GitHubアカウント
  • J1各クラブのLINE公式アカウントのURL一覧

GitHubアカウントの作り方については、今回は省略します。分からない場合は、それもAIに聞いてみてください。

Claude Codeへ依頼する際に渡すURL一覧については、各クラブのLINE公式アカウントページ(公開情報)のリンクをまとめたものを、CSVファイルとして用意しました。「クラブ名」と「LINE OFFICIAL ACCOUNT」の2列だけの、シンプルなファイルです。
なお、J1クラブの一覧は、Jリーグ公式サイトのクラブ情報を元に、各クラブのLINE公式アカウントURLを1つずつ確認しました。

2026年J1全20クラブ LINE公式ページ一覧.csv

クラブ名,LINE OFFICIAL ACCOUNT
鹿島アントラーズ,https://page.line.me/409edqqs
水戸ホーリーホック,https://page.line.me/915ftene
浦和レッズ,https://page.line.me/225mrgne
ジェフユナイテッド千葉,https://page.line.me/421nmayb
柏レイソル,https://page.line.me/blf5167q
FC東京,https://page.line.me/065tmwee
東京ヴェルディ,https://page.line.me/tbe6216g
FC町田ゼルビア,https://page.line.me/xat.0000188286.7y9
川崎フロンターレ,https://page.line.me/541irnhb
横浜F・マリノス,https://page.line.me/126faobh
清水エスパルス,https://page.line.me/069fjmae
名古屋グランパス,https://page.line.me/kxa1293u
京都サンガF.C.,https://page.line.me/514wpvrz
ガンバ大阪,https://page.line.me/zbh5308y
セレッソ大阪,https://page.line.me/806plzup
ヴィッセル神戸,https://page.line.me/poy9621m
ファジアーノ岡山,https://page.line.me/kat6428q
サンフレッチェ広島,https://page.line.me/tam0517s
アビスパ福岡,https://page.line.me/071mikxs
V・ファーレン長崎,https://page.line.me/192qqgja

(参照)
GitHub公式:https://github.com/
Jクラブ:https://aboutj.jleague.jp/corporate/about_jclubs/profile_jclubs/

どうClaude Codeと相談したか

用意するものが揃ったところで、実際にClaude Codeに相談してみました。
最初に伝えたのは、以下です。

J1全クラブのLINE公式アカウントのお友だち数を、毎日自動で取得する仕組みを作りたいです。クラブ名とLINE URLをまとめたCSVファイルを渡します。無料の範囲内で、自動取得する方法を教えてください

Claude Codeから返ってきたのは、LINEの公式APIを使う方法の提案でした。AIは一般的によく使われる方法から提案してくる傾向があるのかなと思いますが、管理していないクラブのAPIは取得できません。この時点では求めていた答えにはなりませんでした。
後から振り返るとこの指示には『他クラブの情報も取得したい』という重要な制約が抜けていたことが原因だとわかりました。

ここで気づいたのは、「ふんわりとした内容」だけを伝えても、今の段階のAIは一般的な解決策を提案してくるということです。
無料範囲で完結させたいこと、他クラブの情報も含めて取得したいことなど、こちらの制約や状況をきちんと伝える必要がありました。

J1全クラブのLINE公式アカウントは、お友だち数が公開されています。
まず、1つの公式ページを解析してみて「お友だち数」を取得できるか確認してください。
次にGitHub Actionsを利用して、毎日朝8:00に自動でLINE公式アカウントから各クラブの「お友だち数」を取得し、CSVファイルを貯めるPythonファイルとYAMLファイルを作成してほしい。
ファイル名の形式は「2026_J1_LINE友だち数_yyyy-mm-dd.csv」となります。

  • 使うツール(GitHub Actions)
  • 実行するタイミング(毎日8:00)
  • 生成してほしいファイルの種類(PythonファイルとYAMLファイル)
  • 出力するファイル名

これらを具体的に指定したところ、うまく進み始めました。この違いは、Claude Codeの性能の差ではなく、依頼側がどれだけ状況や制約を具体的に伝えられるかにあると感じます。例えば「無料で毎日自動実行できる方法は何がありますか?」と聞けば、AIの方から候補を提示してくれるはずです。
今回の具体的な発想はこれまでの知見に基づくものですが、知識がなくても、AIに丸ごと相談すれば十分に対応はできます。

実際にどうやったのか

Claude Codeに具体的な指示を出したところ、LINE公式アカウントのページを解析するPythonファイルと、それを毎日自動実行するためのYAMLファイル(GitHub Actionsの設定ファイル)を作成してくれました。
生成されたPythonファイルとYAMLファイルは、そのまま貼り付けて利用しました。
エンジニアリングは専門外のため、コードの正誤は判断できません。まずはClaude Codeを信じて進め、問題があれば都度修正を依頼する方針にしました。
今後もずっと運用する場合、本来であれば専門家によるレビューが望ましい場面だと思います。しかし今回はあくまでAIで『やってみた』の記録として、そのまま進めています。

collect_friends.py
import requests
import json
import re
import csv
import os
import time
from datetime import datetime, timezone, timedelta
from bs4 import BeautifulSoup

# =============================================
# クラブ名とLINE URLの対応表
# =============================================
CLUBS = [
    {"クラブ名": "鹿島アントラーズ",          "url": "https://page.line.me/409edqqs"},
    {"クラブ名": "水戸ホーリーホック",          "url": "https://page.line.me/915ftene"},
    {"クラブ名": "浦和レッズ",                "url": "https://page.line.me/225mrgne"},
    {"クラブ名": "ジェフユナイテッド千葉",      "url": "https://page.line.me/421nmayb"},
    {"クラブ名": "柏レイソル",                "url": "https://page.line.me/blf5167q"},
    {"クラブ名": "FC東京",                  "url": "https://page.line.me/065tmwee"},
    {"クラブ名": "東京ヴェルディ",             "url": "https://page.line.me/tbe6216g"},
    {"クラブ名": "FC町田ゼルビア",           "url": "https://page.line.me/xat.0000188286.7y9"},
    {"クラブ名": "川崎フロンターレ",            "url": "https://page.line.me/541irnhb"},
    {"クラブ名": "横浜F・マリノス",            "url": "https://page.line.me/126faobh"},
    {"クラブ名": "清水エスパルス",             "url": "https://page.line.me/069fjmae"},
    {"クラブ名": "名古屋グランパス",            "url": "https://page.line.me/kxa1293u"},
    {"クラブ名": "京都サンガF.C.",             "url": "https://page.line.me/514wpvrz"},
    {"クラブ名": "ガンバ大阪",                "url": "https://page.line.me/zbh5308y"},
    {"クラブ名": "セレッソ大阪",               "url": "https://page.line.me/806plzup"},
    {"クラブ名": "ヴィッセル神戸",             "url": "https://page.line.me/poy9621m"},
    {"クラブ名": "ファジアーノ岡山",            "url": "https://page.line.me/kat6428q"},
    {"クラブ名": "サンフレッチェ広島",          "url": "https://page.line.me/tam0517s"},
    {"クラブ名": "アビスパ福岡",               "url": "https://page.line.me/071mikxs"},
    {"クラブ名": "V・ファーレン長崎",          "url": "https://page.line.me/192qqgja"},
]

# =============================================
# 1クラブの友だち数を取得する関数
# =============================================
def get_friends_count(club_name, url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36"
    }

    try:
        response = requests.get(url, headers=headers, timeout=30)
        response.raise_for_status()

        soup = BeautifulSoup(response.text, "html.parser")
        script_tag = soup.find("script", id="__NEXT_DATA__")

        if not script_tag:
            print(f"  ⚠️  {club_name}: __NEXT_DATA__ が見つかりません")
            return None

        match = re.search(r'\\?"friendCount\\?":(\d+)', script_tag.string)

        if match:
            count = int(match.group(1))
            print(f"  ✅ {club_name}: {count:,} 人")
            return count
        else:
            print(f"  ⚠️  {club_name}: friendCount が見つかりません")
            return None

    except requests.exceptions.Timeout:
        print(f"  ❌ {club_name}: タイムアウト")
        return None
    except requests.exceptions.HTTPError as e:
        print(f"  ❌ {club_name}: HTTPエラー → {e}")
        return None
    except Exception as e:
        print(f"  ❌ {club_name}: 予期しないエラー → {e}")
        return None

# =============================================
# メイン処理
# =============================================
def main():
    jst = timezone(timedelta(hours=9))
    now = datetime.now(jst)
    date_str = now.strftime("%Y/%m/%d")
    filename_date = now.strftime("%Y-%m-%d")

    print("=" * 55)
    print("  Jリーグ LINE友だち数 収集開始")
    print(f"  取得日時: {now.strftime('%Y/%m/%d %H:%M')} (JST)")
    print("=" * 55)

    results = []
    success_count = 0
    fail_count = 0

    for i, club in enumerate(CLUBS, 1):
        print(f"[{i:2d}/20] {club['クラブ名']} を取得中...")

        count = get_friends_count(club["クラブ名"], club["url"])

        if count is not None:
            friends_count = count
            success_count += 1
        else:
            friends_count = ""
            fail_count += 1

        results.append({
            "クラブ名":  club["クラブ名"],
            "友だち数":  friends_count,
            "取得日":    date_str,
        })

        time.sleep(1)

    os.makedirs("data", exist_ok=True)
    filename = f"data/2026_J1_LINE友だち数_{filename_date}.csv"

    with open(filename, "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.DictWriter(f, fieldnames=["クラブ名", "友だち数", "取得日"])
        writer.writeheader()
        writer.writerows(results)

    print()
    print("=" * 55)
    print(f"  ✅ 取得成功: {success_count} クラブ")
    if fail_count > 0:
        print(f"  ❌ 取得失敗: {fail_count} クラブ(空欄で保存)")
    print(f"  💾 保存先:   {filename}")
    print("=" * 55)

    if fail_count > 0:
        print(f"\n⚠️  {fail_count}クラブの取得に失敗しました。翌日再取得されます。")

if __name__ == "__main__":
    main()

Pythonファイルの役割:各クラブのLINE公式ページには、画面には表示されていないものの、裏側のデータとして「お友だち数」の情報が埋め込まれています。そこを探し出して数字だけを取り出し、全クラブ分をまとめてCSVファイルに保存する、という処理をしています。

この手順において、わかりやすさにこだわった点があります。それは、ターミナル画面(コマンド)でのGit操作を避けたいということでした。
親切な方ほど『ここはgitのコマンドでやると早いですよ』と教えてくれます。しかし、Claude Codeとのやり取りだけで精一杯の状態で新しい知識が加わると、頭がついていかなくなることも多いものです。まずは画面操作で一通り動かしてみて、慣れてきたら応用編としてコマンド操作を学ぶ、という順番がよいかと思います。

Git操作は最初の離脱ポイントになりやすいと感じています。デザイナー歴20数年の中で、GitHubの操作で手が止まる、コンフリクトを解消できず作業が止まるケースを何度も何度も見てきました。
なお、Claude Codeに依頼すればGitHub操作自体も自動化できます。ただ、最初の一歩としては「仕組みがどう動いているか」を自分の目で確認しておくことをおすすめします。

そこで、Claude Codeにはこう伝えました。

GitHubの操作は、IT初心者に教えるように、操作についてもターミナルやコンソールでの操作ではなくWeb画面上での操作手順で教えてください。

AIは画面のどこを操作すればいいかを具体的に教えてくれます。わからない点があれば、遠慮せず聞いてみましょう。
参考に、ステップごとに紹介していきます。

STEP 1: リポジトリを作成する

linefriends_collect_img01

  1. GitHubにログインし、右上の「+」ボタン → 「New repository」をクリック
  2. 以下を入力
    • Repository name:好きな名前(例: jleague-line-friends)
    • Public または Private を選択(全公開かプライベート。仕事であれば Private が無難です)
    • 「Add a README file」にチェック
  3. 「Create repository」をクリック

STEP 2: Pythonファイルをアップロードする

linefriends_collect_img02

  1. 作成したリポジトリのトップページで「Add file」→「Upload files」をクリック
  2. お手元のPythonファイル 「collect_friends.py」をドラッグ&ドロップ、または「choose your files」から選択
  3. ページ下部の「Commit changes」欄に簡単なコメント(例: "お友だち自動取得")を入力
  4. 「Commit changes」ボタンをクリック

STEP 3: 必要なライブラリを記載する requirements.txt を作成

Pythonのライブラリ(requestsやBeautifulSoupなど)を使っている場合、これが必要です。
linefriends_collect_img03

  1. リポジトリトップで「Add file」→「Create new file」
  2. ファイル名に「 requirements.txt 」と入力
  3. 使用しているライブラリを記載
requests
beautifulsoup4
lxml
  1. 「Commit changes」をクリック

STEP 4: ワークフロー用のYAMLファイルを配置する

GitHub Actionsは .github/workflows/ というフォルダの中にYAMLファイルを置く決まりです。
linefriends_collect_img04

  1. リポジトリトップで「Add file」→「Create new file」
  2. ファイル名の入力欄に、まとめて以下をコピー&ペーストします
.github/workflows/collect_data.yml

※ スラッシュ「/」を入力すると自動でフォルダ構造が作成されます。これはITの現場でよく使われる手法で、フォルダの中にフォルダを作る「階層」構造を簡単に表現できる便利な書き方です。

  1. 書いてもらったYAMLを記載します

linefriends_collect_img05

collect_data.yml
name: Jリーグ LINE友だち数 自動収集

on:
  schedule:
    # 毎日23:15 UTC = 日本時間 8:15
    - cron: '15 23 * * *'

  # 手動実行ボタン(テスト用)
  workflow_dispatch:

jobs:
  collect:
    runs-on: ubuntu-latest

    permissions:
      contents: write

    steps:
      - name: リポジトリをチェックアウト
        uses: actions/checkout@v4

      - name: Pythonをセットアップ
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: ライブラリをインストール
        run: pip install -r requirements.txt

      - name: データを収集
        run: python scripts/collect_friends.py

      - name: CSVをGitHubにコミット・プッシュ
        run: |
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Actions Bot"
          git add data/
          git diff --staged --quiet || git commit -m "📊 データ更新: $(date +'%Y/%m/%d')"
          git push
  1. 「Commit changes」をクリック

STEP 5: 動作確認(手動実行してみる)

linefriends_collect_img06

  1. リポジトリ上部のタブから「Actions」をクリック
  2. 左側に表示されている自分でつけたワークフロー名(例: "Jリーグ LINE友だち数 自動収集")をクリック
  3. 右側に「Run workflow」というボタンが表示されるのでクリック
  4. 緑色の「Run workflow」ボタンをもう一度押すと実行開始
  5. 実行中〜完了までジョブ一覧に表示されます。クリックすると詳細ログが見られます

エラーとの向き合い方

なお、この記事に掲載しているコードは、実は最初から完璧に動いたわけではありません。実際にActionsを動かしてみると、お友だち数が空欄になる事象が発生しました。ここでは「期待通りではない挙動」を広義のエラーと捉えることにします。ここで止めずに、Claude Codeに頼るのが解決の近道です。

原因を探るため、Claude Codeに次のように伝えました。

お友だち数が空欄で返ってきます、LINE公式ページの構造をもう一度確認してもらえますか

上記を行ってもらうと、想定していたページの構造が実際とは異なっていることが分かり、お友だち登録数の取得場所が違うということがわかりました。再度コードを調整することで解決しました。
ウェブサイトの裏側ではJavaScriptなどが動いており、データの取得元を正確に指定しないとうまく取得できないことがあります。これも「AIにコードを直接見せて調査相談する」ことで解決策が見つかります。
今回の手法は、LINEさんが対象ページの構造を変えると動かなくなるという弱点もあります。動かなくなった時には、「その状況をそのままAIに伝えて再調査してもらう」という対処法自体は重要です。

時間精度の限界

もう一つ、想定外だったのが実行時刻の精度です。
当初は「毎日朝8:00に実行」と設定していましたが、実際には安定して動きませんでした。
8:00はアクセスが集中しやすい時間帯のため、実行が遅延しているのではと考え、時刻を8:03に変更してみました。

しかし、それでも状況は変わりませんでした。調べてみると、実はGitHub Actionsの無料枠では、指定した時刻に正確に実行される保証がなく、正確な時刻に実行したい場合は、外部の別ツールを使う必要がありそうです。
今回の目的は「毎日1回、数字を取得して比較する」ことだったため、数時間の誤差があっても実用上は問題ないと判断し、このまま運用することにしました。
「今の環境でできる範囲で結果を出す」という判断も大切だと感じています。もちろん厳密な時刻管理が必要な場合は別のツールも検討すべきですが、まずは動かしてみることが大切です。

まとめ

今回、Claude Codeを使って、J1全クラブのLINE公式アカウントのお友だち数を毎日自動で取得する仕組みを作ってみました。

今回のポイント

  • AIへの指示は「状況と制約」を具体的にする
    「何をしたいか」だけでなく、実行環境や希望するやり方(今回はGitHub Actionsなど)を明示することで、精度の高い回答が得られます。
  • 技術の壁は「AIへの相談」で突破する
    ターミナル操作が苦手でも、Web画面での手順をリクエストするなど、自分のスキルレベルに合わせて調整可能です。
  • エラーは「対話のチャンス」
    一度の失敗で諦めず、エラー内容や期待との乖離をAIに伝え直すことで、解決への道筋が必ず見つかります。

技術的に難しいというよりも、「何を、どう取得したいのか。最終的にどうあればよいのか」を最初にはっきりさせることの方が重要です。目的が明確であれば、あとはClaude Codeに具体的に伝えるだけで、形にすることができます。
もちろん無料でできることには限界もあります。それでも、「毎回手動で確認していた作業」がゼロ近くなることは、地味ですが確かな業務改善です。

この記事を読んで、毎週・毎月、同じような確認作業を繰り返しているものがあれば、一度考えてみてください。
ここまでやってみると、次の業務改善のイメージも見えてきます。次のアクションはいかになりそうです。

  • 取得したCSVファイルをExcelやスプレッドシートに自動で取り込み、その日の差分や異常値を検出する
  • 異常値が出た日に何があったのかを、公式SNSやニュースから自動で取得する
  • 取得した情報をスライドに落とし込む
    また同じような課題をお持ちの方や導入自体が難しいと感じる場合は、ぜひクラスメソッドへお気軽にお声がけください。

Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AI白書

関連記事