破解百度旋转图片验证码

602 阅读1分钟

使用德塔云破解百度旋转图片验证码获取旋转的角度

        static int GetVerfiCodeAngle(IBrowser browser,string imgUrl)
        {
            int angle = 0;
            string filename = DateTime.Now.ToString("yyyyMMddHHmmssffff").ToString() + ".jfif";
            try
            {
                new WebClient().DownloadFile(imgUrl, filename);
            }
            catch (Exception)
            {
                Console.WriteLine("下载图片异常");
                return angle;
            }

            string img_base64Str = FileHelper.FileToBase64Str(filename);
            //File.Delete(filename);
            HttpClientHandler handler = new HttpClientHandler()
            {
                UseCookies = false
            };
            HttpClient client = new HttpClient(handler);
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36");
            client.DefaultRequestHeaders.Add("Referer", "http://www.detayun.cn/tool/verifyCodeIdentifyPage/?verify_idf_id=9&_=1669873036912");
            client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
            client.DefaultRequestHeaders.Add("Accept", "application/json, text/javascript, */*; q=0.01");
            string apiUrl = "http://www.detayun.cn/tool/verify_code_identify/";
            Dictionary<string, string> fd = new Dictionary<string, string>();
            fd.Add("verify_idf_id", "9");
            fd.Add("img_base64", img_base64Str);
            fd.Add("words", "");
            var formStr = string.Join("&", fd.Select(kv => $"{kv.Key}={HttpUtility.UrlEncode(kv.Value)}"));
            var formCtx = new StringContent(formStr, Encoding.UTF8, "application/x-www-form-urlencoded");
            var message = new HttpRequestMessage(HttpMethod.Post, apiUrl);
            reset:
            string cookie = Dc.ToStr(DB.Scalar(conStr, "select Cookies from *"));
            message.Headers.Add("Cookie", cookie);
            message.Content = formCtx;
            var result = client.SendAsync(message).Result.Content.ReadAsStringAsync().Result;
            if (!string.IsNullOrEmpty(result))
            {
                var resModel = JsonConvert.DeserializeObject<dynamic>(result);
                if (Dc.ToInt(resModel.code) == 200)
                {
                    string res_str = resModel.data.res_str;
                    if (!string.IsNullOrEmpty(res_str))
                    {
                        angle = Dc.ToInt(res_str.Replace("顺时针旋转", "").Replace("度", ""));
                        Console.WriteLine("旋转度数为" + angle + "度");
                    }
                }
                else
                {
                    Console.WriteLine("德塔云cookie已失效,开始重新登录...");
                    GetddyCookie(browser).Wait();
                    goto reset;
                }
            }
            return angle;
        }
        /// <summary>
        /// 获取德塔云cookie
        /// </summary>
        /// <param name="browser"></param>
        /// <returns></returns>
        public async static Task GetddyCookie(IBrowser browser)
        {
            using (var page =await browser.NewPageAsync())
            {
                await page.GoToAsync("http://www.detayun.cn/account/loginPage/", WaitUntilNavigation.Networkidle0);
                try
                {
                    await page.TypeAsync("#username", "德塔云账号");
                    await page.TypeAsync("#password", "德塔云密码");
                    await page.EvaluateExpressionAsync("$('.layui-icon-ok')[0].click()");
                    Thread.Sleep(1000);
                    await page.EvaluateExpressionAsync("document.getElementById('login_btn').click()");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("登录德塔云异常:" + ex.Message);
                }
                await page.WaitForNavigationAsync();
                Thread.Sleep(1000);
                var cookies= page.GetCookiesAsync().Result;
                StringBuilder sb = new StringBuilder();
                foreach (var item in cookies)
                {
                    sb.Append(item.Name + "=" + item.Value + ";");
                }
                string cookie = sb.ToString();
                DB.Query(conStr, "update cookies");
            }
        }