共享软件这个词,现在彷佛离咱们已经愈来愈遥远了。还有人记得超级兔子吗?还有人知道netants吗?这些辉煌一时的明星,已逐渐消失在人们的视野中。今天已是免费软件的世界。互联网行业的巨头们,打造的免费模式,给共享软件敲响了丧钟。html
共享软件,曾经寄托了多少程序员们创业致富的梦想。我也曾加入共享软件的大潮中,开发过差很少近十个共享软件,最后它们大都灰飞烟灭了,但其中三次经历,仍是给个人程序员生涯留下了难以磨灭的记忆。程序员
本人拙做《程序员第二步-从程序员到项目经理》已经到货,当当网、京东网、天猫商城都可购买,谢谢各位园友们的长期大力支持!算法
第二篇:淘宝发布大王-我赚到了十万块安全
1、淘宝发布大王的来世此生
我开发的第二款让我难忘的共享软件是淘宝发布大王。服务器
这是一款比隐藏专家还要简单的软件,这个软件是针对淘宝卖家的,它的功能很简单,就是每隔一段时间,就把卖家店里的下架的宝贝自动上架。cookie
这个软件最早是给我老婆本身用的。她在淘宝上开了一个网店卖银饰,商品有四五百件。当时淘宝尚未自动上架功能,卖家的商品在一个周期内(好像是7天)没有卖出去,就会自动下架。你要想再上架从新卖,必需要手动操做,找到没有卖出的宝贝,选中它,而后点击上架。四五百件商品,就是说天天要从新上架六七十件,这实在是一件很繁琐、枯燥的工做。因而淘宝发布大王就应运而生了。app
咱们本身用了以后,以为确实很方便,不再用每过一段时间就要跑到电脑前面上架宝贝了,软件开在那里,基本上什么不用管,比之前省事多了。后来咱们想,既然有用,别的卖家确定也须要,因而咱们把软件挂出来卖,70块钱一台机(绑定网卡),没想到反响不错,没过几天,卖软件的销售利润就比老婆卖银饰赚的还要多。ide
当咱们卖这款软件时,市面上根本没有竞争对手,只此一家,别无分店。但是一个多月后,出现了许多模仿者,它们中一些,在销量上可能还超过了淘宝发布大王。即便如此,淘宝发布大王的销量也仍是能够的,差很少天天能卖十来个受权,这对于当时的我来讲,实在是一笔不菲的收入。大概是因为用的人愈来愈多,引发了淘宝网的注意,他们还曾派人电话采访了我,说要写一篇采访稿,记录淘宝网二次开发人员的创业状况,惋惜的是,我一直没有见到那篇文章。函数
更惋惜的是,好景不长。这个软件还没卖上一年,淘宝网就推出了宝贝自动上架功能,淘宝发布大王再也没有用开之地了,它天然的消失,个人致富梦也戛然而止。工具
最后统计了一下,这个软件卖了超过十万元。提及来很少,但对于当时拿着几千元月薪的我来讲,已是一笔不小的数字了。靠着这笔钱,我终于拥有了属于本身的房子,开始了幸福的房奴生活。几年后,广州房价飙升,如今再次回想起来,能够说淘宝发布大王从必定程度上改变了个人人生轨迹。

二.关键技术
下面谈一谈技术吧。
1.运行过程
淘宝发布大王基于.net 1.1开发,在技术上并无什么特别的难度,其核心过程有三步:
(1)采用HttpWebRequest类,将用户名、密码等信息构形成post数据,发送过淘宝网登陆页面。收到返回信息后,记录下cookie。经过携带cookie信息,保持HttpWebRequest的登陆状态。
(2)HttpWebRequest再get待上架宝贝页面,解析页面html,得到的宝贝ID集合。
(3)将宝贝ID列表、上架操做指令构形成post数据,发送到待上架宝贝页面,上架成功。
可见,最核心的就是采用HttpWebRequest类来与服务器交互,代码以下:
private
static
bool
PostData (
string
url,
string
postData,
ref
string
result)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = m_CookieContainer;
request.Method =
"
POST
";
request.ContentType=
"
application/x-www-form-urlencoded
";
byte[] byte1=Encoding.Default.GetBytes(postData);
//
最终编码后要上传的数据
request.Timeout =
20000;
request.ContentLength = postData.Length;
Stream writeStream = request.GetRequestStream();
writeStream.Write(byte1,
0,postData.Length);
writeStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream stream = response.GetResponseStream();
StreamReader reader =
new StreamReader(stream,System.Text.Encoding.Default);
result = reader.ReadToEnd();
stream.Close();
reader.Close();
response.Close();
}
else
{
result =
"";
return
false;
}
return
true;
}
catch(Exception ex)
{
WriteLog(ex.Message);
return
false;
}
}
2.软件注册算法
淘宝发布大王在受权方面使用了非对称加密算法,私钥用于生成注册码,只在我本身的电脑上运行;公钥用于验证注册码,在用户的电脑上运行。
注册码验证采用RSACryptoServiceProvider类提供的VerifyData方法便可,代码以下。
public
static
bool
Verify(
byte
[]digestInput,
byte
[] signed)
{
try
{
RSACryptoServiceProvider RSAalg =
new RSACryptoServiceProvider();
RSAalg.ImportParameters(GetParam());
return RSAalg.VerifyData(digestInput,
typeof(SHA1CryptoServiceProvider),signed);
}
catch
{
return
false;
}
}
private
static RSAParameters GetParam()
{
//
用公钥验证
RSAParameters param =
new RSAParameters();
param.Exponent = Convert.FromBase64String(
"
AQAB
");
param.Modulus = Convert.FromBase64String(
"
55/Jb2IaIoEkgiDHWaHVRnsLivGYtNO/N6I+2P9qh12cm5vvZFk0/7EpuT1PiqruquJ/jbrp3dDDHZeT9xVi1uQ2HQDEcPBnX6FWowTqBHFHG9O00wLy3pCfmKpIRqD4ZRRKhcdtVnKndSTjp6Qrv5vbxWX6+mO9Mz6qF6k+JDc=
");
return param;
}
采用非对称加密算法的好处就是,即便你破解了个人软件,拿到公钥,你也没办法生成注册码,从而比较好的保证软件的安全性。
3.网卡真实的物理地址获取
网卡macid能够经过.net提供的WMI类库来实现,然而它获取的网卡地址只是写在注册表中的地址。这种地址是能够经过软件工具修改的。若是用户经过第三方软件修改了mac地址,WMI就是没法获取真实的网卡地址了。
那有什么办法能够获取网卡的真实的特理地址呢?有,那就要用到Windows API函数DeviceIoControl了,代码以下:
private
static
string GetPhysicalAddr(
string cardId) {
string macAddress =
string.Empty;
uint device =
0;
try {
string driveName =
"
\\\\.\\
" + cardId;
device = Win32Utils.CreateFile( driveName,
Win32Utils.GENERIC_READ | Win32Utils.GENERIC_WRITE,
Win32Utils.FILE_SHARE_READ | Win32Utils.FILE_SHARE_WRITE,
0, Win32Utils.OPEN_EXISTING,
0,
0 );
if (device != Win32Utils.INVALID_HANDLE_VALUE) {
byte[] outBuff =
new
byte[
6];
uint bytRv =
0;
int intBuff = Win32Utils.PERMANENT_ADDRESS;
if (
0 != Win32Utils.DeviceIoControl( device, Win32Utils.IOCTL_NDIS_QUERY_GLOBAL_STATS,
ref intBuff,
4, outBuff,
6,
ref bytRv,
0 )) {
string temp =
string.Empty;
foreach (
byte b
in outBuff) {
temp = Convert.ToString( b,
16 ).PadLeft(
2,
'
0
' );
macAddress += temp;
temp =
string.Empty;
}
}
}
}
finally {
if (device !=
0) {
Win32Utils.CloseHandle( device );
}
}
return macAddress;
}
三.总结
淘宝发布大王虽然生命周期很短,但基本上还算是一个成功的软件(起码算不上失败吧)。能把本身的软件卖出去,这是一个很爽的过程,从中得到的快感不是用金钱能衡量的,经过开发淘宝发布大王,我收获了一些物质财富,更重要的是得到了快乐。
在开发共享软件方面,有两点也许值得思考:
一是若是从本身熟悉的、甚至本身直接须要的东西入手,也许更容易成功;
二是共享软件不在于功能有多强大,而在于多大程度上知足用户的实际需求。
与各位共勉!
---------------------------------
本人拙做《程序员第二步--从程序员到项目经理》已经到货,谢谢各位园友的长期支持!
当当网:http://product.dangdang.com/23365823.html