• wpf使用CefSharp.OffScreen模拟网页登录,并获取身份cookie


    框架信息:

    CefSharp.OffScreen.NETCore 119.1.20

    在这里插入图片描述

    MainWindow.xaml

    <Window x:Class="Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:Wpf_CHZC_Img_Identy_ApiDataGet"
            mc:Ignorable="d"
            Loaded="Window_Loaded"
            WindowStartupLocation="CenterScreen"
            Title="XXXX数据爬取(风险作业)" Height="900" Width="1000"  >
        <Window.Resources>
            <Style TargetType="DockPanel" x:Key="DockPanel1">
                <Setter Property="Margin" Value="0,20,0,0"></Setter>
                <Setter Property="FlowDirection" Value="LeftToRight"></Setter>
                <!--<Setter Property="DockPanel." Value="LeftToRight"></Setter>-->
            </Style>
            <Style TargetType="StackPanel" x:Key="StackPanel1">
                <Setter Property="Margin" Value="0,15,0,0"></Setter>
                <Setter Property="Orientation" Value="Horizontal"></Setter>
                <!--<Setter Property="DockPanel." Value="LeftToRight"></Setter>-->
            </Style>
            <Style TargetType="Label" x:Key="Label2">
                <Setter Property="FontSize" Value="18"></Setter>
            </Style>
            <Style TargetType="ComboBox"  >
                <Setter Property="FontSize" Value="18"></Setter>
            </Style>
        </Window.Resources>
        <Grid Margin="20">
            <StackPanel   >
                <Label  Content="设置时间点执行爬取数据,爬取成功发送到甲甲转发系统" FontWeight="Bold" FontSize="24"/>
                <StackPanel  Style="{StaticResource StackPanel1}"  >
                    <Label Style="{StaticResource Label2}">时间1,时分:</Label>
                    <ComboBox  Name="comboxHour"   Width="100" SelectionChanged="comboxHour_SelectionChanged"     />
                    <ComboBox   Name="comboxMinute"  ItemsSource="{Binding Minute}"  Width="100" Margin="5,0,0,0" SelectionChanged="comboxHour_SelectionChanged"    />
                    <Button Name="btnGoPaqu" Content="立即爬取接口" Width="140" FontSize="18" Margin="5,0,0,0" Click="Button_Click"></Button>
                </StackPanel>
                <StackPanel Style="{StaticResource StackPanel1}"  >
                    <Label Style="{StaticResource Label2}">时间2,时分:</Label>
                    <!--<ComboBox  Name="comboxHour"  ItemsSource="{Binding Hour}" DisplayMemberPath="Name" SelectedValuePath="Value" Width="100" />-->
                    <ComboBox  Name="comboxHour2"   Width="100" SelectionChanged="comboxHour_SelectionChanged"    />
                    <ComboBox   Name="comboxMinute2"  Width="100" Margin="5,0,0,0" SelectionChanged="comboxHour_SelectionChanged"    />
                   
                    <!--显示是否在工作-->
                    <TextBlock Name="lamp" Width="40"  Background="Magenta" Margin="50,0,0,0" DockPanel.Dock="Left" ></TextBlock>
                </StackPanel>
                <StackPanel  Style="{StaticResource StackPanel1}"  >
                    <Label Style="{StaticResource Label2}">时间3,时分:</Label>
                    <ComboBox  Name="comboxHour3"   Width="100"  SelectionChanged="comboxHour_SelectionChanged"    />
                    <ComboBox   Name="comboxMinute3"    Width="100" Margin="5,0,0,0" DockPanel.Dock="Left" SelectionChanged="comboxHour_SelectionChanged"    />
                </StackPanel>
                <StackPanel Style="{StaticResource StackPanel1}"  >
                    <Label Style="{StaticResource Label2}">时间4,时分:</Label>
                    <ComboBox  Name="comboxHour4"   Width="100"  SelectionChanged="comboxHour_SelectionChanged"    />
                    <ComboBox   Name="comboxMinute4"    Width="100"  Margin="5,0,0,0"   SelectionChanged="comboxHour_SelectionChanged"    />
                </StackPanel>
                <DockPanel Style="{StaticResource DockPanel1}">
                    <!--<ListView Name="listView" Height="100"/>-->
                    <TextBox Name="logMsg" FontSize="14" IsReadOnly="True" Height="300"  TextWrapping="WrapWithOverflow" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"  />
                </DockPanel>
                <Border BorderBrush="Blue" BorderThickness="1" Margin="0,10,0,0">
                    <StackPanel     >
                        <Label Content="发布成功后,甲甲文章信息:"  FontSize="14"></Label>
                        <TextBox Name="txtResult"  IsReadOnly="True"  Height="200" FontSize="14" TextWrapping="Wrap"></TextBox>
                    </StackPanel>
                </Border>
        
            </StackPanel>
        </Grid>
    </Window>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    MainWindow.xaml.cs

    
    using CefSharp;
    using CefSharp.OffScreen;
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Interop;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Xml.Linq;
    
    namespace Wpf_CHZC_Img_Identy_ApiDataGet
    {
        /// 
        /// Interaction logic for MainWindow.xaml
        /// 
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
      
                #endregion
    
    
    
                try
                {
                    var settings = new CefSettings()
                    {
                        CookieableSchemesExcludeDefaults = false,
                        PersistSessionCookies = true,
                        Locale = "zh-CN",
                        UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
    
                    };
    
                    //Perform dependency check to make sure all relevant resources are in our output directory.
                    Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
    
                }
                catch (Exception ex)
                {
                    LogHelpter.AddLog("Cef.Initialize初始化异常" + ex.Message, null, "error_Cef.Initialize");
                }
    
                //自动登陆,获取身份
                //this.Dispatcher.Invoke(new Action(async () =>
                //{
                //    LoginHandle loginHandle = new LoginHandle();
                //    await loginHandle.Login();
                //}));
    			
                EventHandler<string> func = (s, e) =>
                {
                    ShowMsg(e);
                };
    
                //订阅消息, 显示
                ApiJsonGetHandle.ShowLog += func;
    
                ApiJsonGetHandle.DoLogin +=  (s, e) =>
                {
                    this.Dispatcher.Invoke(new Action(async  () => {
                        //登录失效,从新登录
                        LoginHandle loginHandle = new LoginHandle();
                        await loginHandle.Login();
                    }));         
                };
    
                //订阅登录消息
                LoginHandle.ShowLog += func;
    
                //订阅消息,文章发布成功后,显示访问信息
                ApiJsonGetHandle.SetArticleInfo += (s, e) =>
                {
                    this.txtResult.Dispatcher.Invoke(new Action(() =>
                    {
                        string txtMsg = "更新时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +
                         System.Environment.NewLine + e;
                        this.txtResult.Text = txtMsg;
                    }));
    
                };
            }
    
    
            public List<ConfigNameValue> Hour = new List<ConfigNameValue>();
    
            public List<string> Minute = new List<string>();
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                Hour.Add(new ConfigNameValue() { Name = "请选择", Value = "" });
                for (int i = 0; i < 24; i++)
                {
                    string name = i.ToString();
                    if (i < 10)
                    {
                        name = "0" + i;
                    }
                    Hour.Add(new ConfigNameValue() { Name = name, Value = name });
                }
                //小时选择
                var hourList = Hour.Select(g => g.Name).ToList();
    
    
    
                //分钟选择
                Minute.Add("请选择");
                for (int i = 0; i < 60; i++)
                {
                    if (i < 10)
                    {
                        Minute.Add("0" + i);
                    }
                    else
                    {
                        Minute.Add(i.ToString());
                    }
                }
                //---------------第一个
                this.comboxHour.ItemsSource = hourList;
                comboxMinute.ItemsSource = Minute;
                this.comboxHour.SelectedIndex = 0;
                comboxMinute.SelectedIndex = 0;
    
                //---------------第二个
                comboxHour2.ItemsSource = hourList;
                comboxMinute2.ItemsSource = Minute;
    
                //设置默认选择
                this.comboxHour2.SelectedIndex = 0;
                comboxMinute2.SelectedIndex = 0;
    
                //---------------第三个
                comboxHour3.ItemsSource = hourList;
                comboxMinute3.ItemsSource = Minute;
    
                //设置默认选择
                this.comboxHour3.SelectedIndex = 0;
                comboxMinute3.SelectedIndex = 0;
    
                comboxHour4.ItemsSource = hourList;
                comboxMinute4.ItemsSource = Minute;
                this.comboxHour4.SelectedIndex = 0;
                comboxMinute4.SelectedIndex = 0;
    
                //listView.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
    
                //定时爬取
                var task = new Task(async () =>
                {
    
                    while (true)
                    {
                        string time1 = string.Empty;
                        string time2 = string.Empty;
                        string time3 = string.Empty;
                        string time4 = string.Empty;
                        comboxHour.Dispatcher.Invoke(() =>
                        {
                            time1 = comboxHour.SelectedValue + ":" + comboxMinute.SelectedValue + ":00";
                            time2 = comboxHour2.SelectedValue + ":" + comboxMinute2.SelectedValue + ":00";
                            time3 = comboxHour3.SelectedValue + ":" + comboxMinute3.SelectedValue + ":00";
                            time4 = comboxHour4.SelectedValue + ":" + comboxMinute4.SelectedValue + ":00";
    
                            //ShowMsg("执行时间点:" + time1 + "," + time2 + "," + time3);
                        });
    
                        string hhmm = DateTime.Now.ToString("HH:mm:ss");
                        if (
                        (!string.IsNullOrWhiteSpace(time1) && hhmm.Equals(time1))
                            || (!string.IsNullOrWhiteSpace(time2) && hhmm.Equals(time2))
                            || (!string.IsNullOrWhiteSpace(time3) && hhmm.Equals(time3))
                            || (!string.IsNullOrWhiteSpace(time4) && hhmm.Equals(time4))
                        )
                        {
                            ShowMsg("命中时间点" + hhmm + ",执行爬取数据...");
    
                            //到时间点,爬取记录,爬取很成功,推送到;
                            await DoGetHttpJsonDataAndPush();
                        }
    
                        //指示灯,显示是否在工作              
                        lamp.Dispatcher.InvokeAsync(() =>
                        {
                            if (DateTime.Now.Second % 2 == 0)
                            {
                                lamp.Background = System.Windows.Media.Brushes.LimeGreen;
                            }
                            else
                            {
                                lamp.Background = System.Windows.Media.Brushes.White;
                            }
                        });
                        Thread.Sleep(1000);
                    }
    
                }, creationOptions: TaskCreationOptions.LongRunning);
                task.Start();
     
            }
    
            /// 
            /// 立即爬取数据
            /// 
            /// 
            private async Task DoGetHttpJsonDataAndPush()
            {
                try
                {
    
    
                    //到时间点,爬取记录,爬取很成功,推送到;
                    var result = await ApiJsonGetHandle.PushToRongMeiTiAsync();
                    if (result.Code == 200)
                    {
                        txtResult.Dispatcher.InvokeAsync(() =>
                        {
                            //读取历史json
                            string json = ArticleLocalJsonReadFileHandle.ReadArticle();
                            string txtMsg = "更新时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +
                           System.Environment.NewLine + json;
                            txtResult.Text = txtMsg;
                        });
    
    
                        var info = result.Data as ArticleRongmeti;
                        ShowMsg("调用转发服务成功,ArticleId=" + info?.publish_article_id);
                    }
                }
                catch (Exception ex)
                {
                    var ex1 = ex.InnerException ?? ex;
                    string msg = ex1.Message;
                    ShowMsg("DoGetHttpJsonDataAndPush异常" + msg);
                    LogHelpter.AddLog("DoGetHttpJsonDataAndPush异常" + msg);
                }
            }
    
            private static StringBuilder stringBuilder = new StringBuilder();
    
            /// 
            /// 显示消息
            /// 
            /// 
            /// 创建时间:2023-11-20 15:11:17,
            public void ShowMsg(string msg)
            {
                stringBuilder.AppendLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ">" + msg);
    
                logMsg.Dispatcher.InvokeAsync(new Action(() =>
                {
                    logMsg.Text = stringBuilder.ToString();
                    //logMsg.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
                    if (!logMsg.IsFocused)
                    {
                        logMsg.ScrollToEnd();
                    }
    
                }));
    
                //清理历史字符串
                if (stringBuilder.Length > 10000000)
                {
                    stringBuilder.Remove(0, 200);
                }
            }
    
            //立即爬取,按钮触发
            private async void Button_Click(object sender, RoutedEventArgs e)
            {
                btnGoPaqu.IsEnabled = false;
                await DoGetHttpJsonDataAndPush();
     
                btnGoPaqu.IsEnabled = true;
            }
    
    
            private void comboxHour_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (comboxHour.SelectedValue.Equals("请选择"))
                {
                    e.Handled = true;
                    return;
                }
                //ShowMsg("选择了" + comboxHour.SelectedValue);
                TimeConfig timeConfig = new TimeConfig()
                {
                    Time1 = comboxHour.SelectedValue + ":" + comboxMinute.SelectedValue,
                    Time2 = comboxHour2.SelectedValue + ":" + comboxMinute2.SelectedValue,
                    Time3 = comboxHour3.SelectedValue + ":" + comboxMinute3.SelectedValue,
                    Time4 = comboxHour4.SelectedValue + ":" + comboxMinute4.SelectedValue,
                };
                //保存时间设置
                TimeConfigHandle.WriteTimeConfig(timeConfig);
            }
    
    
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317

    爬取逻辑

    using CefSharp.DevTools.Audits;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Net.Http.Json;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Controls.Ribbon.Primitives;
    using System.Windows.Documents;
    
    namespace Wpf_CHZC_Img_Identy_ApiDataGet
    {
        /// 
        /// api接口获取;XX数据获取
        /// 
        /// 创建时间:2023-11-20 09:09:55,
        public class ApiJsonGetHandle
        {
            /// 
            /// 显示消息
            /// 
            public static event EventHandler<string>? ShowLog;
    
            /// 
            /// 设置文章信息,到UI 控件展示
            /// 
            public static event EventHandler<string>? SetArticleInfo;
    
            /// 
            /// 执行登录,
            /// 
            public static event EventHandler DoLogin;
    
    
            /// 
            /// 成化总厂,接口数据获取
            /// 
            /// 创建时间:2023-11-20 09:09:55,
            public static async Task<string?> GetApiJsonAsync(string cookieValue, string dateStart, string dateEnd, string deptId)
            {
                try
                {
    
                    HttpClient httpClient = new HttpClient();
                    httpClient.Timeout = TimeSpan.FromSeconds(13);
    
                    //httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
                    httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + cookieValue);
    
                    ShowLog?.Invoke(1, "开始爬取接口数据");
    
                    //{"startDate":"2023-11-17","endDate":"2023-11-17","deptId":"XNeOZRJIHLSibwHOpFBkH3aL49ZEEVQq"}
                    //HttpContent httpContent = JsonContent.Create("{\"startDate\":\"" + dateStart + "\",\"endDate\":\"" + dateEnd + "\",\"deptId\":\"" + deptId + "\"}");
                    HttpContent httpContent = new StringContent("{\"startDate\":\"" + dateStart + "\",\"endDate\":\"" + dateEnd + "\",\"deptId\":\"" + deptId + "\"}");
    
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json") { CharSet = "utf-8" };
    
                    /*
           http://11.89.104.129:8099/api/system/workPermitScore/riskPublicityPage?pageSize=10&pageNum=1
                     */
                    string url = MyConfigReader.GetConfigValue("ay_chzc_fxzy_url");
                    var httpResponseMessage = await httpClient.PostAsync(url, httpContent);
                    if (!httpResponseMessage.IsSuccessStatusCode)
                    {
                        return null;
                    }
                    string json = await httpResponseMessage.Content.ReadAsStringAsync();
                    ShowLog?.Invoke(1, "获取到接口数据" + json);
                    //"code":401
                    if (json.IndexOf("\"code\":401") >= 0)
                    {
                        //登录失效,从新登录
                        DoLogin?.Invoke(1,new EventArgs());
                        //LoginHandle loginHandle = new LoginHandle();
                        //await loginHandle.Login();
    
                        //等待cookie写入完成
                        await Task.Delay(8 * 1000);
                    }
    
                    return json;
                }
                catch (Exception ex)
                {
                    ShowLog?.Invoke(1, "获取json数据失败:" + ex.Message);
    
                    LogHelpter.AddLog("获取json数据失败" + ex.ToString(), null, "ApiJsonGetHandle_error");
                    return null;
                }
            }
    
            /// 
            /// 推送数据到甲甲
            /// 
            /// 
            /// 创建时间:2023-11-20 11:14:40,
            public static async Task<ResultPublish> PushToRongMeiTiAsync()
            {
                int count = 1;
                int countRead = 1;
            Again:
                string cookieValue = LoginSuccessCookieHandle.ReadCookieValue();
                if (string.IsNullOrWhiteSpace(cookieValue))
                {
                    if (count <= 1)
                    {
                        //LoginHandle login = new LoginHandle();
                        //await login.Login();
                        DoLogin?.Invoke(1, new EventArgs());
    
                        count++;
                        goto Again;
                    }
                    if (countRead < 20)
                    {
                        cookieValue = LoginSuccessCookieHandle.ReadCookieValue();
                        Thread.Sleep(2000);
                        countRead++;
                        goto Again;
                    }
                    LogHelpter.AddLog("没有获取到身份cookie值", null, "PushToRongMeiTi_error");
                    return new ResultPublish() { Code = 500, Msg = "没有获取到身份cookie值" };
                }
                string dateStart = DateTime.Now.ToString("yyyy-MM-dd");
                string deptId_chzc = MyConfigReader.GetConfigValue("deptId_chzc");
    
                //获取XX 接口数据
                string? json = await GetApiJsonAsync(cookieValue.Trim(), dateStart, dateStart, deptId_chzc);
                if (string.IsNullOrEmpty(json))
                {
                    LogHelpter.AddLog("没有数据", "PushToRongMeiTi");
                    return new ResultPublish() { Code = 500, Msg = "没获取到数据" };
                }
                if (json.IndexOf("\"code\":401") >= 0)
                {
                    goto Again;
                }
                ShowLog?.Invoke(1, "开始推送到甲甲");
    
                ArticleRongmeti info = new ArticleRongmeti();
                info.Title = "XX风险作业api数据";
                info.HtmlContent = json;
                info.ColumnID = MyConfigReader.GetConfigValue("column_id");
                info.News_type = 1;
                //info.ArticleId = "chzcayxt_fxzy231120";  //DateTime.Now.Ticks.ToString();
                info.ArticleId = MyConfigReader.GetConfigValue("chzc_publish_origin_id");
                info.PublishingStartDate = DateTime.Now;
    
                LogHelpter.AddLog("接口数据:" + Newtonsoft.Json.JsonConvert.SerializeObject(info), "PushToRongMeiTi_json");
    
                ResultPublish result;
    
                //检查文章是否已经发布了?有记录的执行修改接口
                string jsonLocal = ArticleLocalJsonReadFileHandle.ReadArticle();
                if (!string.IsNullOrWhiteSpace(jsonLocal) && jsonLocal.Length > 0)
                {
                    //执行修改文章
                    var oldInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<RmtResult>(jsonLocal);
                    info.RongmetiArticleId = oldInfo.Data.Rongmeiti_article_id;
                    info.publish_article_id = oldInfo.Data.Publish_article_id;
                    result = await PublishArticelToRongmeti.UpdateArticle(info);
                }
                else
                {
                    //推送到甲甲
                    //var result = await PublishArticelToRongmeti.PublishArticle(info);
                    result = await PublishArticelToRongmeti.PublishArticle(info);
                }
    
                ShowLog?.Invoke(1, $"甲甲转发系统:{result.Code},Publish_article_id={result.Data},{result.Msg}");
    
                if (result.Code == 200)
                {
                    更新数据到本地json
                    //ArticleLocalJsonReadFileHandle.WriteArticleToFile(json);
                    long publish_article_id = 0;
                    if (result.Msg.Contains("修改"))
                    {
                        publish_article_id = info.publish_article_id;
                    }
                    else
                    {
                        var resutlArticle = Newtonsoft.Json.JsonConvert.DeserializeObject<RmtArticleInfo>(result.Data.ToString());
    
                        publish_article_id = resutlArticle.Publish_article_id;
                    }
    
                    //推送成功,需要获取文章在甲甲的信息,比如URL;
                    Task.Run(async () =>
                    {
                        int index = 1;
                        while (index <= 12)
                        {
                            bool right = await GetArticleInfo(publish_article_id);
                            if (right) break;
    
                            index++;
                            Thread.Sleep(2 * 1000);
                        }
                    });
    
                }
    
             //   LogHelpter.AddLog($"调用转发服务接口:状态={result.Code},{result.Msg}", null, "PushToRongMeiTi");
    
                return result;
            }
    
            /// 
            /// 获取发布后,文章信息,包含可访问的甲甲文章url
            /// 
            /// 
            public static async Task<bool> GetArticleInfo(long publish_article_Id)
            {
                HttpClient httpClient = new HttpClient();
                string rmtZhuanFaSeverUrl = PublishArticelToRongmeti.GetRongmeitiPublishArticleUrl();
                rmtZhuanFaSeverUrl = rmtZhuanFaSeverUrl.Replace("PublishArticle", "ArticleInfo");
    
                string sign = MD5Helpter.MD5Encryptbit32Back16HEX(publish_article_Id + PublishArticelToRongmeti.AppSecret);
    
                string url = rmtZhuanFaSeverUrl + $"?id={publish_article_Id}&sign={sign}&appid={PublishArticelToRongmeti.AppId}";
                var responseMessage = await httpClient.GetAsync(url);
                if (responseMessage.IsSuccessStatusCode)
                {
                    string json = await responseMessage.Content.ReadAsStringAsync();
    
                    //成功的文章,记录文章信息json
                    ArticleLocalJsonReadFileHandle.WriteArticleToFile(json);
    
                    //通知ui控件,显示json
                    SetArticleInfo?.Invoke(12233, json);
                    return true;
                }
                return false;
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243

    模拟登录

    //using CefSharp.Wpf;
    using CefSharp;
    using CefSharp.OffScreen;
    using HalconDotNet;
    using System;
    using System.Collections.Generic;
    using System.Formats.Asn1;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Reflection.Metadata;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Controls;
    using System.Windows.Interop;
    using System.Xml.Linq;
    
    namespace Wpf_CHZC_Img_Identy_ApiDataGet
    {
        /// 
        /// 登录模拟
        /// 
        /// 创建时间:2023-11-20 15:34:27 
        public class LoginHandle
        {
            /// 
            /// 登录消息通知
            /// 
            public static event EventHandler<string>? ShowLog;
    
     
            /// 
            /// 标记是否正在登录?独占登录,同一时间不允许多个登录
            /// 
            static bool loginDoing = false;
    
           
            /// 
            /// 登录
            /// 
            public async Task Login()
            {
                if (loginDoing)
                {
                    return;
                }
                loginDoing = true;
                try
                {
                    ShowLog?.Invoke(1, "正在登录...");
    
                    //登录的网页URL,      http://10.45.22.33:8233/#/ 
                    string testUrl = "http://10.45.22.33:8233/#/";
    
                    // Create the offscreen Chromium browser.
                    var browser = new ChromiumWebBrowser(testUrl)
                    {
                        RequestHandler = new MyRequestHandler()
                    };
                    //browser.Size = new System.Drawing.Size(1920, 20000);
    
                    // 加载完成
                    browser.FrameLoadEnd += Browser_FrameLoadEnd;
    
                    //等待内容完成加载
                    var response = await browser.WaitForInitialLoadAsync();
                    ShowLog?.Invoke(1, "登录页,等待内容完成加载...");
                    
                }
                catch (Exception ex)
                {
                    loginDoing = false;
                    string msg = ex.Message;
                    
                    ShowLog?.Invoke(1, "登录异常:" + msg);
                }
    
            }
    
            private async void Browser_FrameLoadEnd(object? sender, FrameLoadEndEventArgs e)
            {
                var browser = sender as ChromiumWebBrowser;
    
                int checkImgCount = 1;
            Again_get_imgCode:
                string html = await browser.GetSourceAsync();
                
    
                ShowLog?.Invoke(1, "处理验证码图片 ");
    
                //获取验证码图片  base64
                //document.querySelector(".login-code-img").src;
                var imgTask = await browser.GetBrowser().MainFrame.EvaluateScriptAsync("document.querySelector(\".login-code-img\").src;");
                if (!imgTask.Success)
                {
                    loginDoing = false;
                    ShowLog?.Invoke(1, "验证码图片获取失败 ");
                   
                    return;
                }
    
                System.Drawing.Image img = null;
                try
                {
                    string base64Img = imgTask.Result.ToString();
                    ShowLog?.Invoke(1, "base64Img=" + base64Img);
    
                    base64Img = base64Img.Replace("data:image/gif;base64,", "");
                    byte[] bytes = Convert.FromBase64String(base64Img);
                    MemoryStream memStream = new MemoryStream(bytes);
                    img = System.Drawing.Bitmap.FromStream(memStream);
    
                    ShowLog?.Invoke(1, "验证码图片base64解析成功 ");
                }
                catch (Exception ex)
                {
                    loginDoing = false;
                    ShowLog?.Invoke(1, "验证码base64读取异常 " + ex.Message);
                    
                    if (checkImgCount > 20)
                    {
                        return;
                    }
                    checkImgCount++;
                    ShowLog?.Invoke(1, "再次去读取验证码url ");
                    goto Again_get_imgCode;
                    //return;
                }
    
                //图片保存路径
                string dir = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "imgCode");
                if (!System.IO.Directory.Exists(dir))
                {
                    System.IO.Directory.CreateDirectory(dir);
                }
                string fileSavePath = System.IO.Path.Combine(dir, DateTime.UtcNow.Ticks + ".jpg");
                img.Save(fileSavePath);
    
                //识别验证码图片
                ShowLog?.Invoke(1, "识别验证码图片:" + fileSavePath);
                Identify_codeImg identity_CodeImg = new Identify_codeImg();
                string identifyCode = identity_CodeImg.action(fileSavePath);
               
                int calcValue = 0;/* 计算结果 */
             
                string account = "134064";    /* 登录账号  */
                string password = "an1zan@123";  /* 登录密码  */
    
                //输入账号            
                var accountJs = await browser.GetBrowser().MainFrame.EvaluateScriptAsync(
                                                @$"var account23 = document.querySelector('input');
                                                    account23.value = '{account}';
                                                    account23.dispatchEvent(new Event('input'));
                                              ");
    
                //输入密码
                var passwordJs = await browser.GetBrowser().MainFrame.EvaluateScriptAsync(
                                               @$"var password = document.querySelector(""input[type = 'password']"");
                                                    password.value = '{password}';
                                                    password.dispatchEvent(new Event('input'));
                                                   ");
    
                //输入验证码
                var vcode78Js = await browser.GetBrowser().MainFrame.EvaluateScriptAsync(
                                             @$"var vcode78 = document.querySelector(""input[placeholder='验证码']"");
                                                    vcode78.value = '{calcValue}';
                                                    vcode78.dispatchEvent(new Event('input'));
                                         ");
    
                //点击登录
                var buttonClick = await browser.GetBrowser().MainFrame.EvaluateScriptAsync(
                                  "document.querySelector(\"button\").dispatchEvent(new Event(\"click\"));");
                ShowLog?.Invoke(1, "点击登录");
                try
                {
          
                    //等待跳转页面
                    var home = await browser.WaitForNavigationAsync(timeout: TimeSpan.FromSeconds(20));
                    var response5 = await browser.WaitForInitialLoadAsync();
                    //string html2 = await browser.GetSourceAsync();
    
                }
                catch (Exception ex)
                {
                    loginDoing = false;
                    var ex2 = ex.InnerException ?? ex;
                    string msg = ex2.Message;
                     
                }
    
                var cookieManager = Cef.GetGlobalCookieManager();
                CookieVisitorHandle visitor = new CookieVisitorHandle();
                visitor.OnCookie = cookie =>
                {
                    string url = cookie.Domain + cookie.Path;
                    
    
                    ShowLog?.Invoke(1, "获取到cookie=" + cookie.Name + ":" + cookie.Value);
    
                    if (cookie.Path == "/" && cookie.Name == "Admin-Token")
                    {
                        if (cookie.Value.Length > 0)
                        {
                            loginDoing = false;
    
                            //保存cookie值
                            LoginSuccessCookieHandle.WriteCookieValueToFile(cookie.Value);
                            
    
                            ShowLog?.Invoke(1, "登录成功");
    
                        }
                    }
    
                };
    
                cookieManager.VisitAllCookies(visitor);
            }
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223

    拦截请求

    using CefSharp;
    using CefSharp.Handler;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Wpf_CHZC_Img_Identy_ApiDataGet
    {
        /// 
        /// 拦截请求,
        /// 
        /// 创建时间:2023-11-17 14:18:38,xx
        public class MyRequestHandler : RequestHandler
        {
            protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
            {
                //if (request.Url.Contains("user/getInfo"))
                //{
                //    string[] cookie = request.Headers.GetValues("Cookie");
                //}
    
                LogHelpter.AddLog("GetResourceRequestHandler请求url:" + request.Url, null, "MyRequestHandler");
     
                return base.GetResourceRequestHandler(chromiumWebBrowser, browser, frame, request, isNavigation, isDownload, requestInitiator, ref disableDefaultHandling);
            }
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Cookie获取 CookieVisitorHandle

    using CefSharp;
    using System;
    
    namespace Wpf_CHZC_Img_Identy_ApiDataGet
    {
        /// 
        /// Cookie获取
        /// 
        /// 创建时间:2023-11-17 15:39:13。作者:xxx
        public class CookieVisitorHandle : ICookieVisitor
        {
            /// 
            /// 处理Cookie,调用者自定义处理实现
            /// 
            public Action<Cookie> OnCookie;
    
            public void Dispose()
            {
            }
    
            public bool Visit(Cookie cookie, int count, int total, ref bool deleteCookie)
            {
                OnCookie?.Invoke(cookie);
                return true;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    在实施 360 反馈流程之前要考虑的 6 个问题
    网络工程师入门必懂华为认证体系,附系统学习路线分享
    BM2 链表内指定区间反转
    精确杂草控制植物检测模型的改进推广
    Abbexa丨Abbexa动物组织 PCR 试剂盒提取说明书
    Scss
    Java 的 Apache Commons 工具库 助力开发
    基于 Python 的音乐流派分类
    (undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵
    助力交通出行,基于目标检测模型实现路面裂痕缺陷智能识别
  • 原文地址:https://blog.csdn.net/u011511086/article/details/134549420