免费注册 查看新帖 |

Chinaunix

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

Python Session 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-04-17 14:23 |只看该作者 |倒序浏览
本帖最后由 Michaelcobra 于 2018-04-17 16:33 编辑

情况如下:目标网站是用ASP.NET做的。在login页面有一个提交按钮,绑定了后台代码里的 button_click()事件,这个事件创建了Session。登录以后的所有页面都需要对这个Session的内容进行验证。所以在用python爬网的时候需要触发一下这个事件以便生成这个Session对象。

目前直接用python的requests的post方法加上账号密码的参数可以实现登录,但是发现登录后是不能触发这个button_click事件的,因此不能创建Session,导致之后去post其他的页面时没有session不能通过页面的验证,被post的页面不能给出预期的响应。请问python应该如何处理这个情况,让这个Session对象可以被生成出来。

论坛徽章:
0
2 [报告]
发表于 2018-04-17 15:58 |只看该作者
什么意思?

post之前可以用程序触发这个click()呀。但是session是不稳定的,你想用session做啥?

论坛徽章:
0
3 [报告]
发表于 2018-04-17 16:15 |只看该作者
回复 2# dahe_1984

登录之后的所有页面都对这里生成的session进行了判断,所以需要触发一下这个click事件以便生成这个session。请问,您提到的用程序触发click事件是怎样做的,用的什么库?可以详细说一下吗?

论坛徽章:
0
4 [报告]
发表于 2018-04-18 13:44 |只看该作者
你还是贴代码吧,这里大神多,你贴上了,很快就有答案。

论坛徽章:
0
5 [报告]
发表于 2018-04-20 16:25 |只看该作者
C#代码如下:

login 页面有一个button click事件来生成 Session
protected void OnBtnLoginClicked(object sender, EventArgs e)
{
      .................
      Session["UserID"] = user.User_Id;

}

数据处理页面会首先验证这个session然后才去处理数据。
private void Operation(string operation, HttpContext context)
{
      if (HttpContext.Current.Session["UserID"] != null)
      {  ........
          context.Response.Write(json);
      }

}

python 脚本如下:账号密码post方式登录成功以后继续post数据处理页面“AuditTrailHandler.ashx?operation=getlogisticactionlist”。这个数据处理页面有Session的验证,如果没有检测到Session就不返回数据。现在的情况就是对数据处理页面post之后没有返回值,对网站程序进行跟踪调试发现是HttpContext.Current.Session["UserID"] 没有生成出来。
import requests
import json
import time
ses = requests.session()
urlLogin = 'http://localhost:58528/login.aspx'

header = {
    'Request': 'GET /login.aspx HTTP/1.1',
    'Accept': 'text/html, application/xhtml+xml,*/*',
    'Accept-Language': 'en-US',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Accept-Encoding': 'gzip, deflate',
    'Host': 'localhost:58528',
    'Connection': 'Keep-Alive',
    'Cache-Control': 'no-cache',
}
res = ses.get(url=urlLogin, headers=header)
print(res.url)
print('%s%s' % ("Get Cookies from Login", ses.cookies))
#print('%s%s' % ("Get Dict Cookies from Login", requests.utils.dict_from_cookiejar(ses.cookies)))

print('---------------------------------------------------------------------------')

header = {
    'Request': 'POST /login.aspx HTTP/1.1',
    'Accept': 'text/html, application/xhtml+xml,*/*',
    'Referer': 'http://localhost:58528/login.aspx',
    'Accept-Language': 'en-US',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept-Encoding': 'gzip, deflate',
    'Host': 'localhost',
    'Content-Length': '560',
    'Connection': 'Keep-Alive',
    'Cache-Control': 'no-cache',
   }

postData = {
    'txtUserCode': 'engineer',
    'txtPassword': 'password',
    '__VIEWSTATE': "/wEPDwUJMjEzNDc0MjMzD2QWAgIDD2QWAgIFDxAPFgoeDURhdGFUZXh0RmllbGQFBFRleHQeFERhdGFUZXh0Rm9ybWF0U3RyaW5nBQV+ezB9fh4ORGF0YVZhbHVlRmllbGQFBENvZGUeC18hRGF0YUJvdW5kZx4HVmlzaWJsZWhkEBUCCX5FbmdsaXNofgx+TmVkZXJsYW5kc34VAgVlbi11cwVubC1ubBQrAwJnZxYBAgFkZA5CIqmPu1gpiKJwNGIaW01ArNfVuv5gt9jZnsCu3XrU",
    '__VIEWSTATEGENERATOR': "C2EE9ABB",
    '__EVENTVALIDATION': "/wEdAASZmKzqXkMRySpI0tNIsptWtw1OCjuD6m42paJnlnFE+HY2+Mc6SrnAqio3oCKbxYainihG6d/Xh3PZm3b5AoMQgZUkuPOMExPAXVeeZnfeRPwQHseHUpXLNswgqYW3qWg=",
    'btnLogin': "Sign In",
}
res = ses.post(url=urlLogin, headers=header, data=postData, cookies=ses.cookies)

print(res.url)
print('%s%s' % ("Cookies from Login", ses.cookies))
print('---------------------------------------------------------------------------')

logisticUrl = "http://localhost:58528/Views/handlers/AuditTrailHandler.ashx?operation=getlogisticactionlist"

header = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Length': '97',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'localhost:58528',
    'Origin': 'http://localhost:58528',
    'Referer': 'http://localhost:58528/Views/AuditTrail/LogisticActionList.aspx',
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0;'
                  'Nexus 5 Build/MRA58N) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}

postData = json.dumps({'pageIndex': 1, 'beginDate': '2018-04-16', 'endDate': '2018-04-17',
                       'orderNumber': None, 'sortIndx': None, 'sortDir': None})
res = ses.post(url=logisticUrl, headers=header, data=postData, cookies=ses.cookies)
print(res.url)
st = '%s%s' % ('Access handler Page status: ', res.status_code)
print(st)
st = '%s%s' % ('Handler Page Cookies: ', ses.cookies)
print(st)
print(tuple(ses.cookies))
st = '%s%s' % ('Handler Page Header: ', res.headers)
print(st)
st = '%s%s' % ('Handler Page Test: ', res.content)
print(st)




论坛徽章:
0
6 [报告]
发表于 2018-04-24 21:55 |只看该作者
cookies=ses.cookies
是cookies没有生成出来么?

这个东东我也没有用过,不过记得以前perl是将cookie保存成文件,保存在本地。

论坛徽章:
0
7 [报告]
发表于 2018-04-28 14:37 |只看该作者
本帖最后由 Michaelcobra 于 2018-04-28 14:53 编辑

回复 6# dahe_1984

cookie是OK的,但是post的时候没有触发OnBtnLoginClicked 这个事件,因此Session["UserID"]在服务端没有生成。导致后面的页面验证这个Session[UserID]的时候找不到对象。

从页面点击按钮的时候可以触发OnBtnLoginClicked 事件,所以我在想post的机制是不是本来就没办法触发这些后台事件。

论坛徽章:
0
8 [报告]
发表于 2018-04-28 18:31 |只看该作者
login 页面有一个button click事件来生成 Session。

login页面?

可以调用python selenium模块去模拟点击button。

论坛徽章:
0
9 [报告]
发表于 2018-05-02 17:05 |只看该作者
回复 8# dahe_1984

嗯,这样是可行的。谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP