Files
redux-scraper/app/lib/scraper/inkbunny_http_client_config.rb
2025-01-01 03:29:53 +00:00

84 lines
2.1 KiB
Ruby

# typed: false
class Scraper::InkbunnyHttpClientConfig < Scraper::HttpClientConfig
DEFAULT_ALLOWED_DOMAINS = %w[inkbunny.net *.ib.metapix.net]
def do_login(performer)
sid_model =
GlobalState.find_or_create_by(key: "inkbunny-sid") do |gs|
gs.value_type = :string
end
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", 0.25]]
end
def allowed_domains
DEFAULT_ALLOWED_DOMAINS
end
def redirect_limit
2
end
private
def do_ib_login(performer)
username =
GlobalState.find_by(key: "inkbunny-username")&.value ||
raise("missing inkbunny username in global state")
password =
GlobalState.find_by(key: "inkbunny-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