-- 追記
いつのまにか Discord 本体の機能で画像が四枚ともすべて表示されるようになったのでこの bot はもう不要です。Discord Bot の作り方の参考にはなるかもしれないので以下はそのまま置いておきます。
Discord で Twitter の URL を貼った際に画像を全て表示する Bot を作成した。以下のような感じに Twitter の URL を投稿したら表示されない残りの画像を Bot が代わりに表示してくれる。
開発の経緯
現在 Discord では URL を投稿するとその内容の一部を表示する機能があり、Twitter の URL を投稿した際にもツイートの内容や添付画像などが表示されるようになっている。
しかし、画像が2枚以上あっても最初の1枚しか表示されず、全ての画像を見てもらえない場合がある。
それを回避するために Twitter の URL が投稿されたら API でツイートの情報を取得し、画像が複数枚あればそれらを表示する Bot を開発する事にした。
実装
以下ソース。言語は ruby version 2.5.0, discordrb と twitter の gem が必須。
require 'discordrb'
require 'twitter'
bot = Discordrb::Bot.new token: DISCORD_BOT_TOKEN, client_id: '449249282688679936'
@client = Twitter::REST::Client.new do |config|
config.consumer_key = CONSUMER_KEY
config.consumer_secret = CONSUMER_SECRET
config.access_token = ACCESS_TOKEN
config.access_token_secret = ACCESS_TOKEN_SECRET
end
bot.message do |event|
p event.message.content
content = event.message.content
m = content.match(/https:\/\/twitter.com\/([a-zA-Z0-9_]+)\/status\/([0-9]+)/)
next if m.nil?
twitter_url = m[0]
tweet = @client.status(m[2])
if tweet.media?
media = tweet.media
photo_urls = []
if media[0].type == "photo"
media.each { |m| photo_urls.push(m.media_url_https.to_s) }
end
if photo_urls.length > 1
photo_urls.shift
photo_urls.each do |url|
event.respond url
end
end
end
end
bot.run
思いついて15分ぐらいでガッと作ったやつだけど上手く動いてくれた。画像が4枚あるとチャットログが一気に埋まってしまうのが難点か。
利用方法とか
公開状態にしているので誰でも利用できるがいくつか注意点がある。
- Bot が常に正常に動くという保証はしない
- Bot の仕様は予告なく変更される
- Twitter へアクセスする際の認証情報が俺個人(@ryomatsu)のものなので俺が投稿されたツイートのユーザーにブロックされていると表示できない
- もちろんユーザーが非公開にしている場合も表示されない
- 何があっても俺は知らん
BOT の追加はサーバー管理者であれば以下の URL から可能だ。
https://discordapp.com/oauth2/authorize?client_id=449249282688679936&scope=bot&permissions=0
というわけでこんな感じに discord bot は簡単に作ることができる。