Konata.Core
Konata.Core copied to clipboard
[feature request]扫码登录有计划吗
现在登录是需要账号密码,而且验证码很难受
手錶掃碼在計劃之内。
我的验证码处理方式是这样的,几乎没失误过。 ///请订阅bot的OnCaptcha事件,如:_bot.OnCaptcha += Bot_OnCaptcha; //处理验证事件
/// <summary>
/// 处理短信验证和滑动码验证,滑动码验证需要在手机app“滑动助手”配合
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Bot_OnCaptcha(object? sender, CaptchaEvent e)
{
try
{
switch (e.Type)
{
case CaptchaEvent.CaptchaType.Sms:
Console.WriteLine($"手机验证码已经发送,请输入{e.Phone}接收到的验证码:");
_bot.SubmitSmsCode(Console.ReadLine());
break;
case CaptchaEvent.CaptchaType.Slider:
string ticket = DoCaptcha(e.SliderUrl);
if (string.IsNullOrEmpty(ticket)) Console.WriteLine("认证失败,请检查并重试。");
else _bot.SubmitSliderTicket(ticket);
break;
default:
case CaptchaEvent.CaptchaType.Unknown:
Console.WriteLine("未知的验证方式,请联系开发人员");
break;
}
}
catch (Exception err) { Console.WriteLine($"处理验证码出错,出错信息:{err.Message}"); }
}
/// <summary>
/// 处理滑动验证,url是登录QQ时由QQ返回的滑动验证链接,返回滑动认证的ticket
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string DoCaptcha(string url)
{
string code, ticket = "";
try
{
url = url.Replace("ssl.captcha.qq.com", "txhelper.glitch.me");
code = GetUrlInfo(url, "code"); //第一次返回的是4位数字验证码
if (!string.IsNullOrEmpty(code))
{
Console.WriteLine("请在手机app‘滑动验证助手’输入验证码,并手动完成滑动验证:" + code);
Console.WriteLine("完成滑动验证后在本程序按任意键继续登录。");
Console.ReadLine();
ticket = GetUrlInfo(url, "ticket"); //第二次返回的是登录QQ的验证字符串
}
}
catch (Exception ex)
{
Console.WriteLine("处理验证过程出错,出错信息:"+ex.Message);
}
return ticket;
}
/// <summary>
/// 获取滑动验证链接的code或ticket,需要配合手机“滑动验证助手app”
/// </summary>
/// <param name="url">eg:http://www.apollo.com/index.html </param>
public static string GetUrlInfo(string url, string strtype)
{
string str = "";
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
//string result = client.GetStringAsync(url).Result;
string[] strBuff = client.GetStringAsync(url).Result.Split(":");
if (strBuff.Length >= 4 && strtype == "code") str = strBuff[2].Substring(0, 4); //获取滑动验证前的代码
if (strBuff.Length >= 4 && strtype == "ticket") str = strBuff[3].Replace("\"", "").Replace("}",""); //获取滑动验证候的ticket
Thread.Sleep(1000);
}
return str;
}
我的验证码处理方式是这样的,几乎没失误过。 ///请订阅bot的OnCaptcha事件,如:_bot.OnCaptcha += Bot_OnCaptcha; //处理验证事件
/// <summary> /// 处理短信验证和滑动码验证,滑动码验证需要在手机app“滑动助手”配合 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Bot_OnCaptcha(object? sender, CaptchaEvent e) { try { switch (e.Type) { case CaptchaEvent.CaptchaType.Sms: Console.WriteLine($"手机验证码已经发送,请输入{e.Phone}接收到的验证码:"); _bot.SubmitSmsCode(Console.ReadLine()); break; case CaptchaEvent.CaptchaType.Slider: string ticket = DoCaptcha(e.SliderUrl); if (string.IsNullOrEmpty(ticket)) Console.WriteLine("认证失败,请检查并重试。"); else _bot.SubmitSliderTicket(ticket); break; default: case CaptchaEvent.CaptchaType.Unknown: Console.WriteLine("未知的验证方式,请联系开发人员"); break; } } catch (Exception err) { Console.WriteLine($"处理验证码出错,出错信息:{err.Message}"); } } /// <summary> /// 处理滑动验证,url是登录QQ时由QQ返回的滑动验证链接,返回滑动认证的ticket /// </summary> /// <param name="url"></param> /// <returns></returns> public static string DoCaptcha(string url) { string code, ticket = ""; try { url = url.Replace("ssl.captcha.qq.com", "txhelper.glitch.me"); code = GetUrlInfo(url, "code"); //第一次返回的是4位数字验证码 if (!string.IsNullOrEmpty(code)) { Console.WriteLine("请在手机app‘滑动验证助手’输入验证码,并手动完成滑动验证:" + code); Console.WriteLine("完成滑动验证后在本程序按任意键继续登录。"); Console.ReadLine(); ticket = GetUrlInfo(url, "ticket"); //第二次返回的是登录QQ的验证字符串 } } catch (Exception ex) { Console.WriteLine("处理验证过程出错,出错信息:"+ex.Message); } return ticket; } /// <summary> /// 获取滑动验证链接的code或ticket,需要配合手机“滑动验证助手app” /// </summary> /// <param name="url">eg:http://www.apollo.com/index.html </param> public static string GetUrlInfo(string url, string strtype) { string str = ""; using (var client = new HttpClient()) { client.BaseAddress = new Uri(url); client.DefaultRequestHeaders.Add("Accept", "application/json"); client.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample"); //string result = client.GetStringAsync(url).Result; string[] strBuff = client.GetStringAsync(url).Result.Split(":"); if (strBuff.Length >= 4 && strtype == "code") str = strBuff[2].Substring(0, 4); //获取滑动验证前的代码 if (strBuff.Length >= 4 && strtype == "ticket") str = strBuff[3].Replace("\"", "").Replace("}",""); //获取滑动验证候的ticket Thread.Sleep(1000); } return str; }
感谢,非常好用 Console.WriteLine("完成滑动验证后在本程序按任意键继续登录。"); 这块其实可以处理成轮训吧,让用户少点一次
好办法,轮询bot是否在线。
简单写了一下
Console.WriteLine("请在5分钟内完成滑块");
var startTime = DateTime.Now;
var endTime = startTime.AddMinutes(5);
//是否超时
bool IsTimeOut = false;
while (ticket == "" && !IsTimeOut)
{
Thread.Sleep(2000);
ticket = GetUrlInfo(url, "ticket"); //第二次返回的是登录QQ的验证字符串
IsTimeOut = endTime <= DateTime.Now;
}
if (string.IsNullOrEmpty(ticket) && IsTimeOut)
{
Console.WriteLine(DateTime.Now);
throw new Exception("滑动验证超时");
}
请在手机app‘滑动验证助手’ 这是什么APP 我咋搜索不到呢