using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using qingdaoport; using DSWeb.MvcShipping.Models.MsOpSeae; using Microsoft.Practices.EnterpriseLibrary.Data; using System.Web; using System.Web.Script.Serialization; using AjaxPro; using DSWeb.MvcShipping.DAL.MsSysParamSet; using DSWeb.MvcShipping.Models.MsOpSeaeYard; namespace DSWeb.Areas.MvcShipping.DAL.MsOpSeaeQDPortDataDAL { public class MsOpSeaeQDPortDataDAL { public string _Cookies { get { return GetCookie(); } set { SaveCookie(value); } } string username = MsSysParamSetDAL.GetData("PARAMNAME='QDPORTUSER'").PARAMVALUE;//读取用户名 string password = MsSysParamSetDAL.GetData("PARAMNAME='QDPORTPASS'").PARAMVALUE;//读取密码 string userid = ""; HttpHelper http = new HttpHelper(); public MsOpSeaeQDPortDataDAL(string uid) { userid = uid; } public bool settleQdportData(string mblno, out string message) { string modelMessage = ""; OpSeaeQDPortDataModel model = GetQdportModel(mblno, out modelMessage); if (model == null) { message = modelMessage; return false; } else { if (model.success) { //进行数据导入 string insertMessage = ""; bool insertResult = InsertQdportDataIntoDB(model, out insertMessage); message = insertMessage; return insertResult; } else { message = modelMessage; return false; } } } private bool InsertQdportDataIntoDB(OpSeaeQDPortDataModel model, out string message) { message = ""; return false; } /// /// /// /// 提单号 public OpSeaeQDPortDataModel GetQdportModel(string mblno, out string message) { string msg = ""; HttpItem item = new HttpItem() { URL = "http://track.qingdao-port.net/logistics/wmdp/queryWmdp?tdhType=ZTDH&jckType=NONE&value=" + mblno, Method = "post",//URL 可选项 默认为Get ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 可选项有默认值 Postdata = "qtype=pc",//Post要发送的数据 Cookie = _Cookies }; HttpResult result = http.GetHtml(item); var obj = JsonConvert.DeserializeObject(result.Html); if (obj != null) { //获取信息正常 msg = "获取信息正常!"; } else { //未获取到信息 //进行登录操作 string loginState = doLogin(); if (loginState == "登录成功") { //重新获取 _Cookies = result.Cookie; obj = GetQdportModel(mblno, out msg); } } message = obj == null ? "获取失败,请稍后重试!" : (obj.success ? "获取成功" : msg); return obj; } /// /// 青岛港单票查询 /// /// /// /// /// public Dictionary GetQdportHttpInfo(string tdhType, string jckType, string value) { //SetQdportAccount(); Dictionary dict = new Dictionary(); HttpItem item = new HttpItem { URL = "http://track.qingdao-port.net/logistics/wmdp/queryWmdp?tdhType=" + tdhType + "&jckType=" + jckType + "&value=" + value, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 Postdata = "qtype=pc",//Post要发送的数据 Cookie = _Cookies }; HttpResult result = http.GetHtml(item); if (result.Html == "") { //登陆 string loginState = doLogin(); if (loginState == "登录成功") { //_Cookies = result.Cookie; return GetQdportHttpInfo(tdhType, jckType, value); } //登陆失败 dict.Add(loginState, new OpSeaeQDPortDataModel()); return dict; } dict.Add("success", JsonConvert.DeserializeObject(result.Html)); return dict; } /// /// 单船查询 /// /// /// /// public Dictionary GetQdvHttpInfo(string vessel, string voyno) { // SetQdportAccount(); Dictionary dict = new Dictionary(); HttpItem item = new HttpItem { URL = "http://track.qingdao-port.net/logistics/singleship/querySingleShip?YWCM=" + vessel + "&CKHC=" + voyno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 Postdata = "qtype=pc",//Post要发送的数据 Cookie = _Cookies }; HttpResult result = http.GetHtml(item); if (result.Html == "") { //登陆 string loginState = doLogin(); if (loginState == "登录成功") { //_Cookies = result.Cookie; return GetQdvHttpInfo(vessel, voyno); } //登陆失败 dict.Add(loginState, new OpSeaeQdvDataModel()); return dict; } dict.Add("success", JsonConvert.DeserializeObject(result.Html)); return dict; } private string doLogin() { string message = ""; int cnt = 0; Boolean ok = false; Boolean stop = false; Dictionary dict = new Dictionary(); while (!ok && !stop) { if (cnt > 20) { message = "登录出现异常:失败次数过多,请稍后再试。"; break; } cnt++; dict = getVerificationCode(); if (!dict.Values.First()) return dict.Keys.First(); HttpItem item = new HttpItem() { //URL = "http://www.qingdao-port.net/market/login.do",//URL 必需项 URL = "https://www.qingdao-port.net/ygt/api/sso/login.do", Method = "post",//URL 可选项 默认为Get ContentType = "application/x-www-form-urlencoded",//返回类型 可选项有默认值 Postdata = "userName=" + username + "&passWord=" + password + "&code=" + dict.Keys.First(),//Post要发送的数据 Cookie = _Cookies }; HttpResult result = http.GetHtml(item); string html = result.Html; JObject jo = (JObject)JsonConvert.DeserializeObject(html); if (jo["success"].ToString().ToLower() == "true") { message = "登录成功"; //_Cookies = result.Cookie; ok = true; } else { if (!jo["msg"].ToString().Contains("图片验证码输入错误,请重新输入")) { stop = true; } message = jo["msg"].ToString(); } } return message; } public Dictionary getVerificationCode() { Dictionary dict = new Dictionary(); HttpItem item = new HttpItem() { //URL = "http://www.qingdao-port.net/market/getKaptchaImage.do?timestamp=" + ConvertDateTimeInt(DateTime.Now), URL = "https://www.qingdao-port.net/ygt/api/safe/captcha.do?" + ConvertDateTimeInt(DateTime.Now), Method = "get",//URL 可选项 默认为Get ResultType = ResultType.Byte }; HttpResult result = http.GetHtml(item); _Cookies = result.Cookie; Bitmap bitmap = BytesToBitmap(result.ResultByte); //bitmap = unNoise(bitmap, 0); Bitmap bm2 = new Bitmap(bitmap.Width, bitmap.Height); Graphics g = Graphics.FromImage(bm2); g.DrawImageUnscaled(bitmap, 0, 0); string guid = Guid.NewGuid().ToString(); string path = HttpRuntime.AppDomainAppPath.ToString() + "qdporttemp\\"; string filename = path + guid + ".png"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } bm2.Save(filename); //调用百度云文字识别 OcrDemo ocr = new OcrDemo(); JToken o = ocr.GeneralBasic(filename); var errorMsg = o.Value("error_msg"); var wordsNum = o.Value("words_result_num"); if (String.IsNullOrEmpty(errorMsg)) { if (wordsNum > 0) { var txts = from p in (JArray)o.Root["words_result"] select (string)p["words"]; //Regex r = new Regex(@"^\d{1,3}\s*[\+-×÷X]\s*\d{1,3}$");//匹配 计算表达式 string words = txts.First(); //if (r.IsMatch(words)) if (words.Length == 4) { //Regex aReg = new Regex(@"\d{1,3}(?=\s*[\+-×÷X])"); //Regex bReg = new Regex(@"(?<=[\+-×÷X]\s*)\d{1,3}"); //Regex opReg = new Regex(@"(?<=\d{1,3}\s*)[\+-×÷X](?=\s*\d{1,3})"); //var a = Convert.ToInt32(aReg.Match(words).Value);//第一个参数 //var b = Convert.ToInt32(bReg.Match(words).Value);//第二个参数 //var op = opReg.Match(words).Value;//操作符 //int c; //switch (op) //{ // case "+"://加法运算 // c = a + b; // break; // case "-"://减法运算 // c = a - b; // break; // case "÷"://除法运算 // if (b == 0) return getVerificationCode(); // c = a / b; // break; // default: //乘法运算 // c = a * b; // break; //} //dict.Add(c.ToString(), true); dict.Add(words.ToString(), true); File.Delete(filename); return dict; } else { File.Delete(filename); return getVerificationCode(); } } return getVerificationCode(); } dict.Add(errorMsg, false); return dict; } /// /// 珉钧场站验证码破解 /// public Dictionary getVerificationCodebygdv(int times, string url) { Dictionary dict = new Dictionary(); HttpItem item = new HttpItem { URL = url + "?t=" + ConvertDateTimeInt(DateTime.Now), Method = "get",//URL 可选项 默认为Get ResultType = ResultType.Byte }; HttpResult result = http.GetHtml(item); Bitmap bitmap = BytesToBitmap(result.ResultByte); bitmap = unNoise(bitmap, 1); Bitmap bm2 = new Bitmap(bitmap.Width, bitmap.Height); Graphics g = Graphics.FromImage(bm2); g.DrawImageUnscaled(bitmap, 0, 0); string guid = Guid.NewGuid().ToString(); string path = HttpRuntime.AppDomainAppPath.ToString() + "qdporttemp\\"; string filename = path + guid + ".png"; if (!Directory.Exists(path)) Directory.CreateDirectory(path); bm2.Save(filename); OcrDemo ocr = new OcrDemo(); JToken obj = ocr.GeneralBasicDemo(filename); File.Delete(filename);//删除本地文件 var errorCode = obj.Value("error_code");//请求错误,返回错误码,17,每日请求量超限额 if (errorCode == null) { var wordsNum = obj.Value("words_result_num"); if (wordsNum > 0) { var txts = from o in (JArray)obj.Root["words_result"] select (string)o["words"]; Regex r = new Regex(@"^[a-zA-Z0-9]{4}$"); if (r.IsMatch(txts.First())) { dict.Add(txts.First(), result.Cookie); return dict; } } if (times < 7) return getVerificationCodebygdv(times++, url); return dict; } dict.Add(errorCode.ToString(), result.Cookie); return dict; } #region 图像处理部分 public static long ConvertDateTimeInt(System.DateTime time) { //double intResult = 0; System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0)); //intResult = (time- startTime).TotalMilliseconds; long t = (time.Ticks - startTime.Ticks) / 10000; //除10000调整为13位 return t; } public static Bitmap BytesToBitmap(byte[] Bytes) { MemoryStream stream = null; try { stream = new MemoryStream(Bytes); return new Bitmap((Image)new Bitmap(stream)); } catch (ArgumentNullException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } finally { stream.Close(); } } public Bitmap unNoise(Bitmap bmpOut, int type) { UnCodebase imageNoise = new UnCodebase(bmpOut); //灰度处理 bmpOut = imageNoise.ToGray(); imageNoise = new UnCodebase(bmpOut); //得到阈值 int grayvalue = imageNoise.GetDgGrayValue(); //降噪 if (type == 0) bmpOut = imageNoise.ClearNoise(grayvalue); else bmpOut = imageNoise.ClearNoise(grayvalue, 3); imageNoise = new UnCodebase(bmpOut); bmpOut = imageNoise.ConvertTo1Bpp1(); imageNoise = new UnCodebase(bmpOut); bmpOut = imageNoise.Sharpen(1); return bmpOut; } #endregion private void SaveCookie(string cookie) { //更新 string sql = @"update Op_QdPortCookies set cookie = '" + cookie + "'"; Database db = DatabaseFactory.CreateDatabase(); int flag = db.ExecuteNonQuery(CommandType.Text, sql); if (flag == 0) { //添加 string sql2 = @"insert into Op_QdPortCookies (cookie) values ('" + cookie + "')"; db.ExecuteNonQuery(CommandType.Text, sql2); } } private static string GetCookie() { string sql = @"select top 1 cookie from Op_QdPortCookies order by updatetime desc"; Database db = DatabaseFactory.CreateDatabase(); if (db.ExecuteScalar(CommandType.Text, sql) == null) return ""; return db.ExecuteScalar(CommandType.Text, sql).ToString(); } public static bool CheckQdAccountSetting(string userid) { //string sql = "select QdPortUserName,QdPortPassword from user_baseinfo where userid='" + userid + "'"; //Database db = DatabaseFactory.CreateDatabase(); string qduname = MsSysParamSetDAL.GetData("PARAMNAME='QDPORTUSER'").PARAMVALUE; ; string qdpwd = MsSysParamSetDAL.GetData("PARAMNAME='QDPORTPASS'").PARAMVALUE; ; //using (IDataReader reader = db.ExecuteReader(CommandType.Text, sql)) //{ // while (reader.Read()) // { // qduname = reader["QdPortUserName"].ToString(); // qdpwd = reader["QdPortPassword"].ToString(); // } //} if (qduname == "" || qdpwd == "") { return false; } else { return true; } } private void SetQdportAccount() { /* string sql = "select * from user_baseinfo where userid= '" + userid + "'"; Database db = DatabaseFactory.CreateDatabase(); string qduname = ""; string qdpwd = ""; using (IDataReader reader = db.ExecuteReader(CommandType.Text, sql)) { while (reader.Read()) { username = reader["QdPortUserName"].ToString(); password = reader["QdPortPassword"].ToString(); } } */ username = MsSysParamSetDAL.GetData("PARAMNAME='QDPORTUSER'").PARAMVALUE;//读取用户名 password = MsSysParamSetDAL.GetData("PARAMNAME='QDPORTPASS'").PARAMVALUE;//读取密码 } /// /// 青岛港--长荣出口提单查询 /// /// /// public List GetCRYard(string mblno) { //SetQdportAccount(); List result = new List(); HttpItem itemJgxx = new HttpItem { URL = "http://track.qingdao-port.net/logistics/crstation/queryJgxx?tdh=" + mblno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 //Postdata = "tdh" + mblno,//Post要发送的数据 Postdata = "qtype=pc", Cookie = _Cookies }; HttpResult resultJgxx = http.GetHtml(itemJgxx); HttpItem itemZhxx = new HttpItem { URL = "http://track.qingdao-port.net/logistics/crstation/querySjzh?tdh=" + mblno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 //Postdata = "tdh" + mblno,//Post要发送的数据 Postdata = "qtype=pc", Cookie = _Cookies }; HttpResult resultZhxx = http.GetHtml(itemZhxx); HttpItem itemXhdt = new HttpItem { URL = "http://track.qingdao-port.net/logistics/crstation/queryXhdt?tdh=" + mblno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 //Postdata = "tdh" + mblno,//Post要发送的数据 Postdata = "qtype=pc", Cookie = _Cookies }; HttpResult resultXhdt = http.GetHtml(itemXhdt); //if ((resultJgxx.Html == "") || (resultXhdt.Html == "") || (resultZhxx.Html == "")) if (resultJgxx.Html == "") { //登陆 string loginState = doLogin(); if (loginState == "登录成功") { //_Cookies = result.Cookie; return GetCRYard(mblno); } //登陆失败 return (result); } result.Add(resultJgxx.Html); result.Add(resultXhdt.Html); result.Add(resultZhxx.Html); return result; } /// /// 青岛港--长荣出口提单查询--集港信息 /// /// /// public OpSeaeJGXX_CRModel GetCRYardJgxx(string mblno) { SetQdportAccount(); HttpItem item = new HttpItem { URL = "http://track.qingdao-port.net/logistics/crstation/queryJgxx?tdh=" + mblno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 //Postdata = "tdh" + mblno,//Post要发送的数据 Postdata = "qtype=pc", Cookie = _Cookies }; HttpResult result = http.GetHtml(item); if (result.Html == "") { //登陆 string loginState = doLogin(); if (loginState == "登录成功") { //_Cookies = result.Cookie; return GetCRYardJgxx(mblno); } //登陆失败 return (new OpSeaeJGXX_CRModel()); } return JsonConvert.DeserializeObject(result.Html); } /// /// 青岛港--长荣出口提单查询--实际装货 /// /// /// public OpSeaeZHXX_CRModel GetCRYardZhxx(string mblno) { SetQdportAccount(); HttpItem item = new HttpItem { URL = "http://track.qingdao-port.net/logistics/crstation/querySjzh?tdh=" + mblno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 //Postdata = "tdh" + mblno,//Post要发送的数据 Postdata = "qtype=pc", Cookie = _Cookies }; HttpResult result = http.GetHtml(item); if (result.Html == "") { //登陆 string loginState = doLogin(); if (loginState == "登录成功") { //_Cookies = result.Cookie; return GetCRYardZhxx(mblno); } //登陆失败 return (new OpSeaeZHXX_CRModel()); } return JsonConvert.DeserializeObject(result.Html); } /// /// 青岛港--长荣出口提单查询--箱货动态 /// /// /// public OpSeaeXHDT_CRModel GetCRYardXhdt(string mblno) { SetQdportAccount(); HttpItem item = new HttpItem { URL = "http://track.qingdao-port.net/logistics/crstation/queryXhdt?tdh=" + mblno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 //Postdata = "tdh" + mblno,//Post要发送的数据 Postdata = "qtype=pc", Cookie = _Cookies }; HttpResult result = http.GetHtml(item); if (result.Html == "") { //登陆 string loginState = doLogin(); if (loginState == "登录成功") { //_Cookies = result.Cookie; return GetCRYardXhdt(mblno); } //登陆失败 return (new OpSeaeXHDT_CRModel()); } return JsonConvert.DeserializeObject(result.Html); } /// /// 青岛港--港联荣提单查询 /// /// /// public OpSeaeGLRModel GetGLRYardXhdt(string mblno) { //SetQdportAccount(); HttpItem item = new HttpItem { URL = "http://track.qingdao-port.net/logistics/mtsearch/glrcz?searchval=" + mblno, Method = "post",//URL ContentType = "/*application/x-www-form-urlencoded*/",//返回类型 Postdata = "qtype=pc", Cookie = _Cookies }; HttpResult result = http.GetHtml(item); if (result.Html == "") { //登陆 string loginState = doLogin(); if (loginState == "登录成功") { //_Cookies = result.Cookie; return GetGLRYardXhdt(mblno); } //登陆失败 return (new OpSeaeGLRModel()); } return JsonConvert.DeserializeObject(result.Html); } } }