商品サンプル画像
タカラトミー ホンダ シビック TYPE R トミカ55周年記念仕様
商品ページ
Amazon
収益広告(自動登録)
商品サンプル画像
BANDAI SPIRITS(バンダイ スピリッツ) HG 機動戦士Gundam GQuuuuuuX 軽キャノン 1/144スケール 色分け済みプラモデル
商品ページ
Amazon
収益広告(自動登録)
商品サンプル画像
『ToHeart』プレミアムエディション -Steam 【特典】TVアニメ『ToHeart』Blu-ray Disc(全13話・2枚組)同梱
商品ページ
Amazon
収益広告(手動登録)
商品サンプル画像
ホットウィール(Hot Wheels) ベーシックカー フェラーリ SF90 ストラダーレ 乗り物おもちゃ ミニカー 3歳から レッド JFN28
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
商品サンプル画像
【公式グッズ】IdentityV 第五人格 IJLカード 2024年秋シーズン コレクションカード 1BOX(16パック・112枚) 出場選手カード収録・全12種レアリティ・出場選手カード・記念コレクション向け 1BOX(ボックス)
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
記事の概要
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
作成日:2024-10-06
最終更新日:2024-10-13
記事の文字数:7584
情報技術情報技術-WebAPIプログラミング
本記事のトピック
  • 概要
  • Pythonのバージョンと必要なモジュール
  • Twitter(X)のコード
  • Misskeyのコード
  • Mastodonのコード
  • Blueskyのコード
  • Blueskyのコードの解説
  • ツイート一元化コード
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
概要
概要
SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。
それぞれのSNSについて、認証とツイートのコードは分けています。
コードの個別の解説はしないですが、大体以下の流れです。
①認証を行う
②ツイートを行う(連続してツイートすると前のツイートにリプライする形でツイートする)
一元化したPythonコードは一番最後に記載しています。
命名規則は気にしないでください
Pythonのバージョンと必要なモジュール
Pythonのバージョンは「3.11.0」です。
使っているもずーるは以下です(コロンより後はボクが使っているバージョンです)。
tweepy(Twitter用):4.12.0
misskey(Misskey用):4.1.0
mastodon(Mastodon用):1.8.1
atproto(Bluesky用):0.0.54
各リンクからそのモジュールのリファレンスが見られるはずです
Twitter(X)のコード
認証用コード
def CreateTwitterInstance(): twitterClient = tweepy.Client( bearer_token = TWITTER_BEARER_TOKEN, consumer_key = TWITTER_API_KEY, consumer_secret = TWITTER_API_SECRET, access_token = TWITTER_ACCESS_TOKEN, access_token_secret = TWITTER_ACCESS_TOKEN_SECRET )
ツイート用コード
def CreateTwitterTweet(message): if twitterParentTweetId != '': tweet = twitterClient.create_tweet(text=message, in_reply_to_tweet_id=twitterParentTweetId) else: tweet = twitterClient.create_tweet(text=message) twitterParentTweetId = tweet.data['id']
Misskeyのコード
認証用コード
def CreateMisskeyInstance(): misskeyClient = Misskey(MISSKEY_SERVER_NAME, i=MISSKEY_ACCESS_TOKEN)
ツイート用コード
def CreateMisskeyTweet(message): if misskeyParentTweetId != '': misskeyRet = misskeyClient.notes_create(text=message, reply_id=misskeyParentTweetId) else: misskeyRet = misskeyClient.notes_create(text=message) misskeyParentTweetId = misskeyRet['createdNote']['id']
Mastodonのコード
認証用コード
def CreateMastodonInstance(): mastodonClient = Mastodon( api_base_url = MASTODON_SERVER_URL, client_id = MASTODON_CLIENT_ID, client_secret = MASTODON_CLIENT_SECRET, access_token = MASTODON_ACCESS_TOKEN )
ツイート用コード
def CreateMastodonTweet(message): if mastodonParentTweetId != '': mastodonRet = mastodonClient.status_post(message, in_reply_to_id=mastodonParentTweetId) else: mastodonRet = mastodonClient.status_post(message) mastodonParentTweetId = mastodonRet['id']
Blueskyのコード
認証用コード
def CreateBlueskyInstance(): blueskyClient = Bluesky() blueskyClient.login(BLUESKY_LOGIN_ID, BLUESKY_LOGIN_PW)
ツイート用コード
def CreateBlueskyTweet(message): # 送信用のメッセージ作成 text_builder = BlueskyUtils.TextBuilder() messageArray = re.split(r'(https?://[^\s]+|#[^\s]+)', message) # 正規表現を使って「#」と「https://」で文字列を区切る for msg in messageArray: if msg.startswith("#"): text_builder.tag(msg, msg.lstrip("#")) elif msg.startswith("https://") or msg.startswith("http://"): text_builder.link(msg, msg) else: text_builder.text(msg) # ツイート実行 blueskyRet = None if blueskyParentTweet != None: blueskyRet = blueskyClient.send_post( text=text_builder, reply_to={ "parent": { "uri": blueskyParentTweet["uri"], "cid": blueskyParentTweet["cid"] }, "root": { "uri": blueskyRootTweet["uri"], "cid": blueskyRootTweet["cid"] } } ) else: blueskyRet = blueskyClient.send_post(text=text_builder) blueskyRootTweet = blueskyRet blueskyParentTweet = blueskyRet
Blueskyのコードの解説
TextBuilderについて
Blueskyは送ったテキスト内のURLやタグが自動でリンク化されません。
そのため、TextBuilderというものを使ってURLやタグを明示的に指定する必要があります。
本コード内では、通常のテキスト・URL・タグをsplitしてそこからTextBuilderを作っています。
reply-toについて
Blueskyのコードも、他のSNSと同じで前のツイートからリプライするような実装になっているのですが、「reply_to」の値がちょっと複雑です。
なぜかは知りませんが、Blueskyのツイートはリプライのツイートだけでなく、そのツリーの一番上のツイートまで指定しないといけないらしくこのような作りになっています。
(parent→リプライ元のツイート / root→そのツリーの一番上のツイート)
ツイート一元化コード
以下が一元化したクラスです。
定数は自身の認証情報を入力してください。
Twitterはアクセストークンの発行に手続きが必要です。
MisskeyとMastodonはWeb上のユーザ設定等から発行できます。
Blueskyは普通にログインIDとパスワードで入れます。
# パッケージの読み込み import tweepy from misskey import Misskey from mastodon import Mastodon from atproto import Client as Bluesky, client_utils as BlueskyUtils from tkinter import messagebox import re class TweetManagement: #-----定数-------------------------------------------------------------- TWITTER_API_KEY = "{自分の認証情報を入れる}" TWITTER_API_SECRET = "{自分の認証情報を入れる}" TWITTER_BEARER_TOKEN = "{自分の認証情報を入れる}" TWITTER_ACCESS_TOKEN = "{自分の認証情報を入れる}" TWITTER_ACCESS_TOKEN_SECRET = "{自分の認証情報を入れる}" MISSKEY_SERVER_NAME = "{インスタンス名 例:misskey.io}" MISSKEY_ACCESS_TOKEN = "{自分の認証情報を入れる}" MASTODON_SERVER_URL = "インスタンス名 例:https://mastodon.social" MASTODON_CLIENT_ID = "{自分の認証情報を入れる}" MASTODON_CLIENT_SECRET = "{自分の認証情報を入れる}" MASTODON_ACCESS_TOKEN = "{自分の認証情報を入れる}" BLUESKY_LOGIN_ID = "{自分の認証情報を入れる}" BLUESKY_LOGIN_PW = "{自分の認証情報を入れる}" #-----コンストラクタ-------------------------------------------------------------- def __init__(self): self.twitterClient = None self.misskeyClient = None self.mastodonClient = None self.blueskyClient = None self.twitterParentTweetId = '' self.misskeyParentTweetId = '' self.mastodonParentTweetId = '' self.blueskyRootTweet = None self.blueskyParentTweet = None self.CreateTwitterInstance() self.CreateMisskeyInstance() self.CreateMastodonInstance() self.CreateBlueskyInstance() #-----ツイート関連のメソッド-------------------------------------------------------------- # Twitter 接続インスタンスを作成 def CreateTwitterInstance(self): self.twitterClient = tweepy.Client( bearer_token = TweetManagement.TWITTER_BEARER_TOKEN, consumer_key = TweetManagement.TWITTER_API_KEY, consumer_secret = TweetManagement.TWITTER_API_SECRET, access_token = TweetManagement.TWITTER_ACCESS_TOKEN, access_token_secret = TweetManagement.TWITTER_ACCESS_TOKEN_SECRET ) # Misskey 接続インスタンスを作成 def CreateMisskeyInstance(self): self.misskeyClient = Misskey(TweetManagement.MISSKEY_SERVER_NAME, i=TweetManagement.MISSKEY_ACCESS_TOKEN) # Mastodon 接続インスタンスを作成 def CreateMastodonInstance(self): self.mastodonClient = Mastodon( api_base_url = TweetManagement.MASTODON_SERVER_URL, client_id = TweetManagement.MASTODON_CLIENT_ID, client_secret = TweetManagement.MASTODON_CLIENT_SECRET, access_token = TweetManagement.MASTODON_ACCESS_TOKEN ) # Bluesky 接続インスタンスを作成 def CreateBlueskyInstance(self): self.blueskyClient = Bluesky() self.blueskyClient.login(TweetManagement.BLUESKY_LOGIN_ID, TweetManagement.BLUESKY_LOGIN_PW) # Twitter ツイート実行 def CreateTwitterTweet(self, message): if self.twitterParentTweetId != '': tweet = self.twitterClient.create_tweet(text=message, in_reply_to_tweet_id=self.twitterParentTweetId) else: tweet = self.twitterClient.create_tweet(text=message) self.twitterParentTweetId = tweet.data['id'] # Misskey ツイート実行 def CreateMisskeyTweet(self, message): if self.misskeyParentTweetId != '': misskeyRet = self.misskeyClient.notes_create(text=message, reply_id=self.misskeyParentTweetId) else: misskeyRet = self.misskeyClient.notes_create(text=message) self.misskeyParentTweetId = misskeyRet['createdNote']['id'] # Mastodon ツイート実行 def CreateMastodonTweet(self, message): if self.mastodonParentTweetId != '': mastodonRet = self.mastodonClient.status_post(message, in_reply_to_id=self.mastodonParentTweetId) else: mastodonRet = self.mastodonClient.status_post(message) self.mastodonParentTweetId = mastodonRet['id'] # Bluesky ツイート実行 def CreateBlueskyTweet(self, message): # 送信用のメッセージ作成 text_builder = BlueskyUtils.TextBuilder() messageArray = re.split(r'(https?://[^\s]+|#[^\s]+)', message) # 正規表現を使って「#」と「https://」で文字列を区切る for msg in messageArray: if msg.startswith("#"): text_builder.tag(msg, msg.lstrip("#")) elif msg.startswith("https://") or msg.startswith("http://"): text_builder.link(msg, msg) else: text_builder.text(msg) # ツイート実行 blueskyRet = None if self.blueskyParentTweet != None: blueskyRet = self.blueskyClient.send_post( text=text_builder, reply_to={ "parent": { "uri": self.blueskyParentTweet["uri"], "cid": self.blueskyParentTweet["cid"] }, "root": { "uri": self.blueskyRootTweet["uri"], "cid": self.blueskyRootTweet["cid"] } } ) else: blueskyRet = self.blueskyClient.send_post(text=text_builder) self.blueskyRootTweet = blueskyRet self.blueskyParentTweet = blueskyRet #-----ツイート関連のメソッド-------------------------------------------------------------- def execTweet(self, message): if len(message) <= 220: self.CreateTwitterTweet(message) self.CreateMisskeyTweet(message) self.CreateMastodonTweet(message) self.CreateBlueskyTweet(message) else: messagebox.showinfo("エラー", "文字数が多すぎます") # 取得した内容を表示するためのダイアログ
使い方は
tweetMgmt = TweetManagement() tweetMgmt.execTweet('ツイートしたい内容')
です。
URLやハッシュタグも含めて220文字決め打ちになっていますが、まぁ大体それぐらいあれば大丈夫だろうということでテキトーにその値にしてます。
コメントログ
※コメントは最新50件が表示されます
コメント投稿




画面下部の「コンタクト」からも連絡可能です。
管理人ツイート
商品サンプル画像
ホットウィール(Hot Wheels) ベーシックカー ホンダ モトコンポ 乗り物おもちゃ ミニカー 3歳から レッド JFN72
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
商品サンプル画像
勝ち勝ちくん クリア PLUS ブラック 小役カウンター カチカチ君 プラス
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
商品サンプル画像
ファイナルファンタジーIX フォルミズム ビビ・オルニティア
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
商品サンプル画像
チョコエッグ に じ さ ん じ BOX チョコエッグプラス(に じ さ んじ)10個入り チョコエッグ に じ さ ん じ 食玩 1 BOX チョコエッグプラス フルタ製菓 ボックス
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
管理人作品宣伝
ChatGPT-アイコンと名前変更
Chrome 拡張機能 / 最終更新:2025-05-29
ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気…ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気分になれるかもしれません。

ChromeWebストアで閲覧する利用素材等の詳細情報
【アークナイツ】アークナイツ運動会-関所破壊レース
動画 / 最終更新:2025-01-16
アークナイツ生息演算の岸壁の関の関門を誰が最速で破壊できるかを競います。…アークナイツ生息演算の岸壁の関の関門を誰が最速で破壊できるかを競います。

YouTubeで閲覧するニコニコ動画で閲覧する利用素材等の詳細情報
作品一覧はこちら
関連ページ
JavaScriptでアナログ時計とデジタル時計を表示するコード
最終更新日:2025-05-29
概要 最近アナログ時計を使ったので、アナログ時計を表示するJavaScriptコードを載せます。 …
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-03
最終更新日:2025-04-20
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-02
最終更新日:2025-04-15
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
最終更新日:2025-04-13
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
GIF / APNG(アニメーション付きPNG)ファイル解析ページ
最終更新日:2025-03-31
ファイル読込・操作 以下に調べたいファイルを読み込ませてください。 ファイル情報 カラーパレットを…
記事を閲覧する
gifler.js仕様メモ
最終更新日:2025-03-23
本ページの趣旨 「gifler.js」という、gifアニメーションをcanvasに簡単に表示できる…
記事を閲覧する
【プログラミング】実例で分かるかもしれない再帰処理
最終更新日:2024-12-15
本ページは以下動画の台本を書き起こしたものです 解説の趣旨・方向性 皆さん、こんばんは今回はプログ…
記事を閲覧する
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-公開
最終更新日:2024-12-06
概要 SNSツイートを一元化するためのツールを作成しています(古い記事ですが、こちらのページで紹介…
記事を閲覧する
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
最終更新日:2024-10-13
概要 概要 SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。 それぞれ…
記事を閲覧する
Windows-PowerShellを使用してのフォルダ内のファイル名を連番にリネームする
最終更新日:2024-10-08
以下PowerShellコードを実行することで、フォルダ内のすべてのファイルのファイル名を「0001…
記事を閲覧する
本サイトのタグ一覧
NovelAIR18VRoidWebサイト作成Webツールととモノ。アークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグネットスラング系プログラミングホラーポケットタウン怪談気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
人気記事
ポケットタウン_パズル一覧
最終更新日:2025-05-02
スコア:797.4405 pt
グレーのピースの数 (Number of gray pieces):検索グレーピースの数を入力して、…
記事を閲覧する
メイド・オブ・ザ・デッド-攻略お助け情報
最終更新日:2024-05-01
スコア:512.0140 pt
ネタバレ注意! 本ページは『メイド・オブ・ザ・デッド』の情報を記録しているものです。 攻略の参考に…
記事を閲覧する
地獄先生ぬ~べ~で好きな切ないエピソード
最終更新日:2025-07-08
スコア:195.1967 pt
概要 初代というべきか、週刊少年ジャンプで連載されていた地獄先生ぬ~べ~の切ないエピソードの中で好…
記事を閲覧する
剣と魔法と学園モノ。2G - パーティ編成確認ツール
最終更新日:2024-05-09
スコア:178.3820 pt
ツール概要 ととモノ。2Gのパーティ編成を考える際に使うツールです。 あくまでストーリークリアまで…
記事を閲覧する
ゲーム『イカれた狩場の看板娘』の紹介・レビュー
最終更新日:2025-05-01
スコア:171.3803 pt
記事概要 イカれたゲームを紹介するぜ! イカれた狩場の看板娘! 以上だ! ちなみにそんなイカれてな…
記事を閲覧する
黒バス:キセキの世代級の人たちの技一覧
最終更新日:2024-07-21
スコア:116.6400 pt
黒バスのキセキの世代級の人たちの技一覧です 概要 黒バスのキセキの世代級の人たちの技を記載したもの…
記事を閲覧する
アークナイツ-常設商品-理性換算
最終更新日:2024-04-28
スコア:108.3000 pt
概要 "常設商品でお得な商品はどれか"というのを理性に換算して一覧化したものとなります。 絶対的に…
記事を閲覧する
本サイトについて
最終更新日:2025-07-10
スコア:94.0109 pt
本サイトの概要 概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報に…
記事を閲覧する
最新記事
地獄先生ぬ~べ~新アニメで設定変わったところ(3話まで)
最終更新日:2025-07-13
概要 地獄先生ぬ~べ~の新アニメが2025-07-02(木)よりやっていますが、そこで設定が変わっ…
記事を閲覧する
本サイトについて
最終更新日:2025-07-10
本サイトの概要 概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報に…
記事を閲覧する
地獄先生ぬ~べ~で好きな切ないエピソード
最終更新日:2025-07-08
概要 初代というべきか、週刊少年ジャンプで連載されていた地獄先生ぬ~べ~の切ないエピソードの中で好…
記事を閲覧する
htmlタグ混在のテキストをhtmlタグとプレーンテキストで分けるJavaScriptコード
最終更新日:2025-06-20
概要 「よくある質問は a href="/" こ span ち /span ら /a です」 とい…
記事を閲覧する
商品サンプル画像
グッドスマイルカンパニー[GOOD SMILE COMPANY] PLAMATEA ミューズボディ いちか Aタイプ ノンスケール 組み立て式プラモデル
商品ページ
Amazon
収益広告(自動登録)