タイトルの通りだけど 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 を使って実行したコード内からは外部ネットワーク接続は無理っぽい。