新手学习POST登陆发帖等操作
看不懂英语,但我喜欢编码实现自己想要的功能。目前只是学了基本的数据库的操作,所以对POST这方面不太理解,据说学了http协议和js就懂了POST了,望大牛们给予提示。
网上找到了部分教程,能本地discuz论坛实现POST登陆了,但是关于这方面的教程太少了,求大牛们赏点这方面的源码,网上没找到,感谢了!!
根据教程 写了个 HttpHeiper 实现了登陆了 下图 另附上源码分享
源码大概根据提示也能看懂啥意思,只是登陆后如何执行发帖以及一些别的操作不太明白
现在的问题:
1、在网上说 PSOT之后服务器会返还一个特征码,根据特征码来判断在一段时间内是否登陆,这个特征码如何提取用get吗?
2、post发帖是 特征码+操作还是?
// httpHelPer类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace HttpHelper封装
{
public class HttpPara
{
public string Referer { get; set; }
public string Accept { get; set; }
public string ContentType { get; set; }
public string UserAgent { get; set; }
}
public class HttpHelper
{
/// <summary>Get方法
/// GetHtml方法
/// </summary>
/// <param name="url">网址</param>
/// <param name="httppara">传入的协议头</param>
/// <param name="encoding">编码</param>
/// <returns></returns>
public string GetHtml(string url,HttpPara httpparas,Encoding encoding)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url));
req.Method = "GET";
req.Referer = httpparas.Referer;
req.Accept = httpparas.Accept;
req.ContentType = httpparas.ContentType;
req.UserAgent = httpparas.UserAgent;
//使用压缩传输
req.Headers.Add("Accept-Encoding", "gzip,deflate");
//获取响应
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
//获得响应的流
Stream stream = res.GetResponseStream();
//流读取器
StreamReader reader = new StreamReader(stream,encoding);
//得到数据
string result = reader.ReadToEnd();
//关闭连接并释放
reader.Close();
reader.Dispose();
stream.Close();
stream.Dispose();
res.Close();
req.Abort();
return result;
}
/// <summary>POST方法
/// POST方法
/// </summary>
/// <param name="url">网址</param>
/// <param name="psotData">POST数据</param>
/// <param name="httpparas">传入的协议头</param>
/// <param name="encoding">编码</param>
/// <returns></returns>
public string PostHtml(string url,string psotData, HttpPara httpparas, Encoding encoding)
{
//处理即将POST的数据
byte[] bt = encoding.GetBytes(psotData);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url));
req.Method = "POST";
req.Referer = httpparas.Referer;
req.Accept = httpparas.Accept;
req.ContentType = httpparas.ContentType;
req.UserAgent = httpparas.UserAgent;
//把POST数据写入流
Stream streamReq = req.GetRequestStream();
//发送
streamReq.Write(bt,0,bt.Length);
//关闭流
streamReq.Close();
//获取响应
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
//获取响应体的流
Stream streamRes = res.GetResponseStream();
//流读取器
StreamReader reader = (StreamReader) new StreamReader(streamRes, encoding);
string result = reader.ReadToEnd();
reader.Close();
reader.Dispose();
streamReq.Dispose();
res.Close();
req.Abort();
return result;
}
}
}
//主程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace HttpHelper封装
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnGET_Click(object sender, EventArgs e)
{
HttpPara httpparas = new HttpPara();
httpparas.Accept = "application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-xpsdocument, */*";
httpparas.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
HttpHelper helper= new HttpHelper();
txtResult.Text = helper.GetHtml(txtUrl.Text.Trim(),httpparas,Encoding.UTF8);
}
private void btnLogein_Click(object sender, EventArgs e)
{
HttpPara paras = new HttpPara();
paras.Accept = "application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-xpsdocument, */*";
paras.ContentType = "application/x-www-form-urlencoded";
paras.Referer = txtBbsUrl.Text.Trim();
paras.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
//POST地址
string url = "http://127.0.0.1/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1";
//POST登录参数
string postData = string.Format( "fastloginfield=username&username={0}&password={1}&quickforward=yes&handlekey=ls",txtUserName.Text.Trim(),txtPassWord.Text.Trim());
HttpHelper helper = new HttpHelper();
txtResultDz.Text= helper.PostHtml(url, postData, paras, Encoding.GetEncoding("GBK"));
}
}
}
--------------------编程问答-------------------- Stream s = Resp.GetResponseStream(); --------------------编程问答-------------------- 用fiddler抓取浏览器的post数据,然后照着模仿。 --------------------编程问答-------------------- 哦 好 去看看西安 --------------------编程问答-------------------- 特征码???你说的时sessionId吧。。。。。。
对于一个浏览器会话,服务器会创建一个唯一的sessionId,这个sessionid会在请求、回复的过程中一直存在,服务器就依靠这个来识别一个客户端,通常的登录都是在sesisonId对应的区域存放一个标志,表示该会话已登录。
session失效时id也不存在,则浏览器认为是未登录。失效方式有服务器设置20分钟超时(没请求1次刷新这个时间为20分钟),浏览器关闭(session存在于服务器,只是已经为无主session,任何其他浏览器都访问不了),代码中消除session(通常的退出登录)。
sessionid不光大多数情况是cookie的形式,如果cookie被禁用则会改为url参数形式来传递这个身份证。
综上,你要判断是否登录,方法就是post一个需要登录的页面,如果没登录返回的html必定为登录页面,如果已经登录返回的html则为要访问的目标页面。
以上纯手工,原创! --------------------编程问答--------------------
非常感谢 现在C#的水平还在入门阶段,不知道应该怎么学习,学习哪方面的。能否传授下学习流程或源码研究下,个人比较喜欢桌面软件,wen应用程序其次 --------------------编程问答--------------------
c#做客户端我个人认为是比较小众的,大众的是c++(不过难度相对较高),但是作为学习编程,c#做客户端又非常合适,其简洁易懂的代码,而且因为web的原因,用户群大,网上资料齐备。
学习流程:第一个是把语法基础好好的学学,第二个是不停的编写代码,例如模仿某个成熟的软件,或者经常做些自己需要的工具(比如我发现公司oa登录比较麻烦,我做个小程序自动登录,公司签到麻烦,我做个小程序来自动签到,又或者网上很多时候复制的源码每行代码前面都会有个数字代表行数,我一个一个的删除麻烦,我写个程序来自动去掉每行代码前面的数字,公司系统有很多业务术语,太多我记不住,我写个词典工具,来记录这些数据,更加方便我查询等等)
总结:扎实的基础+丰富的实践=长年累月的经验累积 --------------------编程问答--------------------
你就是想说使用c#的只有业余人员吧?
那么我觉得你应该从此扔掉c#,离开这个论坛,以免跟我们这些业余开发人员一样受到某种程度的玷污。 --------------------编程问答--------------------
个人始终认为c#做客户端不合适,资源占用偏高。欢迎大神拍钻,接受你的批评意见,你可以有不同的看法,但就算我说的是错误的,也请你尊重我的观点,不是每一个人都可以和你一样高水平,如果这样csdn论坛不会有这么大量的帖子。 --------------------编程问答--------------------
还有,大神,小众 not equal 业余
--------------------编程问答--------------------
还有,大神,小众 not equal 业余
谢谢啦,
我就是属于业余研究,基本语法都知道了。
补充:.NET技术 , C#