PythonでTwitter通知Botを作った
唐突ではございますが、ふれんどしっぷをですとろいしたい。本当にしたいわけではないけど、いたずら感覚で仕掛けたい、そんな気分です。
はてなブログにはコードブロックが存在しないので、DiscordBotを作成した話とか誰も得しないんじゃないかと思っていたのですが、存在しているらしい。マジか。
そんなわけで、今回はコードも載せてみよう。汚いってダメ出しはいらない。誰かの参考になればいいな。
経緯
メインで活動しているSNLとは別に、実は時折別のチームでリグマに参加してたりします。
突如現れるへたくそな奴でも快く受け入れてくれる楽しいチームです、そして皆うまい…。
そこのリーダーが、突然「(SNLにある)Twitterに通知するBotほしいんだよね…」とのこと。残念ながらTwitterに通知するBotは私が作成したわけではない。
というわけで、再度一からPythonで作成してみた。興奮気味で「作る!作るよ!!!」って言ってた気がする。オタクかよ。
要件定義
ほとんどSNLにあるTwitter通知Botと同じようなのをご所望されていたので、要件は下記の通り。
1.の!tlの流れは、前回作成したリグマ通知ボットでクリアしているため特に問題なし。
2.もリグマ通知ボットで取得で来ていたので問題なし。
3.も要するに内容の文字数をLENで取得して140文字だったらエラー返却すればいいので問題なし。
設計
PythonからTwitterに連携する方法ってググってみたら、OAuth認証&TwitterAPIでした。
下記のような感じで、とりあえずTwitterAPIを使うためにOAuth認証をしなければならないとのこと。初めてGoogleSlide使いました。
TwitterAPIを利用するための下準備
ということでぇ↝、TwitterAPIを使うためにアクセストークンを取得したわけです。
こんだけ日本で流行ってるTwitterだし~、文献あるし~、余裕っしょって思ってたら大間違いでした。
キャプチャを貼り付ける元気はないので、簡単に箇条書きで書きます。
→Making a botにした気がする。
- Twitterアカウントに電話番号を登録するのと、国、ニックネームを記載しろと言われる。
- TwitterAPIを何に利用するのか聞かれる。
→ In your word/In English/Responce must be at least 200 characters
私日本人やねん。私英語ダメやねん。最後なぜか200文字以内って訳してて、永久にアクティブにならないNextボタンと戦ってました。
ていうか、この後全部英語で、教養のなさを痛感しつつGoogle翻訳さんに手伝ってもらいながらTwitterアプリの生成まで行きました。
コーディング
Twitterライブラリのインポート
今回Twitterライブラリを用いる予定だったので、あらかじめTwitterライブラリを落としておきました。
ちなみにDiscordとの連携も必要なのでライブラリを落とす必要があります。
#Twitterライブラリのインストール pip install twitter
Twitter連携を行うプログラム
Twitter連携させるプログラムを作成します。
純粋に上記で作成したTwitterAppsを連携していあるアカウントに対して、「あいうえお」とツイートさせるプログラムです。
#Twitterのライブラリをインポート import twitter #Twitter連携を行うプログラム def main(): #TwitterAPIKey などを記載する Consumer_Key="********" Consumer_Secret="********" AccessToken="********" AccessTokenSecret="********" #取得したキーとアクセストークンを設定する。 Oauth = twitter.OAuth(AccessToken,AccessTokenSecret,Consumer_Key,Consumer_Secret) twi = twitter.Twitter(auth=Oauth) #TwitterAppsを経由してTweetする twi.statuses.update(status="あいうえお") return
DiscordBotのプログラム
特に説明はしないのですが、基本テンプレのように下記を利用しています。
~~~と記載されている箇所にコーディングをしていきます。
#Discordのライブラリをインポート import discord #DiscordBot Tokenを入れる。 TOKEN = '**************' # 接続に必要なオブジェクトを生成 client = discord.Client() # 起動したらインタプリタにログイン通知が表示される @client.event async def on_ready(): ①~~~ # メッセージ受信時に動作する処理 @client.event async def on_message(message): ②~~~ #変数mesに入れた内容をDiscordBotが通知する await message.channel.send(mes) # Botの起動とDiscordサーバーへの接続 client.run(TOKEN)
①~~~には、プログラミング起動時に動かしたい内容を入れます。
私は基本的にDiscordに通知させたいわけではなかったので、print文などでインタプリタに表示させています。
②~~~には、させたいことをコーディングしていきます。
Discordの情報は【message】に入っているので、お好みのものを取得していきます。
message.content だと、メッセージの内容
message.author.name だと、メッセージを打ったDiscordユーザ名
今のところ私がやっていることは、「ある発言をしたら〇〇をする」なので、基本的にmessage.contentの中身を判定させて処理を行っています。
そのため【message.content】をStartsWith メソッドで先頭にコマンドがあるかを条件判定して処理を書いています。
※先頭以外を判定したいならre.searchを使ってます。
TwitterとDiscordのプログラムを合体させる
TwitterのプログラムをDiscordBotのプログラムの②~~~のところに記載すればいいのです。
そうすると、ユーザが何かを発言したら、Twitterに「あいうえお」ってツイートされます。あとは、要件を満たすようにプログラムを組んでいく。
#DiscordとTwitterのライブラリをインポートする import discord import twitter #TwitterAPIKey Consumer_Key="*******" Consumer_Secret="*******" AccessToken="*******" AccessTokenSecret="*******" #DiscordBot Tokenを入れる TOKEN = "*******" # 接続に必要なオブジェクトを生成 client = discord.Client() # 起動したらインタプリタにログイン通知が表示される @client.event async def on_ready(): print('ログインしました') print('Discord-Twitter-PostBotを起動します。') # メッセージ受信時に動作する処理 @client.event async def on_message(message): CommandTrigger="!tl" Twitter=140 # メッセージ送信者がBotだった場合は無視する if message.author.bot: return if message.content.startswith(CommandTrigger): #取得したキーとアクセストークンを設定する。 Oauth = twitter.OAuth(AccessToken,AccessTokenSecret,Consumer_Key,Consumer_Secret) twi = twitter.Twitter(auth=Oauth) #コマンドは投稿しない、ディスコードネームに置換する message.content=message.content.replace(CommandTrigger,message.author.name+":") #140文字以下か判定する if len(message.content) <= Twitter: #Twitterに投稿 twi.statuses.update(status=message.content) else: mes="Twitterへの投稿に失敗しました、文字数を減らしてください。" await message.channel.send(mes) # Botの起動とDiscordサーバーへの接続 client.run(TOKEN)
Discordの発言の先頭に【!tl】が入っていた場合、Twitterに通知するプログラムの完成。
ステップ数も多くないので、ある程度学んでしまえばすぐに作成できるなぁーって印象。