Eric-Guo/wechat

View on GitHub
bin/wechat

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)

require 'thor'
require 'wechat'
require 'json'
require 'fileutils'
require 'yaml'
require 'cgi'

class App < Thor
  class_option :account, aliases: '-a', default: :default, desc: 'Name of Wechat account configuration.'

  attr_reader :wechat_api_client
  no_commands do
    def wechat_api
      @wechat_api_client ||= Wechat::ApiLoader.with(options)
    end
  end

  option :token_file, aliases: '-t', desc: 'File to store access token'
  desc 'callbackip', '获取微信服务器IP地址'
  def callbackip
    puts wechat_api.callbackip
  end

  desc 'qrcode_download [TICKET, QR_CODE_PIC_PATH]', '通过ticket下载二维码'
  def qrcode_download(ticket, qr_code_pic_path)
    tmp_file = wechat_api.qrcode(ticket)
    FileUtils.mv(tmp_file.path, qr_code_pic_path)
    puts 'File downloaded'
  end

  in_corp_api_cmd = Wechat::ApiLoader.with(options).is_a?(Wechat::CorpApi)

  if in_corp_api_cmd
    package_name 'Wechat Enterprise Account'
    desc 'department_create [NAME, PARENT_ID]', '创建部门'
    method_option :parentid, aliases: '-p', desc: '父亲部门id。根部门id为1'
    def department_create(name)
      api_opts = options.slice(:parentid)
      puts wechat_api.department_create(name, api_opts[:parentid] || '1')
    end

    desc 'department_delete [DEPARTMENT_ID]', '删除部门'
    def department_delete(departmentid)
      puts wechat_api.department_delete(departmentid)
    end

    desc 'department_update [DEPARTMENT_ID, NAME]', '更新部门'
    method_option :parentid, aliases: '-p', desc: '父亲部门id。根部门id为1', default: nil, check_default_type: false
    method_option :order, aliases: '-o', desc: '在父部门中的次序值。order值小的排序靠前。', default: nil, check_default_type: false
    def department_update(departmentid, name)
      api_opts = options.slice(:parentid, :order)
      puts wechat_api.department_update(departmentid, name, api_opts[:parentid], api_opts[:order])
    end

    desc 'department [DEPARTMENT_ID]', '获取部门列表'
    def department(departmentid = 1)
      r = wechat_api.department(departmentid)
      puts "errcode: #{r['errcode']} errmsg: #{r['errmsg']}"
      puts 'Or# pid  id name'
      r['department'].sort_by { |d| d['order'].to_i + d['parentid'].to_i * 1000 } .each do |i|
        puts format('%3d %3d %3d %s', i['order'], i['parentid'], i['id'], i['name'])
      end
    end

    desc 'user_create [USER_ID, NAME]', '创建成员'
    method_option :departmentid, aliases: '-d', desc: '所属部门id'
    method_option :mobile, aliases: '-m', desc: '手机号码'
    method_option :email, aliases: '-e', desc: '邮箱'
    method_option :weixinid, aliases: '-w', desc: '微信号'
    def user_create(userid, name)
      api_opts = options.slice(:departmentid, :mobile, :email, :weixinid)
      user = { userid: userid, name: name }
      if api_opts[:departmentid].present?
        user[:department] = Array(api_opts['departmentid'].to_i)
      else
        user[:department] = [1]
      end
      user[:mobile] = api_opts[:mobile] if api_opts[:mobile].present?
      user[:email] = api_opts[:email] if api_opts[:email].present?
      user[:weixinid] = api_opts[:weixinid] if api_opts[:weixinid].present?
      puts wechat_api.user_create(user)
    end

    desc 'user_delete [USER_ID]', '删除成员'
    def user_delete(userid)
      puts wechat_api.user_delete(userid)
    end

    desc 'user_batchdelete [USER_ID_LIST]', '批量删除成员'
    def user_batchdelete(useridlist)
      puts wechat_api.user_batchdelete(useridlist.split(','))
    end

    desc 'user_simplelist [DEPARTMENT_ID]', '获取部门成员'
    method_option :fetch_child, aliases: '-c', desc: '是否递归获取子部门下面的成员', default: 1, check_default_type: false
    method_option :status, aliases: '-s', desc: '0 获取全部成员,1 获取已关注成员列表,2 获取禁用成员列表,4 获取未关注成员列表。status可叠加', default: 0, check_default_type: false
    def user_simplelist(departmentid = 1)
      api_opts = options.slice(:fetch_child, :status)

      r = wechat_api.user_simplelist(departmentid, api_opts[:fetch_child], api_opts[:status])
      puts "errcode: #{r['errcode']} errmsg: #{r['errmsg']}"
      puts " userid Name #{' ' * 20} department_ids"
      r['userlist'].sort_by { |d| d['userid'] } .each do |i|
        puts format('%7s %-25s %-14s', i['userid'], i['name'], i['department'])
      end
    end

    desc 'user_list [DEPARTMENT_ID]', '获取部门成员详情'
    method_option :fetch_child, aliases: '-c', desc: '是否递归获取子部门下面的成员', default: 0, check_default_type: false
    method_option :status, aliases: '-s', desc: '0 获取全部成员,1 获取已关注成员列表,2 获取禁用成员列表,4 获取未关注成员列表。status可叠加', default: 0, check_default_type: false
    def user_list(departmentid = 1)
      api_opts = options.slice(:fetch_child, :status)

      r = wechat_api.user_list(departmentid, api_opts[:fetch_child], api_opts[:status])
      puts "errcode: #{r['errcode']} errmsg: #{r['errmsg']}"
      puts " userid Name #{' ' * 15} department_ids position mobile #{' ' * 5}gender email #{' ' * 10}weixinid   status extattr"
      r['userlist'].sort_by { |d| d['userid'] } .each do |i|
        puts format('%7s %-20s %-14s %-8s %-11s %-6s %-15s %-15s %-6s %s',
                    i['userid'], i['name'], i['department'], i['position'], i['mobile'],
                    i['gender'], i['email'], i['weixinid'], i['status'], i['extattr'])
      end
    end

    desc 'invite_user [USER_ID]', '邀请成员关注'
    def invite_user(userid)
      puts wechat_api.invite_user(userid)
    end

    desc 'tag_add_department [TAG_ID, PARTY_IDS]', '增加标签部门'
    def tag_add_department(tagid, partyids)
      puts wechat_api.tag_add_user(tagid, nil, partyids.split(','))
    end

    desc 'tag_del_department [TAG_ID, PARTY_IDS]', '删除标签部门'
    def tag_del_department(tagid, partyids)
      puts wechat_api.tag_del_user(tagid, nil, partyids.split(','))
    end

    desc 'batch_job_result [JOB_ID]', '获取异步任务结果'
    def batch_job_result(job_id)
      puts wechat_api.batch_job_result(job_id)
    end

    desc 'batch_replaceparty [BATCH_PARTY_CSV_MEDIA_ID]', '全量覆盖部门'
    def batch_replaceparty(batch_party_csv_media_id)
      puts wechat_api.batch_replaceparty(batch_party_csv_media_id)
    end

    desc 'upload_replaceparty [BATCH_PARTY_CSV_PATH]', '上传文件方式全量覆盖部门'
    def upload_replaceparty(batch_party_csv_path)
      media_id = wechat_api.media_create('file', batch_party_csv_path)['media_id']
      job_id = wechat_api.batch_replaceparty(media_id)['jobid']
      puts "running job_id: #{job_id}"
      puts wechat_api.batch_job_result(job_id)
    end

    desc 'batch_syncuser [SYNC_USER_CSV_MEDIA_ID]', '增量更新成员'
    def batch_syncuser(sync_user_csv_media_id)
      puts wechat_api.batch_syncuser(sync_user_csv_media_id)
    end

    desc 'batch_replaceuser [BATCH_USER_CSV_MEDIA_ID]', '全量覆盖成员'
    def batch_replaceuser(batch_user_csv_media_id)
      puts wechat_api.batch_replaceuser(batch_user_csv_media_id)
    end

    desc 'upload_replaceuser [BATCH_USER_CSV_PATH]', '上传文件方式全量覆盖成员'
    def upload_replaceuser(batch_user_csv_path)
      media_id = wechat_api.media_create('file', batch_user_csv_path)['media_id']
      job_id = wechat_api.batch_replaceuser(media_id)['jobid']
      puts "running job_id: #{job_id}"
      puts wechat_api.batch_job_result(job_id)
    end

    desc 'convert_to_openid [USER_ID]', 'userid转换成openid'
    def convert_to_openid(userid)
      puts wechat_api.convert_to_openid(userid)
    end

    desc 'convert_to_userid [OPENID]', 'openid转换成userid'
    def convert_to_userid(openid)
      puts wechat_api.convert_to_userid(openid)
    end

    desc 'agent_list', '获取应用概况列表'
    def agent_list
      r = wechat_api.agent_list
      puts "errcode: #{r['errcode']} errmsg: #{r['errmsg']}"
      puts 'ag# name        square_logo_url round_logo_url'
      r['agentlist'].sort_by { |d| d['agentid'] } .each do |i|
        puts format('%3d %s %s %s', i['agentid'], i['name'], i['square_logo_url'], i['round_logo_url'])
      end
    end

    desc 'agent [AGENT_ID]', '获取企业号应用详情'
    def agent(agentid)
      r = wechat_api.agent(agentid)
      puts "agentid: #{r['agentid']} errcode: #{r['errcode']} errmsg: #{r['errmsg']}"
      puts "name: #{r['name']}"
      puts "description: #{r['description']}"
      puts "  square_logo_url: #{r['square_logo_url']}"
      puts "   round_logo_url: #{r['round_logo_url']}"
      puts "allow_userinfos: #{r['allow_userinfos']}"
      puts "allow_partys: #{r['allow_partys']}"
      puts "allow_tags: #{r['allow_tags']}"
      puts "close: #{r['close']} redirect_domain: #{r['redirect_domain']}"
      puts "report_location_flag: #{r['report_location_flag']} isreportuser: #{r['isreportuser']} isreportenter: #{r['isreportenter']}"
    end

    desc 'message_send [OPENID, TEXT_MESSAGE]', '发送文字消息'
    def message_send(openid, text_message)
      puts wechat_api.message_send openid, text_message
    end
  else
    package_name 'Wechat Public Account'
    desc 'wxacode_download [WXA_CODE_PIC_PATH, PATH, WIDTH]', '下载小程序码'
    def wxacode_download(wxa_code_pic_path, path = 'pages/index/index', width = 430)
      tmp_file = wechat_api.wxa_get_wxacode(path, width)
      FileUtils.mv(tmp_file.path, wxa_code_pic_path)
      puts 'WXA Code File downloaded'
    end

    desc 'wxa_msg_sec_check [CONTENT]', '检查一段文本是否含有违法违规内容。'
    def wxa_msg_sec_check(content)
      puts wechat_api.wxa_msg_sec_check(content)
    end

    desc 'wxa_generate_urllink [PATH]', '获取小程序 URL Link'
    def wxa_generate_urllink(path)
      body_hash = { path: path, expire_type: 0 }
      puts wechat_api.wxa_generate_urllink(body_hash)
    end

    desc 'wxa_generate_shortlink [PATH]', '获取小程序 Short Link'
    def wxa_generate_shortlink(url, title = '', is_permanent = false)
      body_hash = { page_url: url, page_title: title, is_permanent: is_permanent}
      puts wechat_api.wxa_generate_shortlink(body_hash)
    end

    desc 'media_uploadnews [MPNEWS_YAML_PATH]', '上传图文消息素材'
    def media_uploadnews(mpnews_yaml_path)
      mpnew = Wechat::ApiLoader.load_yaml(File.read(mpnews_yaml_path))
      puts wechat_api.media_uploadnews(Wechat::Message.new(MsgType: 'uploadnews').mpnews(mpnew[:articles]))
    end

    desc 'draft_add [ARTICLE_YAML_PATH]', '新建草稿'
    def draft_add(article_yaml_path)
      yml_hash = Wechat::ApiLoader.load_yaml(File.read(article_yaml_path))
      puts wechat_api.draft_add(Wechat::Message.new(MsgType: 'draft_news').draft_news(yml_hash[:articles]))
    end

    desc 'draft_get [MEDIA_ID]', '获取草稿'
    def draft_get(media_id)
      puts wechat_api.draft_get(media_id)
    end

    desc 'draft_delete [MEDIA_ID]', '删除草稿'
    def draft_delete(media_id)
      puts wechat_api.draft_delete(media_id)
    end

    desc 'draft_count', '获取草稿总数'
    def draft_count
      puts wechat_api.draft_count
    end

    desc 'draft_batchget [OFFSET, COUNT]', '获取草稿列表'
    method_option :no_content, aliases: '-no_content', desc: '不要返回 content 字段', default: true, check_default_type: false
    def draft_batchget(offset, count)
      api_opts = options.slice(:no_content)
      wechat_api.draft_batchget(offset, count, no_content: api_opts[:no_content])
    end

    desc 'draft_switch', '检查草稿箱和发布功能开关状态'
    method_option :enable_draft, aliases: '-enable_draft', desc: '立刻开启草稿箱和发布功能', default: false, check_default_type: false
    def draft_switch
      api_opts = options.slice(:enable_draft)
      puts wechat_api.draft_switch(checkonly: api_opts[:enable_draft] || false)
    end

    desc 'message_mass_delete [MSG_ID]', '删除群发消息'
    def message_mass_delete(msg_id)
      puts wechat_api.message_mass_delete(msg_id)
    end

    desc 'message_mass_preview [WX_NAME, MPNEWS_MEDIA_ID]', '预览图文消息素材'
    def message_mass_preview(wx_name, mpnews_media_id)
      puts wechat_api.message_mass_preview(Wechat::Message.to(towxname: wx_name).ref_mpnews(mpnews_media_id))
    end

    desc 'message_mass_get [MSG_ID]', '查询群发消息发送状态'
    def message_mass_get(msg_id)
      puts wechat_api.message_mass_get(msg_id)
    end

    desc 'group_create [GROUP_NAME]', '创建分组'
    def group_create(group_name)
      puts wechat_api.group_create(group_name)
    end

    desc 'groups', '查询所有分组'
    def groups
      puts wechat_api.groups
    end

    desc 'user_group [OPEN_ID]', '查询用户所在分组'
    def user_group(openid)
      puts wechat_api.user_group(openid)
    end

    desc 'group_update [GROUP_ID, NEW_GROUP_NAME]', '修改分组名'
    def group_update(groupid, new_group_name)
      puts wechat_api.group_update(groupid, new_group_name)
    end

    desc 'user_change_group [OPEN_ID, TO_GROUP_ID]', '移动用户分组'
    def user_change_group(openid, to_groupid)
      puts wechat_api.user_change_group(openid, to_groupid)
    end

    desc 'group_delete [GROUP_ID]', '删除分组'
    def group_delete(groupid)
      puts wechat_api.group_delete(groupid)
    end

    desc 'users', '关注者列表'
    def users
      puts wechat_api.users
    end

    desc 'user_batchget [OPEN_ID_LIST]', '批量获取用户基本信息'
    def user_batchget(openidlist)
      puts wechat_api.user_batchget(openidlist.split(','))
    end

    desc 'qrcode_create_scene [SCENE_ID_OR_STR, EXPIRE_SECONDS]', '请求临时二维码'
    def qrcode_create_scene(scene_id_or_str, expire_seconds = 604800)
      puts wechat_api.qrcode_create_scene(scene_id_or_str, expire_seconds)
    end

    desc 'qrcode_create_limit_scene [SCENE_ID_OR_STR]', '请求永久二维码'
    def qrcode_create_limit_scene(scene_id_or_str)
      puts wechat_api.qrcode_create_limit_scene(scene_id_or_str)
    end

    desc 'shorturl [LONG_URL]', '长链接转短链接'
    def shorturl(long_url)
      puts wechat_api.shorturl(long_url)
    end

    desc 'customservice_getonlinekflist', '获取在线客服接待信息'
    def customservice_getonlinekflist
      puts wechat_api.customservice_getonlinekflist
    end

    desc 'addvoicetorecofortext [VOICE_ID]', 'AI开放接口-提交语音'
    def addvoicetorecofortext(voice_id)
      puts wechat_api.addvoicetorecofortext(voice_id)
    end

    desc 'queryrecoresultfortext [VOICE_ID]', 'AI开放接口-获取语音识别结果'
    def queryrecoresultfortext(voice_id)
      puts wechat_api.queryrecoresultfortext(voice_id)
    end

    desc 'translatecontent [CONTENT]', 'AI开放接口-微信翻译'
    def translatecontent(content)
      puts wechat_api.translatecontent(content)
    end
  end

  desc 'user [OPEN_ID]', '获取用户基本信息'
  def user(open_id)
    puts wechat_api.user(open_id)
  end

  desc 'user_update_remark [OPEN_ID, REMARK]', '设置备注名'
  def user_update_remark(openid, remark)
    puts wechat_api.user_update_remark(openid, remark)
  end

  desc 'menu', '当前菜单'
  def menu
    puts wechat_api.menu
  end

  desc 'menu_delete', '删除菜单'
  def menu_delete
    puts 'Menu deleted' if wechat_api.menu_delete
  end

  desc 'menu_create [MENU_YAML_PATH]', '创建菜单'
  def menu_create(menu_yaml_path)
    menu = Wechat::ApiLoader.load_yaml(File.read(menu_yaml_path))
    puts 'Menu created' if wechat_api.menu_create(menu)
  end

  desc 'menu_addconditional [CONDITIONAL_MENU_YAML_PATH]', '创建个性化菜单'
  def menu_addconditional(conditional_menu_yaml_path)
    conditional_menu = Wechat::ApiLoader.load_yaml(File.read(conditional_menu_yaml_path))
    add_result = wechat_api.menu_addconditional(conditional_menu)
    puts "Conditional menu created: #{add_result}" if add_result
  end

  desc 'menu_trymatch [USER_ID]', '测试个性化菜单匹配结果'
  def menu_trymatch(user_id)
    puts wechat_api.menu_trymatch(user_id)
  end

  desc 'menu_delconditional [MENU_ID]', '删除个性化菜单'
  def menu_delconditional(menuid)
    puts wechat_api.menu_delconditional(menuid)
  end

  desc 'media [MEDIA_ID, PATH]', '媒体下载'
  def media(media_id, path)
    tmp_file = wechat_api.media(media_id)
    FileUtils.mv(tmp_file.path, path)
    puts 'File downloaded'
  end

  desc 'media_hq [MEDIA_ID, PATH]', '高清音频媒体下载'
  def media_hq(media_id, path)
    tmp_file = wechat_api.media_hq(media_id)
    FileUtils.mv(tmp_file.path, path)
    puts 'File downloaded'
  end

  desc 'media_create [MEDIA_TYPE, PATH]', '媒体上传'
  def media_create(type, path)
    puts wechat_api.media_create(type, path)
  end

  desc 'media_uploadimg [IMAGE_PATH]', '上传图文消息内的图片'
  def media_uploadimg(image_path)
    puts wechat_api.media_uploadimg(image_path)
  end

  desc 'material_get [MEDIA_ID, PATH]', '永久媒体下载'
  def material_get(media_id, path)
    tmp_file = wechat_api.get_material(media_id)
    FileUtils.mv(tmp_file.path, path)
    puts 'File downloaded'
  end

  desc 'material_add [MEDIA_TYPE, PATH]', '永久媒体上传'
  def material_add(type, path)
    puts wechat_api.material_add(type, path)
  end

  desc 'material_add_news [MPNEWS_YAML_PATH]', '永久图文素材上传'
  def material_add_news(mpnews_yaml_path)
    new = Wechat::ApiLoader.load_yaml(File.read(mpnews_yaml_path))
    puts wechat_api.material_add_news(Wechat::Message.new(MsgType: 'mpnews').mpnews(new['articles']))
  end

  desc 'material_delete [MEDIA_ID]', '删除永久素材'
  def material_delete(media_id)
    puts wechat_api.material_delete(media_id)
  end

  desc 'material_count', '获取永久素材总数'
  def material_count
    puts wechat_api.material_count
  end

  desc 'material_list [TYPE, OFFSET, COUNT]', '获取永久素材列表'
  def material_list(type, offset, count)
    r = wechat_api.material_list(type, offset, count)
    if %w(image voice video file).include?(type)
      puts "errcode: #{r['errcode']} errmsg: #{r['errmsg']} total_count: #{r['total_count']} item_count: #{r['item_count']}"
      if wechat_api.is_a?(Wechat::CorpApi)
        r['itemlist'].each { |i| puts "#{i['media_id']} #{i['filename']} #{Time.at(i['update_time'].to_i)}" }
      else
        r['item'].each { |i| puts "#{i['media_id']} #{i['name']} #{Time.at(i['update_time'].to_i)}" }
      end
    else
      puts r
    end
  end

  desc 'custom_text [OPENID, TEXT_MESSAGE]', '发送文字客服消息'
  def custom_text(openid, text_message)
    puts wechat_api.custom_message_send Wechat::Message.to(openid).text(text_message)
  end

  desc 'custom_image [OPENID, IMAGE_PATH]', '发送图片客服消息'
  def custom_image(openid, image_path)
    api = wechat_api
    media_id = api.media_create('image', image_path)['media_id']
    puts api.custom_message_send Wechat::Message.to(openid).image(media_id)
  end

  desc 'custom_voice [OPENID, VOICE_PATH]', '发送语音客服消息'
  def custom_voice(openid, voice_path)
    api = wechat_api
    media_id = api.media_create('voice', voice_path)['media_id']
    puts api.custom_message_send Wechat::Message.to(openid).voice(media_id)
  end

  desc 'custom_video [OPENID, VIDEO_PATH]', '发送视频客服消息'
  method_option :title, aliases: '-h', desc: '视频标题'
  method_option :description, aliases: '-d', desc: '视频描述'
  def custom_video(openid, video_path)
    api = wechat_api
    api_opts = options.slice(:title, :description)
    media_id = api.media_create('video', video_path)['media_id']
    puts api.custom_message_send Wechat::Message.to(openid).video(media_id, api_opts)
  end

  desc 'custom_music [OPENID, THUMBNAIL_PATH, MUSIC_URL]', '发送音乐客服消息'
  method_option :title, aliases: '-h', desc: '音乐标题'
  method_option :description, aliases: '-d', desc: '音乐描述'
  method_option :HQ_music_url, aliases: '-u', desc: '高质量音乐URL链接'
  def custom_music(openid, thumbnail_path, music_url)
    api = wechat_api
    api_opts = options.slice(:title, :description, :HQ_music_url)
    thumb_media_id = api.media_create('thumb', thumbnail_path)['thumb_media_id']
    puts api.custom_message_send Wechat::Message.to(openid).music(thumb_media_id, music_url, api_opts)
  end

  desc 'custom_news [OPENID, NEWS_YAML_PATH]', '发送图文客服消息'
  def custom_news(openid, news_yaml_path)
    articles = Wechat::ApiLoader.load_yaml(File.read(news_yaml_path))
    puts wechat_api.custom_message_send Wechat::Message.to(openid).news(articles['articles'])
  end

  desc 'template_message [OPENID, TEMPLATE_YAML_PATH]', '模板消息接口'
  def template_message(openid, template_yaml_path)
    template = Wechat::ApiLoader.load_yaml(File.read(template_yaml_path))
    puts wechat_api.template_message_send Wechat::Message.to(openid).template(template['template'])
  end

  desc 'tags', '获取所有标签'
  def tags
    puts wechat_api.tags
  end

  desc 'tag_create [TAGNAME, TAG_ID]', '创建标签'
  method_option :tagid, aliases: '-id', desc: '整型,指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增' if in_corp_api_cmd
  def tag_create(tag_name)
    if in_corp_api_cmd
      api_opts = options.slice(:tagid)
      puts wechat_api.tag_create(tag_name, api_opts[:tagid])
    else
      puts wechat_api.tag_create(tag_name)
    end
  end

  desc 'tag_update [TAG_ID, TAGNAME]', '更新标签名字'
  def tag_update(tagid, tagname)
    puts wechat_api.tag_update(tagid, tagname)
  end

  desc 'tag_delete [TAG_ID]', '删除标签'
  def tag_delete(tagid)
    puts wechat_api.tag_delete(tagid)
  end

  if in_corp_api_cmd
    desc 'tag_add_user [TAG_ID, USER_IDS]', '增加标签成员'
  else
    desc 'tag_add_user [TAG_ID, OPEN_IDS]', '批量为用户打标签'
  end
  def tag_add_user(tagid, open_or_user_ids)
    puts wechat_api.tag_add_user(tagid, open_or_user_ids.split(','))
  end

  if in_corp_api_cmd
    desc 'tag_del_user [TAG_ID, USER_IDS]', '删除标签成员'
  else
    desc 'tag_del_user [TAG_ID, OPEN_IDS]', '批量为用户取消标签'
  end
  def tag_del_user(tagid, open_or_user_ids)
    puts wechat_api.tag_del_user(tagid, open_or_user_ids.split(','))
  end

  if in_corp_api_cmd
    desc 'tag [TAG_ID]', '获取标签成员'
  else
    desc 'tag [TAGID]', '获取标签下粉丝列表'
  end
  def tag(tagid)
    puts wechat_api.tag tagid
  end

  desc 'getusersummary [BEGIN_DATE, END_DATE]', '获取用户增减数据'
  def getusersummary(begin_date, end_date)
    puts wechat_api.getusersummary(begin_date, end_date)
  end

  desc 'getusercumulate [BEGIN_DATE, END_DATE]', '获取累计用户数据'
  def getusercumulate(begin_date, end_date)
    puts wechat_api.getusercumulate(begin_date, end_date)
  end

  desc 'clear_quota', '接口调用次数清零'
  def clear_quota
    puts wechat_api.clear_quota
  end

  def self.exit_on_failure?
    true
  end
end

App.start