docs: function apiExc(apiName, apiExtra){
    var Config = require('./config').Config
      , config = new Config(confPath)
      , token = config.get('tsina.access_token') || ''
      , apiItem = twei.getApiItem(apiName)
      , weiboEmitter
      , emitter = new Emitter
      ;
      
    process.nextTick(function(){
      var query = require('querystring').decode(apiExtra)
        , proxy = optInfo.proxy ? optInfo.proxy[0] : config.get('proxy')
        ;
        
      query.access_token = token;
      log('apiExtra: ' + apiExtra);
      log('apiPath: ' + apiItem.path);
      log('query: ' + util.inspect(query));
      log('proxy: ' + proxy);
      
      emitter.emit('pendStart');
      
      if(proxy){
        twei.setProxy(proxy)
      }
      if(apiName == 'status.update' && optInfo.image && optInfo.image.length && query.status){
        weiboEmitter = twei.updateWeibo({
            accessToken: token
          , message: query.status
          , image: optInfo.image[0]
          , coordinates: optInfo.coordinates
        });
      }else{
        weiboEmitter = twei.executeApi(apiName, query, {
          method: optInfo.method && optInfo.method[0] || 'get'
        });
      }
      
      weiboEmitter.on('success', function(reply){
        var isLive
          , showData = [], outStr = ''
          ;
        
        emitter.emit('pendEnd', true, reply);
        
        log(reply);
        isLive = checkreply(reply);
        
        if(isLive){
          if(optInfo.filter){
            optInfo.filter.forEach(function(filterStr){
              showData.push(filter(reply, filterStr.trim().split('.')));
            });
            
            function filter(target, keys){
              var keys = keys.slice()//拷贝一份, 防止递归调用影响到上一级的 keys
                , key
                , ret = []
                , self = arguments.callee
                ;
              
              if(keys && keys.length){
                key = keys.shift();
                if(target instanceof Array){
                  
                  target.forEach(function(item){
                    if(key in item){
                      ret = ret.concat(self(item[key], keys));
                    }
                  });
                
                }else if(typeof target == 'object'){
                  ret = self(target[key], keys);
                }else{
                  ret = [];
                }
              }else{
                ret = [target];
              }
              
              return ret;
            }
            
            if(showData.length == 1){
              outStr = showData[0].join('\n');
            }else{
              (function(){
                var tData = {}
                  , group
                  ;
                  
                showData.forEach(function(item){
                  tData[item.length] = tData[item.length] || [];
                  item.forEach(function(val, row){
                    tData[item.length][row] = tData[item.length][row] || [];
                    tData[item.length][row].push(val);
                  });
                });
                
                for(var len in tData){
                  if(len === '1'){
                    group = new Table;
                    group.push(tData[len][0])
                    outStr += group.toString() + '\n';
                  }else{
                    group = new Table;
                    tData[len].forEach(function(d){
                      group.push(d);
                    });
                    outStr += group.toString() + '\n';
                  }
                }
                
              })();
            }
            console.log(outStr);
            if(!outStr || outStr.replace(/\s+/, '') * 1 === 0){//没有想要的字段, 或者全为 0 的时候
              exit(3);
            }
          }else{
            emitter.emit('data', optInfo.promise && optInfo.promise[0] || apiItem.promise, reply);
          }
        }else if(isLive === false){
          emitter.emit('data', 'error', reply);
          exit(3);
        }else{
          emitter.emit('noAuth', reply);
          log('event: noAuth');//需要登录
          takeAccessToken(function(){
            emitter.emit('retry', apiExc(apiName, apiExtra));
          });
        }
      });
      
      weiboEmitter.on('error', function(err){
        emitter.emit('pendEnd', false, err);
      });
    });
    return emitter.on('pendStart', function(){
      if(optInfo.quiet) return;
      log('event: pendStart')
      optInfo.shower.emit('pendStart');
    }).on('pendEnd', function(result, replyOrError){
      if(optInfo.quiet) return;
      log('event: pendEnd ' + result);
      optInfo.shower.emit('pendEnd', result, replyOrError);
    }).on('data', function(type, reply){
      if(optInfo.quiet && type === 'error') return;
      log('event: data_' + type);
      optInfo.shower.emit('data', type, reply);
    });
  }