def fetchGroupMemberTable(self, group): # 没有现在必要获取成员的 uin,也没有必要现在将 uin 和 qq 绑定起来。 # 需要的时候再绑定就可以了 memberTable = QContactTable('group-member') r = self.smartRequest( url='http://qun.qq.com/cgi-bin/qun_mgr/search_group_members', Referer='http://qun.qq.com/member.html', data={ 'gc': group.qq, 'st': '0', 'end': '2000', 'sort': '0', 'bkn': self.bkn }) for m in r['mems']: qq = str(m['uin']) nick = HTMLUnescape(str(m['nick'])) card = HTMLUnescape(str(m.get('card', ''))) memberTable.Add(name=(card or nick), nick=nick, qq=qq, card=card) memberTable.lastUpdateTime = time.time() return memberTable
def fetchBuddyTable(self): result = self.smartRequest( url = 'http://s.web2.qq.com/api/get_user_friends2', data = { 'r': JsonDumps({'vfwebqq':self.vfwebqq, 'hash':self.hash}) }, Referer = ('http://d1.web2.qq.com/proxy.html?v=20151105001&' 'callback=1&id=2'), expectedKey = 'marknames', repeatOnDeny = 4 ) markDict = dict((str(d['uin']), str(d['markname'])) for d in result['marknames']) qqResult = self.smartRequest( url = 'http://qun.qq.com/cgi-bin/qun_mgr/get_friend_list', data = {'bkn': self.bkn}, Referer = 'http://qun.qq.com/member.html' ) qqDict = collections.defaultdict(list) for blist in list(qqResult.values()): for d in blist.get('mems', []): name = HTMLUnescape(d['name']) qqDict[name].append(str(d['uin'])) buddies, unresolved, resolvedQQ = [], [], set() for info in result['info']: uin = str(info['uin']) nick = str(info['nick']) mark = markDict.get(uin, '') name = mark or nick qqlist = qqDict.get(name, []) if len(qqlist) == 1: qq = qqlist[0] resolvedQQ.add(qq) else: qq = '#NULL' unresolved.append('好友“%s”(uin=%s)' % (name, uin)) # 各属性的顺序绝对不能变 buddies.append([qq, uin, nick, mark, name]) for blist in list(qqResult.values()): for d in blist.get('mems', []): name = HTMLUnescape(d['name']) qq = str(d['uin']) if qq not in resolvedQQ: buddies.append([qq, '-'+qq, '#NULL', '#NULL', name]) if unresolved: unresolved.sort() WARN('因存在重名或名称中含特殊字符,无法绑定以下好友的真实QQ号,请修改其备' '注名,保证备注名的唯一性且不带特殊字符:\n\t%s', '\n\t'.join(unresolved)) return buddies
def fetchGroupMemberTable(self, group): # 没有现在必要获取成员的 uin,也没有必要现在将 uin 和 qq 绑定起来。 # 需要的时候再绑定就可以了 memberTable = QContactTable('group-member') r = self.smartRequest( url= 'http://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_members_new', Referer='http://qinfo.clt.qq.com/member.html', data={ 'gc': group.qq, 'u': self.uin, 'bkn': self.bkn }) for m in r['mems']: qq = str(m['u']) nick = HTMLUnescape(m['n']) card = HTMLUnescape(r.get('cards', {}).get(qq, '')) mark = HTMLUnescape(r.get('remarks', {}).get(qq, '')) join_time = r.get('join', {}).get(qq, 0) last_speak_time = r.get('times', {}).get(qq, 0) is_buddy = m['u'] in r.get('friends', []) if r['owner'] == m['u']: role, role_id = '群主', 0 elif m['u'] in r.get('adm', []): role, role_id = '管理员', 1 else: role, role_id = '成员', 2 level = r.get('lv', {}).get(qq, {}).get('l', 0) levelname = HTMLUnescape( r.get('levelname', {}).get('lvln' + str(level), '')) point = r.get('lv', {}).get(qq, {}).get('p', 0) memberTable.Add(name=(card or nick), nick=nick, qq=qq, card=card, join_time=join_time, last_speak_time=last_speak_time, role=role, role_id=role_id, mark=mark, is_buddy=is_buddy, level=level, levelname=levelname, point=point) memberTable.lastUpdateTime = time.time() return memberTable '''
def fetchBuddyTable(self): result = self.smartRequest( url='http://s.web2.qq.com/api/get_user_friends2', data={'r': JsonDumps({ 'vfwebqq': self.vfwebqq, 'hash': self.hash })}, Referer=('http://d1.web2.qq.com/proxy.html?v=20151105001&' 'callback=1&id=2'), expectedKey='marknames', repeatOnDeny=4) qqResult = self.smartRequest( url='http://qun.qq.com/cgi-bin/qun_mgr/get_friend_list', data={'bkn': self.bkn}, Referer='http://qun.qq.com/member.html') nameDict = {} for blist in list(qqResult.values()): for d in blist.get('mems', []): name = HTMLUnescape(d['name']) qq = str(d['uin']) nameDict[qq] = name buddies = [] for info in result['info']: uin = str(info['uin']) qq = str(info['nick']) name = nameDict.get(qq, '#NULL') nick = '#NULL' mark = '#NULL' buddies.append([qq, uin, nick, mark, name]) # 各属性的顺序绝对不能变 return buddies
def fetchGroupTable(self): qqResult = self.smartRequest( url='http://qun.qq.com/cgi-bin/qun_mgr/get_group_list', data={'bkn': self.bkn}, Referer='http://qun.qq.com/member.html' ) result = self.smartRequest( url='http://s.web2.qq.com/api/get_group_name_list_mask2', data={ 'r': JsonDumps({'vfwebqq': self.vfwebqq, 'hash': self.hash}) }, Referer=('http://d1.web2.qq.com/proxy.html?v=20151105001&' 'callback=1&id=2'), expectedKey='gmarklist', repeatOnDeny=6 ) markDict = dict((str(d['uin']), str(d['markname'])) \ for d in result['gmarklist']) qqDict = collections.defaultdict(list) for k in ('create', 'manage', 'join'): for d in qqResult.get(k, []): qqDict[HTMLUnescape(d['gn'])].append(str(d['gc'])) qqDict2 = getManaulGroupQQDict() groups, unresolved = [], [] for info in result['gnamelist']: uin = str(info['gid']) nick = str(info['name']) mark = markDict.get(uin, '') gcode = str(info['code']) if PY3: nick = nick.replace('\xa0', ' ') mark = mark.replace('\xa0', ' ') name = mark or nick qqlist = qqDict.get(nick, []) if len(qqlist) == 1: qq = qqlist[0] else: qqlist = qqDict2.get(nick, []) if len(qqlist) == 1: qq = qqlist[0] else: qq = '#NULL' unresolved.append('群“%s”(uin=%s)' % (name, uin)) groups.append([qq, uin, nick, mark, name, gcode]) if unresolved: unresolved.sort() WARN('因存在重名或名称中含特殊字符,无法绑定以下' '群的真实QQ号:\n\t%s', '\n\t'.join(unresolved)) return groups
def fetchGroupMemberTable(self, group): # 没有现在必要获取成员的 uin,也没有必要现在将 uin 和 qq 绑定起来。 # 需要的时候再绑定就可以了 memberTable = QContactTable('group-member') r = self.smartRequest( url='http://qun.qq.com/cgi-bin/qun_mgr/search_group_members', Referer='http://qun.qq.com/member.html', data={ 'gc': group.qq, 'st': '0', 'end': '2000', 'sort': '0', 'bkn': self.bkn }) for m in r['mems']: qq = str(m['uin']) nick = HTMLUnescape(str(m['nick'])) card = HTMLUnescape(str(m.get('card', ''))) role = ['群主', '管理员', '普通成员'][m.get('role', 2)] join_time = m.get('join_time', 0) last_speak_time = m.get('last_speak_time', 0) level = m.get('level', 0) levelname = r.get('levelname', {}).get(level, 'NULL') point = r.get('point', 0) qage = r.get('qage', 0) memberTable.Add(name=(card or nick), nick=nick, qq=qq, card=card, role=role, join_time=join_time, level=level, levelname=levelname, point=point, last_speak_time=last_speak_time, qage=qage) memberTable.lastUpdateTime = time.time() return memberTable
def fetchBuddyTable(self): buddyTable = QContactTable('buddy') result = self.smartRequest( url='http://s.web2.qq.com/api/get_user_friends2', data={ 'r': JsonDumps({ 'vfwebqq': self.vfwebqq, 'hash': self.hash }) }, Referer=('http://d1.web2.qq.com/proxy.html?v=20151105001&' 'callback=1&id=2'), expectedKey='marknames', repeatOnDeny=4) markDict = dict( (str(d['uin']), str(d['markname'])) for d in result['marknames']) qqResult = self.smartRequest( url='http://qun.qq.com/cgi-bin/qun_mgr/get_friend_list', data={'bkn': self.bkn}, Referer='http://qun.qq.com/member.html') qqDict = collections.defaultdict(list) for blist in list(qqResult.values()): for d in blist.get('mems', []): name = HTMLUnescape(d['name']) qqDict[name].append(str(d['uin'])) for info in result['info']: uin = str(info['uin']) nick = str(info['nick']) mark = markDict.get(uin, '') if PY3: nick = nick.replace('\xa0', ' ') mark = mark.replace('\xa0', ' ') name = mark or nick qqlist = qqDict.get(name, []) if len(qqlist) == 1: qq = qqlist.pop() else: qq = self.fetchBuddyQQ(uin) try: qqlist.remove(qq) except ValueError: pass buddyTable.Add(uin=uin, name=name, qq=qq, mark=mark, nick=nick) buddyTable.lastUpdateTime = time.time() return buddyTable
def fetchGroupMemberTable(self, group): result = self.smartRequest( url=('http://s.web2.qq.com/api/get_group_info_ext2?gcode=%s' '&vfwebqq=%s&t={rand}') % (group.gcode, self.vfwebqq), Referer=('http://s.web2.qq.com/proxy.html?v=20130916001' '&callback=1&id=1'), expectedKey='minfo', repeatOnDeny=5) uinDict = {} for m, inf in zip(result['ginfo']['members'], result['minfo']): uin = str(m['muin']) qq = str(inf['nick']) uinDict[qq] = uin membs = [] if group.qq != '#NULL': r = self.smartRequest( url= 'http://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_members_new', Referer='http://qinfo.clt.qq.com/member.html', data={ 'gc': group.qq, 'u': self.uin, 'bkn': self.bkn }) for m in r['mems']: qq = str(m['u']) if qq not in uinDict: continue uin = uinDict[qq] nick = HTMLUnescape(m['n']) card = HTMLUnescape(r.get('cards', {}).get(qq, '')) mark = HTMLUnescape(r.get('remarks', {}).get(qq, '')) name = card or nick join_time = r.get('join', {}).get(qq, 0) last_speak_time = r.get('times', {}).get(qq, 0) is_buddy = m['u'] in r.get('friends', []) if r['owner'] == m['u']: role, role_id = '群主', 0 elif m['u'] in r.get('adm', []): role, role_id = '管理员', 1 else: role, role_id = '普通成员', 2 level = r.get('lv', {}).get(qq, {}).get('l', 0) levelname = HTMLUnescape( r.get('levelname', {}).get('lvln' + str(level), '')) point = r.get('lv', {}).get(qq, {}).get('p', 0) memb = [ qq, uin, nick, mark, card, name, join_time, last_speak_time, role, role_id, is_buddy, level, levelname, point ] membs.append(memb) return membs
def fetchGroupMemberTable(self, group): result = self.smartRequest( url = ('http://s.web2.qq.com/api/get_group_info_ext2?gcode=%s' '&vfwebqq=%s&t={rand}') % (group.gcode, self.vfwebqq), Referer = ('http://s.web2.qq.com/proxy.html?v=20130916001' '&callback=1&id=1'), expectedKey = 'minfo', repeatOnDeny = 5 ) cardDict = collections.defaultdict(list) nickDict = collections.defaultdict(list) _qqDict = {} if group.qq != '#NULL': r = self.smartRequest( url='http://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_members_new', Referer='http://qinfo.clt.qq.com/member.html', data={'gc': group.qq, 'u': self.uin , 'bkn': self.bkn} ) for m in r['mems']: qq = str(m['u']) nick = HTMLUnescape(m['n']) card = HTMLUnescape(r.get('cards', {}).get(qq, '')) mark = HTMLUnescape(r.get('remarks', {}).get(qq, '')) name = card or nick join_time = r.get('join', {}).get(qq, 0) last_speak_time = r.get('times', {}).get(qq, 0) is_buddy = m['u'] in r.get('friends', []) if r['owner'] == m['u'] : role, role_id = '群主', 0 elif m['u'] in r.get('adm', []): role, role_id = '管理员', 1 else: role, role_id = '普通成员', 2 level = r.get('lv', {}).get(qq, {}).get('l', 0) levelname = HTMLUnescape(r.get('levelname', {}).get('lvln' + str(level), '')) point = r.get('lv', {}).get(qq, {}).get('p', 0) memb = [qq, None, nick, mark, card, name, join_time, last_speak_time, role, role_id, is_buddy, level, levelname, point] if card: cardDict[STR2BYTES(card)[:18]].append(memb) nickDict[nick].append(memb) _qqDict[qq] = memb membss, unresolved = [], [] ucDict = dict((str(it['muin']), it['card']) for it in result.get('cards', {})) for m, inf in zip(result['ginfo']['members'], result['minfo']): uin, nick = str(m['muin']), str(inf['nick']) card = ucDict.get(uin, '') if not PY3: card = card.replace('\xc2\xa0', ' ') nick = nick.replace('\xc2\xa0', ' ') else: card = card.replace('\xa0', ' ') nick = nick.replace('\xa0', ' ') name = card or nick membs = nickDict.get(nick, []) if len(membs) == 1: memb = membs[0] else: membs = cardDict.get(STR2BYTES(card)[:18], []) if len(membs) == 1: memb = membs[0] else: memb = None if memb is None: unresolved.append('成员“%s”(uin=%s)' % (name, uin)) memb = ['#NULL', uin, nick, mark, card, name, -1, -1, '#NULL', -1, -1, -1, '#NULL', -1] else: memb[1] = uin _qqDict.pop(memb[0], None) membss.append(memb) if unresolved: unresolved.sort() WARN('因存在重名或名称中含特殊字符,无法绑定 %s 中以下' '成员的真实QQ号:\n\t%s', group, '\n\t'.join(unresolved)) for memb in _qqDict.values(): memb[1] = '-' + memb[0] membss.append(memb) return membss
def fetchGroupTable(self): groupTable = QContactTable('group') qqResult = self.smartRequest( url='http://qun.qq.com/cgi-bin/qun_mgr/get_group_list', data={'bkn': self.bkn}, Referer='http://qun.qq.com/member.html') result = self.smartRequest( url='http://s.web2.qq.com/api/get_group_name_list_mask2', data={ 'r': JsonDumps({ 'vfwebqq': self.vfwebqq, 'hash': self.hash }) }, Referer=('http://d1.web2.qq.com/proxy.html?v=20151105001&' 'callback=1&id=2'), expectedKey='gmarklist', repeatOnDeny=6) markDict = dict((str(d['uin']), str(d['markname'])) \ for d in result['gmarklist']) qqDict = collections.defaultdict(list) for k in ('create', 'manage', 'join'): for d in qqResult.get(k, []): qqDict[HTMLUnescape(d['gn'])].append(str(d['gc'])) unresolved = [] for info in result['gnamelist']: uin = str(info['gid']) name = str(info['name']) mark = markDict.get(uin, '') if PY3: name = name.replace('\xa0', ' ') mark = mark.replace('\xa0', ' ') qqlist = qqDict.get(name, []) if len(qqlist) == 1: # 没有重名现象 qq = qqlist[0] qqDict.pop(name) elif len(qqlist) > 1: # 有重名现象 qq = self.fetchGroupQQ(uin) # 这里返回的qq号可能只有最后6位是对的 for trueQQ in qqlist[:]: if qq[-6:] == trueQQ[-6:]: qq = trueQQ qqlist.remove(trueQQ) break else: # 可能是 qun.qq.com 返回的 name 和 w.qq.com 返回的 name 不一致 # 比如: “x x” 和 “x x” ,尽管经过前面的转义处理,但可能还是 # 有没有转过来的 # 也可能是两次请求的空隙期间加入了一个新群(理论上有这种可能) unresolved.append((uin, name, mark)) continue groupTable.Add(uin=uin, name=(mark or name), nick=name, qq=qq, mark=mark, gcode=str(info['code'])) for uin, name, mark in unresolved: qq = self.fetchGroupQQ(uin) # 这里返回的qq号可能只有最后6位是对的 for xname, qqlist in list(qqDict.items()): for trueQQ in qqlist[:]: if qq[-6:] == trueQQ[-6:]: qq = trueQQ if len(qqlist) == 1: qqDict.pop(xname) else: qqlist.remove(qq) break else: continue break groupTable.Add(uin=uin, name=(mark or name), nick=name, qq=qq, mark=mark, gcode=str(info['code'])) groupTable.lastUpdateTime = time.time() return groupTable
def fetchGroupMemberTable(self, group): memberTable = QContactTable('group-member') result = self.smartRequest( url=('http://s.web2.qq.com/api/get_group_info_ext2?gcode=%s' '&vfwebqq=%s&t={rand}') % (group.gcode, self.vfwebqq), Referer=('http://s.web2.qq.com/proxy.html?v=20130916001' '&callback=1&id=1'), # expectedCodes = (0, 100003, 6, 15), expectedKey='ginfo', repeatOnDeny=5) r = self.smartRequest( url='http://qun.qq.com/cgi-bin/qun_mgr/search_group_members', Referer='http://qun.qq.com/member.html', data={ 'gc': group.qq, 'st': '0', 'end': '20', 'sort': '0', 'bkn': self.bkn }) qqDict, nickDict = {}, collections.defaultdict(list) for m in r['mems']: qq, nick, card = \ str(m['uin']), str(m['nick']), str(m.get('card', '')) nick = HTMLUnescape(nick) card = HTMLUnescape(card) memb = [qq, nick, card] qqDict[qq] = memb nickDict[nick].append(memb) if 'minfo' in result: for m, inf in zip(result['ginfo']['members'], result['minfo']): uin, nick = str(m['muin']), str(inf['nick']) membs = nickDict.get(nick, []) if len(membs) == 1: qq, card = membs[0][0], membs[0][2] else: qq = self.fetchBuddyQQ(uin) if qq in qqDict: card = qqDict[qq][2] try: membs.remove(qqDict[qq]) except ValueError: pass else: card = '' memberTable.Add(uin=uin, name=(card or nick), nick=nick, qq=qq, card=card) else: for m in result['ginfo']['members']: uin = str(m['muin']) qq = self.fetchBuddyQQ(uin) if qq in qqDict: nick, card = qqDict[qq][1], qqDict[qq][2] else: nick, card = '##UNKOWN', '' memberTable.Add(uin=uin, name=(card or nick), nick=nick, qq=qq, card=card) memberTable.lastUpdateTime = time.time() return memberTable