好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python实现的douban.fm客户端,添加登录功能

python实现的douban.fm客户端,添加登录功能

一个月前心血来潮用python实现了一个简单的douban.fm客户端,计划是陆续将其完善成为Ubuntu下可替代web版本的douban.fm客户端。但后来因为事多,被一直搁着,没有再继续完善。就在昨天,一位园友在评论中提到了登录的实现,虽然最近依然事多,但突然很想实现这个功能。正好,前几天因为一些需要,曾用python实现过网站登录,约摸估计这douban.fm的登录不会差太多。

关于网站身份验证

http协议被设计为无连接协议,但现实中,很多网站需要对用户进行身份识别,cookie就是为此而诞生的。当我们用浏览器浏览网站时,浏览器会帮我们透明的处理cookie。而我们现在要第三方登录网站,这就必须对cookie的工作流程有一定的了解。

另外,很多网站为了防止程序自动登录而使用了验证码机制,验证码的介入会使登录过程变得麻烦,但也还不算太难处理。

实际中douban.fm的登录流程

为了模拟一个干净(不使用已有cookie)的登录流程,我使用chromium的隐身模式。

观察请求和响应头,可以看到,第一次请求的请求头是没有Cookie字段的,而服务器的响应头中包含着Set-Cookie字段,这告诉浏览器下次请求该网站时需要携带Cookie。

这里我注意到了一个有意思的现象,访问douban.fm,实际中经过了3次重定向。当然,一般来说我们并不需要关注这些细节,浏览器和高级的httplib会透明的处理重定向,但如果使用底层的C Socket,就必须小心的处理这些重定向。

点击登录按钮,浏览器发起几个新的请求,其中有几个至关重要的请求,这几个请求是我们第三方登录douban.fm的关键所在。

首先,有一条请求的URL是 http://douban.fm/j/new_captcha ,请求该URL,服务器会返回一个随机字符串,这有什么用呢?

再看下一条请求, http://douban.fm/misc/captcha?size=m&id=0iPlm837LsnSsJTMJrf5TZ7e ,这条请求会返回验证码。原来如此,请求 http://douban.fm/j/new_captcha ,将服务器返回的字符串作为 下一条请求的id 参数值。

我们可以写一段python代码来验证我们的想法。

值得注意的是python提供了3个http库,httplib、urllib和urllib2,能透明处理cookie的是urllib2,想我之前用httplib手动处理cookie,那个痛苦啊。

opener =  urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar()))
captcha_id  = opener.open(urllib2.Request( '  http://douban.fm/j/new_captcha  ' )).read().strip( '  "  '  ) 
captcha  = opener.open(urllib2.Request( '  http://douban.fm/misc/captcha?size=m&id=  '  +  captcha_id)).read())
file  = open( 'captcha  .jpg  ' ,  '  wb  '  )
file  =  write(captcha)
file.close() 

这段代码实现了验证码的下载。

接着,我们填写表单,并提交。

可以看到,登录表单的目标地址为 http://douban.fm/j/login, 参数有:

source: radio alias: 用户名 form_password: 密码 captcha_solution: 验证码 captcha_id: 验证码ID task: sync_channel_list

接下来要做的是用python构造一个表单。

 opener.open(
    urllib2.Request(  '  http://douban.fm/j/login  '  ),
    urllib.urlencode({
          '  source  ' :  '  radio  '  ,
          '  alias  '  : username,
          '  form_password  '  : password,
          '  captcha_solution  '  : captcha,
          '  captcha_id  '  : captcha_id,
          '  task  ' :  '  sync_channel_list  ' }))

服务器返回的数据格式是json,具体格式这里不赘诉了,大家可以自己测试。

我们怎么知道登录是否起作用了呢?是了,之前的文章提到过channel=-3为红心兆赫,是用户的收藏列表,没有登录是获取不到该频道的播放列表的。请求 http://douban.fm/j/mine/playlist?type=n&channel=-3 ,如果返回你自己收藏过的音乐列表,那么就说明登录起作用了。

代码整理

结合之前的版本和新增的登录功能,再加上命令行参数处理、频道选择,一个稍稍完善的douban.fm就完成的。

View Code

以下是本人使用自己的帐号登录并播放红心兆赫:

接下来,我会继续完善这个python douban.fm客户端程序,添加频道搜索和查看,全局按键控制等功能。

 

 

标签:  python ,  ubuntu

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于python实现的douban.fm客户端,添加登录功能的详细内容...

  阅读:43次

上一篇: CPU知识

下一篇:使用iis来调试