private string yzmDistinguish(Bitmap bitmap) { byte[] data = null; using (MemoryStream stream = new MemoryStream()) { bitmap.Save(stream, ImageFormat.Png); data = new byte[stream.Length]; stream.Seek(0, SeekOrigin.Begin); stream.Read(data, 0, Convert.ToInt32(stream.Length)); } //必要的参数 var param = new Dictionary <object, object> { { "username", account }, { "password", password }, { "typeid", yzmStyle }, { "timeout", "90" }, { "softid", softId }, { "softkey", softKey } }; //提交服务器 string httpResult = RuoKuaiHttp.Post("http://api.ruokuai.com/create.xml", param, data); XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.LoadXml(httpResult); } catch { } XmlNode idNode = xmlDoc.SelectSingleNode("Root/Id"); XmlNode resultNode = xmlDoc.SelectSingleNode("Root/Result"); XmlNode errorNode = xmlDoc.SelectSingleNode("Root/Error"); string result = string.Empty; string topidid = string.Empty; if (resultNode != null && idNode != null) { topidid = idNode.InnerText; result = resultNode.InnerText; } bitmap.Dispose(); return(result); }
public void Run(QqContext context) { var miniBrowser = (ScrapingBrowser)context["miniBrowser"]; var userName = context["userName"].ToString(); var postForm = new NameValueCollection(); postForm["uin"] = userName; postForm["appid"] = Constants.QqAppId; postForm["js_ver"] = "10095"; postForm["js_type"] = "0"; postForm["u1"] = "http://w.qq.com/proxy.html&r=0.6158497643191367"; postForm["r"] = "0.6158497643191367"; var htmlStr = miniBrowser.NavigateTo(new Uri(Constants.QqMsgCheckUrl), HttpVerb.Get, postForm); //将验证码信息的三部分存入数组 int checkCodePosition = htmlStr.IndexOf("(", StringComparison.Ordinal) + 1; var checkCode = htmlStr.Substring(checkCodePosition, htmlStr.LastIndexOf(")", StringComparison.Ordinal) - checkCodePosition); var checkArray = checkCode.Replace("'", "").Split(','); //验证码数组 context["qq16"] = checkArray[2]; if (checkArray[0] == "0") { context["code"] = checkArray[1]; context.QqMsgCodeStatus = QqMsgCodeStatus.NotNeedCode; } else if (checkArray[0] == "1") { //必要的参数 var url = string.Format(Constants.QqMsgCodeImageTemplate, Constants.QqAppId, "0.8478438374586403", userName); var param = new Dictionary <object, object> { { "username", context["ruokuaiUser"] }, { "password", context["ruokuaiPwd"] }, { "typeid", context["ruokuaiTypeid"] }, { "timeout", "90" }, { "softid", context["ruokuaiSoftid"] }, { "softkey", context["ruokuaiSoftkey"] } }; var wr = miniBrowser.DownloadWebResource(new Uri(url)); try { string httpResult = RuoKuaiHttp.Post("http://api.ruokuai.com/create.xml", param, wr.Content.ToArray()); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(httpResult); XmlNode idNode = xmlDoc.SelectSingleNode("Root/Id"); XmlNode resultNode = xmlDoc.SelectSingleNode("Root/Result"); //XmlNode errorNode = xmlDoc.SelectSingleNode("Root/Error"); if (resultNode != null && idNode != null) { //var topidid = idNode.InnerText; var result = resultNode.InnerText; context["code"] = result; context.QqMsgCodeStatus = QqMsgCodeStatus.NotNeedCode; //停顿下,否则qq会认为是在攻击它 Thread.Sleep(2000); } } catch (Exception ex) { Log4Logger.Error(ex.Message, ex); } if (string.IsNullOrWhiteSpace((context["code"] ?? "").ToString())) { var baseStartupPath = AppDomain.CurrentDomain.BaseDirectory; if (!Directory.Exists(baseStartupPath + "\\CodeImages")) { Directory.CreateDirectory(baseStartupPath + "\\CodeImages"); } File.WriteAllBytes(baseStartupPath + "\\CodeImages\\qqmsg_" + userName + ".jpg", wr.Content.ToArray()); context.QqMsgCodeStatus = QqMsgCodeStatus.NeedCode; if ((bool)context["needSendMail"]) { Log4Logger.Info("QQMsgLogger需要验证码,请尽快输入验证码!"); MailLogger.LogInfo("QQMsgLogger需要验证码,请尽快输入验证码!<a href='http://123.57.83.216:8001/QQMsgLogger/Check'>进入</a>"); } } } else { context.QqMsgStatus = QqMsgStatus.Fail; } context["verifysession"] = miniBrowser.GetCookie(new Uri(Constants.QqMsgCheckUrl), "verifysession").Value; }
/// <summary> ///获取验证信息 //验证信息格式为:ptui_checkVC('0','!MIW','\x00\x00\x00\x00\x9a\x65\x0f\xd7') //其中分为三部分,第一个值0或1判断是否需要图片验证码 // 第二个值是默认验证码,若不需要图片验证码,就用此验证码来提交 // 第三部分是所使用的QQ号码的16进制形式 /// </summary> /// <param name="scrapingBrowser"></param> /// <param name="htmlStr"></param> private void Check(ScrapingBrowser scrapingBrowser, string htmlStr) { cap_cd = string.Empty; //将验证码信息的三部分存入数组 int checkCodePosition = htmlStr.IndexOf("(", System.StringComparison.Ordinal) + 1; var checkCode = htmlStr.Substring(checkCodePosition, htmlStr.LastIndexOf(")", System.StringComparison.Ordinal) - checkCodePosition); var checkArray = checkCode.Replace("'", "").Split(','); //验证码数组 if (checkArray[0] == "0") { CodeStatus = CodeStatus.NotNeedCode; QqProvider.Instance.UpdateCodeStatus(Id, CodeStatus.NotNeedCode); Log4Logger.Info(UserName + " 获取验证信息成功! " + htmlStr); Login(checkArray[1]); } else if (checkArray[0] == "1") { cap_cd = checkArray[1]; var ruokuaiUser = ConfigurationManager.AppSettings["ruokuaiUser"] ?? ""; var ruokuaiPwd = ConfigurationManager.AppSettings["ruokuaiPwd"] ?? ""; var ruokuaiTypeid = ConfigurationManager.AppSettings["ruokuaiTypeid"] ?? ""; var ruokuaiSoftid = ConfigurationManager.AppSettings["ruokuaiSoftid"] ?? ""; var ruokuaiSoftkey = ConfigurationManager.AppSettings["ruokuaiSoftkey"] ?? ""; var param = new Dictionary <object, object> { { "username", ruokuaiUser }, { "password", ruokuaiPwd }, { "typeid", ruokuaiTypeid }, { "timeout", "90" }, { "softid", ruokuaiSoftid }, { "softkey", ruokuaiSoftkey } }; var url = string.Format(CodeImage, AppId, UserName, cap_cd); var wr = scrapingBrowser.DownloadWebResource(new Uri(url)); try { string httpResult = RuoKuaiHttp.Post("http://api.ruokuai.com/create.xml", param, wr.Content.ToArray()); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(httpResult); XmlNode idNode = xmlDoc.SelectSingleNode("Root/Id"); XmlNode resultNode = xmlDoc.SelectSingleNode("Root/Result"); //XmlNode errorNode = xmlDoc.SelectSingleNode("Root/Error"); if (resultNode != null && idNode != null) { //var topidid = idNode.InnerText; var result = resultNode.InnerText; CodeStatus = CodeStatus.NotNeedCode; QqProvider.Instance.UpdateCodeStatus(Id, CodeStatus.NotNeedCode); Log4Logger.Info(UserName + " 获取验证信息成功! " + htmlStr); QqMsgLogger.LogInfo(UserName + " 若快识别成功! "); //停顿下,否则qq会认为是在攻击它 Thread.Sleep(2000); Login(result); } else { CodeStatus = CodeStatus.NeedCode; QqProvider.Instance.UpdateCodeStatus(Id, CodeStatus.NeedCode); Log4Logger.Info(UserName + " 需要验证码,请尽快输入验证码!"); } } catch (Exception ex) { Log4Logger.Error(ex.Message, ex); CodeStatus = CodeStatus.NeedCode; QqProvider.Instance.UpdateCodeStatus(Id, CodeStatus.NeedCode); Log4Logger.Info(UserName + " 需要验证码,请尽快输入验证码!"); QqMsgLogger.LogInfo(UserName + " 若快识别失败! " + ex.Message, ex); } } else { CodeStatus = CodeStatus.NeedCode; QqProvider.Instance.UpdateCodeStatus(Id, CodeStatus.NeedCode); Log4Logger.Error("Check失败!\r\n" + UserName + "\r\n" + htmlStr); QqMsgLogger.LogError("Check失败!" + UserName + ":" + htmlStr); } }