[转载]C#实现微信公众号群发消息(解决一天只能发一次的限制) - simadi - 博客园

mikel阅读(1204)

[转载]C#实现微信公众号群发消息(解决一天只能发一次的限制) – simadi – 博客园.经过几天研究网上的代码和谢灿大神的帮忙,今天终于用C#实现了微信公众号群发消息,现在整理一下。
总体思路:1.首先必须要在微信公众平台上申请一个公众号。
2.然后进行模拟登陆。(由于我对http传输原理和编程不是特别懂,在模拟登陆的地方,不是特别清楚,希望有大神指教)
3.模拟登陆后会获得一个token(令牌)和cookie。
4.因为模拟登陆后相当于就进入了微信公众平台,在这个里面就可以抓取到需要的数据,如公众好友的昵称,fakeId。其中的fakeid非常重要,因为传输数据必须要知道                      对方的fakeid。
5.知道对方的fakeid就可以进行数据的发送了。
我整个项目的代码在下载里面有 http://download.csdn.net/detail/zhangzhilai8/5679269
不过里面还有一些小问题,希望有人继续修改和讨论!也有人说这样会被封号,所以请谨慎操作
讲一下我项目里面的主要内容

 //对密码进行MD5加密
 static string GetMd5Str32(string str)
    {
        MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
        // Convert the input string to a byte array and compute the hash.
        char[] temp = str.ToCharArray();
        byte[] buf = new byte[temp.Length];
        for (int i = 0; i < temp.Length; i++)
        {
            buf[i] = (byte)temp[i];
        }
        byte[] data = md5Hasher.ComputeHash(buf);
        // Create a new Stringbuilder to collect the bytes
        // and create a string.
        StringBuilder sBuilder = new StringBuilder();
        // Loop through each byte of the hashed data
        // and format each one as a hexadecimal string.
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }
        // Return the hexadecimal string.
        return sBuilder.ToString();
    }
//执行登陆操作
    public static bool ExecLogin(string name,string pass)
    {
        bool result = false;
        string password = GetMd5Str32(pass).ToUpper();
        string padata = "username=" + name + "&pwd=" + password + "&imgcode=&f=json";
        string url = "http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN ";//请求登录的URL
        try
        {
            CookieContainer cc = new CookieContainer();//接收缓存
            byte[] byteArray = Encoding.UTF8.GetBytes(padata); // 转化
            HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(url);  //新建一个WebRequest对象用来请求或者响应url
            webRequest2.CookieContainer = cc;                                      //保存cookie
            webRequest2.Method = "POST";                                          //请求方式是POST
            webRequest2.ContentType = "application/x-www-form-urlencoded";       //请求的内容格式为application/x-www-form-urlencoded
            webRequest2.ContentLength = byteArray.Length;
            Stream newStream = webRequest2.GetRequestStream();           //返回用于将数据写入 Internet 资源的 Stream。
            // Send the data.
            newStream.Write(byteArray, 0, byteArray.Length);    //写入参数
            newStream.Close();
            HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();
            StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.Default);
            string text2 = sr2.ReadToEnd();
            //此处用到了newtonsoft来序列化
            WeiXinRetInfo retinfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WeiXinRetInfo>(text2);
            string token = string.Empty;
            if (retinfo.ErrMsg.Length > 0)
            {
                token = retinfo.ErrMsg.Split(new char[] { '&' })[2].Split(new char[] { '=' })[1].ToString();//取得令牌
                LoginInfo.LoginCookie = cc;
                LoginInfo.CreateDate = DateTime.Now;
                LoginInfo.Token = token;
                result = true;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.StackTrace);
        }
        return result;
    }
    public static class LoginInfo
    {
        /// <summary>
        /// 登录后得到的令牌
        /// </summary>
        public static string Token { get; set; }
        /// <summary>
        /// 登录后得到的cookie
        /// </summary>
        public static CookieContainer LoginCookie { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        public static DateTime CreateDate { get; set; }
    }

2.在WeiXin.cs类中实现发送数据

 public static bool SendMessage(string Message, string fakeid)
    {
        bool result = false;
        CookieContainer cookie = null;
        string token = null;
        cookie = WeiXinLogin.LoginInfo.LoginCookie;//取得cookie
        token =  WeiXinLogin.LoginInfo.Token;//取得token
        string strMsg = System.Web.HttpUtility.UrlEncode(Message);  //对传递过来的信息进行url编码
        string padate = "type=1&content=" + strMsg + "&error=false&tofakeid=" + fakeid + "&token=" + token + "&ajax=1";
        string url = "https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN";
        byte[] byteArray = Encoding.UTF8.GetBytes(padate); // 转化
        HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(url);
        webRequest2.CookieContainer = cookie; //登录时得到的缓存
        webRequest2.Referer = "https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token=" + token + "&fromfakeid=" + fakeid + "&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN";
        webRequest2.Method = "POST";
        webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
        webRequest2.ContentType = "application/x-www-form-urlencoded";
        webRequest2.ContentLength = byteArray.Length;
        Stream newStream = webRequest2.GetRequestStream();
        // Send the data.
        newStream.Write(byteArray, 0, byteArray.Length);    //写入参数
        newStream.Close();
        HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();
        StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.Default);
        string text2 = sr2.ReadToEnd();
        if (text2.Contains("ok"))
        {
            result = true;
        }
        return result;
    }

3.SendMessage.aspx.cs中主要实现获取fakeid

public static ArrayList SubscribeMP()
    {
        try
        {
            CookieContainer cookie = null;
            string token = null;
            cookie = WeiXinLogin.LoginInfo.LoginCookie;//取得cookie
            token = WeiXinLogin.LoginInfo.Token;//取得token
            /*获取用户信息的url,这里有几个参数给大家讲一下,1.token此参数为上面的token 2.pagesize此参数为每一页显示的记录条数
            3.pageid为当前的页数,4.groupid为微信公众平台的用户分组的组id,当然这也是我的猜想不一定正确*/
            string Url = "https://mp.weixin.qq.com/cgi-bin/contactmanagepage?t=wxm-friend&token=" + token + "&lang=zh_CN&pagesize=10&pageidx=0&type=0&groupid=0";
            HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(Url);
            webRequest2.CookieContainer = cookie;
            webRequest2.ContentType = "text/html; charset=UTF-8";
            webRequest2.Method = "GET";
            webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
            webRequest2.ContentType = "application/x-www-form-urlencoded";
            HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();
            StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.Default);
            string text2 = sr2.ReadToEnd();
            MatchCollection mc;
            //由于此方法获取过来的信息是一个html网页所以此处使用了正则表达式,注意:(此正则表达式只是获取了fakeid的信息如果想获得一些其他的信息修改此处的正则表达式就可以了。)
             Regex r = new Regex("\"fakeId\"\\s\\:\\s\"\\d+\""); //定义一个Regex对象实例
            mc = r.Matches(text2);
            Int32 friendSum = mc.Count;          //好友总数
            string fackID ="";
            ArrayList fackID1 = new ArrayList();
            for (int i = 0; i < friendSum; i++)
            {
                fackID = mc[i].Value.Split(new char[] { ':' })[1];
                fackID = fackID.Replace("\"", "").Trim();
                fackID1.Add(fackID);
            }
            return fackID1;
   }
        catch (Exception ex)
        {
            throw new Exception(ex.StackTrace);
        }
    }

[转载]WebRequest的使用 - 瞌睡虫 - 博客园

mikel阅读(1164)

[转载]WebRequest的使用 – 瞌睡虫 – 博客园.1:利用System.Net.WebRequest的Create方法创建WebRequest对象:

System.Net.WebRequest ObjWebRequest =System.Net.WebRequest.Create(urlP);

异常类型:
NotSupportedException

:requestUri 中指定的请求方案未注册。 
ArgumentNullException :requestUri 为空引用(Visual Basic 中为 Nothing)。 
SecurityException 调用方没有连接到请求的 URI 或请求重定向到的 URI 上的权限。 

 2:对请求进行预先身份验证,如果无明确的要求,此项可以空.

ObjWebRequest.Credentials CredentialCache.DefaultCredentials;

如果需要按照特别的验证协议,需要强制转换成HttpWebRequest类型:

 ((HttpWebRequest)ObjWebRequest).UserAgent “5DO8”;

 3:指明协议的类型:

ObjWebRequest.Method “POST”;

 可以是POST方式和Get方式.

 4:发送传输的数据长度(如果无显示传送,亦可发送),如果设置了此项,发送的数据必须恰好满足此值.

ObjWebRequest.ContentLength Stringdata.ToCharArray().Length;

 5:设置传入请求的 MIME 内容类型:

ObjWebRequest.ContentType=”application/x-www-form-urlencoded”;//Post
ObjWebRequest.ContentType=”text/xml”;//SOAP

 6:使用GetRequestStream()方法获取发送的流的句柄:

System.IO.Stream dataStream ObjWebRequest.GetRequestStream();

 7:发送数据:

dataStream.Write (byteArray, 0, byteArray.Length);

 注:byteArray是一个Byte数组,它的获取可以是:

byte[] byteArray UTF8Encoding.GetBytes(dataP);

 8:关闭Request流.

dataStream.Close ();

这是必须的,知道Close,服务器不会响应输出,还可以选择调用System.IO.Stream.Close()关闭流.

 9:利用GetResponse()获取Response对象.

WebResponse Objresponse ObjWebRequest.GetResponse();

 9*:你可以获取返回给客户端的 HTTP 输出状态的字符串,默认是公共状态消息”OK”

//Console.WriteLine (((HttpWebResponse)Objresponse).StatusDescription);
if ((HttpWebResponse)Objresponse).StatusDescription != “OK”){
//..结束这一切
}

 10:获取响应流的句柄:

Stream data Objresponse.GetResponseStream

 11:保存数据或者直接读出,例如直接输出到浏览器.

dataStream ObjResponse.GetResponseStream ();

StreamReader new StreamReader(dataStream);
Response.Write(HttpUtility.HtmlEncode(r.ReadToEnd()));

或者使用StreamWriter对象保存:

Stream outStream =System.IO.File.Create( “Temp.data” );
byte []buffer new byte[1024];
int l;
do{
dataStream.Read(buffer,0,buffer.Length);
if(l>0) outStream.Write(buffer,0,l);
while(l>0);

outStream.Close();

此方式可以保存二进制数据.

 12:关闭流.

Objresponse.Close();

 例如发送Soap文件时候,可以创建XmlDocument对象,直接使用Save()即可:

XmlDocument doc new XmlDocument();
doc.Load( System.Web.HttpContext.Current.Server.MapPath(@”~”)+@”\” xmlfile);
HttpWebRequest req (HttpWebRequest)WebRequest.Create(@”http://s:81/5do8/webs.asmx”);

req.ContentType “text/xml;charset=\”utf-8\””;
req.Accept “text/xml”;
req.Method “POST”;

Stream stm req.GetRequestStream();
doc.Save(stm);
stm.Close();
WebResponse resp req.GetResponse();
stm resp.GetResponseStream();
StreamReader new StreamReader(stm);
Response.Write(HttpUtility.HtmlEncode(r.ReadToEnd()));

 -1:利用ASP发送XMLHTTP对象:

Set xmlhttp server.CreateObject(“Msxml2.XMLHTTP”)
xmlhttp.Open “POST”,url,false
xmlhttp.setRequestHeader “Content-Type”, “text/xml;charset=utf-8”
xmlhttp.setRequestHeader “HOST”,”s”
xmlhttp.setRequestHeader “Content-Length”,LEN(SoapRequest)
xmlhttp.setRequestHeader “SOAPAction”, “http://s” 
xmlhttp.Send(SoapRequest)
Response.Write xmlhttp.Status&” 
Response.Write xmlhttp.StatusText
Set xmlhttp Nothing

获取的时候:

If xmlhttp.Status 200 Then
Set xmlDOC =server.CreateObject(“MSXML.DOMDocument”)
xmlDOC.load(xmlhttp.responseXML)
xmlStr xmlDOC.xml
Set xmlDOC=nothing
xmlStr Replace(xmlStr,”<“,”<“)
xmlStr Replace(xmlStr,”>”,”>”)
Response.write xmlStr
Else
Response.Write xmlhttp.Status&” 
Response.Write xmlhttp.StatusText
End if
请求正确则给出完整响应,请求不正确(如账号,密码不对)响应的内容就会信息不完整.
取出响应里的数据,如下:
If xmlhttp.Status 200 Then
Set xmlDOC server.CreateObject(“MSXML.DOMDocument”)
xmlDOC.load(xmlhttp.responseXML)
Response.Write xmlDOC.documentElement.selectNodes(“//LoginByAccountResult”)(0).text 
Set xmlDOC nothing
Else
Response.Write xmlhttp.Status&” 
Response.Write xmlhttp.StatusText
End if
显示某节点各个属性和数据的FUNCTION:
Function showallnode(rootname,myxmlDOC)
if rootname<>”” then
set nodeobj=myxmlDOC.documentElement.selectSingleNode(“//”&rootname&””)’当前结点对像
nodeAttributelen=myxmlDOC.documentElement.selectSingleNode(“//”&rootname&””).attributes.length’当前结点属性数
returnstring=returnstring&”<BR>节点名称:”&rootname
if nodeobj.text<>”” then
returnstring=returnstring&”<BR>节点的文本:(“&nodeobj.text&”)”
end if
returnstring=returnstring&”<BR>{<BR>”
if nodeAttributelen<>0 then
returnstring=returnstring&”<BR>属性数有  “&nodeAttributelen&” 个,分别是:”
end if
for i=0 to nodeAttributelen-1
returnstring=returnstring&”<li>”&nodeobj.attributes(i).Name&”: “&nodeobj.getAttribute(nodeobj.attributes(i).Name)&” </li>”
next
if nodeobj.childNodes.Length<>0 then
if nodeobj.hasChildNodes() and lcase(nodeobj.childNodes.item(0).nodeName)<>”#text” then’是否有子节点
set childnodeobj=nodeobj.childNodes
childnodelen=nodeobj.childNodes.Length
returnstring=returnstring&”<BR><BR>有 “&childnodelen&” 个子节点;<BR>分别是: 
for i=0 to childnodelen-1
returnstring=returnstring&”<li>”&childnodeobj.item(i).nodeName&”</li>”
next
end if
end if
returnstring=returnstring&”<BR>}<BR>”
response.write returnstring
set nodeobj=nothing
end if
End Function
可以这样用:
If xmlhttp.Status 200 Then
Set xmlDOC server.CreateObject(“MSXML.DOMDocument”)
xmlDOC.load(xmlhttp.responseXML)
showallnode “LoginByAccountResponse”,xmlDOC’调用SHOWALLNODE
Set xmlDOC nothing
Else
Response.Write xmlhttp.Status&” 
Response.Write xmlhttp.StatusText
End if

POST:

url “http://s/”
SoapRequest=”username=”&username&”&password=”&password
Set xmlhttp server.CreateObject(“Msxml2.XMLHTTP”)
xmlhttp.Open “POST”,url,false
xmlhttp.setRequestHeader “Content-Type”, “application/x-www-form-urlencoded”’注意
xmlhttp.setRequestHeader “HOST”,”

xmlhttp.setRequestHeader “Content-Length”,LEN(SoapRequest)
xmlhttp.Send(SoapRequest)

Response.Write xmlhttp.Status&” 
Response.Write xmlhttp.StatusText
Set xmlhttp Nothing

‘POST 
If xmlhttp.Status 200 Then
Set xmlDOC server.CreateObject(“MSXML.DOMDocument”)
xmlDOC.load(xmlhttp.responseXML)
showallnode “string”,xmlDOC’调用SHOWALLNODE
Set xmlDOC nothing
Else
Response.Write xmlhttp.Status&” 
Response.Write xmlhttp.StatusText
End if

[转载]DELPHI下POST/GET数据 - 猪悟能 - 博客园

mikel阅读(1026)

[转载]DELPHI下POST/GET数据 – 猪悟能 – 博客园.

法一:利用TWebBrowser组件
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
*******
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
URL:OleVariant;
POST:OleVariant;
target:OleVariant;
flag:OleVariant;
header:OleVariant;
PostStr:String;
PostLen,Index:Integer;
begin
URL:=’http://port.fudan.edu.cn:58080/amserver/UI/Login?goto=http%3A%2F%2Fwww.urp.fudan.edu.cn%3A81%2Fepstar%2Frs%2Fpr%2Fgwkh%2Fdzgwkh%2Fgr_dzgwkh_index.jsp&gotoOnFail=http://www.urp.fudan.edu.cn/portal?.flag=fail’;
PostStr:=’Login.Token1=04538&Login.Token2=*******&Submit=%B5%C7+%C2%BC’;
target:=NULL;
flag:=0;
PostLen := Length(PostStr);
// 用构建 varByte 类型的 Variant array
Post := VarArrayCreate([0, (PostLen – 1)], varByte);
// 填充数据
for Index := 0 to PostLen – 1 do
Post[Index] := Ord(PostStr[Index + 1]);
// 填补头部数据注意:application
Header := ‘Content-Type: application/x-www-form-urlencoded’;

WebBrowser1.Navigate2(URL,flag,target,POST,Header);
while WebBrowser1.Busy=True do
Application.ProcessMessages ;
if WebBrowser1.ReadyState <>READYSTATE_COMPLETE   then
Memo1.Text :=WebBrowser1.OleObject.Document.all.tags(‘HTML’).Item(0).outerHTML;
else
Memo1.Text:=’页面加载失败’;
end;
end.

法二:利用XMLHTTP组件         use comobj, ActiveX,
var
xmlHTTP:oleVariant;
code0:OleVariant ;
begin
code0:=CODE+’&DataGrid1%3A_ctl’+inttostr(strtoint(form1.Edit2.Text)+1)+’%3Azhj1=on’;
while not connectfalg do
begin
try
CoInitialize(nil);
xmlHttp:=CreateOleObject(‘Msxml2.XMLHTTP’);
except
CoUninitialize();
Continue ;
end;

try
begin;
xmlHttp.open(‘POST’,Url,false);
xmlHttp.setRequestHeader(‘Content-Type’,’application/x-www-form-urlencoded’);
xmlHttp.send(code0);
htmlcode:=xmlHttp.responsetext;
if   xmlHttp.status=’200′   then
begin
connectfalg:=True;
Result:=0;
xmlHttp   :=   Unassigned;
CoUninitialize();
Exit ;
end;
end;
except
on E:Exception do
begin
ShowMessage(e.Message);
end;
end;
end;
Result:=-1;
end;

发三:TIdhttp组件           use IdHTTP
Function Getwebs():Integer;stdcall; //线程函数
Var
myhttp: TIdhttp;
param:string;
begin
myhttp:=Tidhttp.Create(nil);
myhttp.ReadTimeout := 30000;
try
begin
cc := myhttp.Get(param);
End;
except
begin
myhttp.Free;
Result :=1;
Exit;
end;
end;
Result :=0;
end;
补充一例:<WinInet函数相关 >

DWORD dwConnectState;
CString strConnectState;
BOOL bOK = InternetGetConnectedState( &dwConnectState, 0);
if ( bOK )
{
if ( dwConnectState & INTERNET_CONNECTION_LAN )
strConnectState = “Local system uses a local area network to connect to the Internet. “;
if ( dwConnectState & INTERNET_CONNECTION_MODEM )
strConnectState = “Local system uses a modem to connect to the Internet. “;
if ( dwConnectState & INTERNET_CONNECTION_MODEM_BUSY )
strConnectState = “No longer used. “;
if ( dwConnectState = INTERNET_CONNECTION_PROXY )
strConnectState = “Local system uses a proxy server to connect to the Internet. “;
}
测试连接是否有效,可以用:InternetCheckConnection

检测计算机是否联网比较简单的做法可以通过一个 Win32 Internet(WinInet) 函数 InternetCheckConnection来实现;
这个函数的功能是检查是否能够建立 Internet 连接。
它的实现是在 %SystemRoot%\System32\wininet.dll 中,Delphi 调用声明在 WinInet.pas 中,
其 API 声明如下:

BOOL InternetCheckConnection(
IN LPCSTR lpszUrl,
IN DWORD dwFlags,
IN DWORD dwReserved
);

参数的意义是:

lpszUrl: 需要测试能否建立连接的 URL 地址,可以为空;
dwFlags: 目前只能是 FLAG_ICC_FORCE_CONNECTION(这个常量 Delphi 中没有声明,其值为 $00000001);
dwReserved: 目前只能为 0。

调用的说明:

如果 lpszUrl 是非空的,Windows 从中解析出 Host 名然后 Ping 这个指定的 Host。
如果 lpszUrl 是空的,并且 WinInet 内部服务器的 database 中有一个关于最近的 Server 的纪录,Windows 就从这条纪录中解析出 Host 名然后 Ping 它。

如果能够成功的连接返回 True,否则返回 False;

以下是一个判断当前计算机是否联网的例子:

procedure TForm1.Button1Click(Sender: TObject);
begin
if InternetCheckConnection(‘http://www.yahoo.com/‘, 1, 0) then
edit1.text:= ‘Connected’
else
edit1.text:= ‘Disconnected’;
end;

通过上述的方法只能检测出当前计算机是否物理联网,即网线是否接好,网卡是否能顺利工作,不能确定是否能够实现获得 Internet 服务,即是否能和 ISP 进行 Internet 连接。
这时可以通过另一个 Win32 Internet(WinInet) 函数 InternetQueryOption 来检测;
这个函数的功能是查询指定 Internet 句柄的状态、选项。
其 API 声明如下:

BOOL InternetQueryOption(
IN HINTERNET hInternet,
IN DWORD dwOption,
OUT LPVOID lpBuffer,
IN OUT LPDWORD lpdwBufferLength
);

参数的意义是:

hInternet:查询对象的 Internet 句柄(全局查询时为 nil),
dwOption:查询的项目;
lpBuffer:返回的查询结果;
lpdwBufferLength:查询结果的字节长度(包括 IN 和 OUT);

查询成功返回 True,否则返回 False;

我们要查询当前计算机的 Internet 连接状态时可以使用查询项目 INTERNET_OPTION_CONNECTED_STATE,

得到的 ConnectState 返回值可能是以下值的一个或几个值之和:

INTERNET_STATE_CONNECTED                :$00000001 连接状态;
INTERNET_STATE_DISCONNECTED             :$00000002 非连接状态(和 INTERNET_STATE_CONNECTED 对应);
INTERNET_STATE_DISCONNECTED_BY_USER     :$00000010 用户请求的非连接状态
INTERNET_STATE_IDLE                     :$00000100 连接状态,并且空闲
INTERNET_STATE_BUSY                     :$00000200 连接状态,正在响应连接请求

以下是一个判断当前计算机是否可以获得 Internet 服务的例子:

function TForm1.CheckOffline: boolean;
var
ConnectState: DWORD;
StateSize: DWORD;
begin
ConnectState:= 0;
StateSize:= SizeOf(ConnectState);
result:= false;
if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState, StateSize) then
if (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2 then result:= true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckOffline then
edit1.text:= ‘Connect To ISP’
else
edit1.text:= ‘Disconnect To ISP’;
end;

需要说明的是 InternetQueryOption 函数的检测结果只能表明当前的 Internet 设置是可用的,
并不能表示计算机一定能访问 Internet,例如网线掉了,网卡突然坏了之类的错误就没法检测出来,
要想检测当前计算机是否能够获得 Internet 服务了必须两个函数结合起来使用。

以上程序在 Win2000, Delphi5.0 下调试通过。

最后要提醒大家注意的是在 uses 中要加上 WinInet。

[转载]一、简单的http抓包(微信公众网页登录模拟) - 可可ing - 博客园

mikel阅读(1175)

[转载]一、简单的http抓包(微信公众网页登录模拟) – 可可ing – 博客园.

一、准备工具:

系统:XP
浏览器:IE8
抓包工具:HttpWatch(它可以查看url请求的数据包)

二、抓包思路:
浏览器上的任何获取数据的方式都符合http协议的请求,只要发送符合要求的数据就可以模拟任 何操作,所以抓包重点就要找出服务器需要的数据,例如:模拟登录的话,就是找出那个是用户字段,密码字段,验证码字段,获取有需要的Cookie字段等信 息,话不多说,下面演示一个列子把。
三、实践示列:
这次的抓包演示是模拟微信公众平台登录操作
(1)HttpWatch的基本使用
傻瓜式安装完HttpWatch以后,就打开浏览器-工具启动该软件:

(2)抓取登录操作请求包信息,确认需要发送的数据
以下是执行了登录操作,然后我们来查看下登录操作都访问了那些url地址,和这些url地址的数据:
1:这个就不用多说了,大家都是明白人,这个就是登录第一步访问的url地址
2:刚才忘了说,这个列表包括了请求和返回的全部数据包
3:post请求,以及访问该网站的路径地址,
4:这个微信网站用来防止外链登录的,一开始试登录的时候忘了加这个,然后总是奇怪登录不上,然后把head字段一个个试才知道是需要这个字段;
5:这个也必须得写上,因为有点网站禁止了一些随意的抓包,所以必须得模拟你所在的运行环境。不让服务器发送你是抓包;
6:这个是post的数据列表;
7:这个就是服务器那边需要在本地设置的cookie值,这个得缓存起来,然后在后面的操作发送给服务器,因为服务器有时会用到某些值,如果没有的话就不好办了, 你懂的;
8:这个就是登录操作返回过来的结果,具体的数据就要看自己分析了,这里的数据是一个json字符串,
ret:不清楚,
ErrMsg:跳转的url地址,
showVerifyCode:看字面意思吧,是否需要验证码
ErrCode:登录结果状态
关于登录结果状态,我再登录页面下的js相关文件看到了有一下内容,看了这个就应该很明白了:
(3)go on,接受到登录的结果以后,我们再看下它又跳到哪里去 了。
我们看到它跳转的url地址,恰好是登录返回过来的结果ErrMsg字段的值,所以结果就很清楚了,这个页面就是微信的主页。
简单的模拟微信登录抓包就到这里了,大家还可以自己尝试下获取好友列表,以及发送消息给好友的功能哦;

[转载]微信公众平台公开文章阅读数和点赞数及算法统计 - 微信查询网

mikel阅读(1229)

[转载]微信公众平台公开文章阅读数和点赞数及算法统计 – 微信查询网.

目前微信公众平台广告投放将更透明日曝光量接近1亿,并增加与用户互动形式,微信公众平台确定公开文章阅读次数、点赞数。只有一个微信公众号才会显示,有三个地方新改变:文章标题下的作者信息前加了一个”by”,换行显示日期、每篇文章的阅读次数和公众账号信息和在文章末尾可对文章进行点赞,还有具体的点赞次数。

微信公众号文章公开了阅读数和点赞数,微信查询网和大家一起来看下,对文章算法的统计方法有个全面的了解。

第一,每个微信ID每天可以贡献5阅读数1个点赞数。连续5次打开文章阅读数都会增加。以晚上0点周期开始,打开文章可以再次增加5个阅读数。

第二,只计算微信app打开的文章,将该文章转发到诸如QQ、博客中点开该文章的链接,阅读数都不会被记录。无论是直接将文章“发送给朋友”,还是先“复制链接”再把URL发送给微信好友,都是有效的,只要TA在微信中打开即算数。

第三,手机web版、Mac版、PC端微信打开的文章会跳转到 PC 浏览器,也不算数。只计算在手机APP中打开的。

第四,增加阅读数不需要关注微信公众号,好友或朋友圈转发打开的文章均算数。

第五,“阅读数”是手机上实时显示,在公开数据之前,公众号运营者可以在后台查看昨日的图文页阅读次数。

第六,通过微信后台本身或者微信二次开发后增加的关键词自动回复功能获得的文章不计入阅读数。如果是以关键词回复查看的“图文消息”,该文章将从0计阅读数。

第七,通过“查看历史消息”打开文章是算数的。不过阅读数从7月25开始计算。

第八,测试期间(2014年7月23~2014年7月25)阅读数是可以刷的,提醒一下:刷刷有风险,且刷且珍惜。

[转载]【HTTP】Fiddler(二) - 使用Fiddler做抓包分析 - 专注、专心 - 博客频道 - CSDN.NET

mikel阅读(864)

[转载]【HTTP】Fiddler(二) – 使用Fiddler做抓包分析 – 专注、专心 – 博客频道 – CSDN.NET.

上文( http://blog.csdn.net/ohmygirl/article/details/17846199 )中已经介绍了Fiddler的原理和软件界面。本文主要针对Fiddler的抓包处理。

Fiddler抓取HTTP请求。

抓包是Fiddler的最基本的应用,以本博客为例,启动Fiddler之后,在浏览器中输入http://blog.csdn.net/ohmygirl 键入回车之后,在Fiddler的web session界面捕获到的HTTP请求如下图所示:

各字段的详细说明已经解释过,这里不再说明。需要注意的是#号列中的图标,每种图标代表不同的相应类型,具体的类型包括:

另外,注意请求的host字段。可以看到有来自多个www.csdn.net的子域名的响应,说明在大型网站的架构中,大多需要多个子域名,这些子域名可能是单独用于缓存静态资源的,也可能是专门负责媒体资源的,或者是专门负责数据统计的(如pingback)。

右键单击其中的一条请求。可以选择的操作有:save(保存请求的报文信息,可以是请求报文,可以是响应报文)。例如,我们保存的一条请求头信息如下:

不仅是单条session,Fiddler还支持保存所有抓取到的session(并支持导入),这对于抓取可疑请求然后保存,并在之后随时分析这些请求是很有帮助的。

如果想要重新发送某些请求,可以选中这些请求,然后点击工具栏中的reply.就可以重新发送选中的这些请求。

左键点击单条HTTP请求,可以在右侧的tab面板中看到如下信息:

1. Statistic

关于HTTP请求的性能和其他数据分析:

我们可以从中看出一些基本性能数据:如DNS解析的时间消耗是8ms,建立TCP/IP连接的时间消耗是8ms等等信息。

2. Inspectors

分为上下两个部分,上半部分是请求头部分,下半部分是响应头部分。对于每一部分,提供了多种不同格式查看每个请求和响应的内容。JPG 格式使用 ImageView 就可以看到图片,HTML/JS/CSS 使用 TextView 可以看到响应的内容Raw标签可以查看原始的符合HTTP标准的请求和响应头。Auth则可以查看授权Proxy-Authorization 和 Authorization的相关信息。Cookies标签可以看到请求的cookie和响应的set-cookie头信息。

3. AutoResponder

Fiddler比较重要且比较强大的功能之一。可用于拦截某一请求,并重定向到本地的资源,或者使用Fiddler的内置响应。可用于调试服务器端代码而无需修改服务器端的代码和配置,因为拦截和重定向后,实际上访问的是本地的文件或者得到的是Fiddler的内置响应。当勾选allow autoresponser 并设置相应的规则后(本例中的规则是将http://blog.csdn.net/ohmygirl的请求拦截到本地的文件layout.html,如下图所示

然后在浏览器中访问http://blog.csdn.net/ohmygirl,得到的结果实际为:

这刚好是本地layout.html的内容,说明请求已经成功被拦截到本地.当然也可以使用Fiddler的内置响应。下图是Fiddler支持的拦截重定向的方式:


因此,如果要调试服务器的某个脚本文件,可以将该脚本拦截到本地,在本地修改完脚本之后,再修改服务器端的内容,这可以保证,尽量在真实的环境下去调试,从而最大限度的减少bug发生的可能性。

不仅是单个urlFiddler支持多种url匹配的方式:

I. 字符匹配

如 example可以匹配 http://www.example.comhttp://example.com.cn

II. 完全匹配

EXACT开头表示完全匹配,如上边的例子

EXACT:http://blog.csdn.net/ohmygirl

III. 正则表达式匹配

以regex: 开头,使用正则表达式来匹配URL

如:regex:(?insx).*\.(css|js|php)$  表示匹配所有以css,js,php结尾的请求url

4. Composer。

老版本的fiddler中叫request-builder.顾名思义,可以构建相应的请求,有两种常用的方式构建请求:

(1)Parsed 输入请求的url之后executed即可,也可以修改相应的头信息(如添加常用的accept, host, referrer, cookie,cache-control等头部)后execute.

这个功能的常见应用是:“刷票”(不是火车票!!),如刷新页面的访问量(基于道德和安全原因,如果你真去刷票,刷访问量,本博客概不负责)

(2)Raw。使用HTTP头部信息构建http请求。与上类似。不多叙述

5. Filter

Fiddler另一个比较强大的功能。Fiddler提供了多维度的过滤规则,足以满足日常开发调试的需求。如下图示:

过滤规则有:

a. host和zone过滤。可以过滤只显示intranet或则internet的HTTP请求

也可以选择特定域名的HTTP请求

b. client process:可以捕获指定进程的请求。

这对于调试单个应用的请求很有帮助。

其他更多的设置可以参考fiddler的官方文档。

[转载]fiddler2抓包工具使用图文教程 - Sacrifice的日志 - 网易博客

mikel阅读(996)

[转载]fiddler2抓包工具使用图文教程 – Sacrifice的日志 – 网易博客.

Fiddler2的中文手册请见此博客http://blog.sina.com.cn/s/blog_66a13b8f0100vgfi.html

 

一、软件简介:

   一款免费且功能强大的数据包抓取软件。它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视、设置断点、甚至修改输入输出数据等功能。fiddler包含了一个强大的基于事件脚本的子系统,并且能够使用.net框架语言扩展。所以无论对开发人员或者测试人员来说,都是非常有用的工具。

二、fiddler的下载与安装:

1、下载fiddler2汉化版软件,下载地址:http://www.cr173.com/soft/42248.html

2、下载完成后,解压文件,然后点击“Fiddler.exe”文件即可启动软件。

三、fiddler实用功能使用说明:

1fiddler捕获浏览器的会话:

     能支持http代理的任意程序都能被fiddler捕获到,由于fiddler的运行机制就是监听本机上的8888端口的http代理,所以我们要将浏览器的IE代理设置为127.0.0.1:8888,我们就以360浏览器为例设置浏览器的代理:点击【工具】Internet选项】【连接】【局域网设置】,再点击代理服务器的【高级】按钮,将HTTP代理服务器地址改为127.0.0.1:8888

                                                          图一:设置浏览器代理

2、使用fiddler捕获HTTPS会话:

   默认情况下,fiddler是不会捕获https会话的,所以需要自行设置一下。启动软件,点击【工具】fiddler选项】,在弹出的新窗口中,点击HTTPS选项卡,将捕获HTTPS连接这一选项前面全打上勾,点击OK就操作成功了。如下图所示:

                                                   图二:设置可以捕获HTTPS会话

3fiddler主界面介绍:

     启动fiddler,我们就会看到该软件的主界面,软件窗口大体可以分为六大部分:菜单栏、工具栏、会话列表、命令行工具栏、HTTP Request显示栏、Http Response显示栏。让你在捕获数据的时候一目了然。

                                                               图三:fiddler主界面图

4、查看HTTP统计视图:

      通常fiddler会话列表中会显示捕获的所有的http通 信量,并以列表的形式展示出来,点击你想查看的一个或者多个会话,再点击软件右边的【统计】菜单,你就可以很轻松的查看到请求数、发送字节数等信息。如果 你选择第一个请求和最后一个请求,还可以获得页面加载所消耗的总体时间,还可以从图表中分辩出那些请求耗时最多,从而可以对页面的访问速度进行优化。

                                                            图四:查看某一会话的详细信息

5QuickExec命令行的使用:

     QuickExec命令行是会话列表下边的黑色区域,你可以在里面输入命令,回车之后即可执行你的命令,非常方便,在这里为大家介绍几个常用的命令:

      help  打开官方的使用页面介绍,所有的命令都会列出来

      cls   清屏  (Ctrl+x 也可以清屏)

      select  选择会话的命令

      ?.png  用来选择png后缀的图片

      bpu  截获request

                                                     图五:QuickExec命令行的使用

6、如何在fiddler中设置断点修改Response

   主要有两种方法:

1、点击【设置】菜单【自动断点】【响应之后】,这种方法是中断所有的会话,如果你想消除断点的话,就点击【设置】【自动断点】【禁用】就可以了。

2、在QuickExec命令行中输入:“bpuafter 网址/会话名,这种方法是中断某一具体的会话,如果想消除命令的话,在命令行中输入“bpuafter”

   7、如何在fiddler中创建AUTOResponder规则:

        设置AUTOResponder规则的好处是允许你从本地返回文件,而不用将http request发送到服务器上。我们就以访问博客园网站为例说明一下该功能的用法。

        1) 打开博客园首页,把博客园的LOGO图片保存在本地,并把图片修改一下。

        2) 打开fiddler找到刚才我们有该LOGO图片的会话,然后点击软件右边的自动响应选项卡,在“Enable authomatic reponses”“permit passthrought unmatched requests”前面都打上勾,将会话拖到自动响应列表框中。

        3) 在右下角的Rule Editor的第二个文本框选择“Find a File……”,然后选择本地保存的图片,点击“SAVE”按钮保存就可以了。

                                                              图六:选择修改后的LOGO文件       

     4) 我们再次打开博客园首页,注意观察LOGO图片已经变成我们所修改的那张了。

                                                           图七:效果图

  8fiddler的会话比较功能的使用:

       选中两个会话,右键点击“Compare”,就可以利用WinDiff来比较两个会话有什么不同了。(注:使用这个功能的前提是你要安装有WinDiff

                                                             图八:比较两个会话

  9fiddler还有编码小工具,下面我们来看一下应该怎么使用:

     1)单击工具栏的编码器按钮

     2)在弹出的新窗口中,你就可以操作了,如下图所示。

                                                                 图九:编码工具的使用

  10fiddler查询会话:

      1)点击【编辑】菜单【查询会话】或者使用快捷键Ctrl+F

      2)在弹出的新窗口中输入你要查询会话,点击“find session”按钮之后,你就会发现查询到的会话会用黄色标注出来。

                                                    图十:寻找会话填写会话关键词

                                                 图十一:被找出的会话用黄色标注出来了

  11、如何在VS调试网站的时候使用Fiddler

        如果你想在用visual stuido 开发ASP.NET网站的时候也用Fiddler来分析HTTP 但是默认的Fiddler是不能嗅探到localhost的网站。有两个方法可以供你选用:

      1)你只要在localhost后面加个点号,Fiddler就能嗅探到。例如:原本ASP.NET的地址是 http://localhost:2391/Default.aspx 加个点号后,变成 http://localhost.:2391/Default.aspx 之后就可以被fiddler捕获到了。

                                               图十二:捕获localhost的网站

      2)在hosts文件中加入127.0.0.1  localsite这样也可以被捕获到。

[转载]ASP.NET MVC学习系列(二)-WebAPI请求 - 酷小孩 - 博客园

mikel阅读(1180)

[转载]ASP.NET MVC学习系列(二)-WebAPI请求 – 酷小孩 – 博客园.

  继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理。

这里我使用JQuery 来发起异步请求实现数据调用。

  继续使用上一文章中的示例,添加一个index.html页面,添加对JQuery的引用。

 

一、无参数Get请求

  一般的get请求我们可以使用jQuery提供的$.get() 或者$.ajax({type:”get”}) 来实现:

  请求的后台Action方法仍为上篇文章中的GetUser() :

  也可以用$.ajax({type:”get”}) 方式,正确的获得了返回数据:

 

二、传递一个参数的Get请求

  通常我们需要传递参数只需要指定ajax方法的data属性即可: data:{“name”:”赵大宝”} 

  后台正确的返回数据:

 

三、传递两个或多个参数的Get请求

  按照上面的方法,对于多个参数我们可以很容易就写出来: data:{“name”:”赵大宝”,”age”:12}

   后台正确的返回数据:

四、无参数的Post请求

  我们可以使用$.post() 或$.ajax({type:”post”}) 来发起post请求:

  后台正确的返回了数据:

五、传递一个参数的Post请求:

  首先这里需要提醒大家一下,我们在修改完后台代码后,如果没有重新生成项目,那么在请求时就会报错:“未找到与请求***匹配的HTTP资源” :

  所以,我们只要我们修改了后台代码,就一定要重新生成一下:

 

  不过,当我们重新生成项目,再次发送请求,看到的仍然是404错误,再次检查一番代码,也没有发现是哪里的问题。

  事实上,ASP.NET Web API能够正确的识别我们的UserController控制器处理Post /api/user ,但却不能找到一个可以接受的方法来处理请求。

也就是说,Web API接收到的请求能够找到User控制器,但在该控制器中找不到名称为Def 的这个Action。

那我们要怎么来解决呢?

通过搜索MSDN上Web API官网中的说明,我们可以找到下面的一段介绍:

在Action 方法中我们需要使用 [FromBody] 属性标签来标明属性

  修改后,再次发送请求,我们可以看到,Status Code 为200,请求发送成功。

  可以看到,在post请求中,方法的参数必须要用 [FromBody] 属性来修饰才可以, [FromBody] 就告诉Web API 要从post请求体重去获取参数的值。

但让我们诧异的却是,后台返回的数据中name的值为空。

  通过调试,我们可以看到,后台Action 中接收到的name值为null。

 

  通过上面的测试我就也能够猜测到,Web API 要求请求传递的 [FromBody] 参数,肯定是有一个特定的格式,才能被正确的获取到。而这种特定的格式并不是我们常见的 key=value 的键值对形式。Web API 的模型绑定器希望找到 [FromBody] 里没有键名的值,也就是说, 不是 key=value ,而是 =value 。

现在,咱们把data中的key设置为空,然后再次发送请求:

  测试可见,后台正确的接收到了数据:

 六、传递两个参数的Post请求

  按理说,一个参数的请求实现了,那么传递两个或者多个参数也就很顺利了,对于两个参数的后台接收方法,我们可能会这样来写:

但事实证明,这样是错误的。

 

那到底两个或者多个参数我们要怎样来定义呢?

再次查看官网中的介绍,我们了解到:

  也就是说,[FromBody] 修饰的参数只能有一个。我们需要对传递的多个参数进行封装才行。

这里,我们可以将 Name和 Age 封装成一个Student 类:

  前台页面再次发送请求:

  Status Code为200,请求成功,并正确获取到后台返回的数据:

 

  这里,我们通过上面图片中的请求头数据可以看到,Form Data 的格式是 key=value&key=value 这种表单数据格式 Name=%E8%B5%B5%E5%A4%A7%E5%AE%9D&Age=13 ,我们平时使用的比较多的一般为json格式。 这里,我们使用 JSON.stringify() 来序列化数据。

再次发送请求:

  可以看到,From Data 中数据的格式为json字符串,Status Code为200,请求正确,但结果又出错了,后台又没有接收到数据参数:

那么问题到底出在哪呢?

  我们再次查看上图中请求头内容,注意到,虽然我们传递的数据格式是json字符串,但请求头中的Content-type 却为 

application/x-www-form-urlencoded ,并不是json格式对于的 application/json 。 而编码格式 application/x-www-form-urlencoded 表示的是:窗体数据被编码为名称/值对。 

  这里,也就是我想要说的一个注意点。平时我们在使用json数据的时候,很容易就忘记了 要指定 Content-type 为 “application/json” ,所以就容易导致很多“想不到”的错误。

所以,我们在 $.ajax() 中指定 Content-type :

  这次,后台正确的接收并返回了数据:

 

七、传递多个参数的Post请求

  有了上面的经验,传递多个参数的post请求我们就很容易能写出来了:

后台接收并返回数据:

 

八、传递多个不同对象的Post请求

  有时候我们还会遇到需要传递多个不同对象参数的情况,对于这种特殊的情况在 Json.Net 中为我们提供了一个 名为 JObject 的通用对象容器,我们可以通过 .对象名 的方式来动态的遍历参数里面的属性的值,然后动态的转换和json类型中对应的属性类型。

比如:

后台调试,通过dynamic 动态转换获取属性的值:

后台正确的返回了数据:

 

九、获取不同类型的数据

  一般我们获取到后台返回的数据格式类型为 json格式,我们也可以指定 请求头中的输出类型来获得不同的返回类型数据:

指定输出类型为xml格式:

指定输出类型为 json格式:

 

  基本到这里,这篇文章的主要内容也就算说完了,其中的重点还是 Post请求中对于参数的处理是需要重点注意的。

  上面我们在测试的过程中,都是通过自己创建的Controller控制器类来对参数进行接收处理,可能有人会问,我们这么写到底是否符合规范呢,Web API中默认是怎么来处理的呢? 这里,Visual Studio 中也为我们自带了 Web API控制器类:

我们可以添加新建项选择 Web API控制器类 即可:

  这里我们可以看到,默认创建的Controller控制器类中,对于Post请求的Action方法都自带了 [FromBody] 属性。 现在不用我说,你也已经知道为什么 它会为参数默认带一个 [FromBody]属性吧!

好了,今天的内容就到这里,下面附上我参考的几篇文章:

MSDN中关于Web API 中 [FromBody] 的介绍: Parameter Binding in ASP.NET Web API | The ASP.NET Site 

关于[FromBody]属性的介绍及Post参数说明(E文): Using jQuery to POST [FromBody] parameters to Web API | Encosia 

上面网页文章的翻译版本:【翻译】使用JQuery POST表单到Web API | 北飘漂 

Post 多个参数到Web API的总结: POST多个参数到Web API控制器方法总结 | 北飘漂

附当前项目的代码:XWebAPIDemo-WebAPI请求

转载请注明出处。

 

版权
作者:酷小孩
出处:http://www.cnblogs.com/babycool/

本文首发博客园,版权归作者跟博客园共有。

转载必须保留本段声明,并在页面显著位置给出本文链接,否则保留追究法律责任的权利。

[转载]ASP.NET MVC学习系列(一)-WebAPI初探 - 酷小孩 - 博客园

mikel阅读(1322)

[转载]ASP.NET MVC学习系列(一)-WebAPI初探 – 酷小孩 – 博客园.

  由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章。因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后 来工作以后主要还是开发WebForm的项目,所以MVC的东西也就逐渐的淡忘了。

  经过这一段时间的系统学习,真的觉得MVC3相比于之前的MVC2还有WebForm来说,确实有一种让人欲罢不能爽歪歪的感觉。特别是Razor语法、Linq表达式等的结合运用。

  为了将学习过程中遇到的一些值得留意的问题和知识点进行一个很好地整理,所以 打算把对MVC的学习过程整理成一个文章系列,同时也希望能帮助那些初学ASP.NET MVC的童鞋们。可能文章的风格不会像其他文章那样讲的很深,主要还是通过实例来表达吧。由于自己也是初学,文章中难免有错误,也希望各位高手能够多多指 教,大家共同学习。

  好了,废话不多说,进入正题。

  个人觉得在MVC中,路由规则算是比较重要的一点。记得之前曾看过dudu站长的一篇文章 HttpClient + ASP.NET Web API, WCF之外的另一个选择 ,对于用惯了“html+ajax+一般处理程序” 来开发项目的我来说,觉得这应该算是另一种更加高端的处理数据请求的方式吧,所以,今天我们就从这种“精简版的WebAPI” 开始说起。

 

  首先,先创建一个“ASP.NET 空Web应用程序” :

  然后添加对 “System.Web.Http” 和 “System.Web.Http.WebHost” 的引用:

 

  再添加对“System.Net.Http” 的引用:

 

  由于需要用到对Json数据的处理,所以还要添加对 “Newtonsoft.Json” 的引用。

这里需要注意一下:

如果开始不添加对“Newtonsoft.Json”的引用,在项目运行时就会报错,具体报错原因稍后再说。

 

  对四个类库的引用:

 

  然后新建一个类,用于注册默认路由映射,这里类名为 WebAPIConfig :

  添加Global.asax文件,在 Application_Start 方法中 初始化路由映射:

protected void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时注册路由映射
WebAPIConfig.Register(GlobalConfiguration.Configuration);
}

记得引入命名空间:

using System.Web.Http;

  注意:

上面我们提到,如果开始时不引用 “Newtonsoft.Json”,那么在运行时 注册路由映射这里就会报错:

 

 创建名为Controller的文件夹,然后添加一个类且类名以 Controller结尾,这里为UserController 。让这个类继承自 ApiController 基类:

  创建名为Model的文件夹用来存放实体类,添加Users类:

  在 UserController 类中,添加一个 GetUser() 方法,模拟一些数据:

//引入命名空间
using System.Web.Http;
using X_1_FirstWebAPI.Model;

namespace X_1_FirstWebAPI.Controller
{
public class UserController : ApiController
{

public List GetUser()
{
var userList = new List {
new Users{ Id=1,UName="张三",UAge=12,UAddress="海淀区"},
new Users{Id=2,UName="李四",UAge=23,UAddress="昌平区"},
new Users{Id=3,UName="王五",UAge=34,UAddress="朝阳区"}
};

var temp = (from u in userList
select u).ToList();
return temp;
}

}
}

  我们之前添加的路 由规则为 “api/{controller}/{action}/{id}” ,所以,我们在浏览器中访问数据的url为 http://localhost:****/api/controllerName/actionName  的形式,在这里即是 api/user/getuser :

  OK,到这里,精简版的WebAPI项目就完成了,这个应该对于大部分.NET程序员来说理解起来是很简单的。

那下一篇文章我们就深入地来聊一聊如何调用WebAPI请求后台数据吧!

下载代码

转载请注明出处。

版权
作者:酷小孩
出处:http://www.cnblogs.com/babycool/

本文首发博客园,版权归作者跟博客园共有。

转载必须保留本段声明,并在页面显著位置给出本文链接,否则保留追究法律责任的权利。

[转载]用C#开发的双色球走势图(原创)值得园友拥有(二)接上一篇 - 罗宇皓 - 博客园

mikel阅读(786)

[转载]用C#开发的双色球走势图(原创)值得园友拥有(二)接上一篇 – 罗宇皓 – 博客园.

        昨晚由于时间的原因只写了一部分内容,今天将这一部分内容补充完毕,多谢各位园友的支持。

        这是用C#开发的双色球走势图(原创)值得园友拥有 新 的园友可以看昨晚写的内容,以免脱节。首先回复园友的评论,有说好的有说不好的,本人不管你说好还是不好,根本不影响个人写这篇博客,写这篇博客主要目的 还是与大家交流技术,仅供交流和学习,本人花在这上面的时间的大楷也就是一个星期的晚上时间(星期一到星期五晚上)和周末(周六周日)的时间而已,并没有 花费更多的时间;关于公布源码的问题,本人会在稍后公布,由于现在我的源码集成在我的一个项目里,所以不方便公布,一旦我把这个模块分离出来,会公布源码 以供大家交流和学习,希各位继续支持和关注。还有就是这个程序纯粹个人好玩,不能预测开奖号码,不过这些分析数据可以供大家购买彩票之前的参考,我觉得还 可以。

        以上为题外话,现在言归正传,继续介绍红球四分区走势图。

3.红球四分区走势图

首先呈上效果图:

不带遗漏数据的走势图:

贴上四分区走势图的源码:

#region * 红球四分区走势图
///
/// 红球四分区走势图
///

///private void GetData3(object obj)
{
fourredtable.Clear();
fourcleanredtable.Clear();
if (listWinNo != null &amp;&amp; listWinNo.Count &gt; 0)
{
foreach (WinNo item in listWinNo)
{
List redList = new List();
redList.Add(item.R1);
redList.Add(item.R2);
redList.Add(item.R3);
redList.Add(item.R4);
redList.Add(item.R5);
redList.Add(item.R6);
//--
DataRow reddr =fourredtable.NewRow();
reddr["QiHao"] = item.QiHao;
reddr["R" + item.R1] = "R" + GetStr(item.R1.ToString());//红1
reddr["R" + item.R2] = "R" + GetStr(item.R2.ToString());//红2
reddr["R" + item.R3] = "R" + GetStr(item.R3.ToString());//红3
reddr["R" + item.R4] = "R" + GetStr(item.R4.ToString());//红4
reddr["R" + item.R5] = "R" + GetStr(item.R5.ToString());//红5
reddr["R" + item.R6] = "R" + GetStr(item.R6.ToString());//红6
reddr["C1"] = GetFourFenQu(redList)[0];
reddr["C2"] = GetFourFenQu(redList)[1];
reddr["C3"] = GetFourFenQu(redList)[2];
reddr["C4"] = GetFourFenQu(redList)[3];
fourredtable.Rows.Add(reddr);

DataRow cleanreddr =fourcleanredtable.NewRow();
cleanreddr["QiHao"] = item.QiHao;
cleanreddr["R" + item.R1] = GetStr(item.R1.ToString());//红1
cleanreddr["R" + item.R2] = GetStr(item.R2.ToString());//红2
cleanreddr["R" + item.R3] = GetStr(item.R3.ToString());//红3
cleanreddr["R" + item.R4] = GetStr(item.R4.ToString());//红4
cleanreddr["R" + item.R5] = GetStr(item.R5.ToString());//红5
cleanreddr["R" + item.R6] = GetStr(item.R6.ToString());//红6
cleanreddr["C1"] = GetFourFenQu(redList)[0];
cleanreddr["C2"] = GetFourFenQu(redList)[1];
cleanreddr["C3"] = GetFourFenQu(redList)[2];
cleanreddr["C4"] = GetFourFenQu(redList)[3];
fourcleanredtable.Rows.Add(cleanreddr);
}

for (int j = 1; j &lt; 34; j++)
{
int xint = 0;
for (int i = 0; i &lt; fourredtable.Rows.Count; i++)
{
if (string.IsNullOrEmpty(fourredtable.Rows[i]["R" + j].ToString()))
{
xint++;
fourredtable.Rows[i]["R" + j] = xint;
}
else
{
xint = 0;
}
}
}

if (this.IsHandleCreated)
{
this.Invoke((MethodInvoker)delegate
{
if (flag)
{
fourcleanredtable.DefaultView.Sort = "QiHao DESC";
this.gridControl3.DataSource = fourcleanredtable.DefaultView.ToTable();
}
else
{
fourredtable.DefaultView.Sort = "QiHao DESC";
this.gridControl3.DataSource = fourredtable.DefaultView.ToTable();
}
});
}
}
}

///
/// 四分区个数
///

//////
private List GetFourFenQu(List redList)
{
List retlist = new List();
int xint1 = 0;
int xint2 = 0;
int xint3 = 0;
int xint4 = 0;
foreach (int item in redList)
{
if (item &lt; 9) { xint1++; } else if (item &gt; 8 &amp;&amp; item &lt;= 17) { xint2++; } else if (item &gt; 17 &amp;&amp; item &lt; 26) { xint3++; } else if (item &gt; 25)
{
xint4++;
}
}
retlist.Add(xint1.ToString());
retlist.Add(xint2.ToString());
retlist.Add(xint3.ToString());
retlist.Add(xint4.ToString());
return retlist;
}
#endregion

 

4.红球七分区走势图

七分区走势图效果图:

不带遗漏数据的走势图:

贴上七分区走势图的源码:

#region * 红球七分区走势图
///
/// 红球七分区走势图
///

///private void GetData4(object obj)
{
sevenredtable.Clear();
sevencleanredtable.Clear();
if (listWinNo != null &amp;&amp; listWinNo.Count &gt; 0)
{
foreach (WinNo item in listWinNo)
{
List redList = new List();
redList.Add(item.R1);
redList.Add(item.R2);
redList.Add(item.R3);
redList.Add(item.R4);
redList.Add(item.R5);
redList.Add(item.R6);
//--
DataRow reddr = sevenredtable.NewRow();
reddr["QiHao"] = item.QiHao;
reddr["R" + item.R1] = "R" + GetStr(item.R1.ToString());//红1
reddr["R" + item.R2] = "R" + GetStr(item.R2.ToString());//红2
reddr["R" + item.R3] = "R" + GetStr(item.R3.ToString());//红3
reddr["R" + item.R4] = "R" + GetStr(item.R4.ToString());//红4
reddr["R" + item.R5] = "R" + GetStr(item.R5.ToString());//红5
reddr["R" + item.R6] = "R" + GetStr(item.R6.ToString());//红6
reddr["D1"] = GetSevenFenQu(redList)[0];
reddr["D2"] = GetSevenFenQu(redList)[1];
reddr["D3"] = GetSevenFenQu(redList)[2];
reddr["D4"] = GetSevenFenQu(redList)[3];
reddr["D5"] = GetSevenFenQu(redList)[4];
reddr["D6"] = GetSevenFenQu(redList)[5];
reddr["D7"] = GetSevenFenQu(redList)[6];
sevenredtable.Rows.Add(reddr);

DataRow cleanreddr = sevencleanredtable.NewRow();
cleanreddr["QiHao"] = item.QiHao;
cleanreddr["R" + item.R1] = GetStr(item.R1.ToString());//红1
cleanreddr["R" + item.R2] = GetStr(item.R2.ToString());//红2
cleanreddr["R" + item.R3] = GetStr(item.R3.ToString());//红3
cleanreddr["R" + item.R4] = GetStr(item.R4.ToString());//红4
cleanreddr["R" + item.R5] = GetStr(item.R5.ToString());//红5
cleanreddr["R" + item.R6] = GetStr(item.R6.ToString());//红6
cleanreddr["D1"] = GetSevenFenQu(redList)[0];
cleanreddr["D2"] = GetSevenFenQu(redList)[1];
cleanreddr["D3"] = GetSevenFenQu(redList)[2];
cleanreddr["D4"] = GetSevenFenQu(redList)[3];
cleanreddr["D5"] = GetSevenFenQu(redList)[4];
cleanreddr["D6"] = GetSevenFenQu(redList)[5];
cleanreddr["D7"] = GetSevenFenQu(redList)[6];
sevencleanredtable.Rows.Add(cleanreddr);
}

for (int j = 1; j &lt;34; j++)
{
int xint = 0;
for (int i = 0; i &lt; sevenredtable.Rows.Count; i++)
{
if (string.IsNullOrEmpty(sevenredtable.Rows[i]["R" + j].ToString()))
{
xint++;
sevenredtable.Rows[i]["R" + j] = xint;
}
else
{
xint = 0;
}
}
}

if (this.IsHandleCreated)
{
this.Invoke((MethodInvoker)delegate
{
if (flag)
{
sevencleanredtable.DefaultView.Sort = "QiHao DESC";
this.gridControl4.DataSource = sevencleanredtable.DefaultView.ToTable();
}
else
{
sevenredtable.DefaultView.Sort = "QiHao DESC";
this.gridControl4.DataSource = sevenredtable.DefaultView.ToTable();
}
});
}
}
}

private List GetSevenFenQu(List redList)
{
List retlist = new List();
int xint1 = 0;
int xint2 = 0;
int xint3 = 0;
int xint4 = 0;
int xint5 = 0;
int xint6 = 0;
int xint7 = 0;
foreach (int item in redList)
{
if (item &lt; 6) { xint1++; } else if (item &gt; 5 &amp;&amp; item &lt; 11) { xint2++; } else if (item &gt; 10 &amp;&amp; item &lt; 16) { xint3++; } else if (item &gt; 15 &amp;&amp; item &lt; 21) { xint4++; } else if (item &gt; 20 &amp;&amp; item &lt; 26) { xint5++; } else if (item &gt; 25 &amp;&amp; item &lt; 31) { xint6++; } else if (item &gt; 30 &amp;&amp; item &lt; 34)
{
xint7++;
}
}
retlist.Add(xint1.ToString());
retlist.Add(xint2.ToString());
retlist.Add(xint3.ToString());
retlist.Add(xint4.ToString());
retlist.Add(xint5.ToString());
retlist.Add(xint6.ToString());
retlist.Add(xint7.ToString());
return retlist;
}
#endregion

 

5.红球连号走势图

连号走势图效果图:

不带遗漏数据的效果图:

贴上连号走势图的源码:

#region * 红球连号走势图
///
/// 红球连号走势图
///

///private void GetData6(object obj)
{
lianhaotable.Clear();
lianhaocleantable.Clear();
if (listWinNo != null &amp;&amp; listWinNo.Count &gt; 0)
{
foreach (WinNo item in listWinNo)
{
List redList = new List();
redList.Add(item.R1);
redList.Add(item.R2);
redList.Add(item.R3);
redList.Add(item.R4);
redList.Add(item.R5);
redList.Add(item.R6);
//--
DataRow reddr = lianhaotable.NewRow();
DataRow cleanreddr = lianhaocleantable.NewRow();
reddr["QiHao"] = item.QiHao;
cleanreddr["QiHao"] = item.QiHao;
reddr["R"] = GetStr(item.R1.ToString()) + " " + GetStr(item.R2.ToString()) + " " + GetStr(item.R3.ToString()) + " " + GetStr(item.R4.ToString()) + " " + GetStr(item.R5.ToString()) + " " + GetStr(item.R6.ToString());
cleanreddr["R"] = GetStr(item.R1.ToString()) + " " + GetStr(item.R2.ToString()) + " " + GetStr(item.R3.ToString()) + " " + GetStr(item.R4.ToString()) + " " + GetStr(item.R5.ToString()) + " " + GetStr(item.R6.ToString());
//--
List list = new List();
list = GetList(redList);
int group = 0;
if (list != null &amp;&amp; list.Count &gt; 0)
{
foreach (string strlist in list)
{
string[] arr = strlist.Split(",".ToCharArray());
group += arr.Count() - 1;
foreach (string code in arr)
{
reddr["R" + code] = "R" + GetStr(code);
cleanreddr["R" + code] = GetStr(code);
}
}
}
reddr["A"] = list.Count();
cleanreddr["A"] = list.Count();
reddr["B"] = group.ToString();
cleanreddr["B"] = group.ToString();
//--
lianhaotable.Rows.Add(reddr);
lianhaocleantable.Rows.Add(cleanreddr);
}

for (int j = 1; j &lt; 34; j++)
{
int xint = 0;
for (int i = 0; i &lt; lianhaotable.Rows.Count; i++)
{
if (string.IsNullOrEmpty(lianhaotable.Rows[i]["R" + j].ToString()))
{
xint++;
lianhaotable.Rows[i]["R" + j] = xint;
}
else
{
xint = 0;
}
}
}

if (this.IsHandleCreated)
{
this.Invoke((MethodInvoker)delegate
{
if (flag)
{
lianhaocleantable.DefaultView.Sort = "QiHao DESC";
this.gridControl6.DataSource = lianhaocleantable.DefaultView.ToTable();
}
else
{
lianhaotable.DefaultView.Sort = "QiHao DESC";
this.gridControl6.DataSource = lianhaotable.DefaultView.ToTable();
}
});
}
}
}

///
/// 计算连号
///

//////
private List GetList(List RedCode)
{
List retlist = new List();
for (int i = 0; i &lt; RedCode.Count; i++)
{
string retstr = string.Empty;
if (i &lt; 5)
{
if (RedCode[i + 1] - RedCode[i] == 1)//两连号
{
retstr = RedCode[i] + "," + RedCode[i + 1];
}
}
if (i &lt; 4)
{
if (RedCode[i + 2] - RedCode[i + 1] == 1 &amp;&amp; RedCode[i + 1] - RedCode[i] == 1)//三连号
{
retstr = RedCode[i] + "," + RedCode[i + 1] + "," + RedCode[i + 2];
}
}
if (i &lt; 3)
{
if (RedCode[i + 3] - RedCode[i + 2] == 1 &amp;&amp; RedCode[i + 2] - RedCode[i + 1] == 1 &amp;&amp; RedCode[i + 1] - RedCode[i] == 1)//四连号
{
retstr = RedCode[i] + "," + RedCode[i + 1] + "," + RedCode[i + 2] + "," + RedCode[i + 3];
}
}
if (i &lt; 2) { if (RedCode[i + 4] - RedCode[i + 3] == 1 &amp;&amp; RedCode[i + 3] - RedCode[i + 2] == 1 &amp;&amp; RedCode[i + 2] - RedCode[i + 1] == 1 &amp;&amp; RedCode[i + 1] - RedCode[i] == 1)//五连号 { retstr = RedCode[i] + "," + RedCode[i + 1] + "," + RedCode[i + 2] + "," + RedCode[i + 3] + "," + RedCode[i + 4]; } } if (!string.IsNullOrEmpty(retstr)) { if (retlist != null &amp;&amp; retlist.Count &gt; 0)
{
var tmp = from c in retlist
where ("," + c + ",").Contains("," + retstr + ",")
select c;
if (tmp.Count() == 0)
{
retlist.Add(retstr);
}
}
else
{
retlist.Add(retstr);
}
}
}
return retlist;
}
#endregion

6.和值走势图

和值走势图效果图:

不带遗漏数据的效果图:

贴上和值走势图的源码:

#region * 红球和值走势图
///
/// 红球和值走势图
///

///private void GetData7(object obj)
{
hezhitable.Clear();
hezhicleantable.Clear();
if (listWinNo != null &amp;&amp; listWinNo.Count &gt; 0)
{
foreach (WinNo item in listWinNo)
{
DataRow reddr = hezhitable.NewRow();
DataRow cleanreddr = hezhicleantable.NewRow();
reddr["QiHao"] = item.QiHao;
cleanreddr["QiHao"] = item.QiHao;
reddr["R"] = GetStr(item.R1.ToString()) + " " + GetStr(item.R2.ToString()) + " " + GetStr(item.R3.ToString()) + " " + GetStr(item.R4.ToString()) + " " + GetStr(item.R5.ToString()) + " " + GetStr(item.R6.ToString());
cleanreddr["R"] = GetStr(item.R1.ToString()) + " " + GetStr(item.R2.ToString()) + " " + GetStr(item.R3.ToString()) + " " + GetStr(item.R4.ToString()) + " " + GetStr(item.R5.ToString()) + " " + GetStr(item.R6.ToString());
decimal total = item.R1 + item.R2 + item.R3 + item.R4 + item.R5 + item.R6;
reddr["TOTAL"] = total;
cleanreddr["TOTAL"] = total;
//--
string r1 = total &gt; 20 &amp;&amp; total &lt; 61 ? total.ToString() : ""; string r2 = total &gt; 60 &amp;&amp; total &lt; 71 ? total.ToString() : ""; string r3 = total &gt; 70 &amp;&amp; total &lt; 81 ? total.ToString() : ""; string r4 = total &gt; 80 &amp;&amp; total &lt; 91 ? total.ToString() : ""; string r5 = total &gt; 90 &amp;&amp; total &lt; 101 ? total.ToString() : ""; string r6 = total &gt; 100 &amp;&amp; total &lt; 111 ? total.ToString() : ""; string r7 = total &gt; 110 &amp;&amp; total &lt; 121 ? total.ToString() : ""; string r8 = total &gt; 120 &amp;&amp; total &lt; 131 ? total.ToString() : ""; string r9 = total &gt; 130 &amp;&amp; total &lt; 141 ? total.ToString() : ""; string r10 = total &gt; 140 &amp;&amp; total &lt; 151 ? total.ToString() : ""; string r11 = total &gt; 150 &amp;&amp; total &lt; 161 ? total.ToString() : ""; string r12 = total &gt; 160 &amp;&amp; total &lt; 184 ? total.ToString() : "";
string w = total.ToString().Substring(total.ToString().Length - 1, 1);
//--
reddr["R1"] = !string.IsNullOrEmpty(r1) ? "R" + r1 : "";
reddr["R2"] = !string.IsNullOrEmpty(r2) ? "R" + r2 : "";
reddr["R3"] = !string.IsNullOrEmpty(r3) ? "R" + r3 : "";
reddr["R4"] = !string.IsNullOrEmpty(r4) ? "R" + r4 : "";
reddr["R5"] = !string.IsNullOrEmpty(r5) ? "R" + r5 : "";
reddr["R6"] = !string.IsNullOrEmpty(r6) ? "R" + r6 : "";
reddr["R7"] = !string.IsNullOrEmpty(r7) ? "R" + r7 : "";
reddr["R8"] = !string.IsNullOrEmpty(r8) ? "R" + r8 : "";
reddr["R9"] = !string.IsNullOrEmpty(r9) ? "R" + r9 : "";
reddr["R10"] = !string.IsNullOrEmpty(r10) ? "R" + r10 : "";
reddr["R11"] = !string.IsNullOrEmpty(r11) ? "R" + r11 : "";
reddr["R12"] = !string.IsNullOrEmpty(r12) ? "R" + r12 : "";
reddr["W"] = w;
reddr["W"+w] ="W"+ w;
//--
cleanreddr["R1"] = r1;
cleanreddr["R2"] = r2;
cleanreddr["R3"] = r3;
cleanreddr["R4"] = r4;
cleanreddr["R5"] = r5;
cleanreddr["R6"] = r6;
cleanreddr["R7"] = r7;
cleanreddr["R8"] = r8;
cleanreddr["R9"] = r9;
cleanreddr["R10"] = r10;
cleanreddr["R11"] = r11;
cleanreddr["R12"] = r12;
cleanreddr["W"] = w;
cleanreddr["W" + w] = w;
//--
hezhitable.Rows.Add(reddr);
hezhicleantable.Rows.Add(cleanreddr);
}

for (int j = 1; j &lt; 13; j++)
{
int xint = 0;
for (int i = 0; i &lt; hezhitable.Rows.Count; i++)
{
if (string.IsNullOrEmpty(hezhitable.Rows[i]["R" + j].ToString()))
{
xint++;
hezhitable.Rows[i]["R" + j] = xint;
}
else
{
xint = 0;
}
}
}

for (int j = 0; j &lt; 10; j++)
{
int xint = 0;
for (int i = 0; i &lt; hezhitable.Rows.Count; i++)
{
if (string.IsNullOrEmpty(hezhitable.Rows[i]["W" + j].ToString()))
{
xint++;
hezhitable.Rows[i]["W" + j] = xint;
}
else
{
xint = 0;
}
}
}

if (this.IsHandleCreated)
{
this.Invoke((MethodInvoker)delegate
{
if (flag)
{
hezhicleantable.DefaultView.Sort = "QiHao DESC";
this.gridControl7.DataSource = hezhicleantable.DefaultView.ToTable();
}
else
{
hezhitable.DefaultView.Sort = "QiHao DESC";
this.gridControl7.DataSource = hezhitable.DefaultView.ToTable();
}
});
}
}
}
#endregion

7.篮球综合走势图

篮球综合走势图效果图:

不带遗漏数据的效果图:

贴上篮球综合走势图的源码:

#region * 篮球综合走势图
///
/// 篮球综合走势图
///

///private void GetData5(object obj)
{
buletable.Clear();
bulecleantable.Clear();
if (listWinNo != null &amp;&amp; listWinNo.Count &gt; 0)
{
foreach (WinNo item in listWinNo)
{
DataRow buledr = buletable.NewRow();
buledr["QiHao"] = item.QiHao;
buledr["R"] = GetStr(item.R1.ToString()) + " " + GetStr(item.R2.ToString()) + " " + GetStr(item.R3.ToString()) + " " + GetStr(item.R4.ToString()) + " " + GetStr(item.R5.ToString()) + " " + GetStr(item.R6.ToString());
buledr["B"] = GetStr(item.B.ToString());
buledr["B" + item.B] = "B" + GetStr(item.B.ToString());//篮球
buledr["X1"] = GetDa(item.B);//大
buledr["X2"] = GetXiao(item.B);//小
buledr["X3"] = GetJiShu(item.B);//奇
buledr["X4"] = GetOShu(item.B);//偶
buledr["X5"] = GetZhiShu(item.B);//质
buledr["X6"] = GetHeShu(item.B);//合
buledr["X7"] = GetFenQu1(item.B);//一区
buledr["X8"] = GetFenQu2(item.B);//二区
buledr["X9"] = GetFenQu3(item.B);//三区
buledr["X10"] = GetFenQu4(item.B);//四区
buledr["X11"] = GetWeiShu(item.B);//尾数
buledr["X12"] = GetWeiShuQuJian(item.B, 0);//0-1
buledr["X13"] = GetWeiShuQuJian(item.B, 2);//2-3
buledr["X14"] = GetWeiShuQuJian(item.B, 4);//4-5
buledr["X15"] = GetWeiShuQuJian(item.B, 6);//6-7
buledr["X16"] = GetWeiShuQuJian(item.B, 8);//8-9
buletable.Rows.Add(buledr);
//--
DataRow bulecleandr =bulecleantable.NewRow();
bulecleandr["QiHao"] = item.QiHao;
bulecleandr["R"] = GetStr(item.R1.ToString()) + " " + GetStr(item.R2.ToString()) + " " + GetStr(item.R3.ToString()) + " " + GetStr(item.R4.ToString()) + " " + GetStr(item.R5.ToString()) + " " + GetStr(item.R6.ToString());
bulecleandr["B"] = GetStr(item.B.ToString());
bulecleandr["B" + item.B] = GetStr(item.B.ToString());//篮球
bulecleandr["X1"] = GetDa(item.B);//大
bulecleandr["X2"] = GetXiao(item.B);//小
bulecleandr["X3"] = GetJiShu(item.B);//奇
bulecleandr["X4"] = GetOShu(item.B);//偶
bulecleandr["X5"] = GetZhiShu(item.B);//质
bulecleandr["X6"] = GetHeShu(item.B);//合
bulecleandr["X7"] = GetFenQu1(item.B);//一区
bulecleandr["X8"] = GetFenQu2(item.B);//二区
bulecleandr["X9"] = GetFenQu3(item.B);//三区
bulecleandr["X10"] = GetFenQu4(item.B);//四区
bulecleandr["X11"] = GetWeiShu(item.B);//尾数
bulecleandr["X12"] = GetWeiShuQuJian(item.B, 0);//0-1
bulecleandr["X13"] = GetWeiShuQuJian(item.B, 2);//2-3
bulecleandr["X14"] = GetWeiShuQuJian(item.B, 4);//4-5
bulecleandr["X15"] = GetWeiShuQuJian(item.B, 6);//6-7
bulecleandr["X16"] = GetWeiShuQuJian(item.B, 8);//8-9
bulecleantable.Rows.Add(bulecleandr);
}

for (int j = 1; j &lt; 17; j++)
{
int xint = 0;
for (int i = 0; i &lt; buletable.Rows.Count; i++)
{
if (string.IsNullOrEmpty(buletable.Rows[i]["B" + j].ToString()))
{
xint++;
buletable.Rows[i]["B" + j] = xint;
}
else
{
xint = 0;
}
}
}

for (int j = 1; j &lt; 17; j++)
{
int xint = 0;
for (int i = 0; i &lt; buletable.Rows.Count; i++)
{
if (string.IsNullOrEmpty(buletable.Rows[i]["X"+j].ToString()))
{
xint++;
buletable.Rows[i]["X" + j] = xint;
}
else
{
xint = 0;
}
}
}

if (this.IsHandleCreated)
{
this.Invoke((MethodInvoker)delegate
{
if (flag)
{
bulecleantable.DefaultView.Sort = "QiHao DESC";
this.gridControl5.DataSource = bulecleantable.DefaultView.ToTable();
}
else
{
buletable.DefaultView.Sort = "QiHao DESC";
this.gridControl5.DataSource = buletable.DefaultView.ToTable();
}
});
}
}
}

///
/// 大数
///

//////
private string GetDa(int BuleCode)
{
if (BuleCode &gt; 8)
{
return "大";
}
else
{
return "";
}
}

///
/// 小数
///

//////
private string GetXiao(int BuleCode)
{
if (BuleCode &lt; 9)
{
return "小";
}
else
{
return "";
}
}

///
/// 奇数
///

//////
private string GetJiShu(int BuleCode)
{
if (BuleCode % 2 != 0)
{
return "奇";
}
else
{
return "";
}
}

///
/// 偶数
///

//////
private string GetOShu(int BuleCode)
{
if (BuleCode % 2 == 0)
{
return "偶";
}
else
{
return "";
}
}

///
/// 质数
///

//////
private string GetZhiShu(int BuleCode)
{
if (BuleCode == 1 || BuleCode == 2 || BuleCode == 3 || BuleCode == 5 || BuleCode == 7 || BuleCode == 11 || BuleCode == 13)
{
return "质";
}
else
{
return "";
}
}

///
/// 合数
///

//////
private string GetHeShu(int BuleCode)
{
if (BuleCode == 4 || BuleCode == 6 || BuleCode == 8 || BuleCode == 9 || BuleCode == 10 || BuleCode == 12 || BuleCode == 14 || BuleCode == 15 || BuleCode == 16)
{
return "合";
}
else
{
return "";
}
}

///
/// 分区1
///

//////
private string GetFenQu1(int BuleCode)
{
if (BuleCode &lt; 5)
{
return "X"+BuleCode.ToString();
}
else
{
return "";
}
}

///
/// 分区2
///

//////
private string GetFenQu2(int BuleCode)
{
if (BuleCode &gt; 4 &amp;&amp; BuleCode &lt; 9)
{
return "X"+BuleCode.ToString();
}
else
{
return "";
}
}

///
/// 分区3
///

//////
private string GetFenQu3(int BuleCode)
{
if (BuleCode &gt; 8 &amp;&amp; BuleCode &lt; 13)
{
return "X"+BuleCode.ToString();
}
else
{
return "";
}
}

///
/// 分区4
///

//////
private string GetFenQu4(int BuleCode)
{
if (BuleCode &gt; 12)
{
return "X"+BuleCode.ToString();
}
else
{
return "";
}
}

///
/// 尾数
///

//////
private string GetWeiShu(int BuleCode)
{
if (BuleCode &lt; 10) { return BuleCode.ToString(); } else { return BuleCode.ToString().Substring(1, 1); } } private string GetWeiShuQuJian(int BuleCode, int xint) { string weishu = GetWeiShu(BuleCode); if (int.Parse(weishu) &gt;= 0 + xint &amp;&amp; int.Parse(weishu) &lt;= 1 + xint)
{
return "Y" + weishu;
}
else
{
return "";
}
}
#endregion

篮球走势图是最复杂的,也是本人花费最多时间的,望园友多关注。

 

8.历史同期

历史同期走势图效果图:

历史数据全部是用网上抓取的,在这里就不多介绍了。

以上基本上把本人这段时间研究的这点东西全部公布了,仅供各位参考和交流,如有兴趣可加QQ群(186841119)一起交流学习 C#的心得,个人的源码会在这个群空间里上传,提高技术水平,为将来加薪打下良好的基础,祝愿各位都有一个好运气,500W的大奖会降临在你头上。