You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
8.3 KiB

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
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
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;
wb2.CoreWebView2.Navigate("https://www.1688.com");
}
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;
}
try
{
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.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"更新采购商{purchaserId}");
Console.ResetColor();
fsql.Update<Purchaser>(purchaserId).Set(p => p.ManagmentModeText, bizTypeName).ExecuteAffrows();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
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 select = fsql.Select<OrderPurchaseInfo, Purchaser>()
.InnerJoin((opi, p) => opi.PurchaserId == p.Id)
.Where((opi, p) => string.IsNullOrEmpty(p.ManagmentModeText))
.GroupBy((opi, p) => new { p.Id, p.MemberId })
.WithTempQuery(g => new
{
MaxPoId = g.Max(g.Value.Item1.PurchaseOrderId),
PurchaserId = g.Key.Id,
g.Key.MemberId
})
.From<OrderPurchaseSkuInfo>()
.InnerJoin((opi1, ops) => opi1.MaxPoId == ops.PurchaseOrderId)
.GroupBy((opi1, ops) => new { opi1.PurchaserId, opi1.MemberId, opi1.MaxPoId, ops.PurchaseProductId });
var sql = select.ToSql(g => new { g.Key.PurchaserId, g.Key.MemberId, g.Key.MaxPoId, g.Key.PurchaseProductId });
var pspList = select.ToList(g => new { g.Key.PurchaserId, g.Key.MemberId, g.Key.MaxPoId, g.Key.PurchaseProductId });
//var pspList = fsql.Select<PurchaseSchemeProduct, Purchaser>()
// .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<PurchaseSchemeProduct>()
// .InnerJoin((psp2, psp1) => psp2.MaxId == psp1.Id)
// .OrderByDescending((psp2, psp1) => Guid.NewGuid())
// .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);
}
});
}
}
}