自动充值平台开发进程之联通卡密一最终实现

您所在的位置:网站首页 联通卡密充值平台 自动充值平台开发进程之联通卡密一最终实现

自动充值平台开发进程之联通卡密一最终实现

2024-04-13 03:47| 来源: 网络整理| 查看: 265

前两篇已把相应的准备工作和功能说明列了一下,今天就把详细的实现写一下,以后的将把13800138000的语音拨号系统,和手机短信群发的的实现也发上。

开始这次的内容。

首先就是需要用到模拟提交的两个类

 HttpHead.cs 这个类(其实是结构)它的主要功能就是封装了Http请求的一个头信息

using System;using System.Net;using System.Drawing;

namespace NetHelper {    ///     /// Http头信息设置    ///     public struct HttpHead {        public String Host;    //主机        public String Referer;   //引用        public CookieCollection Cookies;  //cookies容器        public String PostData;       //请求的传给服务器的参数        public String Method;        //请求方式常见的POST,GET        public String ContentType;               public String Html;         //响应的html代码        public String AbsoluteUri;              public Bitmap Image;        //如果请求的是图片,这里返回一个Bitmap对象        public Boolean IsImage;       //是否为图片    }}

HttpRequest.cs   //用来发起提交的

namespace NetHelper {    using System;    using System.Drawing;    using System.IO;    using System.Net;    using System.Text;

    ///     /// Http请求封装类,包括 POST,GET请求    /// 幸福海    ///     public class HttpRequest {        private CookieContainer cookies;        public CookieContainer Cookies {            get { return this.cookies; }            set { this.cookies = value; }        }        ///         /// Http请求        /// 幸福海        ///         public HttpRequest() {            this.Cookies = new CookieContainer();        }        ///         /// 发送HTTP请求        ///         /// HTTP头结构        ///         public String Send(ref HttpHead Head) {            HttpWebResponse Response = null;            String val = "";            try {                HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(Head.Host);                Request.ProtocolVersion = new Version("1.1");                Request.Referer = Head.Referer;                Request.Accept = "*/*";                Request.CookieContainer = this.Cookies;                Request.Timeout = 100000;                Request.Headers.Add("Accept-Language", "zh-CN");                Request.KeepAlive = true;                Request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;.NET CLR 2.0.50727)";

                if (Head.Method.ToLower() == "post") {                    Request.Method = "POST";                    if (String.IsNullOrEmpty(Head.ContentType)) {                        Request.ContentType = "application/x-www-form-urlencoded";                    }                    else {                        Request.ContentType = Head.ContentType;                    }                    if (Head.PostData != null && Head.PostData.Length > 0) {                        Byte[] byteData = Encoding.Default.GetBytes(Head.PostData);                        Request.ContentLength = byteData.Length;                        Stream WriteStream = Request.GetRequestStream();                        WriteStream.Write(byteData, 0, byteData.Length);                        WriteStream.Close();                    }                }                try {                    Response = (HttpWebResponse)Request.GetResponse();                }                catch (WebException ex) {                    if (ex.Response != null) {                        Response = (HttpWebResponse)ex.Response;                    }                    else {                        return "网络异常";                    }                }                foreach (Cookie cookie in Request.CookieContainer.GetCookies(Request.RequestUri)) {                    this.Cookies.Add(cookie);                }                Stream dataStream = Response.GetResponseStream();                if (Head.IsImage) {                    Bitmap img = new Bitmap(dataStream);                    Head.Image = img;                    return "";                }                else {                    String encode = Response.CharacterSet;                    if (encode == null) encode = "gb2312";                    if (encode.ToLower() == "iso-8859-1") encode = "gb2312";                    StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding(encode));                    val = reader.ReadToEnd();                    Head.AbsoluteUri = Response.ResponseUri.AbsoluteUri;                    reader.Close();                    dataStream.Close();                    Response.Close();                    Head.Html = val;                }            }            catch {                return "未知错误";            }            return val;        }    }}

这个类中最关键的是那个关联cookie,这里不详细说明,具体看代码,如果有不明白的地方,请提出来。

        //开始提交联通卡密,这就是那个按钮对应的事件        private void BtnOk_Click(object sender, EventArgs e) {            String strTel = tbTel.Text.Trim();            String strPass = tbPass.Text.Trim();            String Result = UnionCardPay(strTel, strPass);            lblMsg.Text = BuilderErrMsg(Result);  //显示充值信息        }

 

   //重填输入框,重置按钮事件        private void BtnReset_Click(object sender, EventArgs e) {            tbTel.Text = tbPass.Text = String.Empty;        }

 

  //字符串中获取指定开始和结束的子串        private String GetValue(string str, string s, string e) {            Regex regex = new Regex("(?");

                //自动过验证码                Int16 index = 1;                while (1 == 1) {                    head.Host = "http://upay.10010.com/web/EsfWeb/VerifyCode.action?timestamp=" + DateTime.Now.ToString("yyyyMMddhhmmss");                    head.IsImage = true;                    head.Method = "GET";                    request.Send(ref head);                    Bitmap img = head.Image;                    CheckImage imgChk = new CheckImage();                    String chk = imgChk.GetCheckCode(img);

                    //提交充值号码和卡密                    String para = "numbean.userNumBean.userSelNum=1&numbean.userNumBean.otherNum=" + tel + "&cardPwd=" + pass + "&verifyCode=" + chk;                    para += "&numbean.cityCodeBean.provinceId=&numbean.cityCodeBean.cityId=&numbean.cityCodeBean.cityCode=&numbean.userNumBean.telNum=";                    para += "&secstate.state=" + state;                    head.Host = "http://upay.10010.com/web/Recharge/rechargeConfirm";                    head.PostData = para;                    head.IsImage = false;                    head.Method = "POST";                    head.Referer = "http://upay.10010.com/web/Recharge/rechargeInit";                    request.Send(ref head);                    result = head.Html;                    state = GetValue(result, "name=\"secstate.state\" value=\"", "\" id=\"secstate.state\"/>");                    result = GetValue(result, "", "");//提交状态                    //状态处理                    if (result.Contains("验证码不正确")) { // 验证码匹配5次不正确。                        if (index++ >= 5) {                            return "005";                        }                        else {                            continue; //重新跳转到验证码识别                        }                    }                    break;                }

                if (result.Contains("输入的充值卡已充值")) { //尊敬的用户您好,您输入的充值卡已充值,无法再次使用,请更换充值卡重新操作                    return "001";                }

                if (result.Contains("您输入的充值卡密码有误")) { //尊敬的用户您好,您输入的充值卡密码有误,请重新输入。                    return "002";                }

                if (result.Contains("您输入的交费充值号码不存在")) { // 尊敬的用户您好,您输入的交费充值号码不存在,请重新输入。                    return "003";                }

                if (result.Contains("请正确输入手机号码")) { //请正确输入手机号码。                    return "004";                }

                if (result.Contains("过期")) { //充值卡已过期。                    return "006";                }

                //确认充值结果                head.Host = "http://upay.10010.com/web/Recharge/rechargeResult";                head.Method = "POST";                head.PostData = "secstate.state=" + state;                head.Cookies = request.Cookies.GetCookies(new Uri(head.Host));                head.Referer = "http://upay.10010.com/web/Recharge/rechargeConfirm";                request.Send(ref head);                result = head.Html;                if (!result.Contains("成功")) { //最后一步没有完成,即充值失败                    return "009";                }                return "888";            }            catch {                return "009";            }        }

 

全部代码就这些,这里主要是给大家整理思路,主要是通过C#向服务器提交数据

现把联通卡密提交的顺序说一下

1,当我们启动抓包工具,开始提交数据的时候,我们会看到,有几个参数提到了服务器端

 

这几个,名称看上去怪怪的,原因很简单,主是因为联通这个站是JAVA来写到了,用了Bean,所有看上去名称就比较上

其实对我们来说无所谓

 

numbean.userNumBean.userSelNum 如果是给手机充值这个是1,固话小灵通,宽带就为2numbean.userNumBean.otherNum   手机号码cardPwd               卡密verifyCode              验证码,

下面四个我们可以不管他了numbean.cityCodeBean.provinceIdnumbean.cityCodeBean.cityIdnumbean.cityCodeBean.cityCodenumbean.userNumBean.telNum

这个参数非常重要,也就是一个隐藏域的东西,估计是一个加密字符串充,如果错了,就提交不上了。secstate.state

 

最后当我们点提交的时候,就可以得到相应的信息,假如你还要获取订单号,和充值的金额,你只对html源进行分析,截取就行了

OK,这个联通的卡密就写到这里,由于第一次写东西,没有什么思路,呵呵,想到哪就写到哪了,毕竟文学功底有限,希望以后写文章这方面的功能加强些,

如果大家对这个联通卡密自动提交还不是很清楚的话,可以随你给我发信息.

--幸福海

博客地址:http://www.cnblogs.com/ningqhai/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3