class UserManager(QObject): connected = pyqtSignal(str) openidGot = pyqtSignal(str) error = pyqtSignal(str) info = pyqtSignal(str) onUser = pyqtSignal(User) progress = pyqtSignal(int, int) def __init__(self): QObject.__init__(self) self.reset() self.statistic = Statistic(self.users) def reset(self): self.users = {} def connect(self, appid, secret): url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' %(appid, secret) try: r = requests.get(url) if r.status_code == 200: content = json.loads(r.content) if content.has_key('access_token'): self.access_token = content['access_token'] self.connected.emit('Connected to server successfully') elif content.has_key('errmsg'): errmsg = content['errmsg'] else: self.error.emit('Unknown error in connection') else: errmsg = 'Connection error with code %i' %(r.status_code) self.error.emit(errmsg) except: self.error.emit('Unhandling error in connection') def get_openids(self): url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=' %(self.access_token) try: r = requests.get(url) if r.status_code == 200: content = json.loads(r.content) if content.has_key('data'): self.openids = content['data']['openid'] self.openidGot.emit('Pull openids successfully') else: errmsg = 'Connection error with code %i' %(r.status_code) self.error.emit(errmsg) except: self.error.emit('Unhandling error in show users') def get_user(self, openid): if openid not in self.users: self.load_user(openid) self.onUser.emit(self.users[openid]) def dump_all_users(self): self.info.emit('Dumping all users information') t = threading.Thread(target = self.dump_execute) t.start() def dump_execute(self): for openid in self.openids: if openid not in self.users: t = threading.Thread(target = self.load_user, args = (openid,)) t.start() def load_user(self, openid): url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s' %(self.access_token, openid) msg = 'loading user %s' %(openid) self.info.emit(msg) try: r = requests.get(url) if r.status_code == 200: jobj = json.loads(r.content) if jobj.has_key('openid'): self.users[openid] = User(jobj) self.progress.emit(len(self.users), len(self.openids)) else: errmsg = 'User information error' self.error.emit(errmsg) else: errmsg = 'Connection error with code %i' %(r.status_code) self.error.emit(errmsg) except: self.error.emit('Unhandling error in load user info') def do_statistic(self): self.statistic.doStatistic() def show_stat_sex(self): self.statistic.showPieChart('sex') def show_stat_language(self): self.statistic.showPieChart('language') def show_stat_city(self): self.statistic.showPieChart('city') def show_stat_province(self): self.statistic.showPieChart('province') def show_stat_country(self): self.statistic.showPieChart('country')