开篇之需求分析
这一段时间开心、校内这一类SNS网站相当的红火,我想大家或多或少的会有几个帐号,这些网站最吸引人的其实是一些在线的小游戏,比如说开心农场,有不少同志为了偷别人的菜可谓是起早贪黑,这样的境界估计“杨叫兽”找上你也不远了,但是看着朋友们拥有大把的“现金”大套的“住房”,又老在你面前炫耀,有没有什么两全齐美的办法呢,又不占用你的时间,又保证你的收成?有,现在网上已经有好多自动化的工具,说白了就是“外挂”,想不到这也一个小小的应用也会有外挂出现,看来,有这样需求的人还不少。做为码代码的我们用别人的外挂,总有点不放心,这玩意儿要输入帐号密码的,开心网还好一点,这个帐号也没有太重要的地方,但是QQ农场的就不一样了,用的是你的QQ号,密码万一人家留个小后门的,你的帐号就和你88了。
题外话:
本来两天前就准备好写这一系列的文章,但是就再前天下载了一款叫做《植物大战僵尸》的小游戏,没想到我就沉迷了,两天时间什么也没干,坐在电脑前就是玩这个游戏,兴好今天终于自拔出来了,每天本来就只有9点以后这点时间能碰回儿电脑,全耗游戏上了,正经事都没有干,如果再继续下去真的也要送去电击一下了,这也是我至今也有没有碰网络游戏的原因之一。所以也奉劝还在沉迷的兄弟们,出来吧, 不然“扬叫兽”就要找上你了,电脑还可以有很多其它用途的。
开篇之需求分析
这一段时间开心、校内这一类SNS网站相当的红火,我想大家或多或少的会有几个帐号,这些网站最吸引人的其实是一些在线的小游戏,比如说开心农场,有不少同志为了偷别人的菜可谓是起早贪黑,这样的境界估计“杨叫兽”找上你也不远了,但是看着朋友们拥有大把的“现金”大套的“住房”,又老在你面前炫耀,有没有什么两全齐美的办法呢,又不占用你的时间,又保证你的收成?有,现在网上已经有好多自动化的工具,说白了就是“外挂”,想不到这也一个小小的应用也会有外挂出现,看来,有这样需求的人还不少。做为码代码的我们用别人的外挂,总有点不放心,这玩意儿要输入帐号密码的,开心网还好一点,这个帐号也没有太重要的地方,但是QQ农场的就不一样了,用的是你的QQ号,密码万一人家留个小后门的,你的帐号就和你88了。
自已动手丰衣足食,自己写一个吧, 就当自己给自己练手了,要写这样的东西,现要明白他的原理,打开开心农场我们会发现,展示给我们的就是一个flash应用,说白了就是用来显示的,所有的操作都是通过和服务器的交互来实现的,我们先要搞清楚,到底它和服务器交互了些什么东西,然后用我的程序来模拟它。
为了分析我们到你向服务器发送了什么,服务器又返回什么了,我下载了fiddler 一个小巧好用的http debug 工具,启动它后,它可以截获你所有的web request 和服务器的response的信息。
我们登录开心网,然后切换到fiddler在左边的Web sessions列表中就可以看到类似以下的信息,
%60%25HB_thumb.jpg)
我们选中其中的一行在右边就可以看到这一次请求的所有详细信息
![J6%$48XN]F68PS9M[1$048N J6%$48XN]F68PS9M[1$048N](https://images.cnblogs.com/cnblogs_com/9527/WindowsLiveWriter/e45da228e899_13C97/J6%25$48XN%5DF68PS9M%5B1$048N_thumb.jpg)
我们看到登录的过程其实就是用POST 方法和服务器/login/login.php这个URL提交了一些信息,换到“textview”标签页,我们会看到,类似
url=%2Fhome%2F&email=cctv5cn@gmail.com&password=111111
这就是POST上去的数据,如果以get 方法提交数据
收获:GET /!house/!garden/havest.php?verify=22842320%5F1062%5F22842320%5F1245934796%5Fb2a24c5dfb54cbeb1498d95d42b820a4&seedid=0&farmnum=13&fuid=0&r=0%2E24021180626004934 HTTP/1.1
这是在开心网上收获作物的时提交的数据。
我们的程序要做的就是,用程序直接向服务器提交这些数据,然后接收其返回的信息,然后,更据这些信息,判读想应的操作。原理就是这样。
用C#来实现数据的提交并接受其返回
用HTTP方法来向服务器提交数据,我们就要用到HttpWebRequest 和 HttpWebResponse这两个类,如果不了解其用法,打开msdn吧,详细自己来,我就简单介绍一下,看字面意思也可以知道HttpWebRequest用来发送请求,HttpWebResponse用来接受返回的数据,我就写用这一来模拟定下整个登录过程吧。

Code
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
6
using System.Net;
7
using System.Net.Cache;
8
using System.IO;
9
10
11
namespace kaixin
12

{
13
/**//// <summary>
14
/// 我的一个简单的HttpHelper类,现在还没有全部完善,我们随着程序的深入
15
/// 逐步完善它,但就开始阶段它足够用了。
16
/// </summary>
17
public class HttpHelper
18
{
19
protected CookieContainer cookies;
20
public HttpHelper()
21
{
22
cookies = new CookieContainer();
23
}
24
25
/**//// <summary>
26
///
27
/// </summary>
28
/// <param name="url"></param>
29
/// <returns></returns>
30
public Stream RequestByGetStream(string url)
31
{
32
HttpWebRequest request = CustomRequest(url, "GET");
33
if (request != null)
34
{
35
try
36
{
37
38
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
39
40
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8, true);
41
//string renvalue = reader.ReadToEnd();
42
43
44
response.Close();
45
reader.Close();
46
return reader.BaseStream;
47
}
48
catch (WebException ex)
49
{
50
Log.LogOut(ex.Message);
51
return null;
52
}
53
}
54
else
55
{
56
return null;
57
}
58
59
}
60
61
/**//// <summary>
62
/// 获得通过Get方法返回的数据
63
/// </summary>
64
/// <param name="url">请求的网址</param>
65
/// <returns></returns>
66
public string RequestByGet(string url)
67
{
68
HttpWebRequest request=CustomRequest(url,"GET");
69
if (request != null)
70
{
71
try
72
{
73
74
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
75
/**////把返回的数据读入到一个StreamReader对象
76
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8, true);
77
/**////把StreamReader中的数据转化为一个string对象
78
string renvalue = reader.ReadToEnd();
79
80
81
response.Close();
82
reader.Close();
83
return renvalue;
84
}
85
catch (WebException ex)
86
{
87
Log.LogOut(ex.Message);
88
return "err";
89
}
90
}
91
else
92
{
93
return "err";
94
}
95
96
}
97
98
/**//// <summary>
99
/// 得到POST方法返回的数据
100
/// </summary>
101
/// <param name="Url">请求的网址</param>
102
/// <param name="PostUrl">post的数据</param>
103
/// <returns></returns>
104
public string RequestByPost(string Url, string PostUrl)
105
{
106
HttpWebRequest request = CustomRequest(Url, "POST");
107
if (request != null)
108
{
109
try
110
{
111
/**////POST方法提交数据
112
byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(PostUrl);
113
request.ContentLength = bytes.Length;
114
115
Stream requestStream = request.GetRequestStream();
116
requestStream.Write(bytes, 0, bytes.Length);
117
requestStream.Close();
118
119
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
120
121
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8, true);
122
string renvalue = reader.ReadToEnd();
123
124
response.Close();
125
reader.Close();
126
127
return renvalue;
128
}
129
catch(WebException ex)
130
{
131
Log.LogOut(ex.Message);
132
return "err";
133
}
134
135
}
136
else
137
{
138
return "err";
139
}
140
141
142
}
143
/**//// <summary>
144
/// 创建一个request对象,因为根据数据提交方式的不同,在获得返回的操作稍有差别,但是创建Request的
145
/// 过程还是一样的,所以单独写在一个方法呢
146
/// </summary>
147
/// <param name="url"></param>
148
/// <param name="method"></param>
149
/// <returns></returns>
150
public HttpWebRequest CustomRequest(string url,string method)
151
{
152
try
153
{
154
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
155
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)";
156
request.Method = method;
157
request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
158
request.KeepAlive = true;
159
request.ContentType = "application/x-www-form-urlencoded";
160
request.CookieContainer = this.cookies;
161
162
HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
163
request.CachePolicy = policy;
164
165
return request;
166
}
167
catch (WebException err)
168
{
169
Log.LogText = err.ToString();
170
return null;
171
}
172
}
173
174
}
175
}
176
这是我简单封装的一个httphelper相当简单,我们要登录的代码就可以这样写
展开
折叠
public bool ChkLogin(string username,string password)
{
//请求的URL
string loginurl = "http://www.kaixin001.com/login/login.php";
//POST的数据
string PostValue = string.Format("url=%2Fhome%2F&email={0}&password={1}", username, password);
//发送请求并获得服务器返回的字符串
string str = myrequest.RequestByPost(loginurl, PostValue);
if (str != "err")
{
//在字符串在查找用于判断是否成功等录的标识
if (str.IndexOf("我的首页") >= 0)
{
Log.LogOut(string.Format("{0}登录成功", username));
IfLogined = true;
return true;
}
else
{
Log.LogOut("用户名密码错误!!");
return false;
}
}
else
{
Log.LogText = "登录失败,请重试!!";
return false;
}
}
注:myrequest是我在类中已经实例化了的httphelper类
今天就到这里吧, 我们了解了编写开心网外挂需要的工具,和最基本的要用到的C#类库。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?