1
0
mirror of https://e.coding.net/circlecloud/AliKeywordSearch.git synced 2024-12-27 07:38:56 +00:00

首次提交

This commit is contained in:
j502647092 2015-07-25 18:07:54 +08:00
commit d4012764f7
17 changed files with 1898 additions and 0 deletions

63
.gitattributes vendored Normal file
View File

@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

156
.gitignore vendored Normal file
View File

@ -0,0 +1,156 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
!packages/*/build/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
#packages/
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
#LightSwitch generated files
GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml
# =========================
# Windows detritus
# =========================
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac desktop service store files
.DS_Store

32
AliCPM.sln Normal file
View File

@ -0,0 +1,32 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliKeywordSearch", "AliKeywordSearch.csproj", "{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Debug|x86.ActiveCfg = Debug|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Release|Any CPU.Build.0 = Release|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

99
AliKeywordSearch.csproj Normal file
View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{118BA2B4-EB09-4A14-A7AA-6C4350B63DC2}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>AliKeywordSearch</RootNamespace>
<AssemblyName>AliKeywordSearch</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Config.cs" />
<Compile Include="Frm_Main.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Frm_Main.Designer.cs">
<DependentUpon>Frm_Main.cs</DependentUpon>
</Compile>
<Compile Include="HttpHelper.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Frm_Main.resx">
<DependentUpon>Frm_Main.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="icon.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

55
Config.cs Normal file
View File

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace AliKeywordSearch
{
class Config
{
protected string fileName;
public Config(string fileName)
{
this.fileName = fileName;
}
//将List转换为TXT文件
public void WriteListToTextFile(List<string> list)
{
//创建一个文件流用以写入或者创建一个StreamWriter
FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.Flush();
// 使用StreamWriter来往文件中写入内容
sw.BaseStream.Seek(0, SeekOrigin.Begin);
for (int i = 0; i < list.Count; i++) sw.WriteLine(list[i]);
//关闭此文件t
sw.Flush();
sw.Close();
fs.Close();
}
//读取文本文件转换为List
public List<string> ReadTextFileToList()
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
List<string> list = new List<string>();
StreamReader sr = new StreamReader(fs);
//使用StreamReader类来读取文件
sr.BaseStream.Seek(0, SeekOrigin.Begin);
// 从数据流中读取每一行,直到文件的最后一行
string tmp = sr.ReadLine();
while (tmp != null)
{
list.Add(tmp);
tmp = sr.ReadLine();
}
//关闭此StreamReader对象
sr.Close();
fs.Close();
return list;
}
}
}

278
Frm_Main.Designer.cs generated Normal file
View File

@ -0,0 +1,278 @@
namespace EnAliKeywordSearch
{
partial class Frm_Main
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Frm_Main));
this.SearchView = new System.Windows.Forms.DataGridView();
this.company = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.keyword = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ResultView = new System.Windows.Forms.DataGridView();
this. = new System.Windows.Forms.DataGridViewTextBoxColumn();
this. = new System.Windows.Forms.DataGridViewTextBoxColumn();
this. = new System.Windows.Forms.DataGridViewTextBoxColumn();
this. = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.search = new System.Windows.Forms.Button();
this.max = new System.Windows.Forms.TextBox();
this.cnAli = new System.Windows.Forms.RadioButton();
this.enAli = new System.Windows.Forms.RadioButton();
this.label1 = new System.Windows.Forms.Label();
this.state = new System.Windows.Forms.Label();
this.saveout = new System.Windows.Forms.Button();
this.readin = new System.Windows.Forms.Button();
this.openFile = new System.Windows.Forms.OpenFileDialog();
this.saveFile = new System.Windows.Forms.SaveFileDialog();
this.backgroundWorker = new System.ComponentModel.BackgroundWorker();
this.clearresult = new System.Windows.Forms.Button();
this.clearsearch = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.SearchView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ResultView)).BeginInit();
this.SuspendLayout();
//
// SearchView
//
this.SearchView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.SearchView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.company,
this.keyword});
this.SearchView.Location = new System.Drawing.Point(12, 54);
this.SearchView.Name = "SearchView";
this.SearchView.RowTemplate.Height = 23;
this.SearchView.Size = new System.Drawing.Size(843, 241);
this.SearchView.TabIndex = 0;
//
// company
//
this.company.HeaderText = "公司名称";
this.company.Name = "company";
this.company.Width = 300;
//
// keyword
//
this.keyword.HeaderText = "关键词(用英文逗号隔开)";
this.keyword.Name = "keyword";
this.keyword.Width = 500;
//
// ResultView
//
this.ResultView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.ResultView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.,
this.,
this.,
this.});
this.ResultView.Location = new System.Drawing.Point(12, 322);
this.ResultView.Name = "ResultView";
this.ResultView.RowTemplate.Height = 23;
this.ResultView.Size = new System.Drawing.Size(843, 460);
this.ResultView.TabIndex = 1;
//
// 公司名称
//
this..HeaderText = "公司名称";
this..Name = "公司名称";
this..Width = 300;
//
// 关键词
//
this..HeaderText = "关键词";
this..Name = "关键词";
this..Width = 200;
//
// 排名
//
this..HeaderText = "排名";
this..Name = "排名";
this..Width = 150;
//
// 查询时间
//
this..HeaderText = "查询时间";
this..Name = "查询时间";
this..Width = 150;
//
// search
//
this.search.Location = new System.Drawing.Point(399, 9);
this.search.Name = "search";
this.search.Size = new System.Drawing.Size(152, 36);
this.search.TabIndex = 2;
this.search.Text = "查 询 关 键 词";
this.search.UseVisualStyleBackColor = true;
this.search.Click += new System.EventHandler(this.search_Click);
//
// max
//
this.max.Location = new System.Drawing.Point(112, 12);
this.max.Name = "max";
this.max.Size = new System.Drawing.Size(83, 21);
this.max.TabIndex = 3;
this.max.Text = "20";
//
// cnAli
//
this.cnAli.AutoSize = true;
this.cnAli.Enabled = false;
this.cnAli.Location = new System.Drawing.Point(303, 19);
this.cnAli.Name = "cnAli";
this.cnAli.Size = new System.Drawing.Size(71, 16);
this.cnAli.TabIndex = 5;
this.cnAli.Text = "中文阿里";
this.cnAli.UseVisualStyleBackColor = true;
this.cnAli.Visible = false;
//
// enAli
//
this.enAli.AutoSize = true;
this.enAli.Checked = true;
this.enAli.Location = new System.Drawing.Point(226, 19);
this.enAli.Name = "enAli";
this.enAli.Size = new System.Drawing.Size(71, 16);
this.enAli.TabIndex = 6;
this.enAli.TabStop = true;
this.enAli.Text = "英文阿里";
this.enAli.UseVisualStyleBackColor = true;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(16, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(89, 12);
this.label1.TabIndex = 7;
this.label1.Text = "最大查询页数: ";
//
// state
//
this.state.AutoSize = true;
this.state.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.state.Location = new System.Drawing.Point(96, 302);
this.state.Name = "state";
this.state.Size = new System.Drawing.Size(37, 14);
this.state.TabIndex = 8;
this.state.Text = "状态";
this.state.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// saveout
//
this.saveout.Location = new System.Drawing.Point(777, 16);
this.saveout.Name = "saveout";
this.saveout.Size = new System.Drawing.Size(75, 23);
this.saveout.TabIndex = 9;
this.saveout.Text = "导出数据";
this.saveout.UseVisualStyleBackColor = true;
this.saveout.Click += new System.EventHandler(this.saveout_Click);
//
// readin
//
this.readin.Location = new System.Drawing.Point(615, 16);
this.readin.Name = "readin";
this.readin.Size = new System.Drawing.Size(75, 23);
this.readin.TabIndex = 10;
this.readin.Text = "导入数据";
this.readin.UseVisualStyleBackColor = true;
this.readin.Click += new System.EventHandler(this.readin_Click);
//
// openFile
//
this.openFile.FileName = "openFileDialog1";
//
// clearresult
//
this.clearresult.Location = new System.Drawing.Point(14, 299);
this.clearresult.Name = "clearresult";
this.clearresult.Size = new System.Drawing.Size(68, 20);
this.clearresult.TabIndex = 11;
this.clearresult.Text = "清除结果";
this.clearresult.UseVisualStyleBackColor = true;
this.clearresult.Click += new System.EventHandler(this.clearresult_Click);
//
// clearsearch
//
this.clearsearch.Location = new System.Drawing.Point(696, 16);
this.clearsearch.Name = "clearsearch";
this.clearsearch.Size = new System.Drawing.Size(75, 23);
this.clearsearch.TabIndex = 12;
this.clearsearch.Text = "清除数据";
this.clearsearch.UseVisualStyleBackColor = true;
this.clearsearch.Click += new System.EventHandler(this.clearsearch_Click);
//
// Frm_Main
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(864, 794);
this.Controls.Add(this.clearsearch);
this.Controls.Add(this.clearresult);
this.Controls.Add(this.readin);
this.Controls.Add(this.saveout);
this.Controls.Add(this.state);
this.Controls.Add(this.label1);
this.Controls.Add(this.enAli);
this.Controls.Add(this.cnAli);
this.Controls.Add(this.max);
this.Controls.Add(this.search);
this.Controls.Add(this.ResultView);
this.Controls.Add(this.SearchView);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "Frm_Main";
this.Text = "阿里排名查询软件 2015-7-25";
this.Load += new System.EventHandler(this.Frm_Main_Load);
((System.ComponentModel.ISupportInitialize)(this.SearchView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ResultView)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.DataGridView SearchView;
private System.Windows.Forms.DataGridView ResultView;
private System.Windows.Forms.Button search;
private System.Windows.Forms.TextBox max;
private System.Windows.Forms.DataGridViewTextBoxColumn ;
private System.Windows.Forms.DataGridViewTextBoxColumn ;
private System.Windows.Forms.DataGridViewTextBoxColumn ;
private System.Windows.Forms.DataGridViewTextBoxColumn ;
private System.Windows.Forms.DataGridViewTextBoxColumn company;
private System.Windows.Forms.DataGridViewTextBoxColumn keyword;
private System.Windows.Forms.RadioButton cnAli;
private System.Windows.Forms.RadioButton enAli;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label state;
private System.Windows.Forms.Button saveout;
private System.Windows.Forms.Button readin;
private System.Windows.Forms.OpenFileDialog openFile;
private System.Windows.Forms.SaveFileDialog saveFile;
private System.ComponentModel.BackgroundWorker backgroundWorker;
private System.Windows.Forms.Button clearresult;
private System.Windows.Forms.Button clearsearch;
}
}

167
Frm_Main.cs Normal file
View File

@ -0,0 +1,167 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AliKeywordSearch;
namespace EnAliKeywordSearch
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
backgroundWorker.DoWork += backgroundWorker_DoWork;
backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
}
void DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
}
private void search_Click(object sender, EventArgs e)
{
search.Enabled = false;
foreach (DataGridViewRow item in this.SearchView.Rows)
{
string cpy = item.Cells["company"].Value == null ? "" : item.Cells["company"].Value.ToString();
string keys = item.Cells["keyword"].Value == null ? "" : item.Cells["keyword"].Value.ToString();
if (cpy != "" && keys != "")
{
foreach (string key in keys.Split(','))
{
int maxpage = this.ToInt(max.Text);
int index = this.ResultView.Rows.Add();
this.ResultView.Rows[index].Cells["公司名称"].Value = cpy;
this.ResultView.Rows[index].Cells["关键词"].Value = key;
state.Text = "正在查询 " + cpy + " 的关键词 " + key;
Application.DoEvents();
for (int i = 1; i <= maxpage; i++)
{
string url = string.Empty;
this.ResultView.Rows[index].Cells["排名"].Value = "正在查询第" + i + "页...";
Application.DoEvents();
if (enAli.Checked == true)
url = String.Format("http://www.alibaba.com/products/F0/{0}/{1}.html", key, i);
else
url = String.Format("http://s.1688.com/selloffer/offer_search.htm?keywords={0}&beginPage={1}", key, i);
string htmldoc = HttpHelper.Get(url);
if (string.IsNullOrEmpty(htmldoc))
{
this.ResultView.Rows[index].Cells["排名"].Value = "网页抓取失败";
break;
}
if (htmldoc.Contains(cpy))
{
this.ResultView.Rows[index].Cells["排名"].Value = "第" + i + "页";
break;
}
if (i == maxpage)
{
this.ResultView.Rows[index].Cells["排名"].Value = maxpage + "页以后";
break;
}
Application.DoEvents();
}
this.ResultView.Rows[index].Cells["查询时间"].Value = DateTime.Now.ToString();
Application.DoEvents();
}
}
Application.DoEvents();
}
state.Text = "所有关键词查询完成!";
search.Enabled = true;
}
private int ToInt(String str)
{
int s = 0;
int.TryParse(str, out s);
return s;
}
private void Frm_Main_Load(object sender, EventArgs e)
{
}
#region
private void saveout_Click(object sender, EventArgs e)
{
SaveFileDialog cpm = new SaveFileDialog();
cpm.Filter = "查排名数据|*.cpm";
if (cpm.ShowDialog() == DialogResult.OK)
{
List<string> data = new List<string>();
foreach (DataGridViewRow item in this.SearchView.Rows)
{
string cpy = item.Cells["company"].Value == null ? "" : item.Cells["company"].Value.ToString();
string keys = item.Cells["keyword"].Value == null ? "" : item.Cells["keyword"].Value.ToString();
if (cpy != "" && keys != "")
data.Add(cpy + "|" + keys);
}
Config cfg = new Config(cpm.FileName);
cfg.WriteListToTextFile(data);
}
}
private void readin_Click(object sender, EventArgs e)
{
OpenFileDialog cpm = new OpenFileDialog();
cpm.Filter = "查排名数据|*.cpm";
if (cpm.ShowDialog() == DialogResult.OK)
{
Config cfg = new Config(cpm.FileName);
List<string> data = cfg.ReadTextFileToList();
string cpy = string.Empty;
string keys = string.Empty;
foreach (string item in data)
{
string[] str = item.Split('|');
if (str.Length == 2)
{
cpy = str[0];
keys = str[1];
int index = this.SearchView.Rows.Add();
this.SearchView.Rows[index].Cells["company"].Value = cpy;
this.SearchView.Rows[index].Cells["keyword"].Value = keys;
}
}
}
}
private void clearresult_Click(object sender, EventArgs e)
{
ResultView.Rows.Clear();
}
private void clearsearch_Click(object sender, EventArgs e)
{
SearchView.Rows.Clear();
}
#endregion
}
}

449
Frm_Main.resx Normal file
View File

@ -0,0 +1,449 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="company.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="keyword.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="公司名称.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="关键词.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="排名.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="查询时间.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="openFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="saveFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>161, 17</value>
</metadata>
<metadata name="backgroundWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>262, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAQAEBAAAAEACABoBQAARgAAADAwAAABACAAqCUAAK4FAAAgIAAAAQAgAKgQAABWKwAAGBgAAAEA
IACICQAA/jsAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AI1Q
CwDFdBsAxHARAMRxEQDDbg4AxHYeANSvhgASo/MAEaH0ABKi8wANofQAQKPgAL9qCwC+ZgAAvmQAAL9t
DgDRq4AAAprzAACZ8wABmvIAAJn0ADSc3gC9aAkAu2QAALxkAAC7YQAAvWsMANCqgAAAl/QAAJb0AACW
9gAxmd8AumkQALplBQC6ZgUAumMFALttEwDPqoEAB5fyAAWW8wAGl/IABZb0ADeZ3gC/jlYAvIpQAL2K
TwC9iU4Av5FcAFKo4ABRp94AUqjfAFCn3wB0rtgAu3AeALlrFQC5axMAuWoSALViBQC0ZA0AsWYPAMVo
BwAXmPMAEpf2ABSY9gARl/cAQZvhALNkDACxXwIAsF8CALBgAwC2XwAAu14AALdgAAAGjPEAAov1AAOM
9AABivUANJHfAK9jCwCtXQAArF4BALRYAAB6bVIASXycAEx6lQBYhKIAEZf4AAGH8wAAh/YAAIf1AACG
9gAzjd8Aq2EKAKlcAACpWwAAplwCALJiDQBReJIAAIv/AACH/wAAg/QAAIX2AACE9QABhfQAAIT2ADOL
3gCnXgsApFgAAKVYAACgWQUAK5LpAAOA8gABgvIAAIP3AACD9gAAgvQAAYP1AACB9gAziN4ApVwLAKJX
AACiWAAAnlgHABeT/wAEfvQABn3xAAd98AAFffEAAH31AAF99QAAfPYANIXeAKFbCwCfVQAAnlUAAJ1W
AwABevQAAHr1AAB49gAzgt8AnlgLAJxUAACbVQMAAnj0AAB29QABd/UAAHb2ADSA4ACdVwsAmVMAAJlS
AACYUwMAAnbzAAB29AABd/QAAHT1ADR/3wCbWAoAmFMCAAF19gAAc/YAAHL3ADV94QCISgAAh0kAAIdK
AwADaOAAAGbgAANn4AAAZOEANXXQALBsaQAoAAAAV2hpAGUAZQCcdGkAnHRpABQAAABXaGkASAcAABsA
AAAAAAAACAAAADAlIABoaXQAAKO0APBsaQAUCWgAQAAAADR4MgAUAAAAGwAAAAAAAAAKAAAAICAgACAg
NAAyMAAA9HRpAPR0aQAUAAAAMjIsAKAHAAAbAAAAAAAAAAsAAAAgICAAICAyACwzOACwbGkAsGxpACgA
AABXaGkAZQBlADR1aQA0dWkAFAAAAFdoaQDgBwAAGwAAAAAAAAAIAAAAMCUgAGhpdAAAo7QA8GxpABQJ
aABAAAAANHgyABQAAAAbAAAAAAAAAAoAAAAgICAAICA0ADIwAACMdWkAjHVpABQAAAAyMSwAOAgAABsA
AAAAAAAACwAAACAgIAAgIDIALDM4ALBsaQCwbGkAKAAAAFdoaQBlAGUAzHVpAMx1aQAUAAAAAqWlpqcA
AAAAAACoqaqrrJ+Xl5igAAAAAAAAoaKdo6SWl5iYmQAAAAAAAJqbnJ2ejo+Pj5AAAAAAAACRkpOUlYaH
iIeJAAAAAAAAiouKjI15ent7fAB9fn+AgYKCg4SFbG1tbm8AcHFycnN0dXZ3eF5fYF9hYhpkZWVmZ2hp
amtQUVFRUlMaVVZXWFlaW1xdREVFRkVHSElKAABLTE1OTzc4ODk6Ozw9PgAAP0BBQkMAAAAAAAAAAAAA
AAAAAAAAIhoaGhoaAAAAAAAoKSorLBgaGhoaGgAAAAAAHh4fICEOGhoaGhoAAAAAABMUFRYXGhoaGhoa
AAAAAAAJCgsMDQfgAAAH4AAAB+AAAAfgAAAH4AAABAAAAAQAAAAAAAAAAAAAAABgAAAAYAAA//8AAAPg
AAAD4AAAA+AAAAPgAAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAlGU9/3tE
Bv9+QwD/fUIA/3pCAP96QwD/ekMA/3tCAP95QQD/ekEA/3pBAP95QQD/eUEA/3pAAP95SBL/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAC2TL/wRdyv8FXsr/BF7K/wJfyv8DXcv/BFzL/wRdy/8EX8z/BF7M/wNdy/8DXcv/A13M/wRb
x/9uiL7/rXY//5hUBv+VUwD/lFIA/5ZTAP+VUwD/llIA/5dSAP+WUgD/llIA/5ZSAP+UUgD/lVIA/5VR
AP+SVhL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
9v8AfPb/AH31/wB99f8Affb/AH32/wB99v8Affb/AH72/wB99v8Affb/AH32/wB+9v8AffX/AX31/wN5
7/9uk8//tXo+/6NZBv+jWAD/o1gA/6NYAf+iWAH/olkA/6NZAP+iWQD/olkA/6JYAP+jWAD/o1gB/6JX
AP+dWxH/AAAAAAAAAAAAAAAAAAAAAECe9f8AfPT/AH/1/wB/9v8Af/b/AH/2/wB+9v8Af/b/AH72/wB/
9v8Af/b/AH/2/wB/9v8Afvb/AH/2/wB/9v8Af/b/AH/2/wB/9v8Af/b/AH/2/wB/9v8Af/b/AH/2/wB/
9v8Af/X/AH/1/wF77/9ulM7/tno+/6RbBv+lWQD/pFgA/6RZAf+kWQH/pFgB/6RZAf+kWQH/pFkB/6RY
Af+kWAH/pFkB/6NYAP+dXBD/AAAAAAAAAAAAAAAAAAAAAECf9f8AfPX/AH/1/wB/9v8Af/b/AH/2/wB/
9v8AgPb/AH/2/wB/9v8Af/b/AH/2/wB/9v8Af/b/AH/2/wB/9v8Af/b/AID2/wCA9v8Af/b/AH/2/wB/
9v8Af/b/AID2/wB/9v8AgPb/AID2/wB87/9tlM7/t3o+/6VbBv+lWQD/pVgA/6RZAP+kWQD/pFkA/6VY
AP+lWQD/pVkA/6VZAP+lWQD/pVgA/6VZAP+fXRH/AAAAAAAAAAAAAAAAAAAAAECg9f8Af/X/AIL1/wCC
9v8Agvb/AIL2/wCC9v8Agvb/AIL2/wCC9v8Agvb/AIL2/wCC9v8Agvb/AIL2/wCC9v8Agvb/AIL2/wCC
9v8Agvb/AIL2/wCC9v8Agvb/AIL2/wCC9v8AgvX/AYH1/wJ97/9ulc7/t3s+/6ZbBP+lWQD/pVkA/6VZ
AP+lWQD/pVkA/6VZAP+mWQD/plkA/6ZZAP+mWQD/pVkA/6VZAP+gXhH/AAAAAAAAAAAAAAAAAAAAAECi
9v8AgfT/AIP1/wCE9v8AhPb/AIT2/wCE9v8AhPb/AIT2/wCE9v8AhPb/AIT2/wCE9v8AhPb/AIT2/wCE
9v8AhPb/AIT2/wCE9v8AhPb/AIT2/wCE9v8AhPb/AIT2/wCE9v8AhPX/AIT1/wF+7/9tlc3/t3s+/6db
Bf+mWgD/ploA/6daAP+nWwD/p1sA/6dbAP+nWwD/p1sA/6dbAP+nWwD/p1oA/6haAP+hWwr/AAAAAAAA
AAAAAAAAAAAAADaP2v8AhPf/AIX1/wCG9v8Ahvb/AIb2/wCG9v8Ahvb/AIX2/wCG9v8Ahvb/AIb2/wCG
9v8Ahvb/AIb2/wCG9v8Ahvb/AIb2/wCG9v8Ahvb/AIb2/wCG9v8Ahvb/AIb2/wCG9v8Ahvb/AIb2/wCA
7v9tmM7/uXs+/6hdBP+oXAD/qFwA/6hbAP+oWwD/qFsA/6hbAP+oWwD/qFsA/6hbAP+oWwD/qFsA/6db
AP+nWwD/pFgA/6NWAP+jVgD/oFkL/zOAwv8Ahvj/AIX1/wCF9v8Ahfb/AIX2/wCF9v8Ahvb/AIb2/wCF
9v8Ahfb/AIX2/wCF9v8Ahfb/AIb2/wCG9v8Ahfb/AIX2/wCF9v8Ahfb/AIX2/wCF9v8Ahfb/AIb2/wCF
9v8Ahfb/AIX2/wCB7v9tmM7/unw9/6ldBP+qXQD/ql0A/6pcAP+qXQD/ql0B/6pdAf+qXQH/ql0B/6pd
Af+qXQH/qV0A/6ldAP+rXgD/q14B/6tdAP+rXQD/qV8P/zSCw/8Ah/j/AIb1/wCG9f8Ahvb/AIb2/wCG
9v8Ahvb/AIb2/wCG9v8Ahvb/AIX2/wCG9v8Ahvb/AIX2/wCG9v8Ahvb/AIb2/wCF9v8Ahfb/AIX2/wCF
9v8Ahfb/AIb2/wCG9v8Ahfb/AIb2/wGB7v9tmc3/un49/6xeBv+sXgH/rF4B/6xeAf+tXgD/rV4A/6xe
Af+tXgH/rF8B/61eAP+tXgH/rV4B/61fAf+tXgH/rF4B/61eAf+sXgD/q18P/zWCw/8Ah/j/AIf1/wCH
9f8Ah/X/AIf1/wCH9v8Ah/b/AIf2/wCH9v8Ahvb/AIb2/wCG9v8Ah/b/AIb2/wCG9v8Ahvb/AIb2/wCG
9v8Ahvb/AIb2/wCG9v8Ahvb/AIb2/wCG9v8Ahvb/AIf2/wGC7v9tmM3/u30+/6xfBv+tXwH/rV4A/61e
AP+sXgD/rV4A/61eAf+tXgH/rV4A/61eAf+tXgD/rV4B/61eAP+tXgH/rV4B/61eAf+tXQH/q2AR/zOD
xf8Ah/r/AIf3/wCH9/8Ah/f/AIf3/wCH9/8Ah/f/AIf3/wCG9f8AhfX/AIT1/wCE9f8AhfT/AIf1/wCI
9v8Ah/b/AIf2/wCH9v8AiPb/AIf2/wCH9v8AiPb/AIf2/wCH9v8AiPX/AIn2/wKD7v9tmc7/vH4+/61f
Bf+tXgD/rV4A/61eAP+tXgD/rV4A/61eAP+tXgD/rV4A/61eAP+uXgD/rV4A/65eAP+tXgD/rl4A/61e
AP+uXQH/rGAO/1eEnv80isr/NYnI/zWJyP81icj/NYrI/zSKyP81icf/NI3P/0Gl8P9DpvP/Qqbz/0Sm
8v83oPP/BYn0/wCG9f8AiPb/AIj2/wCI9v8AiPb/AIj2/wCI9v8AiPb/AIj2/wCI9v8AiPX/AIj2/wGE
7/9tms7/vYA+/7BgBP+wXgD/sF4A/69dAP+vXQD/sF0A/69dAP+wXQD/r10A/69dAP+wXQD/sF0A/7Bd
AP+vXQD/sF0A/7BdAP+wXgH/r14C/6piEP+pZRP/qWUT/6plE/+qZRP/qWUT/6llE/+qZBP/pnY//wAA
AAAAAAAAAAAAAAAAAAAAAAAADY/0/wCI9f8Aivb/AIr2/wCL9v8Aivb/AIr2/wCK9v8Aivb/AIr2/wCL
9v8AivX/AIr2/wGF7v9tms7/vn4+/7BgBf+wXwD/sF4A/7BfAP+wXwD/sF8A/69fAP+wXwD/sF8A/7Bf
AP+wXwD/sF8A/7BfAP+wXwD/sF8A/7BfAP+wXwD/sF8A/7BfAP+wXwD/sF8A/7BfAP+wXgD/sF4A/7Bf
AP+wXAD/rW8v/wAAAAAAAAAAAAAAAAAAAAAAAAAAC5D0/wCJ9f8Aivb/AIr2/wCL9v8Ai/b/AIr2/wCK
9v8Aivb/AIv2/wCK9v8Ai/X/AYr2/wGH7/9tm8//vn4+/7BfBf+xXwD/sV8A/7FgAP+xYAD/sWAA/7Fg
AP+wYAD/sWAA/7FgAP+xYAD/sWAA/7FgAP+xYAD/sWAA/7FgAP+xYAD/sWAA/7FgAP+xYAD/sWAA/7Fg
AP+xYAD/sWAA/7FfAP+wXgD/rXAw/wAAAAAAAAAAAAAAAAAAAAAAAAAADJD0/wCK9f8Ai/b/AIr2/wCL
9v8Ai/b/AIr2/wCK9v8Aivb/AIv2/wCK9v8AivX/AIr2/wGI7/9tnM//wIA+/7NgBf+yXgD/sl4A/7Je
AP+yXgD/sl4A/7JeAP+yXgD/sl8A/7JfAP+yXgD/sV4A/7FeAP+yXgD/sl4A/7JeAP+yXgD/sl4A/7Je
AP+yXwD/sl8A/7JfAP+yXwD/sl4A/7JeAP+wXgD/rnEv/wAAAAAAAAAAAAAAAAAAAAAAAAAADJL0/wCL
9f8AjPX/AIz2/wCM9f8AjPX/AIz1/wCM9f8AjPX/AIz2/wCM9v8AjPX/AIz1/wCI7v9tm87/v388/7Jf
A/+xXgD/sV0A/7JdAP+yXgD/s10A/7JdAP+zXgD/sl0A/7JdAP+yXgD/sl4A/7JeAP+yXQD/sl4A/7Je
AP+zXgD/sl4A/7JdAP+xXQD/sF4A/7FeAP+yXgD/sl0A/7JdAP+xXAD/rnAv/wAAAAAAAAAAAAAAAAAA
AAAAAAAACpH0/wCM9P8AjvT/AI70/wCO9f8AjvX/AI71/wCO9f8AjfT/AI70/wCO9P8AjvT/AI30/wCI
7f9sm83/y5Vc/8B7Mf+/ey3/wHst/8B7LP/Aey3/wHou/8B6Lf/Beyz/wHss/8F8LP/BfCz/wXws/8B7
LP/AfC3/wHwt/8B8LP/Aey3/wHou/8B6Lf/AfC3/wHwt/8B9Lf/AfCz/v3st/797LP+/eCz/vIdR/wAA
AAAAAAAAAAAAAAAAAAAAAAAANab0/yuj9f8spPT/LKP0/yuj9f8ro/X/K6L1/yyh9f8rovT/K6Pz/yyk
9f8so/X/LKP0/yyf7/9/r9f/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY
9P8AmPT/AJj0/wCY9P8AmPT/AJj0/wCY9P8AmPT/AAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//4AA
AAAAAf//gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB
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
9vUAfvf5AH32+QB+9/kAfvf5AH73+QB/9/kAfvb6AH72/gB/9v8Af/b/AH/2/wB+9v8Af/X/AH71/wB/
9f8Ae/T/XY/Q/6xnHf+kWAH/o1cA/6NZAP+kWAD/pFgA/6RYAP+kWAD/pFcA/6BbCv0AAAAAAAAAAAAA
AAAajfT/AH70+QGC9f8AgfT/AIL1/wCC9f8AgvX/AIL1/wCC9f8AgvX/AIL1/wCC9v8AgvX/AIL2/wCB
9f8AgfX/AIL1/wB99P9dkND/rWcc/6VZAf+lWAD/plkA/6VaAP+mWQD/ploA/6VaAP+mWQD/oloG/gAA
AAAAAAAAAAAAAA6I8/8AgvX9AIX1/wCE9P8AhPb/AIT1/wCF9f8AhPX/AIX1/wCF9f8Ahfb/AIX1/wCF
9v8Ahfb/AIX1/wCE9f8AhfX/AID0/1yR0P+uaBv/qFwA/6hbAP+oWgD/qFsA/6hbAP+nWwD/qFsA/6da
AP+nWwD/p18K/7RaAf+MZjn/CIXy/wCE9P8AhPP/AIT0/wCE9P8AhfX/AYT2/wGE9f8AhfX/AIX1/wCF
9f8AhPb/AIT1/wCE9v8Ahfb/AIX1/wCF9v8AgfT/XJTQ/7BpHP+rXQL/ql0A/6tdAP+rXQD/q10B/6td
AP+sXQD/q10A/6tdAP6pXQH7sFkA+4tnPfwHhvL/AIT0/gCE8/8AhfX+AIX1/wCE9P0AgvH6AIT2+gCD
9voAhfb+AIX2/wCF9f8Ahfb/AIX2/wCF9f8AhfX/AIX1/wCC9P9dk8//sWod/6xeAv+sXQD/rF0A/6xd
AP+sXgD/q14A/61dAP+tXgD/rF0A/6teA/+yWwD/jWk+/w+L8/8HifX/CIn0/wiK9f8HifT/CY35/w2U
//8bh/P/FI3z/wCG9P8AhvX/AIb1/wCG9f8Ah/b/AIf1/wCG9f8Ah/X/AIP0/12U0P+0bBz/r14B/65c
AP+tXAD/rl0A/65dAP+uXQD/rl0A/69dAP+uXAD/rlwA/7BcAP+mYRL/im9F/4hvRf+Kb0X/iW9F/Ihv
SP8AAAAAAAAAAAAAAAAAAAAABYrz/gCH9P8Aifb/AIn0/wCI9f8AiPT/AIn0/wCJ9P8AhfP/XJbR/7Vs
Hf+wXwL/sF8A/7BfAP+vXgD/r2AA/7BfAP+wYAD/sGAA/7BgAP+wXwD/sGAA/7FfAP+2XQD/t10A/7Zd
AP+3XAD6tV0A/wAAAAAAAAAAAAAAAAAAAAAHjfT9AIn1/wCK9v8AivX/AIn2/wCK9f8AivX/AIr1/wCH
9P9dl9L/tWkY+69bAPuvWgD7sFsA+7BbAPuwWwD7sFsA+7BbAPuvWwD7r1sA+7BbAPuvWwD7sFsA+65c
APuuXAD7rV0A+65bAPesXQP7AAAAAAAAAAAAAAAAAAAAAAKM9PoAiPT7AIn1+wCI9PsAifT7AIn1+wCI
9PsAifT7AIXz+1qV0Pu8div/tmoT/7ZoEv+3aRL/t2kS/7doEv+3aRH/t2kS/7dpEf+3aRL/t2kS/7dp
Ev+3aBL/tmgS/7ZpEv+2ahL/t2gR/7VpFv8AAAAAAAAAAAAAAAAAAAAAF5f0/xGW8/8RlvP/EZX0/xGW
9P8RlfP/EZbz/xKW9P8PkvH/ZZ/T/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/9jGsAPcyrYGv3ssA8B8LQO/fCwDv3orA756MAO8hU8CabDcAGm3
4gBqteIQAZbx/gGW8f4BlvH+AZbx/gGW8f4BlvH+AZbx/gGW8f4BlvH+A5bx/rxxH/+3ZAb/t2MF/7dj
Bf+3YwX/uWQF/7hjBf+3ZAX/uGIF/7ZpFP+8ZAD/zayHANK0kQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAPmfEAFp3xABed8RYKlvH/BZTx/wWV8f8FlPH/BZTx/wWV8f8FlPD/BZXx/wWR7/8Cl/H/vm8b/Lpj
APy7ZAD8vGQA/LtjAPy8ZAD8u2MA/LtkAPy8YgD4uWoQ/LxkAP/PrYcA1LSQAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAqb9QAToPUAFKD2FASZ9PsAlvX8AJf2/ACW9fwAl/b8AJf1/ACW9fwAl/b8AJT0/AGW
8f++bx3/uWMB/7tkAP+7ZAD/u2QA/7tlAP+7ZAD/u2QA/7xiAPu5ahL/vGQA/9CthwDVtJADAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAC5v0ABWg8wAVoPQVBpnz/gCW9P8AlvT/AJfz/wCX9P8AlvT/AJXz/wCX
9P8Ak/P/Apfx/8FyG/+8ZQH/vGQA/7tlAP+8ZAD/vWMA/7xkAP+7ZQD/vWMA+7pqEf+8ZAD/z62HANS0
kAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKm/QAE57zABSe8xUFmvT+AJb0/wCX9P8Al/P/AJf0/wCX
9P8AlvP/AJf0/wCV8/8Cl/H/wXIc/71lAv+9ZQD/vWUA/71lAP+9ZQD/vWYA/7xmAP+9ZAD7u2wS/7xk
AP/QrogA1bWRAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuc9AAUn/QAFZ/0FQaa8/4AmPP/AJnz/wCY
9P8AmfP/AJjz/wCY8v8AmfT/AJby/wKX8f/BcBr/vmUA/79mAP++ZQD/vmYA/79nAP++ZgD/vmYA/75l
APu7bBH/vGQA/9CuhwDUtZADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACp30ABOg9AAUoPQVBZv0/gCY
9P8AmfT/AJrz/wCY9P8AmfT/AJnz/wCZ9P8Al/P/Apfx/8R0Hv/AaAX/wWgD/8BpBP/AaAP/wWkE/8Fo
A//AaAT/wWcC+71uFP+8ZAD/0a6IANa1kQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPoPMAGKPyABmj
8hUKnvP+Apzz/wOc8/8EnPP/BJvz/wSc9P8Em/P/BJz0/wGZ8/8Cl/H/vGQA/7xkAP+8ZAD/vGQA/7xk
AP+8ZAD/vGQA/7xkAP+8ZAD/vGQA/7xkAP/YuJYA3b+fAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSu
8gA+se8APrHvFQCW8v8Bl/P/AZfz/wGX8/8Bl/P/AZfz/wGX8/8Bl/P/AZfz/wOX8f8AP/wAAD/8AAA/
/AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAAAAA
PAAAADwAAAA8AAAAPAD//////////wAf/AAAH/wAAB/8AAAf/AAAH/wAAB/8AAAf/AAAH/wAAB/8ACgA
AAAYAAAAMAAAAAEAIAAAAAAAYAkAAAAAAAAAAAAAAAAAAAAAAACFTQ7/gEUA/35EAP9+RAD/fkIA/n5D
APp+QwL/u2MA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2TTlgJh0v8AYNL6AV/S/gFg
0/8BYNT/AFvU/1R9wf+dWg3/l1MA/5dTAP+ZUwD/mFIA/phSAPqYUgL/u2MA/wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAABnX4lgBy9v8Acvb6AHL3/gBy9v8Acvb/AG74/1SE1v+ZWA7/llEA/5dR
AP+XUgD/l1IA/pdQAPqXUQL/u2MA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3bylgFz
8v8Ac/P6AHPz/gBz8v8Ac/L/AG/0/1WE1P+dWQ7/mVEA/5hRAP+XUgD/mFAA/phRAPqYUQL/u2MA/wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3fzlgF18v8AdfT6AHX1/gB18/8AdfP/AHH1/1SF
0/+eWA//m1MB/5tUAP+bUwD/m1MA/ptTAPqaUwH/u2MA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAB3nzlgB18/8AdfX6AHX0/gB09P8AdfT/AHL1/1OH1f+eWg7/nFQA/5pTAP+bUwD/m1QA/ptT
APqbUwL/u2MA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnrzlAF38/8Ad/T5AHb0/gB3
9P8Ad/P/AHP0/1OH1v+hWw//nlUA/51UAP+dVAD/nVQA/p1UAPqdVAH/u2MA/wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACHzylQB58/8AefT6AHj0/QB59P8AePT/AHX2/1KJ1P+kXA3/oFUA/6BW
AP+gVwD/n1YA/qBWAPqfVgH/u2MA/wAAAAAAAAAAHYHm0xB75cwUfebQE37l0BB96NARf+rMBXvw6wB6
9P8AevT+AHv0/gB69P8Ae/T/AHf1/1OK1P+lXg//olYA/6JWAP+hVwD/oVcA/qFWAPmgVwH/u2MA/wAA
AAAAAAAAC4H0/wB69f0AfPX/AH32/wB99v8AfPX/AHz0/wB99f8AfvT+AH31/gB99P8AffT/AHr1/1OL
0/+oXw7/olcA/6JXAP+jVwD/pFcA/aRXAPqiVwH/u2MA/wAAAAAAAAAACoTy/AB/9PYAgfT7AIL1+gCB
9PsAgvX7AIL0/QCC9f8AgfX+AIL1/gCA9f8AgfP/AH72/1KM0v+pYQ3/pVkA/6VYAP+mWQD/plkA/qVa
AP6lVwD/u2MA/7tkAP+7ZAD/AYP4/wGC8P4Bg/H/AIPz/gCE8/0AhPT9AIXz/gCE9P8AhPX/AIT1/wCE
9P8AhPT/AIH1/1GP0/+sYg7/qVwA/6lcAP+qXAD/qVwA/qpcAP6qWwD/p1wB/7RUAP+7ZQH/AIj//gCE
+v4Ahfz+AIX6/wCD9f8Dg/T/AIT1/wCE9P8Ag/T+AIT1/gCD9f8AhPT/AIH2/1KQ0v+uZA7+rFwA/qtb
AP6sXAD+q10A/qxcAP6tXAD+qV0C/bNaAfy7ZAD/HIfZ/iKDzv4hhND+H4bY+huQ7N8YifbVCYjy8QCF
9P8AhvT9AIb0/gCG9P4AhvP+AIP1/lKR0/6xZQ78rl4A/K5cAPytXAD8rl4A/K9eAPyuXgD8rl0A/K5d
APysXwf8qWMU/KpjE/mpYRP8u2QA/6aEVDEkkdYOAJXx/gCI9PwAifX3AIj0+wCH9PwAifP8AIb1/FKU
1PyyYwz/rlwB/69bAP+wXAD/r1sA/7BcAP+uXQD/r1wA/69cAP+wWwD/sVsA/7FbAP+xWQD/u2MA/5J8
ZBwtfsUAAJXy/QGK8/8AiPT/AInz/wCJ9P8AifT/AIb1/1GT0/+7ZAD/u2QA/7tkAP+7ZAD/u2QA/7tk
AP+7ZAD/u2QA/7tkAP+7ZAD/u2QA/7tkAP+7ZAD/u2QA/5qGbx1EkMYBAJbx/RaY8tgVl/LRFZfz1hWX
8dYWmPLWEJTy1l6f1db/6OgF/+7cBf/61AX48dUF/vHTBf/yygT//uAF5LlhBcR8Hw0xAAAP15NCD9Sn
ag/RoGMP1aR5DACP/wH//6wAuff/AvT//wfO+v8E8f//Bc3z/wXV/f8FxP7/Bc/8/gW8ZAD/u2QA/7tk
AP+7ZAD/vGQA/7xkAP+7ZAD/vGQA//H09xz+//8A0KyCAf//9gAAAAAA/enlAFmn3gJYp90AAJbx/wGW
8f4BlvH+AZbx/gGW8f4BlvH+AZbx/gCW8f+5ahP/uGQG/7dkBf+4ZAb/uWQG/7hlBv+1XQL/vGQA/+jx
9jHu+/4B1sGnA8OFOgHCgjcBwYZKAQiV8AQGlPAAAJbx/geV8f8FlfH/BpTx/waV8f8GlfH/A5Lx/wKX
8f+6Zwz8uWIA/LtjAPy6YwD8umMA/LtjAPq4WwD7vGQA/+34/yru+v8A2cKpAQAAAAAAAAAAAAAAAACX
8gMAlvIAAJby/QCV8/0AlfT3AJb0+wCV9PwAlfT8AJT2/AGW8f+9ag7/u2MA/7tkAP+7YwD/u2MA/7pk
AP24XAD+vGQA/+v1/izy//8A2cGpAgAAAAAAAAAAAAAAAAGY8wQAmPMAAJby/QGX8/8AlvL6AJfy/gCV
8v8AlvL/AJT0/wKX8f++ag3+vWQA/r1kAP68ZAD+vWUA/rxlAPy6XgD9vGQA/+v3/yvx/v8A2cOpAgAA
AAAAAAAAAAAAAAGY8gQAmPIAAJby/QCX8v8AmPP5AJfz/QCX8v4AmPL+AJb0/gGW8f/Aaw7/v2YC/79m
Af+/ZwH/v2cB/79nAv28YAD+vGQA/+r2/yzv//8A2cKoAgAAAAAAAAAAAAAAAAOa8wQDmvMAAJby/QKa
8/8BmvP6Apny/gGZ8/8CmvP/AJj1/wKX8f/FeST/xHIX/8RzFv/Ecxb/xXMW/8RzF/3BbA/+vGQA/+30
/izx//8A3catAgAAAAAAAAAAAAAAABmk8gQYpPIAAJbx/QGX8v8AlvL/AJby/wGX8v8Bl/P/AZfz/wGX
8f8A/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAMAAAAD
AAAAAwAA////AAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAA=
</value>
</data>
</root>

326
HttpHelper.cs Normal file
View File

@ -0,0 +1,326 @@
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
/************************************************************************/
/* Author:huliang
* Email:huliang@yahoo.cn
* QQ:12658501
*
/************************************************************************/
namespace EnAliKeywordSearch
{
public class HttpArgs
{
public string Url { get; set; }
public string Host { get; set; }
public int Port { get; set; }
public string Accept { get; set; }
public string Referer { get; set; }
public string Cookie { get; set; }
public string Data { get; set; }
public string UA { get; set; }
}
public static class HttpHelper
{
/// <summary>
/// 提交方法
/// </summary>
enum HttpMethod
{
GET,
POST
}
#region HttpWebRequest & HttpWebResponse
/// <summary>
/// Get方法
/// </summary>
/// <param name="geturl">请求地址</param>
/// <param name="cookieser">Cookies存储器</param>
/// <returns>请求返回的Stream</returns>
public static string Get(string url)
{
HttpArgs args = ParseURL(url);
string strhtml = InternalSocketHttp(args, HttpMethod.GET);
return strhtml;
}
/// <summary>
/// Post方法
/// </summary>
/// <param name="posturl">请求地址</param>
/// <param name="bytes">Post数据</param>
/// <param name="cookieser">Cllkies存储器</param>
/// <returns>请求返回的流</returns>
public static string Post(string url,
byte[] bytes,
CookieContainer cookies,
Encoding encoding)
{
return null;
}
/// <summary>
/// 根据Url得到host
/// </summary>
/// <param name="strUrl">url字符串</param>
/// <returns>host字符串</returns>
private static HttpArgs ParseURL(string strUrl)
{
HttpArgs args = new HttpArgs();
args.Host = "";
args.Port = 80;
args.Referer = "";
args.Cookie = "";
args.Url = "";
args.Accept = "text/html";//,application/xhtml+xml,application/xml,application/json;";
args.UA = "Mozilla/5.0+(Compatible;+Baiduspider/2.0;++http://www.baidu.com/search/spider.html)";
//http://www.alibaba.com/products/Egg_Laying_Block_Machine/1.html
int iIndex = strUrl.IndexOf(@"//");
if (iIndex <= 0)
return null;
//www.alibaba.com:80/products/Egg_Laying_Block_Machine/1.html
string nohttpurl = strUrl.Substring(iIndex + 2);
string address = nohttpurl;
iIndex = nohttpurl.IndexOf(@"/");
if (iIndex > 0)
{
//www.alibaba.com:80
address = nohttpurl.Substring(0, iIndex);
args.Url = nohttpurl.Substring(iIndex);
}
iIndex = nohttpurl.IndexOf(@":");
if (iIndex > 0)
{
string[] tempargs = nohttpurl.Trim().Split(char.Parse(":"));
args.Host = tempargs[0];
args.Port = int.Parse(tempargs[1]);
}
else
{
//www.alibaba.com:80
args.Host = address;
args.Port = 80;
}
return args;
}
#endregion
#region Socket
public static string Get(HttpArgs args)
{
return InternalSocketHttp(args, HttpMethod.GET);
}
public static string Post(IPEndPoint endpoint,
HttpArgs args)
{
return InternalSocketHttp(args, HttpMethod.POST);
}
static string InternalSocketHttp(HttpArgs args, HttpMethod method)
{
using (Socket sK = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
try
{
sK.Connect(args.Host, args.Port);
if (sK.Connected)
{
byte[] buff = ParseHttpArgs(method, args);
if (sK.Send(buff) > 0)
{
string html = ParseResponse(sK, args);
return html;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return null;
}
private static string ParseResponse(Socket sK, HttpArgs args)
{
string header = ReadHeaderProcess(sK);
if (header.StartsWith("HTTP/1.1 400 Bad Request"))
{
return string.Empty;
}
if (header.StartsWith("HTTP/1.1 302"))
{
int start = header
.ToUpper().IndexOf("LOCATION");
if (start > 0)
{
string temp = header.Substring(start, header.Length - start);
string[] sArry = Regex.Split(temp, "\r\n");
args.Url = sArry[0].Remove(0, 10);
return Get(args); //注意302协议需要重定向
}
}
else if (header.StartsWith("HTTP/1.1 200")) //继续读取内容
{
int start = header.ToUpper().IndexOf("CONTENT-LENGTH");
int content_length = 0;
if (start > 0)
{
string temp = header.Substring(start, header.Length - start);
string[] sArry = Regex.Split(temp, "\r\n");
content_length = Convert.ToInt32(sArry[0].Split(':')[1]);
if (content_length > 0)
{
byte[] bytes = new byte[content_length];
if (sK.Receive(bytes) > 0)
{
return Encoding.Default.GetString(bytes);
}
}
}
else
{
//不存在Content-Length协议头
return ParseResponse(sK);
}
}
return string.Empty;
}
/// <summary>
/// 读取协议头
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
static string ReadHeaderProcess(Socket sK)
{
StringBuilder bulider = new StringBuilder();
while (true)
{
byte[] buff = new byte[1];
int read = sK.Receive(buff, SocketFlags.None);
if (read > 0)
{
bulider.Append((char)buff[0]);
}
string temp = bulider.ToString();
if (temp.Contains("\r\n\r\n") || temp.Contains("</html>"))
{
break;
}
}
return bulider.ToString();
}
/// <summary>
/// 注意:此函数可能产生死循环
/// </summary>
/// <param name="ssl"></param>
/// <returns></returns>
static string ParseResponse(Socket sK)
{
StringBuilder bulider = new StringBuilder();
byte[] buff = new byte[1024];
int len = sK.Receive(buff);
string temp = string.Empty;
while (len > 0)
{
byte[] reads = new byte[len];
Array.Copy(buff, 0, reads, 0, len);
bulider.Append(Encoding.Default.GetString(reads));
temp = bulider.ToString();
if (temp.ToUpper().Contains("</HTML>") || temp.Contains("\0"))
{
break;
}
len = sK.Receive(buff);
}
return temp;
}
#endregion
#region Helper
static byte[] ParseHttpArgs(HttpMethod method, HttpArgs args)
{
StringBuilder bulider = new StringBuilder();
if (method.Equals(HttpMethod.POST))
{
bulider.AppendLine(string.Format("POST {0} HTTP/1.1", args.Url));
bulider.AppendLine("Content-Type: application/x-www-form-urlencoded");
}
else
{
bulider.AppendLine(string.Format("GET {0} HTTP/1.1", args.Url));
}
bulider.AppendLine(string.Format("Host: {0}:{1}", args.Host, args.Port));
bulider.AppendLine("User-Agent: " + args.UA);
//"User-Agent: Mozilla/5.0+(Compatible;+Baiduspider/2.0;++http://www.baidu.com/search/spider.html)";Mozilla/5.0 (Windows NT 6.1; IE 9.0)
if (!string.IsNullOrEmpty(args.Referer))
bulider.AppendLine(string.Format("Referer: {0}", args.Referer));
//bulider.AppendLine("Connection: close");
if (!string.IsNullOrEmpty(args.Accept))
bulider.AppendLine(string.Format("Accept: {0}", args.Accept));
if (!string.IsNullOrEmpty(args.Cookie))
bulider.AppendLine(string.Format("Cookie: {0}", args.Cookie));
if (method.Equals(HttpMethod.POST))
{
bulider.AppendLine(string.Format("Content-Length: {0}\r\n", Encoding.Default.GetBytes(args.Data).Length));
bulider.Append(args.Data);
}
else
{
bulider.Append("\r\n");
}
string header = bulider.ToString();
return Encoding.Default.GetBytes(header);
}
#endregion
}
public class MilliTimer
{
private static double times { get; set; }
public static void start()
{
times = getTotalMilliseconds();
}
public static double getTimes()
{
return getTotalMilliseconds() - times;
}
public static double getTotalMilliseconds()
{
return DateTime.Now.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds;
}
}
}

21
Program.cs Normal file
View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace EnAliKeywordSearch
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Frm_Main());
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("EnAliKeywordSearch")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("EnAliKeywordSearch")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("d436c66a-3341-44b8-8ef1-c2307ea6cbd8")]
// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

63
Properties/Resources.Designer.cs generated Normal file
View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.18444
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AliKeywordSearch.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AliKeywordSearch.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

117
Properties/Resources.resx Normal file
View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

26
Properties/Settings.Designer.cs generated Normal file
View File

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.18444
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AliKeywordSearch.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

3
app.config Normal file
View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

BIN
icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB