bxfqing 发表于 2014-08-25 15:07

[clear][done]python 中如何追加自定义的cookie

本帖最后由 bxfqing 于 2014-09-08 21:36 编辑

背景描述:
测试页面有如下的javascript,#       <script type="text/javascript">
#      //Check Login
#      function checkLogin(){
#                  if(status && data.info){
#                        ds.setCookie('username', username, 30);
#                        toggleToken(status);
# 。。。。。。
打开网页,输入测试用户名:
654        25.637813        192.168.66.151        61.164.241.82        HTTP        756        GET /index.php?r=user/CheckUserStatus&username=1111&password=&_=1408949763960 HTTP/1.1
抓包看到的 当前cookie
PHPSESSID=ujbf0iqsfmkscqomipdvprs4s3; NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660
输入测试pwd
1280        201.741714        192.168.66.151        61.164.241.82        HTTP        786        GET /index.php?r=user/CheckUserStatus&username=1111&password=11111&_=1408949940047 HTTP/1.1
js脚本会把当前用户添加到cookie中;
PHPSESSID=ujbf0iqsfmkscqomipdvprs4s3; NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660; username=1111

我用python来模拟这个过程,使用的是LWPcookieJar      
      cookieFilename = 'demolocalCookies.txt'
      g_cookiejar = cookielib.LWPCookieJar(cookieFilename)   
      opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(g_cookiejar))
      urllib2.install_opener(opener)
      g_cookiejar.set_cookie(c)
      print "DBG >>> Cookie=== :before urllib2.urlopen\n\t",g_cookiejar
      check_us_req = urllib2.Request(check_userstatus_url,None,check_us_headers)
      check_us_response = urllib2.urlopen(check_us_req)
      check_us_result = check_us_response.read()
      print "DBG >>> Cookie=== :after urllib2.urlopen\n\t",g_cookiejar
输出的调试信息DBG >>> Cookie=== :before urllib2.urlopen
        <_LWPCookieJar.LWPCookieJar[<Cookie NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660 for passport.feng.com/>, <Cookie PHPSESSID=jt545q6regkj5me21k9rcqkbf5 for passport.feng.com/>, <Cookie username=1111 for passport.feng.com/>]>
DBG >>> Cookie=== :after urllib2.urlopen
        <_LWPCookieJar.LWPCookieJar[<Cookie NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660 for passport.feng.com/>, <Cookie PHPSESSID=jt545q6regkj5me21k9rcqkbf5 for passport.feng.com/>]>
有些疑问,在urlopen前,cookie都是三行,为什么抓包的时候,http request 中的cookie还是原来的2行了,cookie始终没有携带username发起请求?
我也试过下面的几个方法,都不行,目前比较迷茫,到底哪里写的不对
+CookieJar.add_cookie_header(request)
+CookieJar.set_cookie(cookie)
+Request.add_header(key, val)

bxfqing 发表于 2014-08-27 17:13

本帖最后由 bxfqing 于 2014-09-08 21:36 编辑

更新,Cookie构造方法有问题:
我把/usr/lib/python2.7/cookielib.py的源代码加了debug信息
    def add_cookie_header(self, request):
      """Add correct Cookie: header to request (urllib2.Request object).

      The Cookie2 header is also added unless policy.hide_cookie2 is true.

      """
      _debug("add_cookie_header")
      self._cookies_lock.acquire()
      try:

            self._policy._now = self._now = int(time.time())

            cookies = self._cookies_for_request(request)
            print '---',cookies

            attrs = self._cookie_attrs(cookies)
            print '+++',attrs
            if attrs:
                if not request.has_header("Cookie"):
                  request.add_unredirected_header(
                        "Cookie", "; ".join(attrs))
                  print '<<< ',"Cookie","; ".join(attrs)

            # if necessary, advertise that we know RFC 2965
            if (self._policy.rfc2965 and not self._policy.hide_cookie2 and
                not request.has_header("Cookie2")):
                for cookie in cookies:
                  if cookie.version != 1:
                        request.add_unredirected_header("Cookie2", '$Version="1"')
                        break

      finally:
            self._cookies_lock.release()

      self.clear_expired_cookies()
      print '>>>',self._cookies_for_request(request)
可以POST是带自定义的cookie信息了;
<<< before Request
<_LWPCookieJar.LWPCookieJar[<Cookie NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660 for passport.feng.com/>, <Cookie PHPSESSID=mf2kvv1pbdc945sespksa8q9f7 for passport.feng.com/>, <Cookie username=1111 for passport.feng.com/>]>
+++ None
<<< after Request,before urlopen
<_LWPCookieJar.LWPCookieJar[<Cookie NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660 for passport.feng.com/>, <Cookie PHPSESSID=mf2kvv1pbdc945sespksa8q9f7 for passport.feng.com/>, <Cookie username=1111 for passport.feng.com/>]>
---
1<<<Cookie username=1111; NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660; PHPSESSID=mf2kvv1pbdc945sespksa8q9f7
>>>
send: 'POST /index.php?r=user/LoginProcess HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 75\r\nAccept-Language: en-US,en;q=0.5\r\nConnection: close\r\nAccept: application/json, text/javascript, */*; q=0.01\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0\r\nHost: passport.feng.com\r\nCookie: username=1111; NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660; PHPSESSID=mf2kvv1pbdc945sespksa8q9f7\r\nX-Requested-With: XMLHttpRequest\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nusername%3D=1111&password%3D=xxxxxxxx&wekey_token%3D=&check_code%3D='
reply: 'HTTP/1.1 200 OK\r\n'
header: Date: Wed, 27 Aug 2014 09:09:22 GMT
header: Server: nginx/1.2
header: Content-Type: text/html;charset=utf-8
header: Transfer-Encoding: chunked
header: X-Powered-By: PHP/5.5.1
header: Expires: Thu, 19 Nov 1981 08:52:00 GMT
header: Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
header: Pragma: no-cache
header: Set-Cookie: NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660;expires=Wed, 27-Aug-2014 09:19:22 GMT;path=/;httponly
header: X-Via: 1.1 lsh57:2 (Cdn Cache Server V2.0)
header: Connection: close
<<< after urlopen
<_LWPCookieJar.LWPCookieJar[<Cookie NSC_qbttqpsu=ffffffffc3a0da7e45525d5f4f58455e445a4a423660 for passport.feng.com/>, <Cookie PHPSESSID=mf2kvv1pbdc945sespksa8q9f7 for passport.feng.com/>, <Cookie username=1111 for passport.feng.com/>]>
{"status":"need_checkcode","info":{"item":"password","info":"\u8d26\u53f7\u4fe1\u606f\u4e0d\u80fd\u4e3a\u7a7a"}}
页: [1]
查看完整版本: [clear][done]python 中如何追加自定义的cookie