using AngleSharp.Html.Parser; using Hncore.Infrastructure.Common; using Hncore.Infrastructure.Extension; using Hncore.Infrastructure.Serializer; using Hncore.Infrastructure.WebApi; using Hncore.Pass.Vpn.Model; using Hncore.Pass.Vpn.Request.Product; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; namespace Hncore.Pass.Vpn.Service { //老鹰B组 public class AgentClient3Service : AgentClientBaseService { string LoginUrl { get; set; } = "api/login"; string LoginCodeUrl { get; set; } = ""; string RefrushTokenUrl { get; set; } = "api/info?_="; string SingleAddUrl { get; set; } = "api/ppp/one"; string ReAddUrl { get; set; } = "api/ppp/renewal"; string MuiltAddUrl { get; set; } = "api/ppp/batch"; string RefundUrl { get; set; } = "api/ppp/delete"; string OnlineUrl { get; set; } = "api/ppp/oln?user={0}&_={1}"; string GetAccount { get; set; } = "index.php/admin/users/users/grid/datagrid.html"; string KIllUrl { get; set; } = "api/ppp/oln/stop"; string UpdateUrl { get; set; } = "api/ppp/update"; string DeleteAccountUrl { get; set; } = "api/ppp/delete?user=hl&_=1583126809671"; string InfoUrl = "api/ppp?page=1&user="; string TestAddUrl { get; set; } = "api/ppp/test"; IHttpClientFactory m_HttpClientFactory; public AgentClient3Service(IHttpClientFactory httpClientFactory):base(httpClientFactory) { m_HttpClientFactory = httpClientFactory; } public override async Task RefrushStatus() { int status = 0; if (this.Token.Has()) { var client = CreateHttpClient(); if (this.RefrushTokenUrl.Has()) { var getResp = await client.GetAsync(this.RefrushTokenUrl+DateTime.Now.GetUnixTimeStamp()); var content = await getResp.Content.ReadAsStringAsync(); if (getResp.StatusCode == HttpStatusCode.OK && content.IndexOf("\"ret\":200") != -1) { status = 1; } else { Debug.WriteLine("离线"); Debug.WriteLine(content); } } } return status; } public override async Task Login(AgentLoginRequest request) { var client = CreateHttpClient(false); var map = new Dictionary(){ {"username",request.Account }, {"password",request.Pwd }, {"autologon","false"}, }; LogHelper.Info("Login", map.ToJson()); var resp = await client.PostAsForm(this.LoginUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.IndexOf("登陆成功")!= -1) { request.Key = this.GetCookie(resp, "_dailissid"); return new ApiResult(request.Key); } return new ApiResult(ResultCode.C_VISITOR_CHECKING, "登录失败"); } public override bool CheckAccount(int productId,List accounts) { return false; } /// /// 新开 /// /// /// /// /// public override async Task NewAccount(string packageKey, string account, string pwd, int connCount = 1, int accountType = 1, int payCount = 1) { if (accountType == 0)//新开测试号 { return await NewTestAccount(account, pwd); } var client = CreateHttpClient(); //user: ceshiyiha // passwd: ceshiyiha // conn_max: 1 // type: m // paynum: 2 // details: ce var map = new Dictionary(){ {"user",account }, {"passwd",pwd }, {"type",packageKey }, {"conn_max",connCount.ToString() }, {"paynum",payCount.ToString()}, {"details","hl" }, }; var title = GetOpTitle("NewAccount", account); LogHelper.Info(title, map.ToJson()); try { var resp = await client.PostAsForm(this.SingleAddUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("开户成功") != -1) { var client_s = m_HttpClientFactory.CreateClient("agentClient"); client_s.BaseAddress = new System.Uri("https://m.ipduoduo.com"); AddCookie(client_s, "_memberssid=155c59d4cc026809755a22743e5464ca6a02bd23616df95179a328e370df9935523fec6e0f5663f36c6e599701387f7d8b36008f576e083f68cecd34"); var map_s = new Dictionary(){ {"text",account+","+pwd }, }; var resp_s = await client_s.PostAsForm("/api/import", map_s); var content_s = await resp.Content.ReadAsStringAsync(); return new ApiResult(ResultCode.C_SUCCESS); } else { LogHelper.Error(title, content); return new ApiResult(ResultCode.C_INVALID_ERROR, "开户失败"); } } catch (Exception ex) { LogHelper.Error(title, ex.Message); return new ApiResult(ResultCode.C_INVALID_ERROR, "开户失败"); } } public async Task NewTestAccount(string account, string pwd) { var client = CreateHttpClient(); var map = new Dictionary(){ {"user",account }, {"passwd",pwd }, }; var title = GetOpTitle("NewTestAccount", account); LogHelper.Info(title, map.ToJson()); try { var resp = await client.PostAsForm(this.TestAddUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("开户成功") != -1) { return new ApiResult(ResultCode.C_SUCCESS); } else { LogHelper.Error(title, content); return new ApiResult(ResultCode.C_INVALID_ERROR, "开户失败"); } } catch (Exception ex) { LogHelper.Error(title, ex.Message); return new ApiResult(ResultCode.C_INVALID_ERROR, "开户失败"); } } /// /// 批量新开 /// /// /// /// /// public override async Task NewMuiltAccount(string packageKey, string account, string pwd, int connCount = 1, int accountType = 1, int startNum = 0, int endNum = 1) { var client = CreateHttpClient(); var map = new Dictionary(){ {"user",account }, {"passwd",pwd }, {"form",startNum.ToString() }, {"to",endNum.ToString() }, {"type",packageKey }, {"conn_max",connCount.ToString() }, {"paynum","1" }, {"details","hl" }, }; var title = GetOpTitle("NewMuiltAccount", account); LogHelper.Info(title, map.ToJson()); try { var resp = await client.PostAsForm(this.MuiltAddUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("开户成功") != -1) { return new ApiResult(1); } else { LogHelper.Error(title, content); return new ApiResult(ResultCode.C_INVALID_ERROR, "开户失败"); } } catch (Exception ex) { LogHelper.Error(title, ex.Message); return new ApiResult(ResultCode.C_INVALID_ERROR, "开户失败"); } } /// /// 续费 /// /// /// /// /// public override async Task NewReAccount(string packageKey, string account, int connCount, int payCount = 1) { var client = CreateHttpClient(); var map = new Dictionary(){ {"user",account }, {"type",packageKey }, {"paynum",payCount.ToString()}, }; var title = GetOpTitle("NewReAccount", account); LogHelper.Info(title, map.ToJson()); try { var resp = await client.PostAsForm(this.ReAddUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("续费成功") != -1) { return new ApiResult(1); } else { LogHelper.Error(title, content); return new ApiResult(ResultCode.C_INVALID_ERROR, "续费失败"); } } catch (Exception ex) { LogHelper.Error(title, ex.Message); return new ApiResult(ResultCode.C_INVALID_ERROR, "续费失败"); } } /// /// 删除账号 /// /// /// /// public override async Task DeleteAccount(string account) { var client = CreateHttpClient(); var map = new Dictionary(){ {"usernames",account } }; LogHelper.Info(GetOpTitle("DeleteAccount", account), map.ToJson()); try { var resp = await client.PostAsForm(this.SingleAddUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("删除成功") != -1) { return true; } else { LogHelper.Error(GetOpTitle("DeleteAccount", account), content); } } catch (Exception ex) { LogHelper.Error(GetOpTitle("DeleteAccount", account), ex); } return false; } /// /// 得到账号信息 /// /// /// /// public override async Task> GetAccountInfo(string account,bool isTest) { var client = CreateHttpClient(); var title = GetOpTitle("GetAccountInfo", account); var info = ""; try { var resp = await client.GetAsync(this.InfoUrl+account); var content = await resp.Content.ReadAsStringAsync(); info = content; JObject jo = (JObject)JsonConvert.DeserializeObject(content); var datas = jo["data"]["data"]; var row = datas?.FirstOrDefault(); var trData = new OriginAccountModel { User = row["user"].ToString(), Account = row["user"].ToString(), AccountType = row["type"].ToString(), Package ="", RegistTime = Convert.ToInt64(row["add_time"]).LoadFromUnixTimeStamp().AddHours(8).ToString(), EndTime =Convert.ToInt64(row["end_time"]).LoadFromUnixTimeStamp().AddHours(8).ToString(), ConnectCount = row["conn_max"].ToString(), Pwd = row["passwd"].ToString(), }; trData.RealEndTime = DateTime.Parse(trData.EndTime); var restDay = (trData.RealEndTime - DateTime.Now).Days; restDay = restDay < 0 ? 0 : restDay; if (restDay <= 1) trData.Package = "天"; else if(restDay <= 7) trData.Package = "周"; else trData.Package = "月"; return new ApiResult(trData); //var parser = new HtmlParser(); //var document = await parser.ParseDocumentAsync(content); //////table class="table table-bordered" //var trs = document.QuerySelectorAll("table[class='table table-bordered']>tr").ToList(); //// var trs= table.QuerySelectorAll("tr").ToList(); //if (trs.Count() > 1) //{ // var tr = trs.Skip(1).FirstOrDefault(); // var tdTexts = tr.QuerySelectorAll("td").Select(m => m.TextContent).ToList(); // //会员账号类型套餐注册日期过期日期连接数余额激活备注 // var trData = new OriginAccountModel // { // Account = tdTexts[0], // AccountType = tdTexts[1], // Package = tdTexts[2], // RegistTime = tdTexts[3], // EndTime = tdTexts[4], // ConnectCount = tdTexts[5], // Amount = tdTexts[6], // IsActive = tdTexts[7], // Remark = tdTexts[8], // }; // var href = tr.LastElementChild.QuerySelector("a")?.Attributes["href"]?.Value; // if (href.Has()) // { // var start = href.LastIndexOf('/'); // var end = href.IndexOf(".html"); // if (start != -1 && end != -1) // { // trData.Id = href.Substring(start, end - start); // } // } // return new ApiResult(trData); //} } catch (Exception ex) { LogHelper.Error(title, ex.Message+"-->info:"+ info); return new ApiResult(ResultCode.C_INVALID_ERROR, "查询失败"); } return new ApiResult(ResultCode.C_INVALID_ERROR, "没有查询到信息"); } /// /// 修改账号密码 /// /// /// /// /// public override async Task UpdateAccountPwd(string account,string pwd) { var client = CreateHttpClient(); var map = new Dictionary(){ {"user",account }, {"new_user",account}, {"passwd",pwd }, {"details","hl" }, }; LogHelper.Info(GetOpTitle("UpdateAccountPwd", account), map.ToJson()); try { var resp = await client.PostAsForm(this.UpdateUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("修改成功") != -1) { return true; } else { LogHelper.Error(GetOpTitle("UpdateAccountPwd", account), content); } } catch (Exception ex) { LogHelper.Error(GetOpTitle("UpdateAccountPwd", account), ex); } return false; } /// /// 退款 /// /// /// /// public override async Task Refund(string account, string packageKey, int days) { var client = CreateHttpClient(); var title = GetOpTitle("Refund", account); try { var resp = await client.GetAsync(this.RefundUrl+$"?user={account}&_={DateTime.Now.GetUnixTimeStamp()} "); var content = await resp.Content.ReadAsStringAsync(); content = System.Text.RegularExpressions.Regex.Unescape(content); if (content.Has() && content.IndexOf("删除成功") != -1) { return new ApiResult(1); } else { LogHelper.Error(title, content); return new ApiResult(ResultCode.C_INVALID_ERROR, "退款失败"); } } catch (Exception ex) { LogHelper.Error(title, ex.Message); return new ApiResult(ResultCode.C_INVALID_ERROR, "退款失败"); } } /// /// 是否在线 /// /// /// /// public override async Task>> OnLine(string account) { var client = CreateHttpClient(); var title = GetOpTitle("OnLine", account); var info = ""; try { string url = string.Format(this.OnlineUrl, account, DateTime.Now.GetUnixTimeStamp()); var resp = await client.GetAsync(url); var content = await resp.Content.ReadAsStringAsync(); info = content; JObject jo = (JObject)JsonConvert.DeserializeObject(content); var datas = jo["data"]["data"]; var rows = datas.Children(); var retData = new List(); if (datas!=null&& rows.Count() > 0) { foreach (var row in rows) { var trData = new OriginAccountOnlineModel() { Account = account, OnLine = 1, LoginIP = row["client_ip"].ToString(), ServerIP=row["nas_name"].ToString(), LoginTime=row["add_time"].ToString(), Id = row["id"].ToString() }; trData.LoginTime = (DateTime.Now - trData.LoginTime.LoadFromUnixTimeStamp().Value).ToString("d\\.hh\\:mm\\:ss"); retData.Add(trData); } } return new ApiResult>(retData); } catch (Exception ex) { LogHelper.Error(title, ex.Message + "-->info:" + info); return await base.OnLine(account); } } /// /// 踢号 /// /// /// /// public override async Task KillOut( string id) { // formData id: d9bd8ac88e31d43b0507f5f66927c2ee var client = CreateHttpClient(); var map = new Dictionary(){ {"id",id }, }; LogHelper.Info(GetOpTitle("KillOut", id), map.ToJson()); try { var resp = await client.PostAsForm(this.KIllUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("踢线成功") != -1) { return true; } else { LogHelper.Error(GetOpTitle("KillOut", id), content); } } catch (Exception ex) { LogHelper.Error(GetOpTitle("KillOut", id), ex); } return false; } /// /// 是否存在 /// /// /// public override async Task Exist(string account) { // return false; // var client = CreateHttpClient(); // var map = new Dictionary(){ // {"groupname",account } // }; // var title = GetOpTitle("Exist", account); // LogHelper.Info(title, map.ToJson()); // var ret = await this.NewAccount("w", account, "123"); // if (ret.Code == ResultCode.C_SUCCESS) // { // await this.Refund(account, "w", 1); // return false; // } return false; } } }