有问题请加入技术Q群: 36085817(DELPHI朋友)
 

时 间 记 忆
最 新 评 论
专 题 分 类
最 新 日 志
最 新 留 言
搜 索
用 户 登 录
友 情 连 接
博 客 信 息


 
分析灰鸽子1.2(4)——UpIp;
[ 2007-4-16 0:11:00 | By: roki ]
 
描述:图片
图片:
[删除]
unit UpIp;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, SkinTabs, DynamicSkinForm, ImgList, StdCtrls,
  SkinBoxCtrls, SkinCtrls,mmsystem, Mask, Shellapi, DESCrypt ,  WinInet ,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, LangFrm,
  Psock, NMFtp;

type  // 本地代理服务器设置信息。
  TProxyServerInf = record
    httpName: string;
    httpport: integer;
    SocksName: string;
    Socksport: integer;
  end;

type
  TUpIpDate = class(TLangForm)
    spDynamicSkinForm1: TspDynamicSkinForm;
    PageControl1: TspSkinPageControl;
    TabSheet1: TspSkinTabSheet;
    TabSheet2: TspSkinTabSheet;
    ImageList1: TImageList;
    Panel1: TspSkinPanel;
    Label2: TspSkinStdLabel;
    Label3: TspSkinStdLabel;
    Label4: TspSkinStdLabel;
    Label5: TspSkinStdLabel;
    Label6: TspSkinStdLabel;
    FTPAdder: TspSkinEdit;
    FTPPort: TspSkinEdit;
    FTPUser: TspSkinEdit;
    Panel2: TspSkinPanel;
    Label7: TspSkinStdLabel;
    IpFileEdit: TspSkinEdit;
    Label8: TspSkinStdLabel;
    IPAddEdit: TspSkinComboBox;
    RadioBox1: TspSkinCheckRadioBox;
    FtpButton1: TspSkinButton;
    Label1: TspSkinLabel;
    Label10: TspSkinStdLabel;
    user126: TspSkinEdit;
    Label12: TspSkinStdLabel;
    Label13: TspSkinStdLabel;
    Label14: TspSkinStdLabel;
    ComboBox1: TspSkinComboBox;
    RadioBox2: TspSkinCheckRadioBox;
    URLButton: TspSkinButton;
    TabSheet4: TspSkinTabSheet;
    Label20: TspSkinStdLabel;
    UserEdit: TspSkinEdit;
    Label21: TspSkinStdLabel;
    Label22: TspSkinStdLabel;
    IPComboBox2: TspSkinComboBox;
    Button3: TspSkinButton;
    IdHTTP1: TIdHTTP;
    Label23: TspSkinStdLabel;
    EmailEdit1: TspSkinEdit;
    TabSheet3: TspSkinTabSheet;
    Label15: TspSkinStdLabel;
    XwEdit: TspSkinEdit;
    Label17: TspSkinStdLabel;
    Xwuser: TspSkinEdit;
    Label18: TspSkinStdLabel;
    Label19: TspSkinStdLabel;
    XWComboBox: TspSkinComboBox;
    CheckRadioBox1: TspSkinCheckRadioBox;
    XWButton: TspSkinButton;
    Label16: TLabel;
    Label9: TspSkinStdLabel;
    httpEdit: TspSkinEdit;
    YComboBox: TspSkinComboBox;
    Label11: TLabel;
    ComboBox10: TspSkinComboBox;
    Label24: TspSkinStdLabel;
    IdHTTP2: TIdHTTP;
    FTPPass1: TspSkinPasswordEdit;
    FTPPass2: TspSkinPasswordEdit;
    spSkinEdit2: TspSkinPasswordEdit;
    pass126: TspSkinPasswordEdit;
    Xwpass: TspSkinPasswordEdit;
    PassEdit1: TspSkinPasswordEdit;
    PassEdit2: TspSkinPasswordEdit;
    NMFTP1: TNMFTP;
    procedure Button3Click(Sender: TObject);
    procedure AfterGetFile(Sender: TObject);
    procedure FtpButton1Click(Sender: TObject);
    procedure URLButtonClick(Sender: TObject);
    procedure RadioBox1Click(Sender: TObject);
    procedure RadioBox2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure XWButtonClick(Sender: TObject);
    procedure Label16Click(Sender: TObject);
    procedure CheckRadioBox1Click(Sender: TObject);
    procedure Label11Click(Sender: TObject);
    procedure user126Change(Sender: TObject);
    procedure spSkinEdit2Change(Sender: TObject);
    procedure YComboBoxClick(Sender: TObject);
    procedure NMFTP1Success(Trans_Type: TCmdType);
    procedure NMFTP1Connect(Sender: TObject);
    procedure NMFTP1ConnectionFailed(Sender: TObject);
    procedure NMFTP1Error(Sender: TComponent; Errno: Word; Errmsg: String);
    procedure NMFTP1Status(Sender: TComponent; Status: String);
  private
    { Private declarations }
  public
    { Public declarations }
    i: integer;
    procedure Get_UserFile;
    function Update(Body,UpdateS:String):Boolean;
  end;



var
  UpIpDate: TUpIpDate;

implementation
uses
  Main;
{$R *.dfm}


{
Pos函数说明:查找字符(串)所在位置。该函数有二个参数。第一个参数为要查找的字符(串),第二个参数为被查找字符(串)。
   如nPos := Pos('Like', 'I Like Reading!');
   此时nPos等于3。如果没有查找到,则nPos为0。注意:Pos函数在查找时是要区分字符大小的。如果要实现不区分大小,那么需要使用UpperCase或LowerCase函数将两个参数的字符(串)转换为“大写”或“小写”再进行查找。
   另外还有一个查找字符(串)的函数----AnsiPos,该函数的使用方法与Pos函数完全一样。当你查找的是汉字时,最好使用AnsiPos函数。

Delete函数说明:删除字符串中指定的字符串。该函数有三个参数。第一个参数为要进行处理的字符串,第二个参数为从何处开始删除,第三个参数为删除的字符个数。
  如:S := 'I Like Reading CPCW.';
      下面的代码将删除S变量中的“C”字符。
      Delete(S, 16, 1);
      此时S变量则是I Like Reading PCW.(“C”已经不存在了)。
}



function CenterStr(Src:String;Before,After:String):String;
  { 这个函数用来分离两个字符串中间的字符串,
    例如 ..('DelphiBox.com','Delphi','.com')=>'Box'。 }
var
    Pos1,Pos2:WORD;
    Temp:String;
begin
    Temp:=Src;
    Pos1:=Pos(Before,Temp);
    Delete(Temp,1,Pos1+Length(Before));
    Pos2:=Pos(After,Temp);
    if (Pos1=0) or (Pos2=0) then
    begin
      Result:='';
      Exit;
    end;
    Pos1:=Pos1+Length(Before);
    Result:=Copy(Src,Pos1,Pos2);
end;

//这个函数的作用应该是获取默认的代理服务的一些信息,然后保存在 ProxyStr 指针变量里
//过程大致是先开辟一个无类型指针Buffer 和相应类型的指针ProxyInfo
//给Buffer分配好内存之后,通过函数InternetQueryOption ,获取默认的一些代理信息
//然后让ProxyInfo指到Buffer指针的内存地址,
//然后通过 ProxyInfo来获取相应的属性,获取相应的信息赋值给ProxyStr,然后释放内存指针
//看了《object pascal》之后终于是明白了,指针原来是这样应用的,呵呵,你领悟到了么?

function GetDefaultProxyServer(var ProxyStr: TProxyServerInf):Boolean;
var
ProxyInfo: PInternetProxyInfo;  //PInternetProxyInfo是一个指针类型
                                  //在wininet.asp里定义的
Buffer: Pointer;                // Pointer类型是可以指向任何类型的指针
BUF_SIZE: DWORD;                //DWORD是32位无符号整数,对应着的Longword。PDWORD = ^DWORD。这两个类型可以直接使用,因为在windows.pas中已经定义了。
Temp,Tmpip:String;
i:integer;
begin
Result := False;
try
BUF_SIZE:=1024;
GetMem(Buffer,BUF_SIZE);  //分配1024的内存给Buffer(前面定义看到它是一个无类型指针)
ProxyStr.httpName :='';
ProxyStr.httpport :=0;
ProxyStr.SocksName :='';
ProxyStr.Socksport :=0;
//
  if InternetQueryOption(nil,INTERNET_OPTION_PROXY,Buffer,BUF_SIZE) then
  begin
    ProxyInfo := Buffer;  //让指针ProxyInfo指向  Buffer指向的地址

    if ProxyInfo^.lpszProxy<>'' then
    begin
      Temp:= ProxyInfo^.lpszProxy+' ';
      //HgzFsbSVip.Memo1.Lines.Text:=Temp;
      //下面处理 HTTP代理的情况
      i:=pos('http=',Temp);    //获取字串中含HTTP的位置
      if i>0 then
        begin
        //下面这句截取http 和 “ ”(空格)之间的内容出来,即IP地址和端口信息吧
          Tmpip:=CenterStr(Temp,'http=',' ');

          i:=pos(':',Tmpip);
          if i>0 then
            begin
            //分离出IP、端口  ,注意COPY函数的参数,表示第几个到第几个字节。
              ProxyStr.httpName:=Copy(Tmpip,1,i-1);

              ProxyStr.httpport:=Strtoint(Copy(Tmpip,i+1,Length(Tmpip)));
            end;
        end;
          //下面处理 socket代理的情况,分离方法和上面类似
      i:=pos('socks=',Temp);
      if i>0 then
        begin
          Tmpip:=CenterStr(Temp,'socks=',' ');
          i:=pos(':',Tmpip);
          if i>0 then
            begin
              ProxyStr.SocksName :=Copy(Tmpip,1,i-1);
              ProxyStr.Socksport:=Strtoint(Copy(Tmpip,i+1,Length(Tmpip)));
            end;
        end;

      if (ProxyStr.httpName='') and (ProxyStr.SocksName='') then
        begin
          i:=pos(':',Temp);
          if i>0 then
            begin
              Delete(Temp,Length(Temp),1);
              ProxyStr.httpName :=Copy(Temp,1,i-1);
              ProxyStr.httpport :=Strtoint(Copy(Temp,i+1,Length(Temp)));
            end;
        end;
      //HgzFsbSVip.Memo1.Lines.Add('HTTP:'+ProxyStr.httpName);
      //HgzFsbSVip.Memo1.Lines.Add('PORT:'+inttoStr(ProxyStr.httpport));
     
      Result := True;
    end else begin
      Result := False;
    end;
  end Else begin
    Result := False;
  end;
finally
  FreeMem(Buffer);  //释放内存
end;
end;

//上传函数,用来取得IP 生成本地文件,然后传到服务器上
procedure TUpIpDate.Get_UserFile;
var
  IPFile:String;
  F: textfile;
begin
  try
    //这几句的意思 就是把本地IP更新本地到文件FTPIp.dat里,这个文件一会要上传到服务器上的
    IPFile := ExtractFilePath(Paramstr(0)) + 'FTPIp.dat';
    AssignFile(F,IPFile);
    Rewrite(F);{F为TextFile类型}

    //这里可以看到,IP更新以后格式将是“http://huigezi +ip +end”
    WriteLn(F,'http://huigezi'+IPAddEdit.Text+'end');
    //更新完后就释放这个资源(textfile类型的F实际上是一个指向文本文件的指针,如果不明白,就权当它就是一个文本文件吧)
    CloseFile(F);


  except

    //这部分是异常出错处理,这里的 Translate是自定义的一个函数,在unit LangFrm;单元里定义。
    //作用:就是把后面的字串和配置文件(这里鸽子里用的是H_Client.chs这个文件)里的字段String0比较,
    //如果值不同就返回配置文件里的值,而不是这个值  。其实这个作用估计也只是过滤一下,如果你光该这里不改配置文件
    //重点:在这个函数里 有一句 Result:=AIniFile.ReadString(ClassName,Ident,Default);
    //看到了么,这个ClassName应该是一个全局变量表示当前的类名,在这个模块里其值就是 TUpIpDate
    //所以 Translate('String0','写FTP上传文件出错.'),这个函数的意思就是找出配置文件,对比一下[TUpIpDate]里String0的值
    //如果有值就返回 字段的值。这个函数可以返回一个指定格式的字符串,防止出错。
    //下面的Translate函数都是差不多的意思就不一一介绍了
   
    Label1.Caption:=Translate('String0','写FTP上传文件出错.');
    Exit;
  end;
  //NMFTP1  是前面定义的FTP上传控件 ,这段就是用来上传保存了上线IP的图片文件的
  with NMFTP1 do
    begin
      //从窗口的Edit控件里获取FTP服务器信息 (IP和端口)
      Host := FTPAdder.Text;
      Port := Strtoint(FTPPort.Text);// Standardport
      //设置FTP的超时时间
      TimeOut := 20000; // 20 sek Versuch
      //获取帐号密码
      UserID := FTPUser.Text;
      Password := FTPPass1.Text;
      //连接服务器
      Connect;

      //查了一些资料,这里的 Mode 是一个NMFTP的方法 参数可以是MODE_IMAGE、MODE_BYTE,MODE_ASCII
      //应该是设置上传模式的。玩过ftp的应该知道
      Mode(MODE_IMAGE);
      //把硬盘的IPFile 路径里的文件上传,上传后名称保存为 IpFileEdit.Text
      Upload(IPFile,IpFileEdit.Text);
    end;


  //这个是多线程上传的部分,作者写了,但是好像又没使用。呵呵。。。可以看看其中的写法哦
{  GetThread := TFTPThreadEx.Create(True);

  with GetThread do begin
      LocalFile  := IPFile;
      RemoteFile  := IpFileEdit.Text;
      Host        := FTPAdder.Text;
      FtpPorts    := Strtoint(FTPPort.Text);
      UserName    := FTPUser.Text;
      Password    := FTPPass1.Text;
      FTPMode    := FtpSend;
      StatProc    := FTPStatus;
      OnTerminate := AfterGetFile;
      NeedSave    := DoSave;
  end;
  GetThread.Resume; }
end;
//看完这个函数,你就知道了 它是上传后的一个处理函数,反馈相应的上传成功信息以及播放声音的
procedure TUpIpDate.AfterGetFile(Sender: TObject);
var
Temp:String;
begin
try
  if httpEdit.Text<>'' then  //如果在地址框填上了地址,就会自动下载该地址的内容进行比较,如果不填,就不去比较了 ,作者真的好聪明
  begin
  //下面这段的意思是获取网址内容,然后和本地要更新的IP匹配看看是不是已经更新上去了
    Temp:=IdHTTP1.Get(httpEdit.Text);
    if pos(IPAddEdit.Text,Temp)>0 then
      begin
        Label1.Caption:=Translate('String1','FTP更新IP成功.');
        //下面这部分应该是播放声音的提示,具体的方法我们暂且不去追究它,只知道他是播放声音的就OK了
          if HgzVip.isSound then
            begin
              try
                sndplaysound('',snd_async);
                //这句似乎没用什么用,播放一个空路径的文件么?
                sndplaysound(Pchar(HgzVip.UpIPok),snd_async);
                //这句应该是播放 HgzVip.UpIPok中的路径的声音

              except
              end;
            end;
      end else begin
        Label1.Caption:=Translate('String2','FTP更新IP完成.但Http访问无效.');
      end;
  end else begin
        Label1.Caption:=Translate('String1','FTP更新IP成功.');
        //播放声音
          if HgzVip.isSound then
            begin
              try
                sndplaysound('',snd_async);
                sndplaysound(Pchar(HgzVip.UpIPok),snd_async);
              except
              end;
            end;
  end;
except
  Label1.Caption:=Translate('String3','FTP更新IP完成.但Http访问出错.');
end;
end;

//看名字就知道 应该是一个替换字符串的函数,都能明白吧,不仔细分析了
function Replace(Str: String;Find:string;ToStr:String): string;
var
  Text,A,B: String;
  i,k: Integer;
begin
  Text:=Str;
  for k:=1 to Length(Str) do
  begin
    i:=pos(Find,Text);
    if i>0 then
      begin
        Delete(Text,i,Length(Find));
        A:=copy(Text,1,i-1);
        B:= copy(Text,i,Length(Text));
        Text:=A+ToStr+B;
      end else break;
  end;
  Result := Text;
end;

//上传按钮的点击事件
procedure TUpIpDate.FtpButton1Click(Sender: TObject);
begin

//判断必须输入的内容是否输入了,提示输入

if FTPAdder.Text='' then
  begin
    Label1.Caption :=Translate('String4','请输入FTP服务器地址!');
    Exit;
  end;
if FTPUser.Text='' then
  begin
    Label1.Caption :=Translate('String5','请输入FTP用户名!');
    Exit;
  end;
if FTPPass1.Text<>FTPPass2.Text then
  begin
    Label1.Caption :=Translate('String6','两次密码输入不一样!');
    FTPPass1.Text:='';
    FTPPass2.Text:='';
    Exit;
  end;
  //判断完后 没什么事情就进行上传贝,这个函数上面已经分析过了
Get_UserFile;
end;

//这个函数返回一个布尔值,比较两字符串,如果body中 包涵了UpdateS 就返回true 否则false
function TUpIpDate.Update(Body,UpdateS:String):Boolean;
var
i:integer;
begin
Result:=False;
i:=pos(UpdateS,Body);      //Update:='修改成功'
if i>=1 then  Result:=True;
end;

//
procedure ZhuIPtohttp;
var
username,pass,Temp:string;
ProxyStr: TProxyServerInf;
begin
try
    username:=UpIpDate.UserEdit.Text;

    pass:= UpIpDate.PassEdit1.Text;
    //看到了吧 GetDefaultProxyServer 作用上面介绍了,就是判断是否有代理,并且把代理信息赋值到 ProxyStr中
    if GetDefaultProxyServer(ProxyStr) then  {本地设置了代理服务器}
      begin
          if ProxyStr.httpName<>'' then
          begin
          //有代理的情况下IdHTTP1控件就要使用代理连接互联网咯
            UpIpDate.IdHTTP1.ProxyParams.ProxyServer:=ProxyStr.httpName;
            UpIpDate.IdHTTP1.ProxyParams.ProxyPort:=ProxyStr.httpport;
          end;
      end else
      begin
      //没代理的情况下赋值
        UpIpDate.IdHTTP1.ProxyParams.ProxyServer:='';
        UpIpDate.IdHTTP1.ProxyParams.ProxyPort:=0;
      end;
  //好 这时可以使用 IdHTTP1控件来注册域名并做判断了,
  //不过这个应该没什么用,my.126.com注册应该是很久以前的事吧现在还可以么?我没试过,哈哈不管它了,继续看代码
    if UpIpDate.ComboBox10.ItemIndex=0 then

      Temp:=UpIpDate.IdHTTP1.Get('http://my.126.com/cgi-bin/register?username='+username+'&domain=126.com&password='+pass+'&password2='+pass+'&email='+UpIpDate.EmailEdit1.Text+
      '&url=http://huigezi'+UpIpDate.IPComboBox2.Text+'end')
    else
      Temp:=UpIpDate.IdHTTP1.Get('http://my.yeah.net/cgi-bin/register?username='+username+'&domain=yeah.net&password='+pass+'&password2='+pass+'&email='+UpIpDate.EmailEdit1.Text+
      '&url=http://huigezi'+UpIpDate.IPComboBox2.Text+'end');

  //上面分析过了 Update实际上是一个字符串查找的函数,返回布尔值,所以作者用它来判断最终是否注册成功

    if UpIpDate.Update(Temp,UpIpDate.Translate('String7','注册成功')) then begin
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String8','注册域名成功!');
    end
    else begin
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String9','注册域名失败!此域名可能被另一用户注册过了!');
    end;
  Except
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String10','注册域名错误!请检查网络!');
  end;
end;

//这个是准备要进行多线程编程了,这里定义一个线程类 TZhuCeThread,重载了一个函数 execute
type
  TZhuCeThread = class(TThread)
  public
      procedure  Execute; override;
end;
//这里是重载函数的定义,每个线程对象都要有一个 execute的方法,你要这个线程做的事,
//就放在这个方法里去实现,看到这里,你应该对多线程编程明白了一点点了吧,
//呵呵,不明白也不要紧,小乐我和你一样,也是慢慢领悟 ^^
procedure TZhuCeThread.Execute;
begin
//就是上面的函数,用来注册域名的那段
ZhuIPtohttp;
Terminate;  //结束线程这个方法,都要有的
end;


//这个XWDns 负责的是做DNS部分的功能,后面类似与前面,方法定义好以后,放到多线程对象里
procedure XWDns;
var
username,pass,Temp:string;
tmphttp:string;
ProxyStr: TProxyServerInf;
begin
  try
    username:=UpIpDate.Xwuser.Text;
    pass:= UpIpDate.Xwpass.Text;

    if GetDefaultProxyServer(ProxyStr) then  {本地设置了代理服务器}
      begin
          if ProxyStr.httpName<>'' then
          begin
            UpIpDate.IdHTTP2.ProxyParams.ProxyServer:=ProxyStr.httpName;
            UpIpDate.IdHTTP2.ProxyParams.ProxyPort:=ProxyStr.httpport;
          end;
      end else
      begin
        UpIpDate.IdHTTP2.ProxyParams.ProxyServer:='';
        UpIpDate.IdHTTP2.ProxyParams.ProxyPort:=0;
      end;


    tmphttp:='http://www.3322.org/dyndns/update?system=dyndns&hostname='+UpIpDate.XwEdit.Text+'&myip='+UpIpDate.XWComboBox.Text+'&wildcard=OFF&mx=&backmx=NO';
    //这个是 IdHTTP的用法 ,估计是给访问这个地址的连接指定一个 用户名和密码,提交给页面的
    UpIpDate.IdHTTP2.Request.Username :=username;
    UpIpDate.IdHTTP2.Request.Password :=pass;
    //用上面的字符串来访问特定的提交信息地址,实现希网更新IP的功能
      Temp:=UpIpDate.IdHTTP2.Get(tmphttp);
    //断开连接
    try
      UpIpDate.IdHTTP2.Disconnect;
    except
    end;
    //通过Update获取提交信息是否成功更新
    if UpIpDate.Update(Temp,'good') then begin
      UpIpDate.Label1.Caption :=UpIpDate.Translate('String11','更新IP成功!请等待服务器上线!');
          if HgzVip.isSound then
            begin
              try
                sndplaysound('',snd_async);
                sndplaysound(Pchar(HgzVip.UpIPok),snd_async);
              except
              end;
            end;
    end
    else
    //失败提示:
    begin
    if pos('badauth',Temp)>0 then begin
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String12','更新IP失败!用户名或密码不正确!');
    UpIpDate.XWButton.Enabled:=True;
    Exit;
    end;
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String13','更新IP失败!请检查输入信息是否正确!')+Temp;
    end;
  Except
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String14','更新IP错误!请检查网络!');
  end;
  UpIpDate.XWButton.Enabled:=True;
end;

type
  TXWDnsThread = class(TThread)
  public
      procedure  Execute; override;
  end;
//与上面的线程方法分析类似,不多说了
procedure TXWDnsThread.Execute;
begin
XWDns;
Terminate;
end;


    //靠,又来一个类似的东西,我不分析了,大家参照上面的分析,然后理解吧
    //应该是修改 my.126.com的域名解析的吧,看看就算了
procedure IPtohttp;
var
username,pass,Temp:string;
ProxyStr: TProxyServerInf;
begin
  try
    username:=UpIpDate.user126.Text;
    pass:= UpIpDate.pass126.Text;


    if GetDefaultProxyServer(ProxyStr) then  {本地设置了代理服务器}
      begin
          if ProxyStr.httpName<>'' then
          begin
            UpIpDate.IdHTTP1.ProxyParams.ProxyServer:=ProxyStr.httpName;
            UpIpDate.IdHTTP1.ProxyParams.ProxyPort:=ProxyStr.httpport;
          end;
      end else
      begin
            UpIpDate.IdHTTP1.ProxyParams.ProxyServer:='';
            UpIpDate.IdHTTP1.ProxyParams.ProxyPort:=0;
      end;

    if UpIpDate.YComboBox.ItemIndex=0 then
      Temp:=UpIpDate.IdHTTP1.Get('http://my.126.com/cgi-bin/modify?username='+username+'&domain=126.com&password='+
          pass+'&url=http://huigezi'+UpIpDate.ComboBox1.Text+'end')
    else
      Temp:=UpIpDate.IdHTTP1.Get('http://my.yeah.net/cgi-bin/modify?username='+username+'&domain=yeah.net&password='+
          pass+'&url=http://huigezi'+UpIpDate.ComboBox1.Text+'end');

    if UpIpDate.Update(Temp,UpIpDate.Translate('String15','修改成功')) then begin
      UpIpDate.Label1.Caption :=UpIpDate.Translate('String11','更新IP成功!请等待服务器上线!');
          if HgzVip.isSound then
            begin
              try
                sndplaysound('',snd_async);
                sndplaysound(Pchar(HgzVip.UpIPok),snd_async);
              except
              end;
            end;
    end
    else begin
    if pos(UpIpDate.Translate('String16','密码错误'),Temp)>0 then begin
      UpIpDate.Label1.Caption :=UpIpDate.Translate('String12','更新IP失败!密码不正确!');
      UpIpDate.URLButton.Enabled:=True;
    Exit;
    end;
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String13','更新IP失败!请检查输入信息是否正确!');
    end;
  Except
    UpIpDate.Label1.Caption :=UpIpDate.Translate('String17','更新IP错误!请检查网络或域名服务商!');
  end;
    UpIpDate.URLButton.Enabled:=True;
end;

type
  THttpThread = class(TThread)
  public
      procedure  Execute; override;
  end;

procedure THttpThread.Execute;
begin
IPtohttp;
Terminate;
end;

// 这个是进行更新URL域名转发更新IP的一个模块,点击这个按钮激发事件进行
procedure TUpIpDate.URLButtonClick(Sender: TObject);
begin
if user126.Text='' then
  begin
    Label1.Caption:=Translate('String18','对不起!好像您没有填写域名噢!请您填上吧!');
    Exit;
  end;
if spSkinEdit2.Text<>pass126.Text then
  begin
    Label1.Caption:=Translate('String19','对不起!两次输入的密码不一致!请重新输入!');
    spSkinEdit2.Text:='';
    pass126.Text:='';
    Exit;
  end;
Label1.Caption:=Translate('String20','开始更新IP地址到域名...');
URLButton.Enabled:=False;
THttpThread.Create(false); //创建上面定义的多线程类对象,并执行
end;

procedure TUpIpDate.Button3Click(Sender: TObject);
{var
  username, pass, Shuzi: string;
  TempS: string;  }
begin
  if UserEdit.Text = '' then begin
    Label1.Caption := Translate('String18','用户名不能为空!');
    Exit;
  end;
  if PassEdit1.Text = '' then begin
    Label1.Caption := Translate('String21','密码不能为空,请重新填写!');
    Exit;
  end;
  if PassEdit1.Text <> PassEdit2.Text then begin
    Label1.Caption := Translate('String19','两次密码不一样,请重新填写!');
    PassEdit1.Text:='';
    PassEdit2.Text:='';
    Exit;
  end;
  if EmailEdit1.Text='' then
    begin
      Label1.Caption := Translate('String22','请填写你的E-Mail地址!');
      Exit;
    end;
Label1.Caption:=Translate('String23','开始注册域名...');
TZhuCeThread.Create(false);  //创建上面定义的多线程类对象,并执行
{  Randomize;
  i := Random(100);
  if i = 0 then i := 01;
  if i = 100 then i := 99;
  username := UserEdit.Text;
  pass := PassEdit2.Text;
  Shuzi := SuiJiMa;

  try
    Button3.Enabled := False;
    Button3.Refresh;
    Label1.Caption := '正在身份验证...'; //http://8225.com/login/login.asp?yhm=1&mima=1&shuzi=11&ipadd=nick
    temps := idHTTP1.Get('http://www.8225.com/login/login.asp?yhm=' + username + '&mima=' + pass + '&shuzi=' + shuzi + '&ipadd=' + IPComboBox2.Text);
  except
    Button3.Enabled := True;
    Button3.Refresh;
    Label1.Caption := '验证出错,请检查网络.';
    Exit;
  end;

  while Pos(#13#10, TempS) <> 0 do
  begin
    Delete(TempS, Pos(#13#10, TempS), 2);
  end;

  if TempS = YanzhenMa then begin
    Label1.Caption := '验证通过,更新IP成功.';
  end else begin
    Label1.Caption := '验证失败.更新IP失败.';
  end;
  Button3.Enabled := True;
  Button3.Refresh;  }
 
end;

  //这个应该是把填写的信息自动保存到配置文件HgzVip.myinifile里 ,
  //myinifile是一个配置文件 在main单元里有定义和赋值,翻到main可以看到它对应的是文件Operate.ini

procedure TUpIpDate.RadioBox1Click(Sender: TObject);
begin
try
if RadioBox1.Checked then
  begin
    HgzVip.myinifile.writestring('FTP','AutoSave','1');
    HgzVip.myinifile.writestring('FTP','FTPServer',FTPAdder.text);
    HgzVip.myinifile.writestring('FTP','FTPport',FTPPort.text);
    HgzVip.myinifile.writestring('FTP','FTPUser',FTPUser.Text);
    HgzVip.myinifile.writestring('FTP','Password',EnCryptStr(FTPPass1.Text,'HUIGEZI'));
    HgzVip.myinifile.writestring('FTP','IpFile',IpFileEdit.Text);
    HgzVip.myinifile.writestring('FTP','Http',httpEdit.Text);
  end else begin
    HgzVip.myinifile.writestring('FTP','AutoSave','0');
    HgzVip.myinifile.writestring('FTP','FTPServer','');
    HgzVip.myinifile.writestring('FTP','FTPport','21');
    HgzVip.myinifile.writestring('FTP','FTPUser','');
    HgzVip.myinifile.writestring('FTP','Password','');
    HgzVip.myinifile.writestring('FTP','IpFile','ip.jpg');
    HgzVip.myinifile.writestring('FTP','Http','');
  end;
except
end;
end;
    //类似。。。。。上面的分析,
procedure TUpIpDate.RadioBox2Click(Sender: TObject);
begin
try
if RadioBox2.Checked then
  begin
    HgzVip.myinifile.writestring('Yuming','AutoSave','1');
    HgzVip.Myinifile.writestring(YComboBox.Text, 'UserName', user126.Text);
    HgzVip.Myinifile.writestring(YComboBox.Text, 'Passwd', EnCryptStr(spSkinEdit2.Text,'HUIGEZI'));
  end else begin
    HgzVip.myinifile.writestring('Yuming','AutoSave','0');
    HgzVip.Myinifile.writestring(YComboBox.Text, 'UserName', '');
    HgzVip.Myinifile.writestring(YComboBox.Text, 'Passwd', '');
  end;
except
end;
end;
  //在这个窗口关闭的时候,也要记得执行一下保存信息到配置文件里
procedure TUpIpDate.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
if RadioBox1.Checked then
  begin
    HgzVip.myinifile.writestring('FTP','AutoSave','1');
    HgzVip.myinifile.writestring('FTP','FTPServer',FTPAdder.text);
    HgzVip.myinifile.writestring('FTP','FTPport',FTPPort.text);
    HgzVip.myinifile.writestring('FTP','FTPUser',FTPUser.Text);
    HgzVip.myinifile.writestring('FTP','Password',EnCryptStr(FTPPass1.Text,'HUIGEZI'));
    HgzVip.myinifile.writestring('FTP','IpFile',IpFileEdit.Text);
    HgzVip.myinifile.writestring('FTP','Http',httpEdit.Text);
  end else begin
    HgzVip.myinifile.writestring('FTP','AutoSave','0');
    HgzVip.myinifile.writestring('FTP','FTPServer','');
    HgzVip.myinifile.writestring('FTP','FTPport','21');
    HgzVip.myinifile.writestring('FTP','FTPUser','');
    HgzVip.myinifile.writestring('FTP','Password','');
    HgzVip.myinifile.writestring('FTP','IpFile','ip.jpg');
    HgzVip.myinifile.writestring('FTP','Http','');
  end;
except
end;
try
if RadioBox2.Checked then
  begin
    HgzVip.myinifile.writestring('Yuming','AutoSave','1');
    HgzVip.Myinifile.writestring(YComboBox.Text, 'UserName', user126.Text);
    HgzVip.Myinifile.writestring(YComboBox.Text, 'Passwd', EnCryptStr(spSkinEdit2.Text,'HUIGEZI'));
  end else begin
    HgzVip.myinifile.writestring('Yuming','AutoSave','0');
    HgzVip.Myinifile.writestring(YComboBox.Text, 'UserName', '');
    HgzVip.Myinifile.writestring(YComboBox.Text, 'Passwd', '');
  end;
except
end;
try
if CheckRadioBox1.Checked then
  begin
    HgzVip.myinifile.writestring('DNSYuming','AutoSave','1');
    HgzVip.myinifile.writestring('DNSYuming','Dns',XwEdit.text);
    HgzVip.myinifile.writestring('DNSYuming','User',Xwuser.text);
    HgzVip.myinifile.writestring('DNSYuming','Password',EnCryptStr(Xwpass.text,'HUIGEZI'));
  end else begin
    HgzVip.myinifile.writestring('DNSYuming','AutoSave','0');
    HgzVip.myinifile.writestring('DNSYuming','User','');
    HgzVip.myinifile.writestring('DNSYuming','Password','');
  end;
except
end;
end;


  //这个按钮 就是 希网动态域名更新IP的按钮,同样后面也是用一个多线程对象(TXWDnsThread.Create(false);)来实现的

procedure TUpIpDate.XWButtonClick(Sender: TObject);
begin
if XwEdit.Text='' then
  begin
    Label1.Caption:=Translate('String18','对不起!好像您没有填写域名噢!请您填上吧!');
    Exit;
  end;
if Xwuser.Text='' then
  begin
    Label1.Caption:=Translate('String24','对不起!请填写用户名!');
    Exit;
  end;
if Xwpass.Text='' then
  begin
    Label1.Caption:=Translate('String21','对不起!请填写密码!');
    Exit;
  end;
XWButton.Enabled:=False;
Label1.Caption:=Translate('String25','开始更新IP地址到域名...');
TXWDnsThread.Create(false);
end;
//点相应连接,打开IE连接其
procedure TUpIpDate.Label16Click(Sender: TObject);
begin
ShellExecute(0, 'Open', pchar('http://www.3322.org'),nil, nil, SW_Show);
end;
//同样是保存信息到配置文件,看到了吧,要实现便捷的功能,作者要写很多语句来实现的哦,真实不得不感谢作者的辛苦
procedure TUpIpDate.CheckRadioBox1Click(Sender: TObject);
begin
try
if CheckRadioBox1.Checked then
  begin
    HgzVip.myinifile.writestring('DNSYuming','AutoSave','1');
    HgzVip.myinifile.writestring('DNSYuming','Dns',XwEdit.text);
    HgzVip.myinifile.writestring('DNSYuming','User',Xwuser.text);
    HgzVip.myinifile.writestring('DNSYuming','Password',EnCryptStr(Xwpass.text,'HUIGEZI'));
  end else begin
    HgzVip.myinifile.writestring('DNSYuming','AutoSave','0');
    HgzVip.myinifile.writestring('DNSYuming','User','');
    HgzVip.myinifile.writestring('DNSYuming','Password','');
  end;
except
end;
end;
//理解同上,不用我再打字了吧,累死了。。。。汗。。。
procedure TUpIpDate.Label11Click(Sender: TObject);
begin
ShellExecute(0, 'Open','http://my.126.com/',nil, nil, SW_Show);
end;
//如果输入框user126 有输入,就是变化啦,更新配置文件,
procedure TUpIpDate.user126Change(Sender: TObject);
begin
try
if RadioBox2.Checked then
  begin
    if YComboBox.ItemIndex =0 then
      HgzVip.Myinifile.writestring('.126.com', 'UserName', user126.Text);
    if YComboBox.ItemIndex =1 then
      HgzVip.Myinifile.writestring('.yeah.net', 'UserName', user126.Text);
  end;
except
end;
end;
//理解同上。。
procedure TUpIpDate.spSkinEdit2Change(Sender: TObject);
begin
try
if RadioBox2.Checked then
  begin
    if YComboBox.ItemIndex =0 then
      HgzVip.Myinifile.writestring('.126.com', 'Passwd', EnCryptStr(spSkinEdit2.Text,'HUIGEZI'));
    if YComboBox.ItemIndex =1 then
      HgzVip.Myinifile.writestring('.yeah.net', 'Passwd', EnCryptStr(spSkinEdit2.Text,'HUIGEZI'));
  end;
except
end;
end;
    //
procedure TUpIpDate.YComboBoxClick(Sender: TObject);
begin
try
if YComboBox.ItemIndex =0 then
  begin
    user126.Text:=HgzVip.myinifile.Readstring('.126.com', 'UserName', '');
    //这里值得讲一下的是,要用解密函数来进行解密保存在配置文件里的密码值,这里用的key是huigezi
    // spSkinEdit2 和 pass126 都是密码框它们一个只是做一致性匹配
    spSkinEdit2.Text:=DeCryptStr(HgzVip.myinifile.Readstring('.126.com', 'Passwd', ''),'HUIGEZI');
    pass126.Text:=DeCryptStr(HgzVip.myinifile.Readstring('.126.com', 'Passwd', ''),'HUIGEZI');
  end;
if YComboBox.ItemIndex =1 then
  begin
    user126.Text:=HgzVip.myinifile.Readstring('.yeah.net', 'UserName', '');
    spSkinEdit2.Text:=DeCryptStr(HgzVip.myinifile.Readstring('.yeah.net', 'Passwd', ''),'HUIGEZI');
    pass126.Text:=DeCryptStr(HgzVip.myinifile.Readstring('.yeah.net', 'Passwd', ''),'HUIGEZI');
  end;
except
end;
end;
//上传成功的处理,提示信息和断开连接
procedure TUpIpDate.NMFTP1Success(Trans_Type: TCmdType);
begin
//Label1.Caption :='成功.';
if Trans_Type=cmdUpload then
begin
  AfterGetFile(nil);
  //上面有定义好的,主要是用来上传后信息提示和声音播放的,还记得么?不记得看上面
  //疑点:定义的时候 参数类型是 TOBJECT 的,这里可以用nil做参数???
  NMFTP1.Disconnect; //断开ftp
end;
end;
//连接 ftp的时候的各种信息反馈
procedure TUpIpDate.NMFTP1Connect(Sender: TObject);
begin
  Label1.Caption :=Translate('String26','连接FTP成功.');
end;

procedure TUpIpDate.NMFTP1ConnectionFailed(Sender: TObject);
begin
  Label1.Caption :=Translate('String27','连接FTP失败.');;
end;

procedure TUpIpDate.NMFTP1Error(Sender: TComponent; Errno: Word;
  Errmsg: String);
begin
  Label1.Caption :='Error..';
end;


procedure TUpIpDate.NMFTP1Status(Sender: TComponent; Status: String);
begin
  Label1.Caption :=Status;
end;

end.

//咳,终于看完这个东西了,打字累死了,不过值得,因为又学了不少东西哇。
//首先 classname 原来是可以做全局变量获取一个类名称的
//然后学到的是加密字串的解密函数应用
//FTP控件的使用
//HTTP控件的运用
//还有配置文件的读写
//还有字符串函数的替换和查找。。。

//你收获了多少呢?
 
有问题请 加入 技术Q群 :36085817(DELPHI朋友)
 
Re:分析灰鸽子1.2(4)——UpIp;
[ 2007-4-16 16:14:20 | By: 剞时(游客) ]
 
兄弟你好强呀!有空我们聊聊。我的qq:458837111
 
个人主页 | 引用 | 返回 | 删除 | 回复
有问题请 加入 技术Q群 :36085817(DELPHI朋友)

发表评论:

    大名:
    密码:
    主页:
    标题:
Powered by Oblog.