前段时间经过观察,我发现,和大多数的博客一样,CSDN在每篇博客文章的上方,都有一个阅读量。这个阅读量的增加,是通过Web用户在浏览器端输入这篇文章的url地址,然后发送请求到服务器端,这时,阅读量就会加1,跟访问者是否登录没有关系。但是需要注意的是,前后的两次请求不能是同一个Session,也就是说,需要重新启动一个浏览器窗口。还有就是,前后两次请求不能间隔时间太短,否则无法刷访问量。
我们可以写一个控制台程序,然后每隔几秒钟就启动一个线程,这个线程的作用,就是启动浏览器访问指定页面,然后Sleep一段时间后,关闭浏览器。一段时间后,在开启浏览器,如此重复,直到刷出指定的次数。
static void Main(string[] args)
{
for (int i = 0; i < 1000; i++)
{
Util util = new Util();
util.StartThread();
Thread.Sleep(90000);
util.Close();
}
}
public class Util
{
public void StartThread()
{
ThreadStart start = new ThreadStart(StartIE);
Thread thread = new Thread(start);
thread.Start();
}
private void StartIE()
{
Process.Start("http://blog.csdn.net/sundacheng1989/article/details/7645498");
}
public void Close()
{
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process myProcess in myProcesses)
{
if (myProcess.ProcessName.ToUpper() == "IEXPLORE")
{
myProcess.Kill();
}
}
}
}
2015年11月更新:
上边的那些代码是刚刚接触C#的时候写的,对于很多地方还不是很明白,所以很乱。最近有时间了,又重写了一下这方面的东西。其实原理很简单,就是CSDN对于某篇文章的访问量的计数原则很简单,就是有人访问了这个页面,页面的访问量就加1.
基于此,使用ASP.NET Web API的HttpClient重写了这个工具。涉及到了一些多线程以及异步同步的基础。相关代码如下
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace VisitAmountIncreaser
{
class Program
{
static void Main()
{
Console.WriteLine("The application is staring!");
//string url = Console.ReadLine();
string url = "http://blog.csdn.net";
int threadAcount = 2;
StartTask(url);
string command = Console.ReadLine();
if (string.CompareOrdinal(command, "X") == 0)
{
Console.WriteLine("Application will quit after 30 seconds!");
Thread.Sleep(30000);
}
}
static async void StartTask(string url)
{
while (true)
{
await RunVisit(url);
}
}
static async Task RunVisit(string url)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
try
{
HttpResponseMessage response = await client.GetAsync("sundacheng1989/article/details/7945542");
response.EnsureSuccessStatusCode(); // Throw if not a success code.
string content = await response.Content.ReadAsStringAsync();
string result = GetStringInBetween(content, "<span class=\"link_view\" title=\"阅读次数\">", "</span>");
Console.WriteLine(result);
}
catch (HttpRequestException e)
{
Console.WriteLine(e.Message);
}
}
}
public static string GetStringInBetween(string strSource, string strStart, string strEnd)
{
if (strSource.Contains(strStart) && strSource.Contains(strEnd))
{
int Start = strSource.IndexOf(strStart, 0, System.StringComparison.Ordinal) + strStart.Length;
int End = strSource.IndexOf(strEnd, Start, System.StringComparison.Ordinal);
return strSource.Substring(Start, End - Start);
}
else
{
return "";
}
}
}
}
其实,当运行这个console程序时候,我们可以把这个exe复制多个,然后同时运行,那么就是多个进程同时干这件事了。在本机测试后,这段代码运行没有问题。
代码已经打包,下载地址:
http://files.cnblogs.com/files/Robin-Sun/VisitAmountIncreaser.zip