Heroku
crystal

かんたん、お手軽、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ベースのビルドパックはいいぞ