Files
redux-scraper/app/lib/scraper/inkbunny_http_client_config.rb
2024-12-19 06:04:37 +00:00

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