共享软件这个词,如今似乎离我们已经越来越遥远了。还有人记得超级兔子吗?还有人知道netants吗?这些辉煌一时的明星,已逐渐消失在人们的视野中。今天已经是免费软件的世界。互联网行业的巨头们,打造的免费模式,给共享软件敲响了丧钟。

  共享软件,曾经寄托了多少程序员们创业致富的梦想。我也曾加入共享软件的大潮中,开发过差不多近十个共享软件,最后它们大都灰飞烟灭了,但其中三次经历,还是给我的程序员生涯留下了难以磨灭的记忆。

本人拙作《程序员第二步-从程序员到项目经理》已经到货,当当网、京东网、天猫商城均可购买,谢谢各位园友们的长期大力支持!

第二篇:淘宝发布大王-我赚到了十万块

一、淘宝发布大王的来世今生

我开发的第二款让我难忘的共享软件是淘宝发布大王。

这是一款比隐藏专家还要简单的软件,这个软件是针对淘宝卖家的,它的功能很简单,就是每隔一段时间,就把卖家店里的下架的宝贝自动上架。

这个软件最先是给我老婆自己用的。她在淘宝上开了一个网店卖银饰,商品有四五百件。当时淘宝还没有自动上架功能,卖家的商品在一个周期内(好像是7天)没有卖出去,就会自动下架。你要想再上架重新卖,必须要手动操作,找到没有卖出的宝贝,选中它,然后点击上架。四五百件商品,就是说每天要重新上架六七十件,这实在是一件很繁琐、枯燥的工作。于是淘宝发布大王就应运而生了。

我们自己用了之后,觉得确实很方便,再也不用每过一段时间就要跑到电脑前面上架宝贝了,软件开在那里,基本上什么不用管,比以前省事多了。后来我们想,既然有用,别的卖家肯定也需要,于是我们把软件挂出来卖,70块钱一台机(绑定网卡),没想到反响不错,没过几天,卖软件的销售利润就比老婆卖银饰赚的还要多。

当我们卖这款软件时,市面上根本没有竞争对手,只此一家,别无分店。可是一个多月后,出现了许多模仿者,它们中一些,在销量上可能还超过了淘宝发布大王。即使如此,淘宝发布大王的销量也还是可以的,差不多每天能卖十来个授权,这对于当时的我来说,实在是一笔不菲的收入。大概是由于用的人越来越多,引起了淘宝网的注意,他们还曾派人电话采访了我,说要写一篇采访稿,记录淘宝网二次开发人员的创业情况,可惜的是,我一直没有见到那篇文章。

更可惜的是,好景不长。这个软件还没卖上一年,淘宝网就推出了宝贝自动上架功能,淘宝发布大王再也没有用开之地了,它自然的消失,我的致富梦也戛然而止。

最后统计了一下,这个软件卖了超过十万元。说起来不多,但对于当时拿着几千元月薪的我来说,已经是一笔不小的数字了。靠着这笔钱,我终于拥有了属于自己的房子,开始了幸福的房奴生活。几年后,广州房价飙升,现在再次回想起来,可以说淘宝发布大王从一定程度上改变了我的人生轨迹。

二.关键技术

下面谈一谈技术吧。

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

        京东网:http://item.jd.com/11350488.html     

转载自:http://www.cnblogs.com/watsonyin/p/3457175.html

我开发共享软件的三次经历(中):我赚到了十万块相关推荐

  1. android 界面组件,安卓开发学习周第三篇——Android中的UI组件

    原标题:安卓开发学习周第三篇--Android中的UI组件 在Android APP中,所有的用户界面元素都是由View和ViewGroup的对象构成的.View是绘制在屏幕上的用户能与之交互的一个对 ...

  2. SLAM机器人开发(三)SLAM中常见的里程计

    SLAM机器人开发(三)SLAM中常见的里程计 里程计分类 车轮里程计 惯性里程计 电磁波(光学)雷达 超声波雷达 视觉里程计 里程计对比图 里程计分类 里程计(Odometry)这个词是由希腊单词o ...

  3. Git之(三)Git中常用命令——分支管理

    三.Git中常用命令--分支管理 为什么要使用分支管理? 分支就是科幻电影里面的平行宇宙,也就是当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干 ...

  4. 我博士科研经历中的经验和教训——朱亮

    原文:科学网-我博士科研经历中的经验和教训--朱亮 一个偶然的触动,引发我反思自己博士期间的经验和教训.我想郑重的声明:写此博文,只是希望和朋友一起分享一下我的经验和体会,而不是想吹嘘自己.因为,我觉 ...

  5. 我博士科研经历中的经验和教训

    原文:我博士科研经历中的经验和教训 朱亮 中国民用航空上海航空器适航审定中心 一个偶然的触动,引发我反思自己博士期间的经验和教训.我想郑重的声明:写此博文,只是希望和朋友一起分享一下我的经验和体会,而 ...

  6. 百度校招——移动软件研发工程师一面,二面,三面经历(已拿Offer)

    百度校招移动软件研发工程师一面,二面,三面经历 一面: 手撕算法: ① 用两个栈实现一个队列: ② 实现一个单例模式: 写出来后又问了我这种写法多线程并发下安全吗? --不安全 那如何保证单例模式多线 ...

  7. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    原文:Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必 ...

  8. iOS 11开发教程(三)运行第一个iOS 11程序

    iOS 11开发教程(三)运行第一个iOS 11程序 运行iOS11程序 创建好项目之后,就可以运行这个项目中的程序了.单击运行按钮,如果程序没有任何问题的话,会看到如图1.6和1.7的运行效果. 图 ...

  9. 特斯拉AI高管都推荐的张量工具,开源了三年后终于中顶会了! | ICLR 2022 Oral

    博雯 发自 凹非寺 量子位 | 公众号 QbitAI 那个在GitHub标星4.3k的张量操作工具Einops,在开源三年后终于中了顶会! 这是一个统一的.通用的操作张量结构的方法,基于爱因斯坦求和约 ...

最新文章

  1. 基于Html5的爱情主题网站–表白神器(第二版)
  2. python编程if语法-Python基本语法(if判断)
  3. Topcoder SRM 630div 2
  4. 项目学生:带有Jersey的Web服务客户端
  5. Navicat for MySQL中如何新建用户并赋予权限
  6. 强烈推荐 16 款 IDEA 插件,让你的开发速度飞起来 | 原力计划
  7. Android Studio使用天天模拟器运行Android程序
  8. ceph搭建及使用详解
  9. python爬虫可视化web展示_python爬虫可视化——小龙虾
  10. qpython androidhelper gps_Qpython SL4A获取手机电量和GPS
  11. 基于C+++Mysql实现(WinForm)校友管理系统(面向对象)【100010007】
  12. 百度、谷歌、雅虎三大搜索引擎算法区别
  13. [QT][问题]关于QT语言家使用失败的原因之一
  14. IBM服务器内存条位置,ibm x3250m3服务器内存安装方法
  15. 梅科尔工作室苏慎臻,鸿蒙实战项目
  16. 网络打印服务器 linux,在Linux环境下搭建网络打印服务器
  17. 高德地图的基础使用(三)绘制点标记
  18. python判断成语_python实现成语找一找
  19. [carla入门教程]-5 使用ROS与carla通信
  20. mysql exist in engine_数据库Table doesn't exist in engine

热门文章

  1. 最小长度电路板排列问题_射频电路板设计,这篇文章五大总结不可忽视!
  2. 编写100多行的c语言程序,C语言编程100多例.doc
  3. 通信系统计算机仿真上机实验报告,昆明理工大学计算机仿真实验.docx
  4. [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)
  5. 刷新table数据_经典 - 一文轻松看懂数据透视表
  6. android viewpager 嵌套fragment,Android ViewPager+Fragment多层嵌套(使用问题处理)
  7. 全程pwm调光_dc调光的手机有哪些
  8. c语言二十四点游戏,C语言解24点游戏程序
  9. typescript索引类型_TypeScript类型声明书写详解
  10. 用php循环星期一到星期日,php函数获取日期范围内的所有星期一