Python 导入 MSN 联系人(web.py 方式)

导入MSN联络人,在各大网站是个很常见的功能,Google了一下,使用PHP导入MSN联络人的代码也是大把大把,然而在开发过程中,却是一波三折,我们分别使用了PHP的两个类库,都不同程序存在问题,令我们头痛不已: 

1、MSN.getAddressList

部分联络人无法获取,可以正常显示MSN名称 

2、PHPMSNCLASS

可以获取所有的联络人,部分联络人的MSN名称不显示 

显然这两个PHP的类库都无法满足我们的要求,通过访问Sina微博饭否,都是可以正常获取所有联络人及显示MSN名称,走投无路时,忽然想起可以使用其他语言来处理,也就是Python,以前也学习实战过,这次正好可以派上用场了。 

msnlibMSN的客户端软件,还自带了python的类库。 

使用web.py,实现http协议,采用POST方式,返回JSON格式的联络人信息。 

具体实现方法如下:

一、下载并安装msnlib

wget http://blitiri.com.ar/p/msnlib/files/3.8/msnlib-3.8.tar.gz 
tar zxvf msnlib-3.8.tar.gz 
cd msnlib-3.8 
# ./install 
msnsetup 
msn

PS: 执行msnsetup后,会请你输入账号与密码,然后执行msn,就自动登录了。 

二、安装web.py

wget http://webpy.org/static/web.py-0.35.tar.gz 
tar zxvf web.py-0.35.tar.gz 
cd web.py-0.35 
python setup.py install

三、msn.py

有代码,有真相:

#coding:utf-8
import socketselecttimemsnlibmsncbweburllib

urls = (
    '/', 'hello'
)

web.config.debug = False
app = web.application(urlsglobals())

class hello:        
    def POST(self):
        i = web.input()
        result = get_friend_list(i.usernamei.pwd)
        if result is None:
            return '{status:false}'
        else:
            http_result = '{status:truebody:[';
            for kv in result.iteritems():
                http_result = http_result + '{name:"' + v.decode("utf-8", "ignore") + '",email:"' + k + '"},'
            http_result = http_result[0:-1] + ']}';

            return http_result

def get_friend_list(emailpassword):
    m = msnlib.msnd()
    m.cb = msncb.cb()

    m.email = email.strip()
    m.pwd = password.strip()
    m.encoding = 'utf-8'
    try:
        m.login()
        m.sync()
    except:
        return
    m.change_status('invisible')

    begin_time = time.time()

    users = set()
    while True:
        fds = m.pollable()
        infd = fds[0]
        outfd = fds[1]

        fds = select.select(infdoutfd, [], 0)

        for i in fds[0] + fds[1]:
            try:
                m.read(i)
            except ('SocketError', socket.error), err:
                if i != m:
                    m.close(i)
        merge_users = users|set(m.users.keys())
        if len(users) == len(merge_users):
            end_time = time.time()
            if len(users):
                if end_time-begin_time >= 2:
                    break
            elif end_time-begin_time >= 3:
                break
            time.sleep(0.05)
        else:
            users = merge_users
            begin_time = time.time()
    result = {}
    for i in users:
        nick = m.users[i].nick
        i_lower = i.lower()
        if nick.lower() == i_lower:
            nick = nick.split("@", 1)[0]
        result[i_lower] = nick
    m.disconnect();
    return result

if __name__ == "__main__":
    msnlib.debug = msncb.debug = void

    app.run()

四、执行msn.py程式,并指定端口为8888:

python msn.py 8888

五、参考文献:

导入MSN联系人http://kanrs.com/4_0.html

总结:遇到难点时,可以跳出PHP世界,你就会发现不一样的美。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。