最近在编一个通过代理实现网页模拟点击和POST的Internet程序
2005-08-17 23:01
656 查看
初步的思想是想用socket来实现网页的模拟点击和表单的POST
至于有什么用这个就很难讲了,大家可以做一个基于WEB的邮箱客户端,也可以做一个半自动的申请器,当然也可以用到别的地方去,但是现在我现在实在没有时间来完成它,原因很简单,因为我今年大四,接下来要参加全国软件水平的软件设计师考试,郁闷,上次下午过了,上午还差一点。还要完成一个毕业设计,是一个基于NDIS的网络数据监测控制软件,这个头有点大了,还没着手,准备就快要开始了,自己给自己一个最后的期限就是明天开始。还有CET-6和教师资格证,晕啊,时间不够了!
现面来说点自己这几天编程的经验。在CSDN中看到有位高人说这个网络程序可以用很多方法来做,我也试过用WININET,但是感觉以后自己来驾驭它会很困难,越是底层的东西就越好控制,当然还有很多可以用的技术,比如WINHTTP,或者COM,但是我没这么好的基础,慢慢学嘛,所以我就采用了socket来实现。有经验的程序员肯定不会有很大的问题,不过我也还是初学者,所以当然走了很多很多的弯路,用了很多很多的时间来整理各种各样的资料。呵呵,有点跑题了,不说这个了..
我发现使用网络数据截获软件可以很方便的观察数据包的收发过程,连一个CONNECT函数都有相应的状态数据包,具体研究如下:
首先,我建立一个SOCKET,然后,使用一个CONNECT,连接到代理服务器及其端口上,当然前提是你的代理服务器支持CONNECT(大部分HTTP代理可以支持CONNECT),成功后服务器返回一个确认信号,这个信号中包含了第二次握手信息,请求我的机器的确认,于是我的机器就给它一个确认的信号。这样两次握手完成,建立了一个基于TCP的连接。
看图:
step1 Source IP =====> Destination IP SYN: 1 (请求连接标志)
step2 Source IP <===== Destination IP ACK: 1 (连接确认标志) SYN: 1 (再次请求连接标志)
step3 Source IP =====> Destination IP ACK: 1 (连接确认标志)
有连接就好了,这样就可以想代理服务器IP发送数据包了,不熟悉HTTP协议的朋友请去看看相关的RFC1945,英文不好的也可以去看中文的RFC,给出链接如下:点击http://www.leepig.com/rfc/RFC1945.txt。
具体的我不多说了,来看看怎么构造HTTP头文件吧。现面给出一个例子。
Version: HTTP/1.0
Method: GET
URI: http://www.163.com/
Accept: */*
Accept-Language: zh-cn
Cookie: ******
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)
Host: www.163.com
Proxy-Connection: Keep-Alive
使用建立好的SOCKET函数发送这个头文件这样就可以向代理服务器请求www.163.com的页面了。但是在程序中怎么发送呢?看了RFC文档的就没问题了,如果还不明白,那我只好说一点了,不说具体的方法,说点实质的东西。
发送括号里的内容给代理服务器 (GET http://www.163.com/ HTTP/1.0 /r/nAccept: */*/r/nAccept-Language: zh-cn/r/nCookie: ******/r/nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)/r/nHost: www.163.com/r/nProxy-Connection: Keep-Alive/r/n/r/n)
这里有特别注意的几点,也是我的失败的经验:******就是这个网站建立的COOKIE,大家可以到系统盘符下面去查看,当然也可以有别的办法获得。网站请求的URL必须要以“/”结尾,不然得不到这个网址得HTML代码,特别注意,换行符使用“/r/n”,最后一定要有两个“/r/n”,不然也会发生错误的。
如果没有别的问题这样就可以了,应该能用RECEIVE函数来获得返回的HTTP头文件和HTML代码了,不过这样不是很完美,如果你要最完美的获得所有的内容,就要完全的模拟浏览器来获得所有的图片的连接,那么呵呵就要这么做,分析获得的HTML代码,在获得的代码中如果有超链接标志的,那么就把这个超链接获得出来,再建立一个SOCKET来发送一个类似于上面描述的HTTP头到代理服务器,就这样每碰到一个就发送一个SESSION,这才是真正的模拟,呵呵。
可惜现在很多人都不肯说,大家忙嘛,没办法,可是这个不是理由,关键是你想不想帮别人,我会不断发我的经验的,要相关资料的朋友请发送EMAIL到rikzjy@gmail.com,我很乐意帮助你们做你们的朋友,最后祝大家愉快!
至于有什么用这个就很难讲了,大家可以做一个基于WEB的邮箱客户端,也可以做一个半自动的申请器,当然也可以用到别的地方去,但是现在我现在实在没有时间来完成它,原因很简单,因为我今年大四,接下来要参加全国软件水平的软件设计师考试,郁闷,上次下午过了,上午还差一点。还要完成一个毕业设计,是一个基于NDIS的网络数据监测控制软件,这个头有点大了,还没着手,准备就快要开始了,自己给自己一个最后的期限就是明天开始。还有CET-6和教师资格证,晕啊,时间不够了!
现面来说点自己这几天编程的经验。在CSDN中看到有位高人说这个网络程序可以用很多方法来做,我也试过用WININET,但是感觉以后自己来驾驭它会很困难,越是底层的东西就越好控制,当然还有很多可以用的技术,比如WINHTTP,或者COM,但是我没这么好的基础,慢慢学嘛,所以我就采用了socket来实现。有经验的程序员肯定不会有很大的问题,不过我也还是初学者,所以当然走了很多很多的弯路,用了很多很多的时间来整理各种各样的资料。呵呵,有点跑题了,不说这个了..
我发现使用网络数据截获软件可以很方便的观察数据包的收发过程,连一个CONNECT函数都有相应的状态数据包,具体研究如下:
首先,我建立一个SOCKET,然后,使用一个CONNECT,连接到代理服务器及其端口上,当然前提是你的代理服务器支持CONNECT(大部分HTTP代理可以支持CONNECT),成功后服务器返回一个确认信号,这个信号中包含了第二次握手信息,请求我的机器的确认,于是我的机器就给它一个确认的信号。这样两次握手完成,建立了一个基于TCP的连接。
看图:
step1 Source IP =====> Destination IP SYN: 1 (请求连接标志)
step2 Source IP <===== Destination IP ACK: 1 (连接确认标志) SYN: 1 (再次请求连接标志)
step3 Source IP =====> Destination IP ACK: 1 (连接确认标志)
有连接就好了,这样就可以想代理服务器IP发送数据包了,不熟悉HTTP协议的朋友请去看看相关的RFC1945,英文不好的也可以去看中文的RFC,给出链接如下:点击http://www.leepig.com/rfc/RFC1945.txt。
具体的我不多说了,来看看怎么构造HTTP头文件吧。现面给出一个例子。
Version: HTTP/1.0
Method: GET
URI: http://www.163.com/
Accept: */*
Accept-Language: zh-cn
Cookie: ******
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)
Host: www.163.com
Proxy-Connection: Keep-Alive
使用建立好的SOCKET函数发送这个头文件这样就可以向代理服务器请求www.163.com的页面了。但是在程序中怎么发送呢?看了RFC文档的就没问题了,如果还不明白,那我只好说一点了,不说具体的方法,说点实质的东西。
发送括号里的内容给代理服务器 (GET http://www.163.com/ HTTP/1.0 /r/nAccept: */*/r/nAccept-Language: zh-cn/r/nCookie: ******/r/nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)/r/nHost: www.163.com/r/nProxy-Connection: Keep-Alive/r/n/r/n)
这里有特别注意的几点,也是我的失败的经验:******就是这个网站建立的COOKIE,大家可以到系统盘符下面去查看,当然也可以有别的办法获得。网站请求的URL必须要以“/”结尾,不然得不到这个网址得HTML代码,特别注意,换行符使用“/r/n”,最后一定要有两个“/r/n”,不然也会发生错误的。
如果没有别的问题这样就可以了,应该能用RECEIVE函数来获得返回的HTTP头文件和HTML代码了,不过这样不是很完美,如果你要最完美的获得所有的内容,就要完全的模拟浏览器来获得所有的图片的连接,那么呵呵就要这么做,分析获得的HTML代码,在获得的代码中如果有超链接标志的,那么就把这个超链接获得出来,再建立一个SOCKET来发送一个类似于上面描述的HTTP头到代理服务器,就这样每碰到一个就发送一个SESSION,这才是真正的模拟,呵呵。
可惜现在很多人都不肯说,大家忙嘛,没办法,可是这个不是理由,关键是你想不想帮别人,我会不断发我的经验的,要相关资料的朋友请发送EMAIL到rikzjy@gmail.com,我很乐意帮助你们做你们的朋友,最后祝大家愉快!
相关文章推荐
- asp.net 读取一个文本文件,并输出到网页显示 通过 一般处理程序实现
- Zookeeper实践之:通过Zookeeper实现一个消费者进程分配程序
- Xcode里通过代码实现一个窗口程序
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- php动态网页实现页面静态化 通过在初次被访问时生成html文件保存起来,下次该PHP程序被访问时就直接找到以前被访问过的html页面
- 用程序来控制一个网页,实现自己主动输入等操作
- 基于CentOS 7系统的两部LAMP服务器,通过NFS共享同一个php网页的实现
- 夺命雷公狗jquery---56通过ajax高级实现模拟post请求
- 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。 要求实现函
- 在事件触发的时候,有时我们需要一些模拟用户行为的操作。例如:当网页加载完毕后 自行点击一个按钮触发一个事件,而不是用户去点击。
- SVM实现多分类的程序基础工作(二)——通过一个简单libsvm例子迈入libsvm学习的大门
- java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例
- 一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成.请用c#语言编写主要程序来实现
- 实现在自己的程序中点击一个按钮,然后弹出系统自带的联系人
- 用程序来控制一个网页,实现自动输入等操作
- 如何实现用Java编写程序,设计一个模拟电梯运行的类
- AutoIT模拟实现一个简单的供销存的程序
- JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
- Python实现一个简易的网页抓取程序
- 利用WebRequest来实现模拟浏览器通过Post方式向服务器提交数据