共享軟件這個詞,現在彷佛離咱們已經愈來愈遙遠了。還有人記得超級兔子嗎?還有人知道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