Example #1
0
    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
Example #2
0
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
Example #3
0
    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
        '''
Example #4
0
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
Example #5
0
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
Example #6
0
    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
Example #7
0
    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
Example #8
0
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
Example #9
0
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
Example #10
0
    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
Example #11
0
    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