Edited at

かんたん、お手軽、TweetBot(Crystal編)

More than 1 year has passed since last update.


お前 is 誰?

@msky026



切っ掛け

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ベースのビルドパックはいいぞ