hengli

Python写的163邮箱的登陆并抓出联系人

  1 #-*- coding:utf-8 -*-
  2 import urllib, urllib2, cookielib
  3 import xml.etree.ElementTree as etree
  4 
  5 class Login163:
  6     header = {\'User-Agent\':\'Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6\'}
  7     username = \'\'
  8     passwd = \'\'
  9     cookie = None #cookie
 10     cookiefile = \'./cookie.dat\'
 11     user = \'\'
 12     sid = \'\'
 13     
 14     def __init__(self, username, passwd):
 15         self.username = username
 16         self.passwd = passwd
 17         #cookie
 18         self.cookie = cookielib.LWPCookieJar()
 19         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
 20         urllib2.install_opener(opener)
 21     
 22     def login(self):
 23         postdata = {
 24                     \'username\': self.username,
 25                     \'password\': self.passwd,
 26                     \'type\': 1
 27                     }
 28         postdata = urllib.urlencode(postdata)
 29         
 30         #用户登录
 31         req = urllib2.Request(
 32                               url = \'https://ssl.mail.163.com/entry/coremail/fcg/ntesdoor2?df=webmail163&from=web&funcid=loginone&iframe=1&language=-1&net=null&passtype=1&product=mail163&race=-2_-2_-2_db&style=-1&uid=\' + self.username, 
 33                               data = postdata,#POST请求发送的参数
 34                               headers = self.header#
 35         )
 36         result = urllib2.urlopen(req).read()
 37         result = str(result)
 38         self.user = self.username.split(\'@\')[0]
 39         self.cookie.save(self.cookiefile)#
 40         
 41         if \'sid=\' in result:
 42             print (\'%s  你已成功登陆163邮箱\') %(self.user)
 43             self.sid = result.split(\'=\')[3].split(\'"\')[0]
 44             self.cookie.save(self.cookiefile)
 45             flag = True
 46         else:
 47             flag = False
 48             print \'%s 登陆163邮箱失败\' %(self.user)
 49         return flag
 50     
 51 #获取通讯录
 52     def address_list(self):
 53         
 54         #请求地址
 55         url = \'http://twebmail.mail.163.com/js4/s?sid=\'+self.sid+\'&func=global:sequential&showAd=false&userType=browser&uid=\'+self.username
 56         #参数设定(var 变量是必需要的,不然就只能看到:<code>S_OK</code><messages/>这类信息)
 57         #这里参数也是在firebug下查看的。
 58         postdata = {
 59             \'func\':\'global:sequential\',
 60             \'showAd\':\'false\',
 61             \'sid\':self.sid,
 62             \'uid\':self.username,
 63             \'userType\':\'browser\',
 64             \'var\':\'<?xml version="1.0"?><object><array name="items"><object><string name="func">pab:searchContacts</string><object name="var"><array name="order"><object><string name="field">FN</string><boolean name="desc">false</boolean><boolean name="ignoreCase">true</boolean></object></array></object></object><object><string name="func">pab:getAllGroups</string></object></array></object>\'
 65             }
 66         postdata = urllib.urlencode(postdata)
 67         
 68         #组装请求
 69         req = urllib2.Request(
 70             url = url,
 71             data = postdata,
 72             headers = self.header
 73             )
 74         res = urllib2.urlopen(req).read()
 75         
 76         #解析XML,转换成json
 77         #说明:由于这样请求后163给出的是xml格式的数据,
 78         #为了返回的数据能方便使用最好是转为JSON
 79         json = []
 80         tree = etree.fromstring(res)
 81         obj = None
 82         for child in tree:
 83             if child.tag == \'array\':
 84                 obj = child            
 85                 break
 86         #这里多参考一下,etree元素的方法属性等,包括attrib,text,tag,getchildren()等
 87         obj = obj[0].getchildren().pop()
 88         for child in obj:
 89             for x in child:
 90                 attr = x.attrib
 91                 if attr[\'name\']== \'EMAIL;PREF\':
 92                     value = {\'email\':x.text}
 93                     json.append(value)
 94         return json
 95         
 96 #Demo
 97 print("Requesting......\n\n")
 98 login = Login163(\'XXX@163.com\',\'XXXXXX\')
 99 flag = login.login()
100 if flag is True:
101     print("Successful landing,Resolved contacts......\n\n")
102     res = login.address_list()
103     for x in res:
104         print(x[\'email\'])
105 else:
106     print(flag)

 

参考了http://www.cnblogs.com/xiaowuyi/archive/2012/05/21/2511428.html的写法。

只是在登陆的时候改了一下,

归根结底,登陆就是要获取sid号,你拥有了sid号,你才能登陆并进行相关操作。

我的程序在获取sid号方面,跟参考程序有所不同,我是从网页中解析出的sid,

而参考程序是从cookie中,找出的sid。

其实都差不多,了解原理就好。

分类:

技术点:

相关文章:

  • 2021-12-15
  • 2022-12-23
  • 2021-12-26
  • 2021-10-04
  • 2021-11-21
  • 2021-04-30
  • 2021-10-22
  • 2021-11-28
猜你喜欢
  • 2022-12-23
  • 2021-08-18
  • 2021-09-15
  • 2022-12-23
  • 2021-11-22
  • 2021-12-02
  • 2022-01-02
相关资源
相似解决方案