タイトルの通りだけど paiza.IO API を見つけた時にふと思い浮かんだので試してみた。
まぁ、これ動いちゃったら paiza.IO のリソースを使い潰せるので、ちゃんと対策してるんだろうなー。
コード 1
FizzBuzz です。途中にある p
はデバッグ目的のやつ。
require 'json' require 'net/http' PAIZA_API_URL = 'http://api.paiza.io/runners/create' SLACK_API_URL = '<Slack Incoming WebHook URL>' MAX_SIZE = 10 SOURCE = File.read(__FILE__) def fizzbuzz(n) [].tap do |arr| arr << 'Fizz' if (n % 3).zero? arr << 'Buzz' if (n % 5).zero? arr << n.to_s if arr.empty? end.join(" ") end def post_runners(input) uri = URI.parse(PAIZA_API_URL) options = { language: :ruby, source_code: SOURCE, api_key: :guest } res = Net::HTTP.post_form(uri, options.merge(input: input)) p input p options p res p res.body end def post_slack(text) uri = URI.parse(SLACK_API_URL) res = Net::HTTP.post_form(uri, payload: JSON.dump(text: text)) p res p res.body end def main(accumulator, n) result = [].tap do |arr| arr << accumulator unless accumulator.empty? arr << fizzbuzz(n) end.join(', ') input = "#{result}\n#{n.next}" if n < MAX_SIZE post_runners(input) else post_slack(result) end end args = $stdin.read.split("\n") p args if args.size > 1 main(args[0], args[1].to_i) else p 'args are required' end
このコードは実行できたけど、API で実行したコードではエラーが発生して止まっていた。
/usr/local/rbenv/versions/2.3.3/lib/ruby/2.3.0/net/http.rb:882:in `rescue in block in connect': Failed to open TCP connection to api.paiza.io:80 (getaddrinfo: Temporary failure in name resolution) (SocketError)
コード 2
API 実行により、Slack へ投稿するコード。
require 'net/http' PAIZA_API_URL = 'http://api.paiza.io/runners/create' def post_runners(source_code) uri = URI.parse(PAIZA_API_URL) options = { language: :ruby, source_code: source_code, api_key: :guest } res = Net::HTTP.post_form(uri, options) p res p res.body end source_code = <<-EOF require 'json' require 'net/http' SLACK_API_URL = '<Slack Incoming WebHook URL>' def post_slack(text) uri = URI.parse(SLACK_API_URL) res = Net::HTTP.post_form(uri, payload: JSON.dump(text: text)) end post_slack('hello') EOF puts '---' puts source_code puts '---' post_runners(source_code)
これも同じエラーが出ました。
まとめ
paiza.IO API を使って実行したコード内からは外部ネットワーク接続は無理っぽい。