程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi編寫論壇灌水機

用Delphi編寫論壇灌水機

編輯:Delphi
 本來以為網頁裡的edit,memo等都和程序裡的一樣,可以用句柄來控制,但後來才明白,它是不存在句柄的!
  查了好久,前幾天看到一個關於QQ自動申請的例子.主要就是控制網頁各種操作的!總結了一下,做出一個論壇灌水機:
  首先要在uses中引用msHtml單元.

  代碼及分析如下:

  var
  hform:IHtmlFormelement;
  hdoc:iHtmldocument2;
  hall:iHtmlelementcollection;
  Hinput:IHtmlinputelement;
  iw:iwebbrowser2;
  hlen,tmploop:integer;
  vk:oleVariant;
  dispatch:IDispatch;
  begin
  if Assigned(webbrowse1) then ///保證網頁裡有內容;即已經打開一個網頁!
  begin
  hdoc:=webbrowse1.document as iHtmldocument2;
  hall:=hdoc.get_all;
  hlen:=hall.get_length;
  ////以上幾步的操作為:將浏覽器控件裡的內容賦給hdoc.取其所有標識,並算出總數;
  ////下面的操作為:按總數循環找到用戶名和密碼的edit;並賦值;
  for tmploop:=0 to hlen-1 do
  begin
  vk:=tmploop;
  dispatch:=hall.item(vk,0);
  if succeeded(Dispatch.QueryInterface(IHtmlInputelement,hinput)) then
  ///如果此標識是一個edit控件.....
  begin ////下面這裡的uppercase是必需的!防止因大小寫的不同而判斷失誤!
  ///下面的"TEXT"是由網頁裡的內容來確定的.也就是說你要判斷就必需根據具體網頁代碼來!
  ///密碼框和用戶名處是一樣的!
  if uppercase(hinput.Type_)='TEXT' then hinput.value:='tresss'
  else if uppercase(hinput.type_)='PASSWord' then hinput.value:='tresss';
  end;
  if succeeded(dispatch.QueryInterface(IHtmlFormElement,hform)) and (uppercase(hform.name)='THEFORM') then
  ///此處是form提交.如果從Html發現只有一個form的話那第二個條件是非必需的!
  ///而且也不一定要判斷name屬性,也可以根據其它屬性來判斷.
  Hform.submit;
  end; ////for end;
  end; //if end;
  end;

  到此,,一個自動登陸的例子就作好了..如果要實現灌水的話,,可以將hinput:ihtmlinputelement換成htext:ihtmltextareaelement,也就相當於memo控件.將用戶名的賦值換成是發言的賦值就好;當然這裡還可以換成是其它的,如單選等...具體內容可以查看msHtml裡的列表!

  本來到這裡已經夠了.但是後來發現--原來論壇裡是有框架--frame的.好長一段時間被此困擾著,後來在csdn上問了一下,有人給出了解決方法,試了一下很不錯!

  上面的代碼裡可以加入:
  var
  ......
  ......
  iw:iwebbrowser2;
  begin
  .....
  iw:=getframe(3); //此步即是取得webbrowse裡的第二個框架;
  ///而後的操作都是一樣的,也就是上面的操作的作用是將一個框架裡的內容來作為一個網頁來處理;
  hdoc:=iw.document as iHtmldocument2;
  hall:=hdoc.get_all;
  ......
  ......

  
  ///getframe() 函數如下需要在uses裡加入activex單元:

  
  Function TFrmain.GetFrame(FrameNo:Integer):IWebbrowser2;
  var
  OleContainer:IOleContainer;
  enum:IEnumUnknown;
  unk:IUnknown;
  Fetched:PLongint;
  begin
  while webbrowse1.ReadyState<>READYSTATE_COMPLETE do
  Application.ProcessMessages;
  if Assigned(webbrowse.document) then
  begin
  Fetched:=nil;
  OleContainer:=webbrowse.Document as IOleContainer;
  OleContainer.EnumObjects(OLECONTF_EMBEDDINGS,enum);
  Enum.Skip(FrameNo);
  Enum.Next(OLECONTF_EMBEDDINGS,Unk,Fetched);
  Result:=Unk as IWebbrowser2;
  end
  else
  Result:=nil;
  end;

  還有要說明的一點就是網頁裡框架的跳轉!依然是使用的navigate 但是需要兩個參數!
  webbrowse.navigae('要轉到的網頁地址',flag1,flag2);
  其中兩個參數的類型是:olevariant;
  第一個參數不需要賦值,它控制的是網頁打開的其它選項(如:在新網頁中打開.等).
  我們所要操作的是第二個參數.這裡你要先打開網頁的源文件,查看他的frame的name屬性!記住所要控制的frame的name把它的值賦給flag2就可以了!這樣就是在一個frame中打開一個網頁!

  這樣的話,加上一個timer再加上一些代碼就可以作成一個完整的灌水機了!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved