Python×GeminiでSNS運用を自動化!Xツリー生成ツールの全ソースコードと1行ずつの初心者向け解説

業務自動化・ツール

こんにちは、てつです!

全3回にわたってお届けしてきた「X(旧Twitter)ツリー自動生成ツール開発」の連載も、いよいよ今回が最終回(第3回)です!

前回、プロも開発現場で愛用する「Docker(ドッカー)」を使い、パソコンの環境を汚さずに最速でアプリを立ち上げる手法をマスターしましたね。まだ環境構築を終えていない方は、ぜひ前回の【第2回:実践編】の記事からチェックしてみてください。

今回は、ノンプログラマーの社会人やこれからIT副業で稼ぎたい初心者の方に向けて、自動化ツールの心臓部であるソースコードをすべて完全公開し、「1行ごとに」何をしているのかを変数や関数の意味を明示しながら優しく徹底的に解説します!

一見すると難しそうに見えるPythonのコードも、仕組みがわかればパズルのように楽しいものです。実務や自動化ビジネスにおいて「他の一歩リードしたアンバランスで強い人材」になるための強力な武器を、今日ここで手に入れましょう!

  1. はじめに:Python×AIでブログ投稿後のSNS運用を1分で半自動化するメリット
    1. ブログを書いてもXへの宣伝方法や要約文の作り方がわからない社会人の悩み
    2. なぜPythonとGemini APIなのか?IT副業で一歩リードする自動化のベネフィット
  2. 【ロジック公開】AIを活用したXツリー自動生成ツールが動く3つの仕組み
    1. ステップ1:ブログURLから本文を正確に抜き出す「スクレイピング」の基本
    2. ステップ2:Gemini APIと連携して「140文字×5連投」の魅力的な文章を作る
    3. ステップ3:Xの特殊な文字数制限(URLは23文字)をクリアする検証ロジック
  3. 3. Python×Geminiで動くツールの全ソースコード(テンプレート)を完全公開
    1. コピペで動く!Xツリー自動生成システムのプログラム全容
      1. ① src/scraper.py (ブログ本文の抽出担当)
      2. ② src/providers/gemini.py (AIへの指示と通信担当)
      3. ③ src/generator.py (文字数カウント&検証・自動リトライ担当)
  4. 4. 【初心者向け】変数や関数の意味がわかる!Pythonソースコード1行ずつ徹底解説
    1. ブログの本文抽出(scraper.py)を行うPythonコードの解説
    2. Gemini APIにシステムプロンプトを送信する連携コードの解説
    3. 文字数オーバーを自動判定して再生成(リトライ)をかけるコードの解説
  5. 5. プロ仕様の設計:GeminiのAPIキーの安全な管理とUX(使い心地)へのこだわり
    1. 【セキュリティ】大切なAPIキーをPythonコードに直書きしてはいけない理由
    2. 【実用的な画面設計】一括コピペを快適にするStreamlitのトースト通知
  6. 6. まとめ:PythonとAIを武器にして、今日のブログ告知からSNS運用を効率化しよう
    1. H3:連載の振り返り:Dockerによる環境構築からプログラムの仕組みまで完全攻略
    2. 【購入特典あり】ダブルクリックで即起動する完成版パッケージをBOOTHでGET
    3. 関連

はじめに:Python×AIでブログ投稿後のSNS運用を1分で半自動化するメリット

ブログを書いてもXへの宣伝方法や要約文の作り方がわからない社会人の悩み

せっかく熱を込めてブログ記事を書き上げたのに、その後の「X(旧Twitter)への告知」で力尽きてしまうこと、ありますよね。

「ブログは投稿したけれど、Xにどうやって宣伝すればいいかわからない…」 「内容を要約したものをポストしたいけれど、140文字に収める文章を考えるのが毎回面倒で時間がかかる…」

これでは、どんなに質の高いブログを書いても、SNSからのアクセスは期待できません。

成果を出しているビジネス系アカウントや副業ブログの先輩たちは、ブログの要点を「フック・要点・まとめ」の綺麗なツリー形式(スレッド投稿)でスマートに発信しています。

この「毎回手動で要約を作るストレス」を、最新テクノロジーの力でゼロにするのが今回のゴールです。

なぜPythonとGemini APIなのか?IT副業で一歩リードする自動化のベネフィット

今回のSNS運用自動化に「Python」と、Googleが開発した最先端AIの「Gemini(ジェミニ)API」を選んだのには、プロの現場でも重視される明確な理由があります。

Pythonは、Webサイトから情報を集める(スクレイピング)や、文字数の厳密な計算、AIとの連携といった「自動化ツール開発」において世界中で広く使われている標準的な言語だからです。

そしてGemini APIは、「圧倒的な処理スピード」と「格安(あるいは無料枠内)で使えるコストパフォーマンス」を誇り、個人がIT副業でツール運営を行う上で最強の味方になります。

この2つを正しく組み合わせることで、「ブログのURLを貼ってボタンを1回押すだけ」で、AIがあなたのブログを1秒で読み込み、Xに最適化された140文字×5連投のストーリーを自動生成してくれる未来が手に入ります。作業時間がグッと短縮され、属人性を排除した効率的な運用が可能になります。

【ロジック公開】AIを活用したXツリー自動生成ツールが動く3つの仕組み

プログラムの具体的な文字を見る前に、まずはこのツールが裏側でやっている「処理の手順(ロジック)」を日本語の設計図で理解しておきましょう。

単に動くだけのコピペで終わらせず、なぜこの手順を踏むのかという「Why」を知ることで、応用が効くプロレベルの知識へと昇華させることができます。

本システムは、以下のステップで厳密に制御されています。

ステップ1:ブログURLから本文を正確に抜き出す「スクレイピング」の基本

プログラムは、指定されたURLのWebページを読み込みにいきますが、ブログにはメニュー、サイドバー、広告、フッターといった「AIの要約には関係のないノイズ」がたくさん含まれています。

これらが残ったままだと、AIが広告文まで要約に含めてしまう原因になります。そのため、Pythonの便利なライブラリ(特定の機能がまとまったパック)を使い、「純粋な記事の本文テキストだけ」を狙い撃ちして綺麗に抜き出す処理を最初に行います。

ステップ2:Gemini APIと連携して「140文字×5連投」の魅力的な文章を作る

綺麗になった本文を、インターネットの通信(API)経由でGeminiに渡します。 このとき、単に「5つに分割して」と頼むと、AIは前後の繋がりがないバラバラな文章を作ってしまいます。

そのため、「1枚目は読者を引きつけるフック、2〜4枚目は具体的な要点、5枚目はブログへ誘導する行動喚起(CTA)にし、各ポストの末尾には次の投稿を読みたくなる引きの言葉(例:〜とは?👇、つづく↓)を必ず入れること」というプロ仕様のプロンプト(AIへの指示書)を裏側でセットして渡しています。

これにより、単なる分割要約ではない「1つの繋がった解説ストーリー」に仕上げます。

ステップ3:Xの特殊な文字数制限(URLは23文字)をクリアする検証ロジック

ここが実際の開発現場や自動化ビジネスでも広く使われている最も重要なポイントです。Xの文字数制限は非常に特殊で、「日本語の全角は1文字、半角英数字は0.5文字」として数えられます。

さらに、文章内に含まれるURLは、どれほど長くても短くても「一律で23文字分」としてカウントされる仕様になっています。

プログラムは、AIから返ってきた5つの文章をこのルールに沿って1文字ずつ厳密に計算し、もし140文字を1文字でも超えていた場合は、「オーバーしているからもう一度作り直して!」と自動でリトライ(最大3回)をかけ、完璧な文字数に収まったものだけを出力します。

3. Python×Geminiで動くツールの全ソースコード(テンプレート)を完全公開

コピペで動く!Xツリー自動生成システムのプログラム全容

ツールの根幹をなすPythonプログラムをすべて完全公開します。これらは実際の製品版でも使用されている、効率化と拡張性を両立したテンプレートです。 今回は、先ほど解説した3つのステップ(スクレイピング、Gemini連携、文字数検証と自動リトライ)を司る重要な3つのファイルの中身を掲載します。

① src/scraper.py (ブログ本文の抽出担当)

② src/providers/gemini.py (AIへの指示と通信担当)

③ src/generator.py (文字数カウント&検証・自動リトライ担当)

4. 【初心者向け】変数や関数の意味がわかる!Pythonソースコード1行ずつ徹底解説

プログラムのコードブロックをただ見るだけでは、「英語の呪文」のように感じてしまいますよね。 プログラミング学習中の方に向けて、それぞれのファイルが何をしているのか1行ずつ完全に分解して解説します。変数(データを一時的に保存する箱)や関数(特定の処理のまとまり)の意味をスッキリ理解して、AI自動化のロジックをマスターしましょう!

ブログの本文抽出(scraper.py)を行うPythonコードの解説

このプログラムは、インターネット上から目的のブログ記事データを安全にダウンロードし、不要なコードを削ぎ落とす仕事をしています。

  • import requests
    👉 requests という、「Pythonにインターネット上のWebページをダウンロードさせるための機能パック」を読み込んでいます。
  • from trafilatura import extract
    👉 trafilatura という、「ダウンロードしたHTMLデータから、本文(テキスト)だけをAIのように賢く見つけて抜き出す特化機能」から、extract(抽出)という関数を呼び出しています。
  • def fetch_blog_content(url: str) -> str:
    👉 fetch_blog_content という名前の処理のまとまり(関数)を定義しています。
    (url: str) は「ブログのURL(文字データ)を1つ教えてね」という意味で、-> str は「最終的にきれいに抜いた本文テキスト(文字データ)を結果として返すよ」という設計図です。
  • headers = { ... }
    👉 headers という名前のデータの箱(辞書型)を作っています。中身の "User-Agent" は、「プログラムからの自動アクセスではなく、普通のGoogle Chromeブラウザからアクセスしていますよ」と、ブログ側のサーバーに伝えるためのプロ仕様の変装用データです。
    これがないと、セキュリティブロックに引っかかりエラーになることがあります。
  • try:
    👉 「今からエラーが起きるかもしれない処理(ネットワーク通信など)に挑戦するよ」という合図です。
  • response = requests.get(url, headers=headers, timeout=10)
    👉 先ほど読み込んだ機能を使って、指定されたURLのブログデータを実際に取得し、response という箱に保存しています。
    timeout=10 は「もし相手のサイトが重くて10秒経っても反応がなければ諦める」という、プログラムをフリーズさせないための配慮です。
  • response.raise_for_status()
    👉 もし入力されたURLが間違っていたり(404エラーなど)、サイトが落ちていた場合に、ここでわざとエラーを発生させて処理を中断する命令です。
  • html_content = response.text
    👉 ダウンロードしたデータの中から、Webページのソースコード(HTML文字データ)だけを取り出して、html_content という箱に入れています。
  • text = extract(html_content, include_comments=False, include_tables=True)
    👉 本文抽出機能にHTMLを渡し、コメント欄(include_comments=False)は無視し、記事内の表(include_tables=True)は含める形で、純粋な本文だけを抜き出して text に入れています。
  • if not text:
    👉 「もし本文が何も抜けなくて、空っぽだったら」という条件分岐のチェックです。
  • raise ValueError("本文の抽出に失敗しました。サイトの構造を確認してください。")
    👉 空っぽだった場合に、「URLは合っているけれど中身が取れなかったよ」というエラーメッセージを自分で作って発生させています。
  • return text
    👉 綺麗に抽出できた本文テキストを、この関数を呼び出した次の処理に「はい、どうぞ」と渡して終了します。
  • except Exception as e:
    👉 try の中で通信エラーやその他の予期せぬトラブルが発生した場合、ここでそのエラー内容(e)をキャッチします。
  • raise RuntimeError(f"スクレイピング中にエラーが発生しました: {str(e)}")
    👉 キャッチした原因をわかりやすい日本語のメッセージに整形して、画面やログへ報告します。

Gemini APIにシステムプロンプトを送信する連携コードの解説

ここでは、抽出した本文をGoogleのAI「Gemini」に送信し、完璧なX用スレッドの形(JSONという、プログラムが処理しやすい綺麗に整理された並びデータ)で出力させる命令を行っています。

  • import google.generativeai as genai
    👉 Googleが公式に提供している「Gemini APIと通信して会話するための機能パック」を、プログラム内で genai という短い名前で使えるように読み込んでいます。
  • import json
    👉 AIから返ってきたテキストデータ(JSON文字列)を、Pythonのプログラムがそのまま部品として扱える配列データに変換するための機能パックを読み込んでいます。
  • def generate_x_thread_via_gemini(api_key: str, blog_text: str, blog_url: str) -> list:
    👉 generate_x_thread_via_gemini という関数を作っています。動かすには「あなたのGeminiのAPIパスワード(api_key)」「ブログの本文(blog_text)」「ブログのリンク(blog_url)」の3つが必要で、最後に「5つに分かれたポストのリスト(配列データ)」を返します。
  • genai.configure(api_key=api_key)
    👉 渡されたAPIキーを使って、Googleのサーバーに「これから私の個人アカウントで接続します」と認証を通す設定を行っています。
  • model = genai.GenerativeModel("gemini-1.5-flash")
    👉 今回使用するAIのモデルとして、スピードとコストのバランスが最強な 「gemini-1.5-flash」 を指定し、model という名前の箱に入れています。
  • system_prompt = f""" ... """
    👉 AIに対する「役割」「構成ルール」「出力フォーマット」を細かく指定したシステムプロンプト(前提指示)を、巨大な文字の箱として作っています。
    ここでは、読者がタイムラインで読みたくなる「ストーリー展開」や、離遅を防ぐための「ポスト末尾の引きの言葉」の義務付け、URLを挿入するための目印([URL_PLACEHOLDER])の配置を厳密に命令しています。
  • prompt = f"【ブログ本文】\n{blog_text}"
    👉 AIに実際に要約してほしいターゲットである、抽出済みのブログ本文を prompt という箱に入れています。
  • response = model.generate_content( ... )
    👉 ここで実際にGoogleのAIサーバーにデータを送信し、要約文の生成をリクエストして、返ってきた結果を response に格納しています。system_instruction にさっきの厳しい指示書を渡し、temperature=0.7 で「真面目すぎず、自然な文章表現」に設定し、response_mime_type="application/json" で「必ずプログラムが読みやすいJSONというフォーマットで返してね」と強制しています。
  • try:
    👉 AIから返ってきたテキストを無事に処理できるか、エラー検証の構文に入ります。
  • posts_data = json.loads(response.text)
    👉 AIが返してきたただの「文字データ」を、Pythonが「1枚目、2枚目…」とバラバラに認識できるリストのデータ形式に変換して posts_data に入れています。
  • return posts_data
    👉 綺麗に構造化された5ツイート分のデータを次の処理に返します。
  • except Exception as e:
    👉 万が一、AIが指定された通りの綺麗なデータ形式で返してくれなかった場合、ここで不具合を捕まえます。
  • raise ValueError(f"Geminiからの応答が正しいJSON形式ではありませんでした: {response.text}")
    👉 エラーが起きたことを、AIが返してきた生データの内容とともに開発者に報告します。

文字数オーバーを自動判定して再生成(リトライ)をかけるコードの解説

このファイルは、AIが作った文章が「本当にXに投稿できる文字数(140文字以内)になっているか」をプロと同じ厳格なルールで判定し、ダメなら自動でやり直させる、ツールの品質管理センターです。

  • def count_x_characters(text: str) -> float:
    👉 X専用の文字数カウンター関数を定義しています。Xは文字数を「0.5文字単位」で計算するため、小数点が扱える float(浮動小数点数)というデータの形で結果を返します。
  • count = 0.0
    👉 文字数を数えるためのカウンターを、最初は「0.0文字」で初期化してリセットしています。
  • for char in text:
    👉 送られてきた文章から、「1文字ずつ」文字を取り出して、以下のチェックを繰り返します(ループ処理)。
  • if re.match(r'[^\x01-\x7EヴヵヶΑ-Ωα-ωА-Яа-яー]', char):
    👉 難しい記号が見えますが、これは「正規表現」という技術です。「今取り出した1文字(char)が、日本語のひらがな・漢字・カタカナなどの全角文字かどうか」を判定しています。
  • count += 1.0
    👉 全角文字だと判定された場合は、カウンターに「1.0」を足します。
  • else: count += 0.5
    👉 それ以外(半角の英数字やスペース、記号など)の場合は、カウンターに「0.5」を足します。
  • return count
    👉 すべての文字を数え終わったら、合計の文字数を返します。
  • def pipeline_generate_and_validate(api_key: str, blog_text: str, blog_url: str) -> list:
    👉 ツール全体のメイン制御を行う「パイプライン(一連の自動作業ライン)」の関数を定義しています。
  • max_retries = 3
    👉 AIの文章が文字数を超えていた場合に、「最大で3回まで自動で作り直させる」という上限数を設定しています。
  • for attempt in range(1, max_retries + 1):
    👉 attempt(試行回数)を1回目、2回目、3回目と数えながら、以下の処理を繰り返します。
  • raw_posts = generate_x_thread_via_gemini(api_key, blog_text, blog_url)
    👉 さっき解説したGeminiの関数を呼び出し、AIに5つのスレッド文章を一度作ってもらいます。
  • validated_posts = [] / all_ok = True
    👉 文字数チェックを無事にクリアした合格済みのポストを入れるための空の箱(validated_posts)を用意し、合格フラグ(all_ok)を「最初はすべて成功している(True)」と仮定してセットします。
  • for post in raw_posts:
    👉 AIが作ってくれた5つのポストを、1つずつ取り出して厳しい検査を行います。
  • content = post["content"]
    👉 ポストの中から、ツイートの本文テキストを取り出します。
  • if "[URL_PLACEHOLDER]" in content:
    👉 もし5枚目のポストに、URLを入れるための目印(プレースホルダー)を見つけたら、
  • content = content.replace("[URL_PLACEHOLDER]", blog_url)
    👉 その目印を、あなたが最初に入力した「実際のブログURL」に綺麗に置き換えます(リプレイス処理)。
  • temp_text_for_count = content
    👉 文字数を正しく数えるため、一時的な計算用の文字の箱を作ります。
  • if blog_url in temp_text_for_count:
    👉 「もし文章の中に実際のブログのURLが含まれていたら」という条件判定です。
  • temp_text_for_count = temp_text_for_count.replace(blog_url, "あ" * 23)
    👉 ここが最大のプロの技です! Xの仕様上、どんな長さのURLもタイムライン上では「一律で23文字分」として計算されるため、文字数カウントを行う前に、URLの部分を一時的に「あ」という全角文字23個分(23文字)に強制置換して、Xのサーバーと全く同じ文字数環境を再現しています。
  • total_chars = count_x_characters(temp_text_for_count)
    👉 X仕様に完全対応した、合計の文字数を計算します。
  • if total_chars > 140.0:
    👉 「もし計算した文字数が、Xの上限である140文字を1文字でも超えていたら」という不合格判定です。
  • all_ok = False / break
    👉 合格フラグを「不合格(False)」に書き換え、残りのポストの検査をすべて中止して、ただちにこの回のチェックを脱出(break)します。
  • validated_posts.append({ ... })
    👉 140文字以内に収まって検査に合格したポストは、文字数データ(char_count)を添えて、合格箱へ綺麗に追加(append)していきます。
  • if all_ok: / return validated_posts
    👉 もし5つのポストがすべて140文字の審査を一発クリア(またはリトライでクリア)していれば、「完璧です!」とシステムが判断し、自動生成された完璧なスレッドデータを画面に出力して処理を無事成功で完了します。
  • raise RuntimeError("最大リトライ回数を超えましたが...")
    👉 3回やり直してもどうしても140文字以下に収まらなかった場合、処理を安全に停止させ、ユーザーに通知します(※実際の開発環境ではGeminiの精度が高いため、ほぼ1〜2回目でクリアして終了します)。

5. プロ仕様の設計:GeminiのAPIキーの安全な管理とUX(使い心地)へのこだわり

自動化ツールは「ただ動けばいい」というものではありません。副業として将来ツールを販売したり、実務で他のメンバーに配布したりするレベル(実務・商用レベル)に達するには、セキュリティと使い心地(UX)への深いこだわりが必要です。

【セキュリティ】大切なAPIキーをPythonコードに直書きしてはいけない理由

プログラミング初心者が最もやってしまいがちな致命的なミスは、プログラムの中に自分のGeminiのパスワード(APIキー)を直接文字で書いてしまうことです。

もしその状態のままプログラムをGitHubなどのインターネット上に公開したり、他人に配布したりすると、あなたのAPIキーが盗まれ、他人に勝手にAIを使われて高額な請求が届く恐怖のリスクがあります。

そのため、本ツールではキーをプログラムに直書きせず、.env(ドットエンブ)という「設定専用の隠しファイル」に切り離して保存する、開発現場の標準スタイルを採用しています。

ツール起動時に、プログラムがこのファイルを自動的に見にいき、安全にパスワードを読み込むため、ソースコードを誰に見せても安全な設計になっています。

【実用的な画面設計】一括コピペを快適にするStreamlitのトースト通知

毎日使う自動化ツールだからこそ、画面の使いやすさ(UX)にも魂を込めました。

操作画面(GUI)の構築には、Pythonで最も人気のあるライブラリ 「Streamlit(ストリームリット)」 を採用しています。

さらに、シックで高級感のある「シャンパンゴールド & ディープチャコール」のデザインテーマをCSS(デザイン調整コード)で注入し、絵文字を一切排除した洗練されたUIに仕上げました。

AIが生成した5つのポストのプレビュー画面の上部には、「COPY ALL POSTS(すべてのポストを一括コピー)」というボタンを配置。これを押すと、Xのスレッドにそのまま貼り付けられるように、自動的に区切り線(---)がついた状態でクリップボードに全コピーされます。

多くの簡易ツールでは、コピーが完了したときにブラウザの画面中央に「コピーしました」という無骨なポップアップが出て、OKボタンを押すまで画面の操作がロックされてしまいます。

しかし本ツールでは、画面の動きを一切邪魔しない、フェードイン・フェードアウト式の小さなトースト通知(画面右下にふわっと現れて2秒で消える通知)をオリジナルで実装しています。この細かな配慮が、作業をノンストップで快適に進めるためのプロのこだわりです

6. まとめ:PythonとAIを武器にして、今日のブログ告知からSNS運用を効率化しよう

H3:連載の振り返り:Dockerによる環境構築からプログラムの仕組みまで完全攻略

全3回の連載、本当にお疲れ様でした!

  • 第1回で、手作業の要約から解放される「SNS運用の自動化」の理想の未来を描き、
  • 第2回で、プロと同じ「Dockerコンテナ」を使い、パソコンの環境を汚さずにエラーを回避して最速で環境を立ち上げる手法を学び、
  • 第3回である今回、Pythonがどうやってブログの本文を抜き出し、Geminiと通信し、Xの特殊な文字数をミリ単位で検証しているかという「ソースコードの全容」と「ロジック」を完全にマスターしました。

ここまで読み進めたあなたは、単なる「コピペでツールを使う人」ではなく、プログラムの裏側の意図まで理解した、実務でも副業でも圧倒的に強い「特化したアンバランスな人材」への大きな一歩を踏み出しています。

【購入特典あり】ダブルクリックで即起動する完成版パッケージをBOOTHでGET

「仕組みはよく分かった!でも、自分でコードを1からファイルに貼り付けて環境を作るのは少しハードルが高い…」 「すぐに使える、デザインされた美しい画面の完成品が今すぐ欲しい!」

そんな方のために、今回解説したすべてのソースコード、Docker構成ファイル、そして「パソコンにPythonやDockerが入っていなくても、ダブルクリックするだけで独立したデスクトップアプリとして起動するWindows専用の実行ファイル(.exe形式パッケージ)」を一つにまとめた【完成版フルパッケージ】を、資産運用や副業の第一歩を応援する特別価格でBOOTHにて販売開始しました!

ワンクリックであなたのPCに極上のシャンパンゴールドの自動化環境が現れ、今日のブログ投稿からSNSの告知作業が「わずか5秒」で完了するようになります。

作業効率を極限まで高め、自由な時間と副業の成果を最速で手に入れたい方は、ぜひ以下のリンクから手に入れてみてください!

👉 【実務レベル】ブログ記事からX告知スレッドを一瞬で自動生成!完成版パッケージ(Windows.exe&Docker対応版)の商品ページはこちら(BOOTH)

あなたのブログ運営とIT副業のライフスタイルが、テクノロジーの力でより豊かになることを応援しています!また次回の自動化記事でお会いしましょう!

それでは、次回の最終回もお楽しみに。てつでした!

コメント

タイトルとURLをコピーしました