using BBWYB.Common.Extensions; using BBWYB.Server.Model.Db; using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.Wpf; using System.IO; using System.Reflection.Metadata; using System.Text; using System.Text.RegularExpressions; using System.Windows; using io = System.IO; namespace BBWYB.PurchaserCapture { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private IFreeSql fsql; private WebView2 wb2; private string purchaserId; private string purchaserMemberId; public MainWindow() { InitializeComponent(); fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwyb;charset=utf8;sslmode=none;").Build(); this.Loaded += MainWindow_Loaded; } private async void MainWindow_Loaded(object sender, RoutedEventArgs e) { wb2 = new WebView2(); grid.Children.Add(wb2); var wb2Setting = CoreWebView2Environment.CreateAsync(userDataFolder: io.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "AdvUnion.Capturer")).Result; wb2.CoreWebView2InitializationCompleted += Wb2_CoreWebView2InitializationCompleted; await wb2.EnsureCoreWebView2Async(wb2Setting); wb2.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All); wb2.CoreWebView2.WebResourceResponseReceived += CoreWebView2_WebResourceResponseReceived; wb2.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested; wb2.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted; } private void CoreWebView2_NavigationCompleted(object? sender, CoreWebView2NavigationCompletedEventArgs e) { var scriptBuilder = new StringBuilder(); scriptBuilder.AppendLine("var divElement = document.querySelector('div[style=\"position: relative; display: flex; flex-direction: row;\"]');"); scriptBuilder.AppendLine("var mouseeoverEvent = new MouseEvent('mouseover', {'view': window,'bubbles': true,'cancelable': false});"); scriptBuilder.AppendLine("divElement.dispatchEvent(mouseeoverEvent);"); wb2.CoreWebView2.ExecuteScriptAsync(scriptBuilder.ToString()); } private async void CoreWebView2_WebResourceResponseReceived(object? sender, CoreWebView2WebResourceResponseReceivedEventArgs e) { if (e.Request.Method.ToUpper() != "GET" || !e.Request.Uri.StartsWith("https://h5api.m.1688.com/h5/mtop.alibaba.alisite.cbu.server.moduleasyncservice") || !e.Request.Uri.Contains("wp_pc_common_header")) { Console.WriteLine($"不满足URL规则,已忽略 {e.Request.Uri}"); return; } if (e.Response.StatusCode != 200) { Console.WriteLine($"HttpCode {e.Response.StatusCode},已忽略 {e.Request.Uri}"); return; } var stream = await e.Response.GetContentAsync(); var sr = new StreamReader(stream); var content = sr.ReadToEnd(); sr.Dispose(); var match = Regex.Match(content, "\"bizTypeName\":\\s?\"(.*)\",\"isShili"); if (!match.Success) { Console.WriteLine($"bizTypeName解析失败,已忽略 {e.Request.Uri}"); return; } var bizTypeName = match.Groups[1].Value; Console.WriteLine(bizTypeName); if (!string.IsNullOrEmpty(purchaserId)) { if (!string.IsNullOrEmpty(purchaserMemberId)) { if (!content.Contains(purchaserMemberId)) { Console.WriteLine($"memberId验证失败,已忽略 {e.Request.Uri}"); return; } } Console.WriteLine($"更新采购商{purchaserId}"); fsql.Update(purchaserId).Set(p => p.ManagmentModeText, bizTypeName).ExecuteAffrows(); } } private void CoreWebView2_WebResourceRequested(object? sender, CoreWebView2WebResourceRequestedEventArgs e) { } private void Wb2_CoreWebView2InitializationCompleted(object? sender, CoreWebView2InitializationCompletedEventArgs e) { } private void SetInfo(string msg) { this.Dispatcher.Invoke(() => txtInfo.Text = msg); } private void Navigate(string url) { this.Dispatcher.Invoke(() => { txt_url.Text = url; wb2.CoreWebView2.Navigate(url); }); } private void btn_start_Click(object sender, RoutedEventArgs e) { Task.Factory.StartNew(() => { var sk = "order"; //var sk = "consign"; var pspList = fsql.Select() .InnerJoin((psp2, p) => psp2.PurchaserId == p.Id) .Where((psp2, p) => string.IsNullOrEmpty(p.ManagmentModeText)) .GroupBy((psp2, p) => new { p.Id, p.MemberId }) .WithTempQuery(g => new { MaxId = g.Max(g.Value.Item1.Id), PurchaserId = g.Key.Id, MemberId = g.Key.MemberId }) .From() .InnerJoin((psp2, psp1) => psp2.MaxId == psp1.Id) .OrderByDescending((psp2, psp1) => psp1.Id) .ToList((psp2, psp1) => new { psp1.PurchaserId, psp2.MemberId, psp1.PurchaseProductId }); for (var i = 0; i < pspList.Count; i++) { SetInfo($"{i + 1}/{pspList.Count}"); purchaserId = pspList[i].PurchaserId; purchaserMemberId = pspList[i].MemberId; var url = $"https://detail.1688.com/offer/{pspList[i].PurchaseProductId}.html?clickid={Guid.NewGuid().ToString().Md5Encrypt()}&sessionid={Guid.NewGuid().ToString().Md5Encrypt()}&sk={sk}"; Navigate(url); Thread.Sleep(10000); } }); } } }