zoukankan      html  css  js  c++  java
  • 获取QQ企业邮箱通讯录PY脚本


    #!/usr/bin/env python
    #
     -*- coding: utf-8 -*-
    #
     @Last Modified time: 2016-03-03 22:45:18
    #
     @Description: 获取腾讯企业邮箱通讯录
    import requests
    import re
    import rsa
    import sys
    import base64
    import time
    import argparse
    reload(sys)

    sys.setdefaultencoding('utf8')


    # 打印部门人员信息
    def print_tree(id, department_infos, level, staff_infors, f):
        prefix = '----' * level
        text = prefix + department_infos[id]['name'] + prefix
        print text
        f.write(text + ' ')
        for key, value in department_infos.items():
            if value['pid'] == id:
                print_tree(
                    value['id'], department_infos, level + 1, staff_infors, f)
        prefix = '    ' * level
        for staff in staff_infors:
            if staff['pid'] == id:
                text = prefix + staff['name'] + '  ' + staff['alias']
                print text
                f.write(text + ' ')


    # 提取RSA算法的公钥
    def get_public_key(content):
        regexp = r'vars*PublicKeys*=s*"(w+?)";'
        results = re.findall(regexp, content)
        if results:
            return results[0]


    # 获取ts参数
    def get_ts(content):
        regexp = r'PublicTss*=s*"([0-9]+)"'
        results = re.findall(regexp, content)
        if results:
            return results[0]


    # 计算p参数
    def get_p(public_key, password, ts):
        public_key = rsa.PublicKey(int(public_key, 16), 65537)
        res_tmp = rsa.encrypt(
            '{password} {ts} '.format(password=password, ts=ts), public_key)
        return base64.b64encode(res_tmp)


    def msg():
        return 'python get_tencent_exmail_contacts.py -u name@domain.com -p passw0rd'

    if __name__ == "__main__":
        description = "获取腾讯企业邮箱通讯录"
        parser = argparse.ArgumentParser(description=description, usage=msg())
        parser.add_argument(
            "-u""--email", required=True, dest="email", help="邮箱名")
        parser.add_argument(
            "-p""--password", required=True, dest="password", help="邮箱密码")
        parser.add_argument(
            "-l""--limit", required=False, dest="limit", default=10000, help="通讯录条数")
        parser.add_argument(
            "-e""--efile", required=False, dest="emailfile", default="emails.txt", help="邮箱保存文件")
        parser.add_argument(
            "-d""--dfile", required=False, dest="departfile", default="departments.txt", help="部门信息保存文件")
        args = parser.parse_args()
        email = args.email
        password = args.password
        limit = args.limit
        emailfile = args.emailfile
        departfile = args.departfile
        session = requests.Session()

        headers = {'Connection''keep-alive',
                   'Cache-Control''max-age=0',
                   'Accept''text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                   'Upgrade-Insecure-Requests': 1,
                   'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
                   'DNT': 1,
                   'Accept-Encoding''gzip, deflate, sdch',
                   'Accept-Language''zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4',
                   }
        resp = session.get('http://exmail.qq.com/login', headers=headers)
        content = resp.content

        public_key = get_public_key(content)

        ts = get_ts(content)

        p = get_p(public_key, password, ts)

        # print ts
        # print public_key
        # print p

        uin = email.split('@')[0]
        domain = email.split('@')[1]
        # print uin
        # print domain

        post_data = {}
        post_data['sid'] = ''
        post_data['firstlogin'] = False
        post_data['domain'] = domain
        post_data['aliastype'] = 'other'
        post_data['errtemplate'] = 'dm_loginpage'
        post_data['first_step'] = ''
        post_data['buy_amount'] = ''
        post_data['year'] = ''
        post_data['company_name'] = ''
        post_data['is_get_dp_coupon'] = ''
        post_data['starttime'] = int(time.time() * 1000)
        post_data['redirecturl'] = ''
        post_data['f'] = 'biz'
        post_data['uin'] = uin
        post_data['p'] = p
        post_data['delegate_url'] = ''
        post_data['ts'] = ts
        post_data['from'] = ''
        post_data['ppp'] = ''
        post_data['chg'] = 0
        post_data['loginentry'] = 3
        post_data['s'] = ''
        post_data['dmtype'] = 'bizmail'
        post_data['fun'] = ''
        post_data['inputuin'] = email
        post_data['verifycode'] = ''

        headers = {'Content-Type''application/x-www-form-urlencoded'}
        url = 'https://exmail.qq.com/cgi-bin/login'
        resp = session.post(url, headers=headers, data=post_data)

        regexp = r'sid=(.*?)"'

        sid = re.findall(regexp, resp.content)[0]
        url = 'http://exmail.qq.com/cgi-bin/laddr_biz?action=show_party_list&sid={sid}&t=contact&view=biz'
        resp = session.get(url.format(sid=sid))

        text = resp.text
        regexp = r'{id:"(S*?)", pid:"(S*?)", name:"(S*?)", order:"(S*?)"}'
        results = re.findall(regexp, text)
        department_ids = []
        department_infor = dict()
        root_department = None
        for item in results:
            department_ids.append(item[0])
            department = dict(id=item[0], pid=item[1], name=item[2], order=item[3])
            department_infor[item[0]] = department
            if item[1] == 0 or item[1] == '0':
                root_department = department

        regexp = r'{uin:"(S*?)",pid:"(S*?)",name:"(S*?)",alias:"(S*?)",sex:"(S*?)",pos:"(S*?)",tel:"(S*?)",birth:"(S*?)",slave_alias:"(S*?)",department:"(S*?)",mobile:"(S*?)"}'

        all_emails = []
        staff_infors = []
        for department_id in department_ids:
            url = 'http://exmail.qq.com/cgi-bin/laddr_biz?t=memtree&limit={limit}&partyid={partyid}&action=show_party&sid={sid}'
            resp = session.get(
                url.format(limit=limit, sid=sid, partyid=department_id))
            text = resp.text
            results = re.findall(regexp, text)

            for item in results:
                all_emails.append(item[3])
                print item[3]
                staff = dict(uin=item[0], pid=item[1], name=item[2], alias=item[3], sex=item[4], pos=item[
                             5], tel=item[6], birth=item[7], slave_alias=item[8], department=item[9], mobile=item[10])
                staff_infors.append(staff)

        with open(emailfile, 'w') as f:
            for item in all_emails:
                f.write(item + ' ')

        with open(departfile, 'w') as f:
            print_tree(root_department['id'], department_infor, 0, staff_infors, f)

        print("total email count: %i" % len(all_emails))
        print("total department count: %i" % len(department_ids))

  • 相关阅读:
    poj-1273(最大流)
    SPOJ
    Gym
    (转)博弈 SG函数
    《STL详解》解题报告
    《STL详解》读书笔记
    LightOJ
    hdu1286 找新朋友 欧拉函数模板
    (转)数位dp
    (转)约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/shellr00t/p/5284149.html
Copyright © 2011-2022 走看看