個人ブログのようなものです。とくにジャンルはありません。
広告枠
本記事のトピック
  • 概要
  • Pythonのバージョンと必要なモジュール
  • Twitter(X)のコード
  • Misskeyのコード
  • Mastodonのコード
  • Blueskyのコード
  • Blueskyのコードの解説
  • ツイート一元化コード
記事の概要
作成日:2024-10-06
最終更新日:2024-10-13
記事の文字数:7584
情報技術情報技術-WebAPIプログラミング
管理人作品宣伝
嘘解説動画
動画 / 最終更新:2025-01-08
ウソだらけの解説動画です。「確かにそうだけど、そうはならんやろ」と思いながら見てくださ…
YouTubeで閲覧するニコニコ動画で閲覧する
利用素材等の詳細情報
ChatGPT-アイコンと名前変更
Chrome 拡張機能 / 最終更新:2023-12-14
ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気…
ChromeWebストアで閲覧する
利用素材等の詳細情報
作品一覧はこちら
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文字決め打ちになっていますが、まぁ大体それぐらいあれば大丈夫だろうということでテキトーにその値にしてます。
コメントログ
コメント投稿




広告枠
関連ページ
【プログラミング】実例で分かるかもしれない再帰処理
本ページは以下動画の台本を書き起こしたものです 解説の趣旨・方向性 皆さん、こんばんは今回はプログ…
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-公開
概要 SNSツイートを一元化するためのツールを作成しています(古い記事ですが、こちらのページで紹介…
(現在ページ)SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
概要 概要 SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。 それぞれ…
Windows-PowerShellを使用してのフォルダ内のファイル名を連番にリネームする
以下PowerShellコードを実行することで、フォルダ内のすべてのファイルのファイル名を「0001…
Youtubeで縦型画面で横型画面のゲームを投稿/配信してるときの対処法
Youtubeで縦型画面で横型画面のゲームを投稿/配信してるときの問題点 このページを見てる時点で…
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話 当然ですが本サイト…
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題…
東京03のyoutubeチャンネルの概要ページの挙動がおかしい
東京03のyoutubeチャンネルの概要ページの挙動がおかしい…
Youtube Data APIでハンドルIDからユーザ情報を取得できない
Youtube Data APIでハンドルIDからユーザ情報を取得できない問題 結論から言うと現在…
ウマ娘まとめサイト(InoReader)
ウマ娘まとめサイト(InoReader)…
最新ページ
アークナイツ:生息演算「熱砂秘聞」の攻略メモ
注意 本ページには攻略情報も一部含まれてるので、そういうのを見たくない人は見ない方が良いです。含ま…
L'Arc~en~Cielの曲を個人的に評価した
本ページについて ラルクの中で各曲を個人的に評価して★0個から5個までを付けています。 ★0個が基…
アークナイツ:全★4オペレータの強み
本ページの概要 ここでは★4オペレータを全員、自分なりの所感を書いてます。書いている順番は昇進2率…
本サイトについて
本サイトの概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報について…
普通の文章をホラーっぽく変換
テキスト:ホラー変換 変換する度に結果が変わります 変換回数: 変換する 変換結果 変換する…
アークナイツ-「二次創作ガイドライン」と「ファンキット利用ガイドライン」の関連について
本記事の概要と注意点 本記事の趣旨・方向性 「アークナイツの二次創作ガイドライン」について、分から…
怖い話(AI)まとめ - Part02
最初に 怪談系の怖い話を載せています。 特に設定部分は人の手が入ってますが、なるべく生成AI(Ch…
もしかしたら知らないかもしれないお守りとかの豆知識集
本ページは以下動画の台本を書き起こしたものです 導入 皆さま、こんばんは。年末ですね年末過ぎれば年…
【プログラミング】実例で分かるかもしれない再帰処理
本ページは以下動画の台本を書き起こしたものです 解説の趣旨・方向性 皆さん、こんばんは今回はプログ…
管理人について
「ふじみ むい」と言います ひょんなことから肉体を得たのでその肉体を使って活動をしています。 とい…
管理人ツイート
本サイトのタグ一覧
NovelAIR18VRoidWebサイト作成Webツールアークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグプログラミングホラーポケットタウン怪談気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
広告枠