class DingtalkHelper

require ‘byebug’

Attributes

access_token[RW]
app_info[RW]
download_url[RW]
image_key[RW]
options[RW]
qrcode_path[RW]
title[RW]

Public Class Methods

new(app_info, options, qrcode_path, download_url) click to toggle source
# File lib/fir/util/dingtalk_helper.rb, line 10
def initialize(app_info, options, qrcode_path, download_url)
  @app_info = app_info
  @options = options
  @access_token = @options[:dingtalk_access_token]
  @secret = @options[:dingtalk_secret]
  @qrcode_path = qrcode_path
  @download_url = download_url
end

Public Instance Methods

build_dingtalk_at_info(payload) click to toggle source
# File lib/fir/util/dingtalk_helper.rb, line 42
def build_dingtalk_at_info(payload)
  answer = {}
  answer[:isAtAll] = options[:dingtalk_at_all]

  unless options[:dingtalk_at_phones].blank?
    answer[:atMobiles] = options[:dingtalk_at_phones].split(',')
    payload[:markdown][:text] += options[:dingtalk_at_phones].split(',').map { |x| "@#{x}" }.join(',')
  end

  payload[:at] = answer
end
secret_cal(secret) click to toggle source
# File lib/fir/util/dingtalk_helper.rb, line 54
def secret_cal(secret)
  timestamp = Time.now.to_i * 1000
  secret_enc = secret.encode('utf-8')
  str = "#{timestamp}\n#{secret}"
  string_to_sign_enc = str.encode('utf-8')

  hmac = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), secret_enc, string_to_sign_enc)
  {
    timestamp: timestamp,
    sign: CGI.escape(Base64.encode64(hmac).strip)
  }

end
send_msg() click to toggle source
# File lib/fir/util/dingtalk_helper.rb, line 19
def send_msg
  return if options[:dingtalk_access_token].blank?

  api_domain = @app_info[:api_url]
  title = "#{@app_info[:name]}-#{@app_info[:version]}(Build #{@app_info[:build]}) #{@app_info[:type]}"
  payload = {
    "msgtype": 'markdown',
    "markdown": {
      "title": "#{title} uploaded",
      "text": "#### #{title}\n\n>uploaded at #{Time.now}\n\nurl: #{download_url}\n\n#{options[:dingtalk_custom_message]}\n\n ![](#{api_domain}/welcome/qrcode?url=#{download_url})"
    }
  }
  build_dingtalk_at_info(payload)
  url = "https://oapi.dingtalk.com/robot/send?access_token=#{options[:dingtalk_access_token]}"
  if options[:dingtalk_secret]
    info = secret_cal(options[:dingtalk_secret])
    url = "#{url}&timestamp=#{info[:timestamp]}&sign=#{info[:sign]}"
  end

  x = DefaultRest.post(url, payload)
rescue StandardError => e
end