From 306b5c3d15850279227a30355bc47e848339e81b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E7=A3=8A=20=E5=BC=A0?= Date: Mon, 22 Nov 2021 16:06:31 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=88=A4=E6=96=AD=E6=96=B0?= =?UTF-8?q?=E6=97=A7=E7=94=A8=E6=88=B7=202.=E5=A2=9E=E5=8A=A0=E5=A4=87?= =?UTF-8?q?=E6=B3=A8(=E9=BB=98=E8=AE=A4=E6=89=8B=E6=9C=BA=E5=8F=B7?= =?UTF-8?q?=E6=88=96pt=5Fpin)=E5=8F=8A=E8=87=AA=E5=AE=9A=E4=B9=89=E5=A4=87?= =?UTF-8?q?=E8=B6=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InputWindow.xaml | 35 +++++++++++++ InputWindow.xaml.cs | 41 +++++++++++++++ JdLoginTool.csproj | 1 + MainWindow.xaml.cs | 124 +++++++++++++++++++++++++++++++++++--------- 4 files changed, 177 insertions(+), 24 deletions(-) create mode 100644 InputWindow.xaml create mode 100644 InputWindow.xaml.cs diff --git a/InputWindow.xaml b/InputWindow.xaml new file mode 100644 index 0000000..bec7e53 --- /dev/null +++ b/InputWindow.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + diff --git a/InputWindow.xaml.cs b/InputWindow.xaml.cs new file mode 100644 index 0000000..dfb0242 --- /dev/null +++ b/InputWindow.xaml.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace JdLoginTool.Wpf +{ + /// + /// InputWindow.xaml 的交互逻辑 + /// + public partial class InputWindow : Window + { + public InputWindow() + { + InitializeComponent(); + } + + private void OkClicked(object sender, RoutedEventArgs e) + { + this.DialogResult = true; + } + + private void CancelClicked(object sender, RoutedEventArgs e) + { + this.DialogResult = false; + } + + public string Remarkers + { + get { return this.TextBox.Text; } + set { this.TextBox.Text = value; } + } + } +} diff --git a/JdLoginTool.csproj b/JdLoginTool.csproj index 2797639..34fdf87 100644 --- a/JdLoginTool.csproj +++ b/JdLoginTool.csproj @@ -34,6 +34,7 @@ + diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 3434c2d..b5bae72 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -3,8 +3,11 @@ using System.Linq; using System.Net; using System.Text.Json.Serialization; +using System.Threading.Tasks; using System.Windows; +using System.Windows.Input; using CefSharp; +using HtmlAgilityPack; using Newtonsoft.Json; using RestSharp; @@ -16,12 +19,28 @@ public MainWindow() { InitializeComponent(); Browser.TitleChanged += Browser_TitleChanged; + Browser.KeyUp += TryGetUserInputPhone; this.Loaded += (o, e) => { Browser.Address = "m.jd.com"; }; + } + private async void TryGetUserInputPhone(object sender, KeyEventArgs e) + { + string script = "function get_phone(){\r\n" + + "return document.querySelector('#app>div>div:nth-child(3)>p:nth-child(1)>input').value;\r\n" + + "}\r\n" + + "get_phone();"; + await Browser.EvaluateScriptAsync(script).ContinueWith(new Action>((respA) => + { + var resp = respA.Result; //respObj此时有两个属性: name、age + dynamic respObj = resp.Result; + PhoneNumber = (string)resp.Result; + })); + } + public String PhoneNumber { get; set; } private void Browser_TitleChanged(object sender, DependencyPropertyChangedEventArgs e) { string ck = ""; @@ -30,7 +49,7 @@ private void Browser_TitleChanged(object sender, DependencyPropertyChangedEventA ICookieManager cm = Browser.WebBrowser.GetCookieManager(); var visitor = new TaskCookieVisitor(); cm.VisitAllCookies(visitor); - var cks = visitor.Task.Result; + var cks = visitor.Task.Result; ck = cks.Where(cookie => cookie.Name == "pt_key" || cookie.Name == "pt_pin").Aggregate(ck, (current, cookie) => current + $"{cookie.Name}={System.Web.HttpUtility.UrlEncode(cookie.Value)};"); if (ck.Contains("pt_key") && ck.Contains("pt_pin")) { @@ -41,6 +60,7 @@ private void Browser_TitleChanged(object sender, DependencyPropertyChangedEventA cm.DeleteCookies(".jd.com", "pt_pin"); Browser.Address = "m.jd.com"; } + //todo:检测当前页面内容,如果存在 })); } @@ -48,10 +68,7 @@ private void Browser_TitleChanged(object sender, DependencyPropertyChangedEventA private void UploadToQingLong(string ck) { var qlUrl = ConfigurationManager.AppSettings["qlUrl"]; - if (string.IsNullOrWhiteSpace(qlUrl)) - { - return; - } + if (string.IsNullOrWhiteSpace(qlUrl)) return; try { if (string.IsNullOrWhiteSpace(qlToken)) @@ -63,18 +80,22 @@ private void UploadToQingLong(string ck) MessageBox.Show("登陆青龙失败:获取Token失败"); return; } - //todo:检测是新ck还是老ck,即是否是更新. - //暂不实现,是否登陆重复先自己搞吧. - - - var client = new RestClient($"{qlUrl}/open/envs"); - client.Timeout = -1; - var request = new RestRequest(Method.POST); + var jck = JDCookie.parse(ck); + var input = new InputWindow(); + string remarks = PhoneNumber ?? jck.ptPin;//正常应该就是手机号了,如果开发的有问题,拿错手机号会用ptPin + input.Remarkers = remarks; + if (input.ShowDialog() == true) + { + remarks = input.Remarkers; + } + var client = new RestClient($"{qlUrl}/open/envs") { Timeout = -1 }; + var request = new RestRequest(); request.AddHeader("Authorization", $"Bearer {qlToken}"); request.AddHeader("Content-Type", "application/json"); - var body = $"[{{\"name\":\"JD_COOKIE\",\"value\":\"{ck}\"}}]"; + var body = $"[{{\"name\":\"JD_COOKIE\",\"value\":\"{ck}\",\"remarks\":\"{remarks}\"}}]"; request.AddParameter("application/json", body, ParameterType.RequestBody); - IRestResponse response = client.Execute(request); + request.Method = CheckIsNewUser(qlUrl, ck) ? Method.POST : Method.PUT; + var response = client.Execute(request); Console.WriteLine(response.Content); MessageBox.Show(response.Content, "上传青龙成功(Cookie已复制到剪切板)"); } @@ -84,7 +105,30 @@ private void UploadToQingLong(string ck) } } - + private bool CheckIsNewUser(string qlUrl, string ck) + { + var newCk = JDCookie.parse(ck); + var client = new RestClient($"{qlUrl}/open/envs"); + client.Timeout = -1; + var request = new RestRequest(Method.GET); + request.AddHeader("Authorization", $"Bearer {qlToken}"); + request.AddHeader("Content-Type", "application/json"); + var response = client.Execute(request); + var result = JsonConvert.DeserializeObject(response.Content); + if (result==null) + { + return true; + } + if (result.code != 200) + { + throw new Exception($"请求返回失败,代码:{result.code}"); + } + if (result.data.Any(jck => JDCookie.parse(jck.value).ptPin == newCk.ptPin)) + { + return false; + } + return true; + } private void GetQingLongToken() { @@ -149,19 +193,28 @@ public class JDCookie public static JDCookie parse(String ck) { JDCookie jdCookie = new JDCookie(); - String[] split = ck.Split(";"); - foreach (var s in split) + try { - if (s.StartsWith("pt_key")) - { - jdCookie.ptKey = (s.Split("=")[1]); - } - if (s.StartsWith("pt_pin")) + + String[] split = ck.Split(";"); + foreach (var s in split) { - jdCookie.ptPin = (s.Split("=")[1]); + if (s.StartsWith("pt_key")) + { + jdCookie.ptKey = (s.Split("=")[1]); + } + if (s.StartsWith("pt_pin")) + { + jdCookie.ptPin = (s.Split("=")[1]); + } } + return jdCookie; + } + catch (Exception e) + { + Console.WriteLine(e); + jdCookie = new JDCookie(); } - return jdCookie; } @@ -172,4 +225,27 @@ public override String ToString() } } + public class GetCookiesResult + { + public int code { get; set; } + public Datum[] data { get; set; } + } + + + + + + + public class Datum + { + public string value { get; set; } + public string _id { get; set; } + public long created { get; set; } + public int status { get; set; } + public string timestamp { get; set; } + public float position { get; set; } + public string name { get; set; } + public string remarks { get; set; } + } + }