読者です 読者をやめる 読者になる 読者になる

paiza.IO から paiza.IO API を使って再帰呼び出しを書こうとして動かなかった話

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