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.

slack_client.rb 2.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. require 'httparty'
  2. require 'json'
  3. require 'selenium-webdriver'
  4. module SlackMattermostEmoji
  5. class SlackClient
  6. def initialize(username:, password:, domain:, download_path: nil, headless: true, log: true)
  7. @username = username
  8. @password = password
  9. @domain = domain
  10. @download_path = File.expand_path(download_path || './slack-emoji')
  11. @log = log
  12. @authenticated = false
  13. if [@username, @password, @domain].any? { |el| el.nil? || el.empty? }
  14. raise 'Slack username, password, and domain are all required'
  15. end
  16. Dir.mkdir(@download_path) unless Dir.exist?(@download_path)
  17. options = Selenium::WebDriver::Chrome::Options.new
  18. options.headless! unless headless == false
  19. @driver = Selenium::WebDriver.for :chrome, options: options
  20. end
  21. def authenticate
  22. print "Logging into Slack at #{@domain} as #{@username}... " if @log
  23. @driver.navigate.to "https://#{@domain}"
  24. @driver.find_element(name: 'email').send_keys(@username)
  25. @driver.find_element(name: 'password').send_keys(@password)
  26. @driver.find_element(id: 'signin_btn').click
  27. begin
  28. @driver.find_element(css: 'p.alert.alert_error')
  29. raise 'Invalid Slack credentials'
  30. rescue Selenium::WebDriver::Error::NoSuchElementError
  31. nil
  32. end
  33. puts 'success' if @log
  34. @authenticated = true
  35. end
  36. def download_emoji
  37. print "Finding emoji... " if @log
  38. token = @driver.execute_script(<<~JS)
  39. const config = JSON.parse(window.localStorage.localConfig_v2);
  40. const teams = Object.values(config.teams);
  41. const team = teams.find((team) => team.url.match('#{@domain}'));
  42. if (!team) {
  43. return null;
  44. } else {
  45. return team.token;
  46. }
  47. JS
  48. @driver.navigate.to("https://#{@domain}/api/emoji.list?token=#{token}")
  49. body = @driver.find_element(tag_name: 'body')
  50. data = JSON.parse(body.text)
  51. emoji_count = data['emoji'].size
  52. digits = emoji_count.to_s.size
  53. puts "found #{emoji_count} emoji" if @log
  54. data['emoji'].each_with_index do |emoji, index|
  55. next if URI(image_url).scheme == 'alias'
  56. name, image_url = emoji
  57. puts "#{(index + 1).to_s.rjust(digits, ' ')}/#{emoji_count} :#{name}:" if @log
  58. extension = File.extname(image_url)
  59. file_name = "#{name}#{extension}"
  60. file_path = File.join(@download_path, file_name)
  61. File.open(file_path, "wb") do |f|
  62. image = HTTParty.get(image_url)
  63. f.write(image.body)
  64. end
  65. end
  66. data['emoji']
  67. end
  68. def authenticated?
  69. @authenticated
  70. end
  71. end
  72. end