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 { //老鹰A组 public class AgentClient2Service : AgentClientBaseService { string LoginUrl { get; set; } = "index.php/admin/index/login.html"; string LoginCodeUrl { get; set; } = "main/imgcode.html"; string RefrushTokenUrl { get; set; } = "index.php/admin/index/public_welcome.html";// ""; string SingleAddUrl { get; set; } = "index.php/admin/users/useradd.html"; string SingleReAddUrl { get; set; } = "index.php/admin/users/userrenew.html"; string MuiltAddUrl { get; set; } = "index.php/admin/users/usersadd.html"; string RefundUrl { get; set; } = "index.php/admin/users/userrefund.html"; string OnlineUrl { get; set; } = ""; string GetAccount { get; set; } = "index.php/admin/users/users/grid/datagrid.html"; string KIllUrl { get; set; } = "index.php/admin/users/useroffline.html"; string UpdateUrl { get; set; } = "index.php/admin/users/useredit.html"; string DeleteAccountUrl { get; set; } = "index.php/admin/users/userdelete.html"; string searchAccountUrl = "index.php/admin/users/users/grid/datagrid.html"; string existCheckUrl = "index.php/admin/users/public_checkusername.html"; string refrushCookie = "admin/Common/getCookie"; string sessionlife = "index.php/admin/index/public_sessionlife.html"; IHttpClientFactory m_HttpClientFactory; public AgentClient2Service(IHttpClientFactory httpClientFactory):base(httpClientFactory) { m_HttpClientFactory = httpClientFactory; } public async Task RefrushStatus1() { int status = 0; if (this.Token.Has()) { var client = CreateHttpClient(); if (this.RefrushTokenUrl.Has()) { var getResp = await client.GetAsync(this.RefrushTokenUrl); var content = await getResp.Content.ReadAsStringAsync(); if (getResp.StatusCode == HttpStatusCode.OK && content.IndexOf("正常登录") == -1) { status = 1; } else { Debug.WriteLine("离线"); Debug.WriteLine(content); } } } return status; } public override async Task RefrushStatus() { var map = new Dictionary(){ {"key","1" } }; int status = 0; var client = CreateHttpClient(); client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest"); var getResp = await client.PostAsForm(this.sessionlife, map); var content = await getResp.Content.ReadAsStringAsync(); content= System.Text.RegularExpressions.Regex.Unescape(content); if (getResp.StatusCode == HttpStatusCode.OK && content.IndexOf("登录后台") == -1) { status = 1; } //else //{ // var request = new AgentLoginRequest() // { // Account = this.Product.Account, // Pwd = this.Product.Pwd // }; // var ret = await this.Login(request); // if (ret.Code == ResultCode.C_SUCCESS) // { // this.Product.Token = ret.Data.ToString(); // status = 1; // } // else // { // Debug.WriteLine("离线"); // } //} client.DefaultRequestHeaders.Remove("X-Requested-With"); return status; } private async Task GetHomeCookie() { var client = CreateHttpClient(false); if (this.LoginUrl.NotHas()) return ""; var getResp = await client.GetAsync(this.LoginUrl); var cookies = this.GetCookies(getResp); cookies=cookies.Replace("path=/;", "").Replace("httponly", "").Trim(); return cookies; } public override async Task Login(AgentLoginRequest request) { var client = CreateHttpClient(false); var map = new Dictionary(){ {"managername",request.Account }, {"password",request.Pwd }, // {"authnum",request.Code }, }; LogHelper.Info("Login", map.ToJson()); request.Key = await GetHomeCookie(); AddCookie(client, request.Key); var resp = await client.PostAsForm(this.LoginUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.IndexOf("index.html") == -1) { return new ApiResult(ResultCode.C_VISITOR_CHECKING, "登录失败"); } return new ApiResult(request.Key); } 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) { var client = CreateHttpClient(); var map = new Dictionary(){ {"info[groupid]","2001" }, {"info[srvid]","6" }, {"info[username]",account }, {"info[password]",pwd }, {"info[cycle]",packageKey }, {"info[simuse]",connCount.ToString() }, {"info[usetime]","1" }, {"info[tryuse]",accountType==1?"0":"1"}, }; 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) { 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 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(){ {"info[groupid]","2001" }, {"info[srvid]","6" }, {"info[username_header]",account }, {"info[username_start]",startNum.ToString() }, {"info[username_end]",endNum.ToString() }, {"info[pwdtype]","0" }, {"info[password]",pwd }, {"info[repassword]",pwd }, {"info[cycle]",packageKey }, {"info[simuse]",connCount.ToString() }, {"info[usetime]","1" }, {"info[tryuse]","0" }, }; 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(); Dictionary priceMap = new Dictionary() { {"daycardprice",3}, {"weekcardprice",15}, {"monthcardprice",60}, }; var price = priceMap[packageKey]; var totalAmount = price * connCount; var map = new Dictionary(){ {"info[username]",account }, {"info[cycle]",packageKey }, {"info[simuse]",connCount.ToString()}, {"info[usetime]","1" }, {"info[usemoney]",totalAmount.ToString() }, }; var title = GetOpTitle("NewReAccount", account); LogHelper.Info(title, map.ToJson()); try { var resp = await client.PostAsForm(this.SingleReAddUrl, 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 map = new Dictionary(){ {"search[username]",account }, {"page","1" }, {"rows","25" }, }; var title = GetOpTitle("GetAccountInfo", account); try { var content = await client.PostAsFormGetString(this.searchAccountUrl, map); JObject jo = (JObject)JsonConvert.DeserializeObject(content); var rows = jo["rows"].ToArray(); var row = rows.FirstOrDefault(); var trData = new OriginAccountModel { User = row["groupname"].ToString(), Account = row["username"].ToString(), AccountType = row["username"].ToString(), Package = row["cycle"].ToString(), RegistTime = row["createdon"].ToString(), EndTime = row["expiration"].ToString(), ConnectCount = row["simuse"].ToString(), Pwd=row["open_password"].ToString(), // Amount = row["cycle"].ToString(), RestTime = row["havetime"].ToString(), IsActive = row["status"].ToString(), Remark = row["comment"].ToString(), OnLine = row["status"].ToString().IndexOf("在线") == -1 ? 0 : 1, LoginTime= row["acctstarttime"].ToString(), LoginServer= row["nasipaddress"].ToString(), }; trData.RealEndTime = DateTime.Parse(trData.EndTime); return new ApiResult(trData); } catch (Exception ex) { LogHelper.Error(title, ex.Message); return new ApiResult(ResultCode.C_INVALID_ERROR, "查询失败"); } } /// /// 修改账号密码 /// /// /// /// /// public override async Task UpdateAccountPwd(string account,string pwd) { var client = CreateHttpClient(); var map = new Dictionary(){ {"info[groupid]","2001" }, {"info[srvid]","6" }, {"info[username]",account }, {"info[password]",pwd }, }; 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 map = new Dictionary(){ {"info[username]",account }, {"info[cycle]",packageKey }, {"info[expiretime]",days.ToString() }, }; var title = GetOpTitle("Refund", account); LogHelper.Info(title, map.ToJson()); try { var resp = await client.PostAsForm(this.RefundUrl, 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>> OnLine(string account) { var accountInfo =await this.GetAccountInfo(account, false); if (accountInfo.Code != ResultCode.C_SUCCESS) return await base.OnLine(account); var list = new List(); if (accountInfo.Data.OnLine == 1) { list.Add(new OriginAccountOnlineModel() { Account = account, OnLine = accountInfo.Data.OnLine, Id = account, LoginTime= accountInfo.Data.LoginTime, LoginIP= accountInfo.Data.LoginServer }); } return new ApiResult>(list); } /// /// 踢号 /// /// /// 账号 /// public override async Task KillOut( string account) { var client = CreateHttpClient(); client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest"); var map = new Dictionary(){ {"usernames",account }, }; var title = GetOpTitle("KillOut", account); LogHelper.Info(title, 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(title, content); } } catch (Exception ex) { LogHelper.Error(title, ex.Message); } return false; } /// /// 是否存在 /// /// /// public override async Task Exist(string account) { var client = CreateHttpClient(); var map = new Dictionary(){ {"username",account } }; var title = GetOpTitle("Exist", account); LogHelper.Info(title, map.ToJson()); try { var resp = await client.PostAsForm(this.existCheckUrl, map); var content = await resp.Content.ReadAsStringAsync(); if (content.Has() && content.IndexOf("false") != -1) { return true; } else { return false; } } catch (Exception ex) { LogHelper.Error(title, ex.Message); return false; } } } }