Skip to content

Instantly share code, notes, and snippets.

@kdmsnr
Last active May 7, 2020 12:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kdmsnr/07773bba5221b6d8bfc9594983384e3c to your computer and use it in GitHub Desktop.
Save kdmsnr/07773bba5221b6d8bfc9594983384e3c to your computer and use it in GitHub Desktop.
# I'm here: ~/src/github.com/decomoji/slack-reaction-decomoji/scripts/
require 'kimurai'
require 'highline/import'
require 'retryable'
require 'open-uri'
require 'json'
class Spider < Kimurai::Base
@name = "slack_spider"
@engine = :selenium_chrome
@start_urls = ["https://slack.com"]
@config = {
user_agent: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36",
before_request: { delay: 4..7 }
}
def parse(response, url:, data: {})
# Ask team name
Retryable.retryable do
@team_name = ask('Your slack team name(subdomain): ')
@url = "https://#{@team_name}.slack.com"
browser.visit(@url)
response = browser.current_response
## TODO: Need to handle error
# unless response.css("#signin_form")
# logger.error "Not found workspace. Please try again."
# raise
# end
end
# Login
Retryable.retryable do
## TODO: Need to handle 2FA
@email = ask('Login email: ')
@password = ask('Login password(hidden): ') { |q| q.echo = false }
browser.fill_in "email", with: @email
browser.fill_in "password", with: @password
browser.click_on "signin_btn"
response = browser.current_response
## TODO: Need to handle error
# if response.css("#signin_btn")
# logger.error "You entered an incorrect email address or password."
# raise
# end
end
# Go to emoji page
@emoji_url = @url + "/customize/emoji"
browser.visit(@emoji_url)
response = browser.current_response
# Upload decomojis
@img_dir = File.expand_path(File.dirname(__FILE__) + "/../decomoji/extra")
files = Dir.glob(@img_dir + "/*.png")
len = files.length
emojis = list_emojis
files.each.with_index(1) do |path, i|
basename = File.basename(path, '.*')
logger.info "(#{i}/#{len}) importing #{basename}..."
# skip if already exists
if emojis.include?(basename)
logger.info "(#{i}/#{len}) #{basename} already exists, skip"
next
end
begin
browser.find(:css,
'button[data-qa="customize_emoji_add_button"]',
wait: 0.1).click
browser.attach_file "emojiimg", path
browser.fill_in "emojiname", with: basename
browser.find(:css,
'button[data-qa="customize_emoji_add_dialog_go"]',
wait: 0.1).click
rescue => ex
## TODO: Need to handle error more smartly
logger.warn "Fails to add."
browser.find(:css,
'button[data-qa="sk_close_modal_button"]').click
next
end
# refresh
response = browser.current_response
end
end
def list_emojis
## Create App on Slack -> Bot Token Scopes : "emoji:read"
token = ask('Token:')
emoji_url = "https://slack.com/api/emoji.list?token=#{token}"
JSON.parse(URI.open(emoji_url).read)["emoji"]
end
end
Spider.crawl!
@yujiorama
Copy link

It's a good script.
A runtime error occurred because there are undefined variables.
The modified parts are as follows.

diff --git a/add-slack-decomojis.rb b/add-slack-decomojis.rb
index 27c6bf4..65d2647 100644
--- a/add-slack-decomojis.rb
+++ b/add-slack-decomojis.rb
@@ -56,6 +56,7 @@ class Spider < Kimurai::Base
     @img_dir = File.expand_path(File.dirname(__FILE__) + "/../decomoji/extra")
     files = Dir.glob(@img_dir + "/*.png")
     len = files.length
+    emojis = list_emojis
     files.each.with_index(1) do |path, i|
       basename = File.basename(path, '.*')
       logger.info "(#{i}/#{len}) importing #{basename}..."

@kdmsnr
Copy link
Author

kdmsnr commented May 7, 2020

Thx! Fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment