免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10336 | 回复: 10
打印 上一主题 下一主题

python登录discuz论坛的登录状态保持问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-31 22:01 |只看该作者 |倒序浏览
Discuz! x2.5
pyhton 2.5 + django1.4

1、已经实现了从python 应用中登录到discuz论坛,但是,论坛中用户状态为在线,但跳转到论坛页面后,总是提醒未登录,要求登录
2、通过使用和登录相同的opener 访问论坛首页后,在首页显示用户状态为登录。但是,点击论坛内页的时候,提醒未登录,要求登录

跟踪抓包发现cookie 信息和存在文件中的cookie信息不一致。

如何做到登录后,使用和登录相同的cookie访问其他页面,做到登录状态在论坛其他内部页面同步登录状态?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-11-01 14:23 |只看该作者
discuz是php, django是ptyhon, 两者的session cookie的生成方式和存储方式, 存储位置根本不在一起, 怎么能交互.

论坛徽章:
0
3 [报告]
发表于 2012-11-03 00:00 |只看该作者
你是用的哪个库去保存和处理cookie的?
我之前用的cookiejar,用于登陆别的网站,貌似是可以正常自动处理cookie的。

论坛徽章:
0
4 [报告]
发表于 2012-11-03 10:06 |只看该作者
回复 3# crifan
我就是用cookiejar的。使用的通用的python登录论坛代码:
def _login_dz(**parms):
    #初始化
    parms_key = ['domain','answer','password','questionid','referer','username']
    arg = {}
    for key in parms_key:
        if key in parms:
            arg[key] = parms[key]
        else:
            arg[key] = ''
            
    #cookie设置
    cookieFile = './bbs_cookies.dat'
    cookie = cookielib.LWPCookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

    #获取formhash
    pre_login = arg['domain']+'member.php?mod=logging&action=login&infloat=yes&handlekey=login&inajax=1&ajaxtarget=fwin_content_login'
    logger.info('BBS pre login url:' + pre_login)
    c = opener.open(pre_login).read()
    cookie.save(cookieFile)
    patt = re.compile(r'.*?name="formhash".*?value="(.*?)".*?')
    formhash = patt.search(c)
    if not formhash:
        raise Exception('GET formhash Fail!')
    formhash = formhash.group(1)

    #登陆
    postdata = {
     'answer':arg['answer'],
     'formhash':formhash,
     'password':arg['password'],
     'questionid':0 if arg['questionid']=='' else arg['questionid'],
     'referer':arg['domain'] if arg['referer']=='' else arg['referer'],
     'username':arg['username'],
        }

    postdata = urllib.urlencode(postdata)
    login_url = arg['domain']+'member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LCaB3&inajax=1'
    req = urllib2.Request(
        url= login_url,
        data=postdata
        )
        
    c = opener.open(req).read(300)           
    #g_cookie = page.info()['set-cookie']
    #logger.info(g_cookie)   

    flag = 'BBS login failed:  %s' % arg['username']
    if 'succeedhandle_login' in c:
        logger.info('BBS login success!')
        flag = 'success'
    elif 'action=activation' in c:
        flag = 'activation'
     

    postdata = {
       'referer': arg['domain'],
       }
      
    postdata = urllib.urlencode(postdata)
    req = urllib2.Request(
        url= arg['domain'],
        data = postdata
        )
        
    page = opener.open(req)
    data= page.read()
    return data

def redrict_bbs(request):
    ucResult = ''
   
    try:
        ucResult = _login_dz(username = request.user.username,password = 'xxx',domain = 'http://bbs.mysite.com/')
    except Exception,e:
        logger.info(e)
        
    return HttpResponse(ucResult)

   

论坛徽章:
0
5 [报告]
发表于 2012-11-03 10:33 |只看该作者
回复 2# linux_c_py_php

在discuz论坛中,我是指定了config_global.php  参数 cookiedomin 和cookiepath 的;论坛和网站同时部署在同级路径下。

论坛徽章:
0
6 [报告]
发表于 2012-11-05 09:43 |只看该作者
我之前用的是cookielib.CookieJar:
  1.     gVal['cj'] = cookielib.CookieJar();
  2.    
  3.     opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(gVal['cj']));
  4.     urllib2.install_opener(opener);
  5.     resp = urllib2.urlopen(baiduSpaceEntryUrl);
复制代码
完整代码可参考:
http://code.google.com/p/blogs-t ... odules/BlogBaidu.py
-> loginBlog()

和你用的cookielib.LWPCookieJar,貌似差不多。
不过,建议你先去试试cookielib.CookieJar,看看是否可以正常实现你的需求。
如果cookielib.CookieJar也不行,那再想别的办法。

论坛徽章:
0
7 [报告]
发表于 2012-11-05 11:37 |只看该作者
回复 6# crifan

还是不行!可能原因在于,怎么将cookie信息记录在客户端浏览器的cookie中,而我在服务端记录cookie是没有用的!

从直接使用login 论坛的opener 访问论坛,登录状态为“已经登录”而进入内页则“没有的登录”现象应该也指向是cookie没有被客户端浏览器访问到导致的


   

论坛徽章:
0
8 [报告]
发表于 2012-11-06 16:34 |只看该作者
还是没有搞定,求助版主!

Content-Type        text/html; charset=utf-8
Date        Tue, 06 Nov 2012 08:23:04 GMT
Location        http://bbs.37joy.com/forum.php
Server        WSGIServer/0.1 Python/2.5
Set-Cookie        ZPmT_2132_lastact=1352184990%09member.php%09logging; Domain=.bbs.37joy.com; Path=/ ZPmT_2132_sid=mzrQpr; Domain=.bbs.37joy.com; Path=/ ZPmT_2132_saltkey=g9fRGCgn; Domain=.bbs.37joy.com; Path=/ ZPmT_2132_lastvisit=1352181390; Domain=.bbs.37joy.com; Path=/
Vary        Cookie
请求头信息原始头信息
Accept        text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding        gzip, deflate
Accept-Language        zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Connection        keep-alive
Cookie        csrftoken=9FAzytlOswFjfgBoIs3K00bBPzPSSoIK; sessionid=4a58f83f42f36a8085f2eed768281e47; bbs.37joy.com=
Host        127.0.0.1:8000
Referer        http://127.0.0.1:8000/action/
User-Agent        Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0


Connection        Keep-Alive
Content-Type        text/html; charset=utf-8
Date        Tue, 06 Nov 2012 08:23:04 GMT
Keep-Alive        timeout=5, max=100
Server        Apache/2.2.22 (Win32) PHP/5.2.17 mod_python/3.3.0b Python/2.5
Set-Cookie        ZPmT_2132_lastact=1352190184%09forum.php%09; expires=Wed, 07-Nov-2012 08:23:04 GMT; path=/ ZPmT_2132_onlineusernum=2; expires=Tue, 06-Nov-2012 08:28:04 GMT; path=/ ZPmT_2132_sid=d5rrYY; expires=Wed, 07-Nov-2012 08:23:04 GMT; path=/
Transfer-Encoding        chunked
X-Powered-By        PHP/5.2.17

论坛徽章:
0
9 [报告]
发表于 2012-11-07 00:07 |只看该作者
你的意思是说,你本身此套python模拟登陆的代码,运行所在的机器,正是你的服务器,
而你的服务器本身正在运行的是你自己的Discuz论坛,
然后你写python代码,想要实现模拟登陆,然后切换页面后,发现无法同步cookie,导致显示退出登陆?

总之,看不太懂的问题。
即使你是我所猜测的,上述的情况,但是也和我之前所遇到的情况不一样。
我所遇到的,都是在客户端,通过python去模拟登陆,把本身浏览器访问你的服务器所发生的一切,用python代码模拟出来,包括cookie的处理,由此实现模拟登陆的。
而你自己在服务器端,用python折腾,按理来说,也和客户端,没区别才对,自动让相关的库去处理cookie,也是正常的才对。

对了,很简单,你自己先试试,你在服务器中,自己用浏览器先访问网页,是否都正常。
如果都正常,用工具把相关的信息,包括cookie都自己调试,找出来,和你程序比较,即可找到原因了啊。

论坛徽章:
0
10 [报告]
发表于 2012-11-07 13:56 |只看该作者
1、登录自己portal的过程中,同时登录Discuz 并记录登录Discuz成功后的cookie
    #登录获取登录formhash
    # 。。。。。。省略,或见最上面的通用登录代码
    #登陆Discuz
    postdata = {
     'answer':arg['answer'],
     'formhash':formhash,
     'password':arg['password'],
     'questionid':0 if arg['questionid']=='' else arg['questionid'],
     'referer':arg['domain'] if arg['referer']=='' else arg['referer'],
     'username':arg['username'],
        }

    postdata = urllib.urlencode(postdata)
    login_url = arg['domain']+'member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LCaB3&inajax=1'
    req = urllib2.Request(
        url= login_url,
        data=postdata
        )
    page = urllib2.urlopen(req)
    # 在此记录全局变量,登录后返回的Cookie
    global g_cookie
    g_cookie = page.info()['Set-cookie']
    logger.info(g_cookie)
    c = opener.open(req).read(300)           
    flag = 'BBS login failed:  %s' % arg['username']
    if 'succeedhandle_login' in c:
        cookie.save(cookieFile)
        logger.info('BBS login success!')
        flag = 'success'
    elif 'action=activation' in c:
        flag = 'activation'

2、登录Discuz成功后,访问Discuz论坛
通过setting中设置的url =r('^bbs/$','redirect_bbs')
views视图处理如下:
def redrict_bbs(request):
    ucResult = ''
    # 将登录过程中存储的cookie文件 load
    cookiePath = './bbs.cookies.dat'
    cookiejar = cookielib.LWPCookieJar()
    cookiejar.load(cookiePath, ignore_discard=True, ignore_expires=True)

   # 重定向到 论坛
    response = HttpResponseRedirect('http://bbs.37joy.com/forum.php')
   
    cookies = cookiejar._cookies['.bbs.37joy.com']['/']
    for ckey in cookies:
        logger.info('load cookie key : ' + ckey)
        cookie = cookies[ckey]
        # 设置带cookie 的定向response
        response.set_cookie(cookie.name,cookie.value,domain='.bbs.37joy.com')
        
    return response


3、网络抓包:
第一个包 Get "/bbs/"的,其响应头信息:
Content-Type        text/html; charset=utf-8
Date        Tue, 06 Nov 2012 08:23:04 GMT
Location        http://bbs.37joy.com/forum.php
Server        WSGIServer/0.1 Python/2.5
Set-Cookie        ZPmT_2132_lastact=1352184990%09member.php%09logging; Domain=.bbs.37joy.com; Path=/ ZPmT_2132_sid=mzrQpr; Domain=.bbs.37joy.com; Path=/ ZPmT_2132_saltkey=g9fRGCgn; Domain=.bbs.37joy.com; Path=/ ZPmT_2132_lastvisit=1352181390; Domain=.bbs.37joy.com; Path=/
Vary        Cookie

注:其中cookie和登录存储的cookie文件load的key和value同,但和 返回的g_cookie 的key不同,少了ZPmt_2132_auth .

第二个包的头信息:
Connection        Keep-Alive
Content-Type        text/html; charset=utf-8
Date        Tue, 06 Nov 2012 08:23:04 GMT
Keep-Alive        timeout=5, max=100
Server        Apache/2.2.22 (Win32) PHP/5.2.17 mod_python/3.3.0b Python/2.5
Set-Cookie        ZPmT_2132_lastact=1352190184%09forum.php%09; expires=Wed, 07-Nov-2012 08:23:04 GMT; path=/ ZPmT_2132_onlineusernum=2; expires=Tue, 06-Nov-2012 08:28:04 GMT; path=/ ZPmT_2132_sid=d5rrYY; expires=Wed, 07-Nov-2012 08:23:04 GMT; path=/
Transfer-Encoding        chunked
X-Powered-By        PHP/5.2.17

注:跳转到furom.php的响应包头cookie和请求包头已经不一样!


登录Discuz后,访问Discuz,浏览器客户端,不能获得设置的cookie!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP