お前 is 誰?
切っ掛け
10月からブレンド・Sが始まりました。
ドリコムの者として(10月時点)何かせねば、、、
どうしようか、、、
そうだ、TwitterBotを作ろう!
というわけで、放映時間10分(くらい前)に放送開始を通知するBotを作ることにした。
いい機会だからCrystalでやろう
いい感じにCrystal版のクライアントがある
https://github.com/sferik/twitter-crystal
(Ruby版のと同じ作者)
shard.yml
dependencies:
kemal:
github: sdogruyol/kemal
branch: master
db:
github: crystal-lang/crystal-db
branch: master
twitter-crystal:
github: sferik/twitter-crystal
version: ~> 0.2.0
require "twitter-crystal"
class TwitterClient
@client : Twitter::REST::Client
def initialize
consumer_key = ENV["CONSUMER_KEY"]
consumer_secret = ENV["CONSUMER_SECRET"]
access_token = ENV["ACCESS_TOKEN"]
access_token_secret = ENV["ACCESS_TOKEN_SECRET"]
@client = Twitter::REST::Client.new(consumer_key, consumer_secret, access_token, access_token_secret)
end
def tweet(message)
@client.update(message)
end
end
twitter_client = TwitterClient.new
twitter_client.tweet("hogehoge")
かんたん、お手軽
完
本当に?
heroku run bash
crystal run src/tweetbot/tweet.cr
--: 1: --: cc: not found
Error: execution of command failed with code: 127: `cc "${@}" -o '/app/.cache/crystal/crystal-run-tweet.tmp' -rdynamic -lz `command -v pkg-config > /dev/null && pkg-config --libs libssl || printf %s '-lssl -lcrypto'` `command -v pkg-config > /dev/null && pkg-config --libs libcrypto || printf %s '-lcrypto'` -lpcre -lm -lgc -lpthread /app/.platform_tools/crystal/src/ext/libcrystal.a -levent -lrt -ldl -L/usr/lib -L/usr/local/lib`
結論から言うと、Heroku上でスクリプト実行が出来ない。
(少なくともHeroku-16スタックでは)
ビルドしてバイナリ実行すればOK
ただし、Kemalのとバイナリを2つ作らなければならない
(BotなのでKemalのはいらないと言えばいらないけど)
Heroku ビルドパック(msky026製)
https://github.com/msky026/heroku-buildpack-crystal
crystal_version=0.23.0
always_rebuild=false
config_vars_to_export=(DATABASE_URL)
post_compile="pwd"
build_command=("crystal build --release ./src/tweetbot.cr" "crystal build --release ./src/tweetbot/tweet.cr")
build_command
ビルドコマンドを複数指定できる
これでKemalとTweetBotのを2つ作り
Herokuスケジューラで
./tweet
結論
Elixirベースのビルドパックはいいぞ