获取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 +  ' \n ')
     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 +  ' \n ')


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


#  获取ts参数
def get_ts(content):
    regexp = r ' PublicTs\s*=\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}\n{ts}\n '.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 +  ' \n ')

    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))

转载于:https://www.cnblogs.com/shellr00t/p/5284149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值