85 lines
2.2 KiB
Ruby
85 lines
2.2 KiB
Ruby
class Scraper::InkbunnyHttpClientConfig < Scraper::HttpClientConfig
|
|
DEFAULT_ALLOWED_DOMAINS = %w[inkbunny.net *.ib.metapix.net]
|
|
|
|
def do_login(performer)
|
|
sid_model =
|
|
Domain::Inkbunny::GlobalState.find_or_create_by(
|
|
key: "#{performer.name}-sid"
|
|
)
|
|
sid_model.with_lock do
|
|
if sid_model.value.blank?
|
|
sid_model.value = do_ib_login(performer)
|
|
sid_model.save!
|
|
end
|
|
@sid = sid_model.value
|
|
end
|
|
end
|
|
|
|
def map_uri(uri)
|
|
raise("no sid") unless @sid
|
|
new_query_ar = URI.decode_www_form(uri.query || "") << ["sid", @sid]
|
|
uri = uri.dup
|
|
uri.query = URI.encode_www_form(new_query_ar).gsub("%2C", ",")
|
|
uri
|
|
end
|
|
|
|
def scrub_stored_uri(uri)
|
|
if uri.path == "/api_login.php"
|
|
uri = uri.dup
|
|
new_query_ar =
|
|
URI
|
|
.decode_www_form(uri.query || "")
|
|
.map do |k, v|
|
|
%w[username password].include?(k) ? [k, "*****"] : [k, v]
|
|
end
|
|
uri.query = URI.encode_www_form(new_query_ar)
|
|
end
|
|
uri
|
|
end
|
|
|
|
def cookies
|
|
end
|
|
|
|
def ratelimit
|
|
[["inkbunny.net", 2], ["*.ib.metapix.net", 1]]
|
|
end
|
|
|
|
def allowed_domains
|
|
DEFAULT_ALLOWED_DOMAINS
|
|
end
|
|
|
|
def redirect_limit
|
|
2
|
|
end
|
|
|
|
private
|
|
|
|
def do_ib_login(performer)
|
|
username =
|
|
Domain::Inkbunny::GlobalState.find_by(
|
|
key: "#{performer.name}-username"
|
|
)&.value || raise("missing inkbunny username in global state")
|
|
password =
|
|
Domain::Inkbunny::GlobalState.find_by(
|
|
key: "#{performer.name}-password"
|
|
)&.value || raise("missing inkbunny password in global state")
|
|
uri =
|
|
"https://inkbunny.net/api_login.php?username=#{username}&password=#{password}"
|
|
logger.info("logging in to inkbunny as #{username}...")
|
|
response = performer.do_request(:post, uri, {})
|
|
if response.response_code != 200
|
|
message =
|
|
"inkbunny login failed: #{response.response_code} #{response.body}"
|
|
logger.error(message)
|
|
raise message
|
|
end
|
|
sid =
|
|
JSON.parse(response.body)["sid"] ||
|
|
raise(
|
|
"inkbunny login failed: no sid in response (#{response.body[0..1000]})"
|
|
)
|
|
logger.info("logged in to inkbunny as #{username}: #{sid}")
|
|
sid
|
|
end
|
|
end
|