A Slack Bot that pulls Pixiv information and posts the full image(s) into Slack, with iOS shortcuts.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

78 lines
2.5 KiB

# coding: utf-8
module SlackMathbot
module Commands
class Illust < SlackRubyBot::Commands::Base
match /member_illust\.php(?<url>.*)$/ do |client, _data, _match|
# Initalize Mechanize
agent = Mechanize.new
# Create Pixiv URL
# If a full URL is given, extra characters are appended for some reason.
# This ensures we catch them better
if (_data[:text].include? "pixiv.net")
pixiv_url = "http://www.pixiv.net/member_illust.php" + _match[:url][0..-2]
else
pixiv_url = "http://www.pixiv.net/member_illust.php" + _match[:url][0..-1]
end
pixiv_url = CGI.unescapeHTML(pixiv_url)
puts pixiv_url
# Create iOS Illustration URL, regex pixiv_url to
# extract numbers only, such as /^[0-9]+$/
#ios_url = "pixiv://illusts/" + pixiv_url.split("illust_id=")[-1]
ios_url = "pixiv://illusts/" + pixiv_url[/\d+/]
puts ios_url
# Scrape profile link
profile = agent.get(pixiv_url).at("div.userdata-row > h2.name > a").attributes['href'].to_s
puts profile
# Create iOS Members URL
ios_mem_url = "pixiv://users/" + profile[/\d+/]
puts ios_mem_url
# Scrape page title
title = agent.get(pixiv_url).title
puts title
# Scrape image
image_url = agent.get(pixiv_url).images_with(:src => /600x600\/img-master/)[0].to_s.sub! '600x600','480x960'
begin
# Attempt to check on image
page = agent.head(image_url)
# Make sure page came back kosher
if page.code.to_i == 200
# Image url is fine
puts "Image is good to go!"
else
# Fallback on http error to be safe
image_url = "https://embed.pixiv.net/decorate.php?illust_id=" + pixiv_url[/\d+/]
end
rescue Mechanize::ResponseCodeError
# Fallback to og:image url
puts "Image failed to load"
image_url = "https://embed.pixiv.net/decorate.php?illust_id=" + pixiv_url[/\d+/]
end
puts image_url
client.web_client.chat_postMessage(
channel: _data.channel,
as_user: true,
attachments: [
{
fallback: title + " - " + pixiv_url,
text: "<" + ios_url + "|View Image> | <" + ios_mem_url + "|Open Profile>",
title: title,
title_link: pixiv_url,
image_url: image_url,
color: "#2684BD"
}
].to_json
)
end
end
end
end