Eureka

アクアリウムとかサカナクションのこと

PythonでTwitter通知Botを作った

唐突ではございますが、ふれんどしっぷをですとろいしたい。本当にしたいわけではないけど、いたずら感覚で仕掛けたい、そんな気分です。
はてなブログにはコードブロックが存在しないので、DiscordBotを作成した話とか誰も得しないんじゃないかと思っていたのですが、存在しているらしい。マジか。
そんなわけで、今回はコードも載せてみよう。汚いってダメ出しはいらない。誰かの参考になればいいな。

経緯

メインで活動しているSNLとは別に、実は時折別のチームでリグマに参加してたりします。
突如現れるへたくそな奴でも快く受け入れてくれる楽しいチームです、そして皆うまい…。
そこのリーダーが、突然「(SNLにある)Twitterに通知するBotほしいんだよね…」とのこと。残念ながらTwitterに通知するBotは私が作成したわけではない。
というわけで、再度一からPythonで作成してみた。興奮気味で「作る!作るよ!!!」って言ってた気がする。オタクかよ。

要件定義

ほとんどSNLにあるTwitter通知Botと同じようなのをご所望されていたので、要件は下記の通り。

  1. Discordに先頭【!tl】が入っていたらTwitterに連携
  2. Twitterに連携してほしいのは、Discord名前と内容
  3. Twitter上限文字数(140文字以上)はエラー返却

1.の!tlの流れは、前回作成したリグマ通知ボットでクリアしているため特に問題なし。
2.もリグマ通知ボットで取得で来ていたので問題なし。
3.も要するに内容の文字数をLENで取得して140文字だったらエラー返却すればいいので問題なし。

設計

PythonからTwitterに連携する方法ってググってみたら、OAuth認証&TwitterAPIでした。
下記のような感じで、とりあえずTwitterAPIを使うためにOAuth認証をしなければならないとのこと。

f:id:cre5cent-nn00n_sunset195:20200430174547j:plain
適当設計図
初めてGoogleSlide使いました。

TwitterAPIを利用するための下準備

ということでぇ↝、TwitterAPIを使うためにアクセストークンを取得したわけです。
こんだけ日本で流行ってるTwitterだし~、文献あるし~、余裕っしょって思ってたら大間違いでした。
キャプチャを貼り付ける元気はないので、簡単に箇条書きで書きます。

  • TwitterのDeveloperサイトにアクセスする。
  • Twitterのアプリを作成しようとすると、DeveloperToolを何に利用するか聞かれる。

 →Making a botにした気がする。

  • Twitterアカウントに電話番号を登録するのと、国、ニックネームを記載しろと言われる。
  • TwitterAPIを何に利用するのか聞かれる。

 → In your word/In English/Responce must be at least 200 characters
  私日本人やねん。私英語ダメやねん。最後なぜか200文字以内って訳してて、永久にアクティブにならないNextボタンと戦ってました。
ていうか、この後全部英語で、教養のなさを痛感しつつGoogle翻訳さんに手伝ってもらいながらTwitterアプリの生成まで行きました。

アクセストークンなどを取得

アプリを生成したら、Detailsをクリック→Keys and Takensを見て4つの良く分からない半角英数字の羅列を取得する。

f:id:cre5cent-nn00n_sunset195:20200430182948j:plain
APIKey
アクセストークンとかは、最初出ていないので「Generate」をして表示させます。
ちなみに、TwitterAPIを調べたんですが、色んなことができます…Twitterの機能片っ端からほぼ全部できるんじゃないかと思うほど。
アクセストークンがばれたら、それを連携している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に通知するプログラムの完成。
ステップ数も多くないので、ある程度学んでしまえばすぐに作成できるなぁーって印象。

後記

最近仕事が安定しているからか、暇で暇で…。
プログラミングがしたいっていうか、暇つぶしがしたかっただけです…。その暇つぶしがたった2日で終わるとは考えていなかった。
こう…色々学ぶと「あーあのTwitterで仲いい人出す方法は、このAPI使ってるのかー」とか「tweet削除するやつはこうやって組むのかー」とか、仕組みが分かるのは楽しいです。
スプラトゥーン3が出たら、Twitterにスケジュール流すアカウントでも作成しようかな。
依頼してくださったとあるチームリーダの方、またテストに付き合ってくださった方、ありがとうございました。
なんかプログラミングするためのネタをくれーえ!