Python模拟163登陆获取邮件列表

利用cookielib和urllib2模块模拟登陆163的例子有很多,近期看了《python模拟登陆163邮箱并获取通讯录》一文,受到启发,试着对收件箱、发件箱等进行了分析,并列出了所有邮件列表及状态,包括发件人、收件人、主题、发信时间、已读未读等状态。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、虚拟主机、营销软件、网站建设、桐城网站维护、网站推广。

1、参考代码:http://hi.baidu.com/fc_lamp/blog/item/2466d1096fcc532de8248839.html%EF%BB%BF

 
 
 
  1. #-*- coding:UTF-8 -*-
  2. import urllib,urllib2,cookielib
  3. import xml.etree.ElementTree as etree #xml解析类
  4. class Login163:
  5.    #伪装browser
  6.     header = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
  7.     username = ''
  8.     passwd = ''
  9.     cookie = None #cookie对象
  10.     cookiefile = './cookies.dat' #cookie临时存放地
  11.     user = ''
  12.     
  13.     def __init__(self,username,passwd):
  14.         self.username = username
  15.         self.passwd = passwd
  16.         #cookie设置
  17.         self.cookie = cookielib.LWPCookieJar() #自定义cookie存放
  18.         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
  19.         urllib2.install_opener(opener)
  20.    #登陆    
  21.     def login(self):       
  22.         #请求参数设置
  23.         postdata = {
  24.             'username':self.username,
  25.             'password':self.passwd,
  26.             'type':1
  27.             }
  28.         postdata = urllib.urlencode(postdata)
  29.         #发起请求
  30.         req = urllib2.Request(
  31.                 url='http://reg.163.com/logins.jsp?type=1&product=mail163&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26style%3D1',
  32.                 data= postdata,#请求数据
  33.                 headers = self.header #请求头
  34.             )
  35.         result = urllib2.urlopen(req).read()
  36.         result = str(result)
  37.         self.user = self.username.split('@')[0]
  38.         self.cookie.save(self.cookiefile)#保存cookie
  39.         
  40.         if '登录成功,正在跳转...' in result:
  41.             #print("%s 你已成功登陆163邮箱。---------\n" %(user))
  42.             flag = True
  43.         else:
  44.             flag = '%s 登陆163邮箱失败。'%(self.user)
  45.            
  46.         return flag
  47.    #获取通讯录
  48.     def address_list(self):
  49.         #获取认证sid
  50.         auth = urllib2.Request(
  51.                 url='http://entry.mail.163.com/coremail/fcg/ntesdoor2?username='+self.user+'&lightweight=1&verifycookie=1&language=-1&style=1',
  52.                 headers = self.header
  53.             )
  54.         auth = urllib2.urlopen(auth).read()
  55.         for i,sid in enumerate(self.cookie):#enumerate()用于同时返数字索引与数值,实际上是一个元组:((0,test[0]),(1,test[1]).......)这有点像php里的foreach 语句的作用
  56.             sid = str(sid)
  57.             if 'sid' in sid:
  58.                 sid = sid.split()[1].split('=')[1]
  59.                 break
  60.         self.cookie.save(self.cookiefile)
  61.         
  62.         #请求地址
  63.         url = 'http://twebmail.mail.163.com/js4/s?sid='+sid+'&func=global:sequential&showAd=false&userType=browser&uid='+self.username
  64.         #参数设定(var 变量是必需要的,不然就只能看到:S_OK这类信息)
  65.         #这里参数也是在firebug下查看的。
  66.         postdata = {
  67.             'func':'global:sequential',
  68.             'showAd':'false',
  69.             'sid':sid,
  70.             'uid':self.username,
  71.             'userType':'browser',
  72.             'var':'pab:searchContactsFNfalsetruepab:getAllGroups'
  73.             }
  74.         postdata = urllib.urlencode(postdata)
  75.         
  76.         #组装请求
  77.         req = urllib2.Request(
  78.             url = url,
  79.             data = postdata,
  80.             headers = self.header
  81.             )
  82.         res = urllib2.urlopen(req).read()
  83.         
  84.         #解析XML,转换成json
  85.         #说明:由于这样请求后163给出的是xml格式的数据,
  86.         #为了返回的数据能方便使用最好是转为JSON
  87.         json = []
  88.         tree = etree.fromstring(res)
  89.         obj = None
  90.         for child in tree:
  91.             if child.tag == 'array':
  92.                 obj = child            
  93.                 break
  94.         #这里多参考一下,etree元素的方法属性等,包括attrib,text,tag,getchildren()等
  95.         obj = obj[0].getchildren().pop()
  96.         for child in obj:
  97.             for x in child:
  98.                 attr = x.attrib
  99.                 if attr['name']== 'EMAIL;PREF':
  100.                     value = {'email':x.text}
  101.                     json.append(value)
  102.         return json
  103.         
  104. #Demo
  105. print("Requesting......\n\n")
  106. login = Login163('xxxx@163.com','xxxxx')
  107. flag = login.login()
  108. if type(flag) is bool:
  109.     print("Successful landing,Resolved contacts......\n\n")
  110.     res = login.address_list()
  111.     for x in res:
  112.         print(x['email'])
  113. else:
  114.     print(flag)

#p#

2、分析收件箱、发件箱等网址

在参考代码中,获取通讯录的url为

url = 'http://twebmail.mail.163.com/js4/s?sid='+sid+'&func=global:sequential&showAd=false&userType=browser&uid='+self.username,通过对邮箱地址的分析,发现收件箱、发件箱等的url为url = 'http://twebmail.mail.163.com/js4/s?sid='+sid+'&func=mbox:listMessages&showAd=false&userType=browser&uid='+self.username,其中func=mbox:listMessages。其对收件箱、发件箱的具体区分在下面的postdata中,具体为:

(1)收件箱

 
 
 
  1. postdata = {
  2. 'func':'global:sequential',
  3. 'showAd':'false',
  4. 'sid':'qACVwiwOfuumHPdcYqOOUTAjEXNbBeAr',
  5. 'uid':self.username,
  6. 'userType':'browser',
  7. 'var':'1datetruefalse020'
  8. }

(2)发件箱

 
 
 
  1. postdata = {
  2. 'func':'global:sequential',
  3. 'showAd':'false',
  4. 'sid':'qACVwiwOfuumHPdcYqOOUTAjEXNbBeAr',
  5. 'uid':self.username,
  6. 'userType':'browser',
  7. 'var':'3datetruefalse020'
  8. }

可以看出,两段代码的不同之处就是fid的取值不同,其中收件箱为1,发件箱为3,草稿箱为2。

#p#

3、xml解析

利用ElementTree 类来进行xml到字典的转换。在获取通讯录的实例中,主要使用了这一方法。本例子(具体代码见后文)在收取邮件列表时,并没有用这一方法,仍然使用的是字符串的处理方法。但这里还是列一下ElementTree 类对xml的处理。如(参考地址:http://hi.baidu.com/fc_lamp/blog/item/8ed2d53ada4586f714cecb3d.html):

 
 
 
  1. -
  2.    S_OK
  3.  -
  4.   -
  5.      S_OK
  6.     -
  7.      +
  8.      +
  9.      +
  10.      +
  11.      +
  12.      +
  13.      +
  14.      +
  15.      +
  16.      +
  17.      +
  18.      +
  19.      +
  20.      +
  21.      +
  22.      +
  23.      
  24.    
  25.   +
  26.   
  27.  

解决方法:

 
 
 
  1. #-*- coding:UTF-8 -*-
  2. import xml.etree.ElementTree as etree #xml解析类
  3. def xml2json(xml):
  4.     json = []
  5.     tree = etree.fromstring(xml) #如果是文件可用parse(source)
  6.     obj = None
  7.     for child in tree:
  8.         if child.tag == 'array':
  9.             obj = child            
  10.             break
  11.     #这里多参考一下,etree元素的方法属性等,包括attrib,text,tag,getchildren()等
  12.     obj = obj[0].getchildren().pop()
  13.     for child in obj:
  14.         for x in child:
  15.             attr = x.attrib
  16.             if attr['name']== 'EMAIL;PREF':
  17.                 value = {'email':x.text}
  18.                 json.append(value)
  19.     return json

#p#

4、收件箱邮件列表

本例子只列出了收件箱邮件列表,如果需要,可根据以上介绍调整fid值,列出发件箱、草稿箱等的邮件列表。程序在windosxp、py2.6环境下调查通过,运行后,会在当前目录下生成三个文件:inboxlistfile.txt记录收件箱邮件列表,addfile.txt记录通讯录,cookies.dat记录cookies。具体代码如下:

 
 
 
  1. #-*- coding:UTF-8 -*-
  2. import urllib,urllib2,cookielib
  3. import xml.etree.ElementTree as etree #xml解析类
  4. class Login163:
  5.    #伪装browser
  6.     header = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
  7.     username = ''
  8.     passwd = ''
  9.     cookie = None #cookie对象
  10.     cookiefile = './cookies.dat' #cookie临时存放地
  11.     user = ''
  12.     
  13.     def __init__(self,username,passwd):
  14.         self.username = username
  15.         self.passwd = passwd
  16.         #cookie设置
  17.         self.cookie = cookielib.LWPCookieJar() #自定义cookie存放
  18.         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
  19.         urllib2.install_opener(opener)
  20.    #登陆    
  21.     def login(self):       
  22.         #请求参数设置
  23.         postdata = {
  24.             'username':self.username,
  25.             'password':self.passwd,
  26.             'type':1
  27.             }
  28.         postdata = urllib.urlencode(postdata)
  29.         #发起请求
  30.         req = urllib2.Request(
  31.                 url='http://reg.163.com/logins.jsp?type=1&product=mail163&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26style%3D1',
  32.                 data= postdata,#请求数据
  33.                 headers = self.header #请求头
  34.             )
  35.         result = urllib2.urlopen(req).read()
  36.         result = str(result)
  37.         #print result
  38.         self.user = self.username.split('@')[0]
  39.         self.cookie.save(self.cookiefile)#保存cookie
  40.         
  41.         if '登录成功,正在跳转...' in result:
  42.             #print("%s 你已成功登陆163邮箱。---------n" %(user))
  43.             flag = True
  44.         else:
  45.             flag = '%s 登陆163邮箱失败。'%(self.user)
  46.            
  47.         return flag
  48.    #获取通讯录
  49.     def address_list(self):
  50.         #获取认证sid
  51.         auth = urllib2.Request(
  52.                 url='http://entry.mail.163.com/coremail/fcg/ntesdoor2?username='+self.user+'&lightweight=1&verifycookie=1&language=-1&style=1',
  53.                 headers = self.header
  54.             )
  55.         auth = urllib2.urlopen(auth).read()
  56.         #authstr=str(auth)
  57.         #print authstr
  58.         
  59.         for i,sid in enumerate(self.cookie):
  60.             sid = str(sid)
  61.             #print 'sid:%s' %sid
  62.             if 'sid' in sid:
  63.                 sid = sid.split()[1].split('=')[1]
  64.                 break
  65.         self.cookie.save(self.cookiefile)
  66.         
  67.         #请求地址
  68.         url = 'http://twebmail.mail.163.com/js4/s?sid='+sid+'&func=global:sequential&showAd=false&userType=browser&uid='+self.username
  69.         #参数设定(var 变量是必需要的,不然就只能看到:S_OK这类信息)
  70.         #这里参数也是在firebug下查看的。
  71.         postdata = {
  72.             'func':'global:sequential',
  73.             'showAd':'false',
  74.             'sid':'qACVwiwOfuumHPdcYqOOUTAjEXNbBeAr',
  75.             'uid':self.username,
  76.             'userType':'browser',
  77.             'var':'pab:searchContactsFNfalsetruepab:getAllGroups'
  78.             }
  79.         postdata = urllib.urlencode(postdata)
  80.         
  81.         #组装请求
  82.         req = urllib2.Request(
  83.             url = url,
  84.             data = postdata,
  85.             headers = self.header
  86.             )
  87.         res = urllib2.urlopen(req).read()
  88.         #print str(res)
  89.         
  90.         #解析XML,转换成json
  91.         #说明:由于这样请求后163给出的是xml格式的数据,
  92.         #为了返回的数据能方便使用最好是转为JSON
  93.         json = []
  94.         tree = etree.fromstring(res)
  95.         
  96.         
  97.         obj = None
  98.         for child in tree:
  99.             if child.tag == 'array':
  100.                 obj = child            
  101.                 break
  102.         #这里多参考一下,etree元素的方法属性等,包括attrib,text,tag,getchildren()等
  103.         obj = obj[0].getchildren().pop()
  104.         for child in obj:
  105.             for x in child:
  106.                 attr = x.attrib
  107.                 if attr['name']== 'EMAIL;PREF':
  108.                     value = {'email':x.text}
  109.                     json.append(value)
  110.         return json
  111. #获取收件箱
  112.     def minbox(self):
  113.         #获取认证sid
  114.         auth = urllib2.Request(
  115.                 url='http://entry.mail.163.com/coremail/fcg/ntesdoor2?username='+self.user+'&lightweight=1&verifycookie=1&language=-1&style=1',
  116.                 headers = self.header
  117.             )
  118.         auth = urllib2.urlopen(auth).read()
  119.         #authstr=str(auth)
  120.         #print authstr
  121.         
  122.         for i,sid in enumerate(self.cookie):
  123.             sid = str(sid)
  124.             #print 'sid:%s' %sid
  125.             if 'sid' in sid:
  126.                 sid = sid.split()[1].split('=')[1]
  127.                 break
  128.         self.cookie.save(self.cookiefile)
  129.         
  130.         
  131.         url = 'http://twebmail.mail.163.com/js4/s?sid='+sid+'&func=mbox:listMessages&showAd=false&userType=browser&uid='+self.username
  132.         
  133.         postdata = {
  134.             'func':'global:sequential',
  135.             'showAd':'false',
  136.             'sid':'qACVwiwOfuumHPdcYqOOUTAjEXNbBeAr',
  137.             'uid':self.username,
  138.             'userType':'browser',
  139.             'var':'1datetruefalse020'
  140.             }
  141.         postdata = urllib.urlencode(postdata)
  142.         
  143.         #组装请求
  144.         req = urllib2.Request(
  145.             url = url,
  146.             data = postdata,
  147.             headers = self.header
  148.             )
  149.         res = urllib2.urlopen(req).read()
  150.         liststr=str(res).split('')#用object进行分割
  151.         inboxlistcount=len(liststr)-1#记录邮件封数
  152.         inboxlistfile=open('inboxlistfile.txt','w')
  153.         t=0  #记录当前第几封信
  154.         for i in liststr:
  155.             if 'xml' in i and ' version=' in i:
  156.                 inboxlistfile.write('inbox 共'+str(inboxlistcount)+'信')
  157.                 inboxlistfile.write('\n')
  158.             if 'name="id"' in i:
  159.                 t=t+1
  160.                 inboxlistfile.write('第'+str(t)+'封:')
  161.                 inboxlistfile.write('\n')
  162.                 #写入from
  163.                 beginnum=i.find('name="from"')
  164.                 endnum=i.find('',beginnum)
  165.                 inboxlistfile.write('From:'+i[beginnum+12:endnum])
  166.                 inboxlistfile.write('\n')
  167.                 #写入to
  168.                 beginnum=i.find('name="to"')
  169.                 endnum=i.find('',beginnum)
  170.                 inboxlistfile.write('TO:'+i[beginnum+10:endnum])
  171.                 inboxlistfile.write('\n')
  172.                 #写入subject
  173.                 beginnum=i.find('name="subject"')
  174.                 endnum=i.find('',beginnum)
  175.                 inboxlistfile.write('Subject:'+i[beginnum+15:endnum])
  176.                 inboxlistfile.write('\n')
  177.                 #写入date:
  178.                 beginnum=i.find('name="sentDate"')
  179.                 endnum=i.find('',beginnum)
  180.                 inboxlistfile.write('Date:'+i[beginnum+16:endnum])
  181.                 inboxlistfile.write('\n')
  182.                 if 'name="read">true' in i:
  183.                     inboxlistfile.write('邮件状态:已读')
  184.                     inboxlistfile.write('\n')
  185.                 else:
  186.                     inboxlistfile.write('邮件状态:未读')
  187.                     inboxlistfile.write('\n')
  188.                 #写用邮件尺寸
  189.                 beginnum=i.find('name="size"')
  190.                 endnum=i.find('',beginnum)
  191.                 inboxlistfile.write('邮件尺寸:'+i[beginnum+12:endnum])
  192.                 inboxlistfile.write('\n')
  193.                 #写入邮件编号,用于下载邮件
  194.                 beginnum=i.find('name="id"')
  195.                 endnum=i.find('',beginnum)
  196.                 inboxlistfile.write('邮件编号:'+i[beginnum+10:endnum])
  197.                 inboxlistfile.write('\n\n')
  198.                 
  199.         inboxlistfile.close()
  200.                 
  201.         
  202.         
  203. if __name__=='__main__':
  204.     print("Edit @xiaowuyi V1.0  http://www.cnblogs.com/xiaowuyi")
  205.     login = Login163('XXXX@163.com','AAAAA')
  206.     flag = login.login()
  207.     if type(flag) is bool:
  208.     
  209.     #login.letterdown()
  210.         print("登陆成功,正在下载列表和通讯录………………")
  211.         login.minbox()
  212.         res = login.address_list()
  213.         addfile=open('addfile.txt','w')
  214.         for x in res:
  215.             addfile.write(x['email'])
  216.         addfile.close()
  217.         print("已完成")
  218.     else:
  219.         print(flag)
  220. 当前文章:Python模拟163登陆获取邮件列表
    文章分享:http://www.mswzjz.com/qtweb/news1/183751.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联