http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 15769|回复: 15

[求助] 关于HttpHelper获取到的Cookie的疑问

[复制链接]
发表于 2015-8-19 20:30:07 | 显示全部楼层 |阅读模式
纯新手一个,还请各路大神指点,不甚感激!

我用HttpWatch抓包抓到的Cookie如下图所示:
疑问1:图中是否所有内容均为Cookie? 假如我接下来要进行POST提交实现自动登录的话,我是否要将其中的所有内容当成Cookie一起提交?

疑问2:HttpHelper获取到的Cookie只有名为“PHPSESSID”的那一行,那么其他内容不是Cookie?那它们是什么?

疑问3:我在求助区也发过一个帖子,http://www.sufeinet.com/thread-13262-1-1.html,我先访问http://www.nydus2015.info/login?callback=/loginbbs,获取验证码和Cookie,然后用HttpHelper组织相关内容后提交,登录并未成功,请问为什么?

       然后我手动将POST方法中的Cookie更换为抓包中的Cookie包含的所有内容后,其返回的html是空的?





Cookie.png


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2015-8-20 08:12:15 | 显示全部楼层
浏览器获取的Cookie不光是这一个域名下的,比如_lpvt这些,不是Cnzz的统计站,应该就是广告联盟的Cookie,这些自然是不需要带的。

页Httphelper的Cookie是访问本次请求必须的Cookie。有差别很正常
 楼主| 发表于 2015-8-20 19:10:48 | 显示全部楼层
站长苏飞 发表于 2015-8-20 08:12
浏览器获取的Cookie不光是这一个域名下的,比如_lpvt这些,不是Cnzz的统计站,应该就是广告联盟的Cookie, ...

非常感谢站长的解答!
现在看来,我模拟登录失败的原因应该是验证码图片的问题。
[C#] 纯文本查看 复制代码
 private void GetVerCode()
        {
            /* 原网站中验证码图片的HTML
             * <img src="/code?d=745090" id="codeimg" alt="验证码" style="vertical-align:top;cursor:pointer;margin-top:padding-bottom:10px;" 
             * title="点击刷新验证码" onclick="this.src='/code?d='+Math.random();">
             */

           //这里第一次请求链接时就会加载一张验证码
            item = new HttpItem()
            {
                URL = "http://www.nydus2015.info/login?callback=/loginbbs",
                Method = "GET",
                Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*",
                UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"
            };
            result = http.GetHtml(item);
            Cookies = result.Cookie;
            retCode = result.Html;

          //虽然这里获取了验证码的链接,但用同样的链接再次提交时,就会加载另一张验证码
         //用第二次提交得到的验证码去登录时不会成功的
            dCode = Utilities.GetMidStr(retCode, @"code?d=", "\"");
            item = new HttpItem()
            {
                URL = "http://www.nydus2015.info/code?d=" + dCode,
                Method = "GET",
                Accept = "*/*",
                Referer = "http://www.nydus2015.info/",
                ResultType = ResultType.Byte,
                Cookie = Cookies
            };
            result = http.GetHtml(item);
            pictureBox1.Image = Utilities.GetImageFromByte(result.ResultByte);
        }
 楼主| 发表于 2015-8-20 19:12:36 | 显示全部楼层
站长苏飞 发表于 2015-8-20 08:12
浏览器获取的Cookie不光是这一个域名下的,比如_lpvt这些,不是Cnzz的统计站,应该就是广告联盟的Cookie, ...

请问站长像http://www.nydus2015.info/code?d=745090这种链接,每一次访问都会加载不同的图片,我该怎样才能得到第一次加载时的验证码呢?

非常感谢站长!
发表于 2015-8-21 08:05:23 | 显示全部楼层
livezingy 发表于 2015-8-20 19:12
请问站长像http://www.nydus2015.info/code?d=745090这种链接,每一次访问都会加载不同的图片,我该怎样 ...

带上Cookie,获取,不一样也没事。不需要一样。
 楼主| 发表于 2015-8-21 22:06:57 | 显示全部楼层
站长苏飞 发表于 2015-8-21 08:05
带上Cookie,获取,不一样也没事。不需要一样。

非常感谢站长在百忙之中回答我的问题!
可是抱歉,我还是不明白,还有一些疑问:
1. 请问站长说的“带上Cookie, 获取”指的是带上Cookie获取验证码吗?如果是这样的话,我已经是这样做的。
2.获取验证码之后,我通过界面填写验证码,用户名和密码之后,带着Cookie提交,但是登录并没有成功。
如果验证码不是问题的话,那请问我是哪里弄错了呢?
非常感谢站长!
 楼主| 发表于 2015-8-21 22:08:05 | 显示全部楼层
站长苏飞 发表于 2015-8-21 08:05
带上Cookie,获取,不一样也没事。不需要一样。

完整的代码:
namespace LoginNyDus
{
    public partial class frmMain : Form
    {
        #region 变量定义及界面初始化
        HttpHelper http = new HttpHelper();
        HttpItem item = null;
        HttpResult result = null;
        string Cookies = "";
        string retCode = "";
        string dCode = "";
        public frmMain()
        {
            InitializeComponent();
        }
        #endregion

        private void frmMain_Load(object sender, EventArgs e)
        {
            GetVerCode();//获取验证码
        }

        private void button1_Click(object sender, EventArgs e)
        {
            item = new HttpItem()
            {
                URL = "http://www.nydus2015.info/login?callback=/loginbbs",
                Method = "POST",
                Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*",
                Referer = "http://www.nydus2015.info/login?callback=/loginbbs",
                UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)",
                Postdata = string.Format("username={0}&password={1}&code={2}", txtUser.Text.Trim(), txtPass.Text.Trim(),txtVerCode.Text.Trim()),
               
                Cookie = Cookies
            };
            result = http.GetHtml(item);
            retCode = result.Html;

        }
        private void GetVerCode()
        {
            /* 原网站中验证码图片的HTML
             * <img src="/code?d=745090" id="codeimg" alt="验证码" style="vertical-align:top;cursor:pointer;margin-top:padding-bottom:10px;"
             * title="点击刷新验证码" onclick="this.src='/code?d='+Math.random();">
             *
             * <img src="/code?d=0.31528944824822247" id="codeimg" alt="验证码" style="vertical-align:top;cursor:pointer;margin-top:padding-bottom:10px;" title="点击刷新验证码" onclick="this.src='/code?d='+Math.random();">
             */
            item = new HttpItem()
            {
                URL = "http://www.nydus2015.info/login?callback=/loginbbs",
                Method = "GET",
                Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*",
                UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"
            };
            result = http.GetHtml(item);
            Cookies = result.Cookie;
            retCode = result.Html;
            dCode = Utilities.GetMidStr(retCode, @"code?d=", "\"");
            item = new HttpItem()
            {
                URL = "http://www.nydus2015.info/code?d=" + dCode,
                Method = "GET",
                Accept = "*/*",
                Referer = "http://www.nydus2015.info/",
                ResultType = ResultType.Byte,
                Cookie = Cookies
            };
            result = http.GetHtml(item);
            pictureBox1.Image = Utilities.GetImageFromByte(result.ResultByte);
        }
    }
}
 楼主| 发表于 2015-8-21 22:18:10 | 显示全部楼层
站长苏飞 发表于 2015-8-21 08:05
带上Cookie,获取,不一样也没事。不需要一样。

登录NydusVPN时的抓包数据:



数据提交后,服务器回复的HTML是这样的:
发表于 2015-8-23 10:15:02 | 显示全部楼层
看一下你带的Cookie格式对不对,不对优化一下,或者是你确定你带的有Cookie才行,有些页面的Cookei不定是从那里得到的,

正常是这样的,先访问一下登录页面提取Cookie,带这个Cookie去提取验证码,然后带验证码和这个Cookie一起提前

当然如果Cookie是从验证码页面获取的,就是这样,先访问验证码页面,然后带着这个验证码和返回的Cookie一起提交,

先确定那个页面返回的有Cookie,然后再说提交。

如果这个流程是正常的,
还提示验证码不对,那还是Cookie原因,

检查格式就行了,比如是否带有Path=/类似于这样的格式,有的些就删除,试试
 楼主| 发表于 2015-8-23 15:23:00 | 显示全部楼层
站长苏飞 发表于 2015-8-23 10:15
看一下你带的Cookie格式对不对,不对优化一下,或者是你确定你带的有Cookie才行,有些页面的Cookei不定是从 ...

非常感谢站长的回复!
以下是我按照站长的建议尝试后的现状,麻烦站长指导下一步该如何尝试:

1.首先我确认Cookie的格式是正确的,仅包含PHPSESSID和它的值。用HttpHelper V1.4.8版本获取的Cookie确实包含“Path=/”的格式,我按照站长的建议将这些内容删除了,但结果与未删除它们时的提交结果是一样的。
2.另外,我再次确认了登录过程完整的抓包数据。第一次加载登录界面时的Cookie和POST登录时的Cookie是一样的,所以理论上而言,获取第一次加载页面的Cookie应该就可以了。
3.我用的HttpHelper提交登录请求的,按照HttpHelper中的一些例程对Cookie等变量赋值,我想正式提交时应该带了Cookie吧?

不知道我是否把问题描述清楚了,还麻烦站长再给一些提示,非常感谢!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-26 04:25

© 2014-2021

快速回复 返回顶部 返回列表