请高手过来,能搞定500分相送 有高手能模拟登录 北方网:https://secure.enorth.cn/user/login ,没有,用httpwebrequest进行,在下研究了很久,也没有搞定,所以 不得不请教高手! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private void Verification(string nameString, string pwdString, string proxyString) { string sURL = "http://q11.3g.qq.com/g/s"; string postData = "u=" + 号码+ "&p=" + 密码+ "&modifySKey=0&aid=nLoginHandle"; byte[] data = Encoding.UTF8.GetBytes(postData); // 创建一个URL请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sURL); request.Method = "POST"; request.Headers.Add("Accept-Language", "zh-cn"); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; request.Accept = "*/*"; request.UserAgent = "Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)"; request.ServicePoint.Expect100Continue = false; // Send the data. Stream dataStream = request.GetResponse(); dataStream.Write(data, 0, data.Length); // 获取响应 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // 获取流包含由服务器返回的内容。 StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); // 保存返回 responseFromServer = reader.ReadToEnd(); } 需要处理下SSL问题。ServicePointManager研究下这个类的使用。 string url = "";HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);string s = "";byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes("");req.Method = "POST";req.ContentType = "application/x-www-form-urlencoded";req.ContentLength = requestBytes.Length;Stream requestStream = req.GetRequestStream();requestStream.Write(requestBytes,0,requestBytes.Length);requestStream.Close();HttpWebResponse res = (HttpWebResponse)req.GetResponse();StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default);string backstr = sr.ReadToEnd(); Response.Write(line); sr.Close(); res.Close(); WebClient、Request 笨方法,但能实现,用WebBrowser省去许多麻烦:private void button1_Click(object sender, EventArgs e) { HtmlElement user = webBrowser1.Document.GetElementById("TextBox1"); user.SetAttribute("Value", "a"); HtmlElement pwd = webBrowser1.Document.GetElementById("TextBox2"); pwd.SetAttribute("Value", "a"); HtmlElement btn = webBrowser1.Document.GetElementById("ButtonLogin"); btn.InvokeMember("click"); } private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate("http://72406.13375.06la.com.cn/"); } 看完楼主的这个帖子以后,我的心久久不能平静,震撼啊!为什么会有如此好的帖子!我纵横网络bbs多年,自以为再也不会有任何帖子能打动我,没想到今天看到了如此精妙绝伦的这样一篇帖子。楼主,是你让我深深地理解了“人外有人,天外有天”这句话。谢谢你!在看完这帖子以后,我没有立即回复,因为我生怕我庸俗不堪的回复会玷污了这网上少有的帖子。但是我还是回复了,因为我觉得如果不能在如此精彩的帖子后面留下自己的网名,那我死也不会瞑目的!能够在如此精彩的帖子后面留下自己的网名是多么骄傲的一件事啊!楼主,请原谅我的自私!我知道无论用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的,都是虚伪的,所以我只想说一句:您的帖子太好了!我愿意一辈子的看下去!这篇帖子构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应当学习之典范。就小说艺术的角度而言,这篇帖子可能不算太成功,但它的实验意义却远远大于成功本身。正所谓:“一马奔腾,射雕引弓,天地都在我心中!”楼主真不愧为无厘界新一代的开山怪!本来我已经对这个社区失望了,觉得这个社区没有前途了,心里充满了悲哀。但是看了你的这个帖子,又让我对社区产生了希望。是你让我的心里重新燃起希望之火,是你让我的心死灰复燃,是你拯救了我一颗拨凉拨凉的心!本来我决定不会在社区回任何帖子了,但是看了你的帖子,我告诉自己这个帖子是一定要回的!这是百年难得一见的好贴啊!苍天有眼啊,让我在优生之年得以观得 如此精彩绝伦的帖子!楼主的话真如“大音希声扫阴翳”,犹如“拨开云雾见青天”,使我等网民看到了希望,看到了未来!晴天霹雳,醍醐灌顶或许不足以形容大师文章的万一;长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾,龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔,写天下文章的智慧神态;仿佛看见了你按剑四顾,江山无数的英武气概!楼主,你说的多好啊!我在社区打滚这么多年,所谓阅人无数,见怪不怪了,但一看到楼主的气势,我就觉得楼主同在社区里灌水的那帮小混蛋有着本质的差别,那忧郁的语调,那熟悉的签名,还有字里行间高屋建瓴的辞藻。没用的,楼主,就算你怎么换马甲都是没有用的,你的亿万拥戴者早已经把你认出来了,你一定就是传说中的最强id。自从社区改版之后,我就已经心灰意冷,对社区也没抱什么希望了,传说已经幻灭,神话已经终结,留在社区还有什么意思。没想到,没想到,今天可以再睹楼主的风范,我激动得忍不住就在屏幕前流下了眼泪。是啊,只要在楼主的带领下,社区就有希望了。我的内心再一次沸腾了,我胸腔里的血再一次燃烧了。楼主的话概括扼要,一语道出了我们苦想多年的而不可得答案的几个重大问题的根本。楼主就好比社区的明灯,楼主就好比社区的方向,楼主就好比社区的栋梁。有楼主在,社区的明天必将更好!楼主你的高尚情操太让人感动了。在现在这样一个物欲横流的金钱社会里,竟然还能见到楼主这样的性情中人,无疑是我这辈子最大的幸运。让我深深感受到了人性的伟大。楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光,一瞬间就让我如饮甘露,让我明白了永恒的真理在这个世界上是真实存在着的。只有楼主这样具备广阔胸怀和完整知识体系的人,才能作为这真理的唯一引言者。看了楼主的帖子,让我陷入了严肃的思考中,我认为,如果不把楼主的帖子顶上去,就是对真理的一种背叛,就是对谬论的极大妥协。因此,我决定义无返顾的顶了!楼主,在遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于汉廷的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲;但现在,我才知道我有多么浅薄!楼主的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐风宋骨发扬得入木三分,能在有生之年看见楼主的这个帖子。实在是我三生之幸啊。看完楼主的这个帖子之后,我竟感发生出一种无以名之的悲痛感――啊,这么好的帖子,如果将来我再也看不到了,那我该怎么办?那我该怎么办?直到我毫不犹豫的把楼主的这个帖子收藏了,我内心的那种激动才逐渐平复下来。可是我立刻想到,这么好的帖子,倘若别人看不到,那么不是浪费楼主的心血吗?经过痛苦的思想斗争,我终于下定决心,我要把这个帖子一直往上顶,往上顶到所有人都看到为止!我现在终于明白我缺乏的是什么了,正是楼主那种对真理的执着追求和楼主那种对理想的艰苦实践所产生的厚重感。面对楼主的帖子,我震惊得几乎不能动弹了,楼主那种裂纸欲出的大手笔,竟使我忍不住一次次的翻开楼主的帖子,每看 一次,赞赏之情就激长数分,我总在想,是否有神灵活在它灵秀的外表下,以至能使人三月不知肉味,使人有余音穿梁,三日不绝的感受。楼主,你写得实在是太好了!我唯一能做的,就只有把这个帖子顶上去这件事了。楼主,我支持您! 看来他是通过SSL进行登录的,为了增强安全性,所以这里的所有人都搞不定。 感谢各位的关注,在此,我提供一个 测试的用户名和密码 : user:testby,password:123456,欢迎各位高手一起研究探讨。上面各位回的都是不能实现的,请测试吧,我研究了很久了。但都没弄出来,我干脆把代码写出来,看看有哪个高手知道其中不能成功的原因没有? public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { //直接确认,否则打不开 return true; } public string GetWithHttps(string URL) { CookieContainer cookies = new CookieContainer(); ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); HttpWebRequest logreq = (HttpWebRequest)WebRequest.Create(URL); logreq.CookieContainer = new CookieContainer(); logreq.ServicePoint.Expect100Continue = false; logreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)"; //模拟一个UserAgent logreq.CookieContainer = cookies; logreq.Method = "GET"; // logreq.AllowAutoRedirect = true; logreq.KeepAlive = true; logreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*"; logreq.Referer = "https://secure.enorth.cn/user/login"; logreq.ContentType = "application/x-www-form-urlencoded"; HttpWebResponse response = (HttpWebResponse)logreq.GetResponse(); cookies.Add(response.Cookies); StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string str = sr2.ReadToEnd(); string formhash = ""; string formhashflag = ""; int i; int j; try { formhashflag = "<input type=\"hidden\" name=\"lt\" value=\""; i = str.IndexOf(formhashflag) + formhashflag.Length; j = str.IndexOf("\"", i); formhash = str.Substring(i, j - i); return formhash; } catch (Exception exception) { Console.Write(exception.StackTrace); return "未能获取formhash值,请打开网页源码查看!"; } response.Close(); logreq.Abort(); } /// <summary> /// 登录 /// </summary> /// <param name="username"></param> /// <param name="password"></param> /// <returns></returns> public CookieContainer login(string username, string password) { // RemoveCookies(); CookieContainer cookies = new CookieContainer(); string url; url = "https://secure.enorth.cn/user/login"; string formhash = GetWithHttps(url); string strPostdata = "username=" + username + "&password=" + password + "<=" + formhash + "&_eventId=submit&submit_chgByZs.x=0&submit_chgByZs.y=0"; ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.CookieContainer = cookies; request.Method = "POST"; request.AllowAutoRedirect = true; request.KeepAlive = true; request.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*"; request.Referer = "https://secure.enorth.cn/user/login"; request.ContentType = "application/x-www-form-urlencoded"; byte[] buffer = Encoding.UTF8.GetBytes(strPostdata); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string str = reader.ReadToEnd(); cookies.Add(response.Cookies); response.Close(); request.Abort(); return cookies;} FORM放置一个WebBrowser,设置Url属性为https://secure.enorth.cn/user/login放一个Button代码如下 System.Windows.Forms.HtmlDocument document = this.webBrowser1.Document; if ( document == null ) { return; } document.All["username"].SetAttribute( "Value", "testby" ); //用户名 document.All["password"].SetAttribute( "Value", "123456" ); //密码 document.All["submit_chgByZs"].InvokeMember( "click" ); //登录按钮的click方法 上面代码是Button的Click事件的代码 他lt的值是每次都不一样的其实你获取的lt的值和提交的并不一致, 楼主所发的都是http的报文,而不是ssl的报文。 请问谁单点登录实现了啊,能否把代码共享出来看看,用webbowser那种方式我也没有问题,请楼上的朋友看看,我用了ssl方式的,但还是没有成功!请大家再努力探讨! WebBrowse方式不是我想要的结果 希望楼主可以兑现呵呵你的代码大部分是正确的,我修改了下面两个地方:1、GetWithHttps方法修改如下://添加一个参数jsid,这个参数在函数体内赋值,传出函数public string GetWithHttps(string URL,out string jsid) { CookieContainer cookies = new CookieContainer(); ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; ... formhash = str.Substring(i, j - i); jsid = str.Substring(str.IndexOf("jsessionid=") + 11, 32); return formhash; ....}2、login方法修改如下:public CookieContainer login(string username, string password) { ... string url; url = "https://secure.enorth.cn/user/login"; string jsid; string formhash = GetWithHttps(url,out jsid); string strPostdata = "username=" + username + "&password=" + password + "<=" + formhash + "&_eventId=submit&submit_chgByZs.x=0&submit_chgByZs.y=0"; url = url + ";jsessionid="+jsid; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); ... ... string str = reader.ReadToEnd(); // 这里读出来的str是一个页面里面只有一句js,重定向到 // <script language="javascript">location.href='http://u.enorth.cn/';</script> ...}根据这个js可以定向到http://u.enorth.cn/即可完成登录。 回楼上,你说的是读出来还要用JS去重定向?还是照你说的2个方法改了之后即可?你改的只是加了一个jsessionid?你测试成功了的?我稍后试试看,如能成功,定当送分给你,绝不食言! 你是不是想要一个,输入那个url可以登陆,也就是输入那个url后是转到自己指定的页面上去。 不是JS重定向,你需要分析这个页面找到这个URL,当然写死也可以,或者配置文件。我修改的两个方法是保证你完成登录的功能,主要是添加了一个jsessionid,还设置了协议类型。你原来的代码请求后又返回到登录页面,修改之后的代码会得到我上面说的那个包含js的页面(也就是那个重定向的页面)。上面的代码我在本机测试通过,通过sniffer查看http请求的路径也是这样的,登录完毕后实际的页面会通过执行那个js跳转,你要做的就是保存好客户端的Cookie信息,就可以模拟出来完整的操作。 ╭︿︿︿╮ {/ o o /} X ( (oo) ) ︶ ︶︶╭︿︿︿╮ {/ o o /} X ( (oo) ) ︶ ︶︶ 要么换个思路,试试watin?我们做自动化测试用的,就模拟在页面上点点点…… 回楼上朋友,按你的说的的确能得到你说的跳转页面的结果,这样按理说应该算是登录了,我保存COOKIE之后,然后加入模拟发日志,但不知道为何还是总是不成功,代码上看不出什么问题,麻烦您再看看,实现模拟发日志呢,总算遇到高手了,有救了。定当高分相送,不过有一个问题不太明白,登陆的时候为何要加上那个seesionid呢,按理说可以不加吧,我把模拟发文的代码也贴上来,麻烦你看看,哪里还有问题//模拟发日志 string user = username.Text; string pwd = password.Text; string blogtitle = title.Text.TrimEnd(); string blogbody = this.textBox1.Text; CookieContainer cookies = login(user, pwd); // 以下模拟发日志 HttpWebRequest sendreq = (HttpWebRequest)WebRequest.Create("http://u.enorth.cn/console/article.do"); string publishstr = "article.title=" + blogtitle + "&article.extProxy.attData%28content%29=" + blogbody + "&article.systemTypeId=63&article.categoryId=659849&categoryTitle=&article.tag=&article.viewScope=2&article.extProxy.attData%28digest%29=&article.commentScope=2&action=addnew&article.state=1&article.articleId=0&refer=http%3A%2F%2Fu.enorth.cn%2Fconsole%2FarticleIndex.do"; byte[] message = Encoding.GetEncoding("GB2312").GetBytes(publishstr); sendreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)"; sendreq.ServicePoint.Expect100Continue = false; sendreq.Credentials = CredentialCache.DefaultCredentials; ServicePointManager.Expect100Continue = false; //模拟一个UserAgent sendreq.AllowAutoRedirect = true; sendreq.KeepAlive = true; sendreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*"; sendreq.ContentType = "application/x-www-form-urlencoded"; sendreq.Method = "POST"; sendreq.Referer = "http://u.enorth.cn/console/articleEdit.do?action=addnew"; sendreq.ContentLength = message.Length; sendreq.CookieContainer = cookies; sendreq.Timeout = 100000; sendreq.GetRequestStream().Write(message, 0, message.Length); sendreq.GetRequestStream().Close(); HttpWebResponse response = (HttpWebResponse)sendreq.GetResponse(); cookies.Add(response.Cookies); StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("GB2312")); string text2 = sr2.ReadToEnd(); sendreq.Abort(); response.Close();得到的响应 text2 总是提示信息,写日志总不成功! 我继续测试发现他的主机域名有所改变,同样传送了那个jsessionid,但我在creat(url)请求时,照你说的方式把那个jseid加在后面传入也不行,期待你的解答! 1、登录现在已经完成。2、模拟发送blog的方法如下: 由于不知道服务器上到底需要什么数据,首先可以肯定这是一个POST,既然是POST就应该把Form里面的表单项全部POST回去。 关于Cookie肯定保存了登录的相关信息,确定你获得的Cookie里面是否有这个信息,如果没有没关系,你可以模拟一个Cookie。 推荐你使用两个工具(Wireshark,ComView)来跟踪,对于HTTPs的可能看到的都是乱码,但是HTTP的都是明文,所以这个POST应该比前面的登陆要稍微简单些。 下面是我用ComView跟踪的内容:0x0030 FF FF 70 5C 00 00 50 4F-53 54 20 68 74 74 70 3A p\..POST http:0x0040 2F 2F 75 2E 65 6E 6F 72-74 68 2E 63 6E 2F 63 6F //u.enorth.cn/co0x0050 6E 73 6F 6C 65 2F 61 72-74 69 63 6C 65 2E 64 6F nsole/article.do0x0060 20 48 54 54 50 2F 31 2E-30 0D 0A 41 63 63 65 70 HTTP/1.0..Accep0x0070 74 3A 20 69 6D 61 67 65-2F 67 69 66 2C 20 69 6D t: image/gif, im0x0080 61 67 65 2F 78 2D 78 62-69 74 6D 61 70 2C 20 69 age/x-xbitmap, i0x0090 6D 61 67 65 2F 6A 70 65-67 2C 20 69 6D 61 67 65 mage/jpeg, image0x00A0 2F 70 6A 70 65 67 2C 20-61 70 70 6C 69 63 61 74 /pjpeg, applicat0x00B0 69 6F 6E 2F 78 2D 73 68-6F 63 6B 77 61 76 65 2D ion/x-shockwave-0x00C0 66 6C 61 73 68 2C 20 61-70 70 6C 69 63 61 74 69 flash, applicati0x00D0 6F 6E 2F 78 2D 6D 73 2D-61 70 70 6C 69 63 61 74 on/x-ms-applicat0x00E0 69 6F 6E 2C 20 61 70 70-6C 69 63 61 74 69 6F 6E ion, application0x00F0 2F 78 2D 6D 73 2D 78 62-61 70 2C 20 61 70 70 6C /x-ms-xbap, appl0x0100 69 63 61 74 69 6F 6E 2F-76 6E 64 2E 6D 73 2D 78 ication/vnd.ms-x0x0110 70 73 64 6F 63 75 6D 65-6E 74 2C 20 61 70 70 6C psdocument, appl0x0120 69 63 61 74 69 6F 6E 2F-78 61 6D 6C 2B 78 6D 6C ication/xaml+xml0x0130 2C 20 2A 2F 2A 0D 0A 52-65 66 65 72 65 72 3A 20 , */*..Referer: 0x0140 68 74 74 70 3A 2F 2F 75-2E 65 6E 6F 72 74 68 2E http://u.enorth.0x0150 63 6E 2F 63 6F 6E 73 6F-6C 65 2F 61 72 74 69 63 cn/console/artic0x0160 6C 65 45 64 69 74 2E 64-6F 3B 6A 73 65 73 73 69 leEdit.do;jsessi0x0170 6F 6E 69 64 3D 44 46 30-33 39 42 41 39 44 43 36 onid=DF039BA9DC60x0180 34 34 46 45 42 30 31 38-33 37 43 30 45 39 42 32 44FEB01837C0E9B20x0190 32 31 44 41 38 3F 61 63-74 69 6F 6E 3D 61 64 64 21DA8?action=add0x01A0 6E 65 77 26 74 69 63 6B-65 74 3D 53 54 2D 31 39 new&ticket=ST-190x01B0 34 38 35 2D 73 63 71 6F-53 75 66 48 44 4C 42 62 485-scqoSufHDLBb0x01C0 4B 74 35 4B 56 61 74 4D-2D 75 73 65 72 0D 0A 41 Kt5KVatM-user..A0x01D0 63 63 65 70 74 2D 4C 61-6E 67 75 61 67 65 3A 20 ccept-Language: 0x01E0 7A 68 2D 63 6E 0D 0A 43-6F 6E 74 65 6E 74 2D 54 zh-cn..Content-T0x01F0 79 70 65 3A 20 61 70 70-6C 69 63 61 74 69 6F 6E ype: application0x0200 2F 78 2D 77 77 77 2D 66-6F 72 6D 2D 75 72 6C 65 /x-www-form-urle0x0210 6E 63 6F 64 65 64 0D 0A-50 72 6F 78 79 2D 43 6F ncoded..Proxy-Co0x0220 6E 6E 65 63 74 69 6F 6E-3A 20 4B 65 65 70 2D 41 nnection: Keep-A0x0230 6C 69 76 65 0D 0A 55 73-65 72 2D 41 67 65 6E 74 live..User-Agent0x0240 3A 20 4D 6F 7A 69 6C 6C-61 2F 34 2E 30 20 : Mozilla/4.0 这里有很多内容,其中包括Referer,Content-Type等等,你在模拟请求的时候这些信息最好都有。关键看下面:x00E0 3A 20 6E 6F 2D 63 61 63-68 65 0D 0A 43 6F 6F 6B : no-cache..Cook0x00F0 69 65 3A 20 4A 53 45 53-53 49 4F 4E 49 44 3D 44 ie: JSESSIONID=D0x0100 46 30 33 39 42 41 39 44-43 36 34 34 46 45 42 30 F039BA9DC644FEB00x0110 31 38 33 37 43 30 45 39-42 32 32 31 44 41 38 0D 1837C0E9B221DA8.这里有个JSESSIONID,这个服务器一定是需要的,你登录的时候已经有这个值了,这时候你可以构造一个Cookie一同发送到服务器上。下面是提交的表单内容:0x0030 FF FF EE 23 00 00 61 72-74 69 63 6C 65 2E 74 69 ?..article.ti0x0040 74 6C 65 3D 74 69 74 6C-65 26 61 72 74 69 63 6C tle=title&articl0x0050 65 2E 65 78 74 50 72 6F-78 79 2E 61 74 74 44 61 e.extProxy.attDa0x0060 74 61 25 32 38 63 6F 6E-74 65 6E 74 25 32 39 3D ta%28content%29=0x0070 25 33 43 50 25 33 45 74-65 73 74 25 33 43 25 32 %3CP%3Etest%3C%20x0080 46 50 25 33 45 26 61 72-74 69 63 6C 65 2E 73 79 FP%3E&article.sy0x0090 73 74 65 6D 54 79 70 65-49 64 3D 36 26 61 72 74 stemTypeId=6&art0x00A0 69 63 6C 65 2E 63 61 74-65 67 6F 72 79 49 64 3D icle.categoryId=0x00B0 36 35 39 38 34 39 26 63-61 74 65 67 6F 72 79 54 659849&categoryT0x00C0 69 74 6C 65 3D 26 61 72-74 69 63 6C 65 2E 74 61 itle=&article.ta0x00D0 67 3D 74 61 6F 62 61 6F-26 61 72 74 69 63 6C 65 g=taobao&article0x00E0 2E 76 69 65 77 53 63 6F-70 65 3D 32 26 61 72 74 .viewScope=2&art0x00F0 69 63 6C 65 2E 65 78 74-50 72 6F 78 79 2E 61 74 icle.extProxy.at0x0100 74 44 61 74 61 25 32 38-64 69 67 65 73 74 25 32 tData%28digest%20x0110 39 3D 26 61 72 74 69 63-6C 65 2E 63 6F 6D 6D 65 9=&article.comme0x0120 6E 74 53 63 6F 70 65 3D-32 26 61 63 74 69 6F 6E ntScope=2&action0x0130 3D 61 64 64 6E 65 77 26-61 72 74 69 63 6C 65 2E =addnew&article.0x0140 73 74 61 74 65 3D 31 26-61 72 74 69 63 6C 65 2E state=1&article.0x0150 61 72 74 69 63 6C 65 49-64 3D 30 26 72 65 66 65 articleId=0&refe0x0160 72 3D 6E 75 6C 6C 0D 0A- r=null..另外需要申明的是,我只是针对此网友的问题做回答,只是出于学习和研究的目的,其他任何事情与我无关。按照上面的方法可以发送,现在里面有个test的blog就是我这么发送上去的,剩下的楼主自己搞定吧。 回高手,怎么狠奇怪呢,我照着你说的方法做的啊,但总是还是不成功,没找出什么原因,麻烦楼主看看我的代码,看能否找出我出错的原因呢,我在cookie中模拟增加了那个jessionid的,但发文就是不成功,得到的响应结果给我以前说的一样,再帮我看看解决解决吧,500分稍后送给你,我把我的代码发如下: public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { //直接确认,否则打不开 return true; } ///<summary> ///采用https协议访问网络 ///</summary> ///<param name="URL">url地址</param> ///<returns></returns> public string GetWithHttps(string URL, out string jsid) { CookieContainer cookies = new CookieContainer(); ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); HttpWebRequest logreq = (HttpWebRequest)WebRequest.Create(URL); logreq.CookieContainer = new CookieContainer(); logreq.ServicePoint.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; logreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)"; //模拟一个UserAgent logreq.CookieContainer = cookies; logreq.Method = "GET"; // logreq.AllowAutoRedirect = true; logreq.KeepAlive = true; logreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*"; logreq.Referer = "https://secure.enorth.cn/user/login"; logreq.ContentType = "application/x-www-form-urlencoded"; HttpWebResponse response = (HttpWebResponse)logreq.GetResponse(); cookies.Add(response.Cookies); StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string str = sr2.ReadToEnd(); string formhash = ""; string formhashflag = ""; int i; int j; try { formhashflag = "<input type=\"hidden\" name=\"lt\" value=\""; i = str.IndexOf(formhashflag) + formhashflag.Length; j = str.IndexOf("\"", i); formhash = str.Substring(i, j - i); jsid = str.Substring(str.IndexOf("jsessionid=") + 11, 32); return formhash; } catch (Exception exception) { Console.Write(exception.StackTrace); jsid = ""; return "未能获取formhash值,请打开网页源码查看!"; } response.Close(); logreq.Abort(); } /// <summary> /// 登录 /// </summary> /// <param name="username"></param> /// <param name="password"></param> /// <returns></returns> public CookieContainer login(string username, string password) { CookieContainer cookies = new CookieContainer(); string url; url = "https://secure.enorth.cn/user/login"; string formhash = GetWithHttps(url, out jsid); string strPostdata = "username=" + username + "&password=" + password + "<=" + formhash + "&_eventId=submit&submit_chgByZs.x=0&submit_chgByZs.y=0"; url = url + ";jsessionid=" + jsid; ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.CookieContainer = cookies; request.Method = "POST"; request.AllowAutoRedirect = true; request.KeepAlive = true; request.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*"; request.Referer = "https://secure.enorth.cn/user/login"; request.ContentType = "application/x-www-form-urlencoded"; byte[] buffer = Encoding.UTF8.GetBytes(strPostdata); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string str = reader.ReadToEnd(); //模拟一个jsessionid请求 cookie Cookie cookie = new Cookie("JSESSIONID", jsid, "/", "u.enorth.cn"); response.Cookies.Add(cookie); cookies.Add(response.Cookies); response.Close(); request.Abort(); return cookies;}发文 string user = username.Text; string pwd = password.Text; CookieContainer cookies = login(user, pwd); // 以下是在北方博客网 发布文章 HttpWebRequest sendreq = (HttpWebRequest)WebRequest.Create("http://u.enorth.cn/console/article.do" ); string publishstr = "article.title=" + blogtitle + "&article.extProxy.attData%28content%29=" + blogbody + "&article.systemTypeId=63&article.categoryId=659849&categoryTitle=&article.tag=&article.viewScope=2&article.extProxy.attData%28digest%29=&article.commentScope=2&action=addnew&article.state=1&article.articleId=0&refer="; byte[] message = Encoding.GetEncoding("GB2312").GetBytes(publishstr); sendreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)"; sendreq.ServicePoint.Expect100Continue = false; // sendreq.Credentials = CredentialCache.DefaultCredentials; //ServicePointManager.Expect100Continue = false; //模拟一个UserAgent sendreq.AllowAutoRedirect =false; sendreq.KeepAlive = true; sendreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*"; sendreq.ContentType = "application/x-www-form-urlencoded"; sendreq.Method = "POST"; sendreq.Referer = "http://u.enorth.cn/console/articleEdit.do?action=addnew"; sendreq.ContentLength = message.Length; sendreq.CookieContainer = cookies; sendreq.Timeout = 100000; sendreq.GetRequestStream().Write(message, 0, message.Length); sendreq.GetRequestStream().Close(); HttpWebResponse response = (HttpWebResponse)sendreq.GetResponse(); cookies.Add(response.Cookies); StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("GB2312")); string text2 = sr2.ReadToEnd(); sendreq.Abort(); response.Close(); 哦也~make掉,偶最近正在弄这个... ... 呵呵,俺不是什么高手,刚才又研究了一下,说说我的理解吧,我个人认为是完全可以实现的。理由很简单,其实就是要模拟一个IE而已,IE能处理为什么自己写的程序不能处理?这个完全没有道理。分析这个网站可以看出这个网站的登录服务器和内容服务器是相互独立的,登录服务器通过https认证,这个是为了保证登录信息的安全,登录成功以后登录服务器会给客户端发一个ticket,这个ticket再去内容服务器验证(这个验证的过程其实就是一个重定向的过程),所以会有两个jsessionid。我测试的请求序列如下:GET: https://secure.enorth.cn/user/login -- 这里产生第一个Jsessionid,下一个请求会使用POST:https://secure.enorth.cn/user/login;jsessionid=第一个Jsessionid,同时产生两个Cookie项,CASPRIVACY,CASTGC(这是一个客户端票)到这里登录完成,开始重定向GET :http://u.enorth.cn/ -- 这里会获得第二个JSESSIONIDGET :http://u.enorth.cn/console -- 这里是重定向到我的首页到此从登录到打开首页就完成了。至于你说的发帖子,其实也是一样的道理,你的代码已经实现了90%了,继续努力吧。特别注意请求时Cookie项一定要正确,并且注意那个jsessionid。此贴到这为止吧,不再回复了。 这是一个response和request的使用问题,楼主好好学习~~ 感谢你的回复,我再自己试试,估计就是第二SESSIONid的问题,谢了,请你过几天接分,500分送给你,我连开5贴,每贴100分,你稍后来接! 楼主你是不是重定向将那个 request.AllowAutoRedirect = false; 然后再单独去get从定向后的网页获取第二个sessionid?有办法在设为true的情况下获取第二个sessionid没有? 我也明白楼主是怎么获得第二个sessionid的了,你应该就是在设为false的情况下,重新去get重定向后的页面的cookie得到的吧?如果在true的情况下好像没法直接获得第二个sessionid,所以我直接用原来那个无论怎样都不对,有办法在true下获得第二个seesionid没有呢 我想做个WinForm 程序,模拟登录新浪博客,然后写博客,提交博客 100分请教几个问题 跪求C#高手帮我做一个期末考试题 如何透过控件获取FORM的坐标 请问一下关于网站上传的问题, 急!急!急!发布网站时app_code.dll发生冲突!!!大侠们帮帮小妹!!在线等==== 有没有老大知道T6格式的传真图怎么转成普通jpg等格式啊?! 为什么不能取得Range.XML属性呢? 请教如何给软件做皮肤 颜色转换 在调用数据适配器的UPdate方法时,出现截断字符串或二进制的错误, 远程服务器返回了意外响应: (400) Bad Request。 C#的服务程序如何执行cmd或bat文件?如何执行dos命令
{
string sURL = "http://q11.3g.qq.com/g/s";
string postData = "u=" + 号码+ "&p=" + 密码+ "&modifySKey=0&aid=nLoginHandle";
byte[] data = Encoding.UTF8.GetBytes(postData);
// 创建一个URL请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sURL);
request.Method = "POST";
request.Headers.Add("Accept-Language", "zh-cn");
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.Accept = "*/*";
request.UserAgent = "Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)";
request.ServicePoint.Expect100Continue = false;
// Send the data.
Stream dataStream = request.GetResponse();
dataStream.Write(data, 0, data.Length);
// 获取响应
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// 获取流包含由服务器返回的内容。
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
// 保存返回
responseFromServer = reader.ReadToEnd();
}
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string s = "";
byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes("");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = requestBytes.Length;
Stream requestStream = req.GetRequestStream();
requestStream.Write(requestBytes,0,requestBytes.Length);
requestStream.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default);
string backstr = sr.ReadToEnd();
Response.Write(line);
sr.Close();
res.Close();
WebClient、Request
{
HtmlElement user = webBrowser1.Document.GetElementById("TextBox1");
user.SetAttribute("Value", "a");
HtmlElement pwd = webBrowser1.Document.GetElementById("TextBox2");
pwd.SetAttribute("Value", "a");
HtmlElement btn = webBrowser1.Document.GetElementById("ButtonLogin");
btn.InvokeMember("click");
} private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("http://72406.13375.06la.com.cn/");
}
{
//直接确认,否则打不开
return true;
} public string GetWithHttps(string URL)
{
CookieContainer cookies = new CookieContainer();
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
HttpWebRequest logreq = (HttpWebRequest)WebRequest.Create(URL);
logreq.CookieContainer = new CookieContainer();
logreq.ServicePoint.Expect100Continue = false;
logreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)";
//模拟一个UserAgent
logreq.CookieContainer = cookies;
logreq.Method = "GET";
// logreq.AllowAutoRedirect = true;
logreq.KeepAlive = true;
logreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*";
logreq.Referer = "https://secure.enorth.cn/user/login";
logreq.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse response = (HttpWebResponse)logreq.GetResponse();
cookies.Add(response.Cookies);
StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string str = sr2.ReadToEnd();
string formhash = "";
string formhashflag = "";
int i;
int j; try
{
formhashflag = "<input type=\"hidden\" name=\"lt\" value=\"";
i = str.IndexOf(formhashflag) + formhashflag.Length;
j = str.IndexOf("\"", i);
formhash = str.Substring(i, j - i); return formhash; }
catch (Exception exception)
{
Console.Write(exception.StackTrace);
return "未能获取formhash值,请打开网页源码查看!";
}
response.Close();
logreq.Abort();
} /// <summary>
/// 登录
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
public CookieContainer login(string username, string password)
{
// RemoveCookies();
CookieContainer cookies = new CookieContainer();
string url;
url = "https://secure.enorth.cn/user/login";
string formhash = GetWithHttps(url);
string strPostdata = "username=" + username + "&password=" + password + "<=" + formhash + "&_eventId=submit&submit_chgByZs.x=0&submit_chgByZs.y=0"; ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = cookies;
request.Method = "POST";
request.AllowAutoRedirect = true;
request.KeepAlive = true;
request.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*";
request.Referer = "https://secure.enorth.cn/user/login";
request.ContentType = "application/x-www-form-urlencoded";
byte[] buffer = Encoding.UTF8.GetBytes(strPostdata);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string str = reader.ReadToEnd();
cookies.Add(response.Cookies);
response.Close();
request.Abort();
return cookies;
}
放一个Button代码如下 System.Windows.Forms.HtmlDocument document = this.webBrowser1.Document;
if ( document == null )
{
return;
}
document.All["username"].SetAttribute( "Value", "testby" ); //用户名
document.All["password"].SetAttribute( "Value", "123456" ); //密码
document.All["submit_chgByZs"].InvokeMember( "click" ); //登录按钮的click方法
其实你获取的lt的值和提交的并不一致,
请问谁单点登录实现了啊,能否把代码共享出来看看,用webbowser那种方式我也没有问题,请楼上的朋友看看,我用了ssl方式的,但还是没有成功!请大家再努力探讨!
//添加一个参数jsid,这个参数在函数体内赋值,传出函数
public string GetWithHttps(string URL,out string jsid) {
CookieContainer cookies = new CookieContainer();
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
...
formhash = str.Substring(i, j - i);
jsid = str.Substring(str.IndexOf("jsessionid=") + 11, 32);
return formhash;
....
}2、login方法修改如下:
public CookieContainer login(string username, string password) {
...
string url;
url = "https://secure.enorth.cn/user/login";
string jsid;
string formhash = GetWithHttps(url,out jsid);
string strPostdata = "username=" + username + "&password=" + password + "<=" + formhash + "&_eventId=submit&submit_chgByZs.x=0&submit_chgByZs.y=0";
url = url + ";jsessionid="+jsid;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
...
...
string str = reader.ReadToEnd();
// 这里读出来的str是一个页面里面只有一句js,重定向到
// <script language="javascript">location.href='http://u.enorth.cn/';</script>
...
}根据这个js可以定向到http://u.enorth.cn/即可完成登录。
╭︿︿︿╮
{/ o o /} X
( (oo) )
︶ ︶︶
╭︿︿︿╮
{/ o o /} X
( (oo) )
︶ ︶︶
string pwd = password.Text; string blogtitle = title.Text.TrimEnd();
string blogbody = this.textBox1.Text;
CookieContainer cookies = login(user, pwd);
// 以下模拟发日志
HttpWebRequest sendreq = (HttpWebRequest)WebRequest.Create("http://u.enorth.cn/console/article.do");
string publishstr = "article.title=" + blogtitle + "&article.extProxy.attData%28content%29=" + blogbody + "&article.systemTypeId=63&article.categoryId=659849&categoryTitle=&article.tag=&article.viewScope=2&article.extProxy.attData%28digest%29=&article.commentScope=2&action=addnew&article.state=1&article.articleId=0&refer=http%3A%2F%2Fu.enorth.cn%2Fconsole%2FarticleIndex.do"; byte[] message = Encoding.GetEncoding("GB2312").GetBytes(publishstr);
sendreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)";
sendreq.ServicePoint.Expect100Continue = false;
sendreq.Credentials = CredentialCache.DefaultCredentials;
ServicePointManager.Expect100Continue = false;
//模拟一个UserAgent
sendreq.AllowAutoRedirect = true;
sendreq.KeepAlive = true;
sendreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*";
sendreq.ContentType = "application/x-www-form-urlencoded";
sendreq.Method = "POST";
sendreq.Referer = "http://u.enorth.cn/console/articleEdit.do?action=addnew";
sendreq.ContentLength = message.Length;
sendreq.CookieContainer = cookies;
sendreq.Timeout = 100000;
sendreq.GetRequestStream().Write(message, 0, message.Length);
sendreq.GetRequestStream().Close();
HttpWebResponse response = (HttpWebResponse)sendreq.GetResponse();
cookies.Add(response.Cookies);
StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("GB2312"));
string text2 = sr2.ReadToEnd();
sendreq.Abort();
response.Close();得到的响应 text2 总是提示信息,写日志总不成功!
我继续测试发现他的主机域名有所改变,同样传送了那个jsessionid,但我在creat(url)请求时,照你说的方式把那个jseid加在后面传入也不行,期待你的解答!
2、模拟发送blog的方法如下:
由于不知道服务器上到底需要什么数据,首先可以肯定这是一个POST,既然是POST就应该把Form里面的表单项全部POST回去。
关于Cookie肯定保存了登录的相关信息,确定你获得的Cookie里面是否有这个信息,如果没有没关系,你可以模拟一个Cookie。
推荐你使用两个工具(Wireshark,ComView)来跟踪,对于HTTPs的可能看到的都是乱码,但是HTTP的都是明文,所以这个POST应该比前面的登陆要稍微简单些。
下面是我用ComView跟踪的内容:
0x0030 FF FF 70 5C 00 00 50 4F-53 54 20 68 74 74 70 3A p\..POST http:
0x0040 2F 2F 75 2E 65 6E 6F 72-74 68 2E 63 6E 2F 63 6F //u.enorth.cn/co
0x0050 6E 73 6F 6C 65 2F 61 72-74 69 63 6C 65 2E 64 6F nsole/article.do
0x0060 20 48 54 54 50 2F 31 2E-30 0D 0A 41 63 63 65 70 HTTP/1.0..Accep
0x0070 74 3A 20 69 6D 61 67 65-2F 67 69 66 2C 20 69 6D t: image/gif, im
0x0080 61 67 65 2F 78 2D 78 62-69 74 6D 61 70 2C 20 69 age/x-xbitmap, i
0x0090 6D 61 67 65 2F 6A 70 65-67 2C 20 69 6D 61 67 65 mage/jpeg, image
0x00A0 2F 70 6A 70 65 67 2C 20-61 70 70 6C 69 63 61 74 /pjpeg, applicat
0x00B0 69 6F 6E 2F 78 2D 73 68-6F 63 6B 77 61 76 65 2D ion/x-shockwave-
0x00C0 66 6C 61 73 68 2C 20 61-70 70 6C 69 63 61 74 69 flash, applicati
0x00D0 6F 6E 2F 78 2D 6D 73 2D-61 70 70 6C 69 63 61 74 on/x-ms-applicat
0x00E0 69 6F 6E 2C 20 61 70 70-6C 69 63 61 74 69 6F 6E ion, application
0x00F0 2F 78 2D 6D 73 2D 78 62-61 70 2C 20 61 70 70 6C /x-ms-xbap, appl
0x0100 69 63 61 74 69 6F 6E 2F-76 6E 64 2E 6D 73 2D 78 ication/vnd.ms-x
0x0110 70 73 64 6F 63 75 6D 65-6E 74 2C 20 61 70 70 6C psdocument, appl
0x0120 69 63 61 74 69 6F 6E 2F-78 61 6D 6C 2B 78 6D 6C ication/xaml+xml
0x0130 2C 20 2A 2F 2A 0D 0A 52-65 66 65 72 65 72 3A 20 , */*..Referer:
0x0140 68 74 74 70 3A 2F 2F 75-2E 65 6E 6F 72 74 68 2E http://u.enorth.
0x0150 63 6E 2F 63 6F 6E 73 6F-6C 65 2F 61 72 74 69 63 cn/console/artic
0x0160 6C 65 45 64 69 74 2E 64-6F 3B 6A 73 65 73 73 69 leEdit.do;jsessi
0x0170 6F 6E 69 64 3D 44 46 30-33 39 42 41 39 44 43 36 onid=DF039BA9DC6
0x0180 34 34 46 45 42 30 31 38-33 37 43 30 45 39 42 32 44FEB01837C0E9B2
0x0190 32 31 44 41 38 3F 61 63-74 69 6F 6E 3D 61 64 64 21DA8?action=add
0x01A0 6E 65 77 26 74 69 63 6B-65 74 3D 53 54 2D 31 39 new&ticket=ST-19
0x01B0 34 38 35 2D 73 63 71 6F-53 75 66 48 44 4C 42 62 485-scqoSufHDLBb
0x01C0 4B 74 35 4B 56 61 74 4D-2D 75 73 65 72 0D 0A 41 Kt5KVatM-user..A
0x01D0 63 63 65 70 74 2D 4C 61-6E 67 75 61 67 65 3A 20 ccept-Language:
0x01E0 7A 68 2D 63 6E 0D 0A 43-6F 6E 74 65 6E 74 2D 54 zh-cn..Content-T
0x01F0 79 70 65 3A 20 61 70 70-6C 69 63 61 74 69 6F 6E ype: application
0x0200 2F 78 2D 77 77 77 2D 66-6F 72 6D 2D 75 72 6C 65 /x-www-form-urle
0x0210 6E 63 6F 64 65 64 0D 0A-50 72 6F 78 79 2D 43 6F ncoded..Proxy-Co
0x0220 6E 6E 65 63 74 69 6F 6E-3A 20 4B 65 65 70 2D 41 nnection: Keep-A
0x0230 6C 69 76 65 0D 0A 55 73-65 72 2D 41 67 65 6E 74 live..User-Agent
0x0240 3A 20 4D 6F 7A 69 6C 6C-61 2F 34 2E 30 20 : Mozilla/4.0 这里有很多内容,其中包括Referer,Content-Type等等,你在模拟请求的时候这些信息最好都有。关键看下面:
x00E0 3A 20 6E 6F 2D 63 61 63-68 65 0D 0A 43 6F 6F 6B : no-cache..Cook
0x00F0 69 65 3A 20 4A 53 45 53-53 49 4F 4E 49 44 3D 44 ie: JSESSIONID=D
0x0100 46 30 33 39 42 41 39 44-43 36 34 34 46 45 42 30 F039BA9DC644FEB0
0x0110 31 38 33 37 43 30 45 39-42 32 32 31 44 41 38 0D 1837C0E9B221DA8.
这里有个JSESSIONID,这个服务器一定是需要的,你登录的时候已经有这个值了,这时候你可以构造一个Cookie一同发送到服务器上。下面是提交的表单内容:
0x0030 FF FF EE 23 00 00 61 72-74 69 63 6C 65 2E 74 69 ?..article.ti
0x0040 74 6C 65 3D 74 69 74 6C-65 26 61 72 74 69 63 6C tle=title&articl
0x0050 65 2E 65 78 74 50 72 6F-78 79 2E 61 74 74 44 61 e.extProxy.attDa
0x0060 74 61 25 32 38 63 6F 6E-74 65 6E 74 25 32 39 3D ta%28content%29=
0x0070 25 33 43 50 25 33 45 74-65 73 74 25 33 43 25 32 %3CP%3Etest%3C%2
0x0080 46 50 25 33 45 26 61 72-74 69 63 6C 65 2E 73 79 FP%3E&article.sy
0x0090 73 74 65 6D 54 79 70 65-49 64 3D 36 26 61 72 74 stemTypeId=6&art
0x00A0 69 63 6C 65 2E 63 61 74-65 67 6F 72 79 49 64 3D icle.categoryId=
0x00B0 36 35 39 38 34 39 26 63-61 74 65 67 6F 72 79 54 659849&categoryT
0x00C0 69 74 6C 65 3D 26 61 72-74 69 63 6C 65 2E 74 61 itle=&article.ta
0x00D0 67 3D 74 61 6F 62 61 6F-26 61 72 74 69 63 6C 65 g=taobao&article
0x00E0 2E 76 69 65 77 53 63 6F-70 65 3D 32 26 61 72 74 .viewScope=2&art
0x00F0 69 63 6C 65 2E 65 78 74-50 72 6F 78 79 2E 61 74 icle.extProxy.at
0x0100 74 44 61 74 61 25 32 38-64 69 67 65 73 74 25 32 tData%28digest%2
0x0110 39 3D 26 61 72 74 69 63-6C 65 2E 63 6F 6D 6D 65 9=&article.comme
0x0120 6E 74 53 63 6F 70 65 3D-32 26 61 63 74 69 6F 6E ntScope=2&action
0x0130 3D 61 64 64 6E 65 77 26-61 72 74 69 63 6C 65 2E =addnew&article.
0x0140 73 74 61 74 65 3D 31 26-61 72 74 69 63 6C 65 2E state=1&article.
0x0150 61 72 74 69 63 6C 65 49-64 3D 30 26 72 65 66 65 articleId=0&refe
0x0160 72 3D 6E 75 6C 6C 0D 0A- r=null..
另外需要申明的是,我只是针对此网友的问题做回答,只是出于学习和研究的目的,其他任何事情与我无关。按照上面的方法可以发送,现在里面有个test的blog就是我这么发送上去的,剩下的楼主自己搞定吧。
{
//直接确认,否则打不开
return true;
}
///<summary>
///采用https协议访问网络
///</summary>
///<param name="URL">url地址</param>
///<returns></returns>
public string GetWithHttps(string URL, out string jsid)
{
CookieContainer cookies = new CookieContainer();
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
HttpWebRequest logreq = (HttpWebRequest)WebRequest.Create(URL);
logreq.CookieContainer = new CookieContainer();
logreq.ServicePoint.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; logreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)";
//模拟一个UserAgent
logreq.CookieContainer = cookies;
logreq.Method = "GET";
// logreq.AllowAutoRedirect = true;
logreq.KeepAlive = true;
logreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*";
logreq.Referer = "https://secure.enorth.cn/user/login";
logreq.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse response = (HttpWebResponse)logreq.GetResponse();
cookies.Add(response.Cookies);
StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string str = sr2.ReadToEnd();
string formhash = "";
string formhashflag = "";
int i;
int j; try
{
formhashflag = "<input type=\"hidden\" name=\"lt\" value=\"";
i = str.IndexOf(formhashflag) + formhashflag.Length;
j = str.IndexOf("\"", i);
formhash = str.Substring(i, j - i);
jsid = str.Substring(str.IndexOf("jsessionid=") + 11, 32);
return formhash; }
catch (Exception exception)
{
Console.Write(exception.StackTrace);
jsid = "";
return "未能获取formhash值,请打开网页源码查看!";
}
response.Close();
logreq.Abort();
} /// <summary>
/// 登录
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
public CookieContainer login(string username, string password)
{
CookieContainer cookies = new CookieContainer();
string url;
url = "https://secure.enorth.cn/user/login";
string formhash = GetWithHttps(url, out jsid);
string strPostdata = "username=" + username + "&password=" + password + "<=" + formhash + "&_eventId=submit&submit_chgByZs.x=0&submit_chgByZs.y=0";
url = url + ";jsessionid=" + jsid;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = cookies;
request.Method = "POST";
request.AllowAutoRedirect = true;
request.KeepAlive = true;
request.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*";
request.Referer = "https://secure.enorth.cn/user/login";
request.ContentType = "application/x-www-form-urlencoded";
byte[] buffer = Encoding.UTF8.GetBytes(strPostdata);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string str = reader.ReadToEnd(); //模拟一个jsessionid请求 cookie
Cookie cookie = new Cookie("JSESSIONID", jsid, "/", "u.enorth.cn");
response.Cookies.Add(cookie);
cookies.Add(response.Cookies);
response.Close();
request.Abort();
return cookies;
}发文 string user = username.Text;
string pwd = password.Text;
CookieContainer cookies = login(user, pwd);
// 以下是在北方博客网 发布文章
HttpWebRequest sendreq = (HttpWebRequest)WebRequest.Create("http://u.enorth.cn/console/article.do" );
string publishstr = "article.title=" + blogtitle + "&article.extProxy.attData%28content%29=" + blogbody + "&article.systemTypeId=63&article.categoryId=659849&categoryTitle=&article.tag=&article.viewScope=2&article.extProxy.attData%28digest%29=&article.commentScope=2&action=addnew&article.state=1&article.articleId=0&refer="; byte[] message = Encoding.GetEncoding("GB2312").GetBytes(publishstr);
sendreq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)";
sendreq.ServicePoint.Expect100Continue = false;
// sendreq.Credentials = CredentialCache.DefaultCredentials;
//ServicePointManager.Expect100Continue = false;
//模拟一个UserAgent
sendreq.AllowAutoRedirect =false;
sendreq.KeepAlive = true;
sendreq.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*";
sendreq.ContentType = "application/x-www-form-urlencoded";
sendreq.Method = "POST";
sendreq.Referer = "http://u.enorth.cn/console/articleEdit.do?action=addnew";
sendreq.ContentLength = message.Length;
sendreq.CookieContainer = cookies;
sendreq.Timeout = 100000;
sendreq.GetRequestStream().Write(message, 0, message.Length);
sendreq.GetRequestStream().Close();
HttpWebResponse response = (HttpWebResponse)sendreq.GetResponse();
cookies.Add(response.Cookies); StreamReader sr2 = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("GB2312"));
string text2 = sr2.ReadToEnd();
sendreq.Abort();
response.Close();
GET: https://secure.enorth.cn/user/login -- 这里产生第一个Jsessionid,下一个请求会使用
POST:https://secure.enorth.cn/user/login;jsessionid=第一个Jsessionid,同时产生两个Cookie项,CASPRIVACY,CASTGC(这是一个客户端票)
到这里登录完成,开始重定向
GET :http://u.enorth.cn/ -- 这里会获得第二个JSESSIONID
GET :http://u.enorth.cn/console -- 这里是重定向到我的首页到此从登录到打开首页就完成了。至于你说的发帖子,其实也是一样的道理,你的代码已经实现了90%了,继续努力吧。特别注意请求时Cookie项一定要正确,并且注意那个jsessionid。此贴到这为止吧,不再回复了。