Jun 13, 2009
Saturday, June 13, 2009

สร้างโปรแกรม Auto comment Hi5 และโปรแกรมควบคุมเว็บด้วย AutoIt :2



ส่วนนี้เป็นการสอนเขียนโปรแกรม หากคุณต้องการที่ทำเสร็จแล้ว ดาวน์โหลดได้ตามลิงก์นี้ครับPSsix Auto Comment Hi5 โปรแกรมช่วยคอมเมนต์อัตโนมัติ Hi5


ตอนที่ 1

หมายเหตุ : ตัวอย่างสำหรับบทความนี้ ใช้เว็บบอร์ดเก่าในการทำ ซึ่งตอนนี้ปิดไปแล้ว
     สำหรับตอนที่ 2 ในการศึกษาการสร้างโปรแกรม Auto comment นั้นเราจะทำโปรแกรมสำหรับการปั้มกระทู้กันครับ และก่อนจะเริ่มทำก็ต้องมาทำความเข้าใจกันเสียก่อนว่า ในการทำโปรแกรมใดๆ ก็ตามที่เกี่ยวกับการสร้างโปรแกรมออโต้ในเว็บ เราจำเป็นต้องมีสิ่งที่เรียกว่า จินตนาการ เพราะโปรแกรมที่เราทำนั้นจะเลียนแบบพฤติกรรมของคน คุณต้องคิดให้ออกเสียก่อนว่าลำดับขั้นตอนที่คนปกติทำ มีขั้นตอนอะไรบ้าง จากนั้นก็นำลำดับขั้นตอนดังกล่าวมาเขียนเป็นคำสั่งที่เลียนแบบพฤติกรรมของคน

     ตัวอย่าง การสร้างโปรแกรมปั้มกระทู้ในเว็บ ผมจะใช้เว็บบอร์ดในเว็บนี้ทำ ซึ่งจะมีลำดับขั้นตอนปกติดังนี้
1. เปิดหน้ากระทู้ที่จะปั้ม (จะตัดการล็อกอินออกไป เพราะถือว่าสามารถล็อคอินในบอร์ดได้ถาวรอยู่แล้ว ไม่จำเป็นต้องล็อคอินทุกครั้งที่ทำการปั้ม)
2. พิมพ์ข้อความลงในช่องข้อความ
3. คลิกปุ่ม ส่งข้อความ
4. รอจนกระทั่งข้อความที่คลิกส่งปรากฏ แล้วก็เริ่มขั้นตอนที่ 2 วนไปเรื่อยๆ

     หากคุณดูและลองทำตามขั้นตอนนี้ จะพบว่ามีปัญหาหนึ่งเกิดขึ้น คือ ในเว็บบอร์ดจะมีระบบป้องกันการฟลัดข้อความอยู่ด้วย หากผู้ใช้ใส่ข้อความเดิมซ้ำๆ ลงไป ก็จะไม่สามารถส่งข้อความขึ้นเว็บบอร์ดได้ วิธีแก้ไขก็ต้องสร้างชุดข้อความเพื่อทำการสุ่มข้อความที่จะส่ง เพื่อไม่ให้ข้อความซ้ำ

และคำสั่งที่จะเพิ่มเติมเข้ามาในบทนี้ก็จะมี

     _IELoadWait เป็นคำสั่งให้โปรแกรมรอการโหลดหน้าเว็บให้เสร็จสิ้นเสียก่อน จึงจะทำงานตามคำสั่งถัดไป ควรใส่คำสั่งนี้เอาไว้คั่นระหว่างคำสั่งต่างๆ ที่มีผลให้หน้าเว็บมีการโหลด เช่น คุณสั่งให้คลิกส่งข้อความ หน้าเว็บก็จะโหลดข้อมูลขึ้นสักพักหนึ่ง เราก็ใส่คำสั่งนี้คั่นต่อท้ายไป ทำไมต้องใส่ นั่นก็เพราะว่าหากคุณไม่ใส่คำสั่งนี้ โปรแกรมจะตรวจข้อมูลในหน้าเว็บ หากพบตรงตามเงื่อนไขมันจะทำงานทันทีโดยไม่สนใจว่าหน้าเว็บโหลดเสร็จหรือยัง ซึ่งการทำแบบนี้จะเกิดความผิดพลาดได้ง่ายๆ เพราะข้อมูลในหน้าเว็บโหลดมาไม่หมด รูปแบบคำสั่ง _IELoadWait(ตามตัวชื่อตัวแปรของเว็บที่รอให้โหลดจนเสร็จ) เช่น _IELoadWait($IE)

     IniRead เป็นคำสั่งสำหรับอ่านข้อมูลจากไฟล์ .ini เพื่อนำข้อความมาใส่เข้าไปในกระทู้ที่จะปั้ม มีรูปแบบคำสั่งดังนี้ IniRead("ตำแหน่งและชื่อไฟล์นามสกุล ini","เซ็กชั่นที่กำหนดให้อ่านข้อมูล","ชื่อคีย์ที่อยู่ในเซ็กซั่น ซึ่งโปรแกรมจะดึงเอาข้อมูลขึ้นมา","ข้อความมาตรฐานเอาไว้ใช้ในกรณีที่ดึงเอาข้อมูลจากไฟล์ ini ไม่ได้")

โครงสร้างของไฟล์ ini

[SectionName]
Key=Value

เมื่อทำแล้วก็จะได้แบบนี้ (จะมีข้อความภายในคีย์ text1 ถึง text5 ใช้สำหรับสุ่มข้อความ 5 แบบ)

[text]
text1="สุ่มข้อความที่ 1 สวัสดี"
text2="สุ่มข้อความที่ 2 ทดสอบ"
text3="สุ่มข้อความที่ 3 การโฟสข้อความแบบสุ่ม"
text4="สุ่มข้อความที่ 4 ข้อความจะไม่เรียงกัน"
text5="สุ่มข้อความที่ 5 จะสุ่มไปเรื่อยๆ"

     แถมท้าย ถ้าคุณสร้างไฟล์ .ini ภายในโฟลเดอร์เดียวกันกับตัวโปรแกรม ควรใช้ตัวแปร @ScriptDir ซึ่งจะช่วยดึงเอาชื่อตำแหน่งไดร์ฟและโฟลเดอร์เดียวกันกับโปรแกรมมาใส่ในคำสั่งอัตโนมัติ

While 1 และ WEnd เอาไว้ครอบชุดคำสั่งที่เราต้องการให้วนลูปไปเรื่อยๆ คำสั่งนี้สำคัญมากเพราะมันจะเป็นตัวชี้ให้โปรแกรมวนซ้ำขั้นตอนต่างๆ ที่เราใส่คำสั่งเอาไว้ ตัวอย่าง ในการสร้างโปรแกรมปั้มกระทู้นี้ เราจะนำเอาคำสั่งมาไว้แบบนี้

1. เปิดหน้ากระทู้ที่จะปั้ม
While 1
2. พิมพ์ข้อความลงในช่องข้อความ
3. คลิกปุ่ม ส่งข้อความ
4. รอจนกระทั่งข้อความที่คลิกส่งปรากฏ
WEnd

     จะเห็นได้ว่าพอเอาคำสั่ง While 1 มาไว้หน้าขั้นตอนที่สอง โปรแกรมก็จะเริ่มการพิมพ์ข้อความลงในช่องความใหม่ทุกครั้ง ที่มีการคลิกส่งข้อความ และรอจนข้อความที่ส่งไปปรากฏขึ้นมาในขั้นตอนที่ 4 เสร็จ บางท่านอาจจะสงสัยว่าทำไมไม่เอาคำสั่ง While 1 มาก่อนขั้นตอนที่ 1 เพื่อให้ทำซ้ำหมดทุกขั้นตอนไปเลย ที่ไม่ทำเช่นนั้นก็เพราะ มันจะกลายเป็นการเปิดหน้ากระทู้ใหม่ทุกครั้งที่มีการวนซ้ำนั่นเอง (แบบนี้หน่วยความจำในเครื่องอาจจะหมด หรือเครื่องแฮงค์ไปก่อนเพราะเปิดหน้าเว็บเยอะเกินไป)

     Random เอาไว้สุ่มตัวเลข เพื่อนำมาดึงข้อความทั้ง 5 แบบในไฟล์ ini เข้ามาในโปรแกรม รูปแบบคำสั่ง Random(เลขน้อยที่สุดสำหรับการเริ่มสุ่ม,เลขมาที่สุดสำหรับการสุ่ม,กำหนดให้เป็นตัวเลขจำนวนเต็มใส่ 1 ถ้าไม่ใส่จะเป็นตัวเลขแบบมีจุดทศนิยม)
ตัวอย่าง Random(1,5,1) จะเป็นการสุ่มตัวเลขระหว่าง 1 - 5

     Switch...Case...EndSwitch เป็นคำสั่ง เพื่ออ่านค่าตัวแปร ถ้าตรงกับเงื่อนไขที่กำหนดก็จะทำตามเงื่อนไขนั้นทันที เราจะใช้คำสั่งนี้คู่กับ Random เพื่อดึงเอาค่าตัวแปรซึ่งสุ่มจำนวนตัวเลข มากำหนดเงื่อนไขในการดึงข้อมูลในไฟล์ ini รูปแบบคำสั่ง

Switch
(ตามด้วยชื่อตัวแปรที่จะอ่าน)
Case (ค่าที่นำมาเปรียบเทียบกับค่าที่อยู่ในตัวแปร)
Case (ค่าที่นำมาเปรียบเทียบกับค่าที่อยู่ในตัวแปร)
Case (ค่าที่นำมาเปรียบเทียบกับค่าที่อยู่ในตัวแปร)
EndSwitch (จบการทำงาน)

ตัวอย่าง

$rnd = Random(1,5,1)
;ทำการสุ่มตัวเลข 1 - 5 หนึ่งครั้ง แล้วดึงเอาค่าตัวเลขที่ได้มาเก็บไว้ในตัวแปรชื่อ $rnd
Switch $rnd
; อ่านค่าตัวแปร $rnd
Case 1
;ถ้าได้เท่ากับ 1 ก็ทำตามเงื่อนไขใน Case ข้อนี้
Case 2
;ถ้าได้เท่ากับ 2 ก็ทำตามเงื่อนไขใน Case ข้อนี้
Case 3
;ถ้าได้เท่ากับ 3 ก็ทำตามเงื่อนไขใน Case ข้อนี้
Case 4
;ถ้าได้เท่ากับ 4 ก็ทำตามเงื่อนไขใน Case ข้อนี้
Case 5
;ถ้าได้เท่ากับ 5 ก็ทำตามเงื่อนไขใน Case ข้อนี้
EndSwitch

ดูคำสั่งอาจจะงงๆ ในการนำมาใช้บ้าง มาดูขั้นตอนการทำจะทำให้เข้าใจยิ่งขึ้น

1. สร้างไฟล์ .ini สำหรับเก็บข้อความที่เราจะสุ่มมาใช้เสียก่อน โดยตั้งชื่อเป็น autotxt.ini เก็บไว้ในโฟลเดอร์เดียวกันกับไฟล์สคริปต์ Autoit ภายในไฟล์ก็พิมพ์ตามรูปแบบด้านล่างนี้ได้เลยครับ (อาจจะเปลี่ยนข้อความที่ใช้สุ่มตามต้องการ)



2. หาชื่อฟอร์มและชื่อช่องสำหรับพิมพ์ข้อความในเว็บบอร์ด เพื่อนำมาเขียนคำสั่ง ตามตัวอย่างนี้
ฟอร์มมีชื่อว่า form1
ช่องสำหรับพิมพ์ข้อความมีชื่อว่า message


3. เริ่มเขียนคำสั่ง ผมจะใส่เครื่องหมาย ; เพื่ออธิบายคำสั่งแต่ละบรรทัดไปด้วย

#include <ie.au3>
;ดึงเอา Library เพื่อควบคุม IE เข้ามาในสคริปต์

$txt1 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text1", "NotFound")
$txt2 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text2", "NotFound")
$txt3 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text3", "NotFound")
$txt4 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text4", "NotFound")
$txt5 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text5", "NotFound")

; คำสั่ง 5 บรรทัดนี้เหมือนกัน คือดึงเอาข้อความที่อยู่ในคีย์ text1 ถึง text5 ที่อยู่ในไฟล์ autotxt.ini มาเก็บไว้ในตัวแปร $txt1 - 5 ตามลำดับ

$IE = _IECreate ("http://bbznet.pukpik.com/scripts2/view.php?user=psix&board=1&id=1107&c=1&order=numtopic")
; เปิดกระทู้ในเว็บบอร์ดที่เราจะปั้ม แล้วดึงเอากระทู้ดังกล่าวเข้ามาสู่ตัวแปร $IE

While 1
;เริ่มต้นวนลูป

$Form = _IEFormGetObjByName ($IE, "form1")
;สั่งโฟกัสไปที่ฟอร์ม form1

$Query = _IEFormElementGetObjByName ($Form, "message")
;สั่งโฟกัสไปยังช่องสำหรับพิมพ์ข้อความมีชื่อว่า message (ซึ่งอยู่ในฟอร์ม form1 ที่เราสั่งโฟกัสไปก่อนหน้านี้)

$rnd = Random(1,5,1)
;สั่งให้สุ่มตัวเลข 1 -5 จำนวนหนึ่งครั้ง และดึงค่าที่ได้มาเก็บไว้ในตัวแปร $rnd

Switch $rnd
;อ่านค่าจากตัวแปร $rnd เพื่อนำไปเปรียบเทียบกับ Case ต่างๆ ต่อไปนี้

Case 1
;ถ้าตัวแปร $rnd มีค่าเท่ากับ 1
_IEFormElementSetValue ($Query,$txt1)
;ให้ส่งข้อความที่อยู่ในตัวแปร $txt1 ไปยังช่องสำหรับพิมพ์ข้อความ(ที่เราเก็บไว้ในตัวแปร $Query)
Case 2
;ถ้าตัวแปร $rnd มีค่าเท่ากับ 2
_IEFormElementSetValue ($Query, $txt2)
;ให้ส่งข้อความที่อยู่ในตัวแปร $txt2 ไปยังช่องสำหรับพิมพ์ข้อความ(ที่เราเก็บไว้ในตัวแปร $Query)
Case 3
;ถ้าตัวแปร $rnd มีค่าเท่ากับ 3
_IEFormElementSetValue ($Query, $txt3)
;ให้ส่งข้อความที่อยู่ในตัวแปร $txt3 ไปยังช่องสำหรับพิมพ์ข้อความ(ที่เราเก็บไว้ในตัวแปร $Query)
Case 4
;ถ้าตัวแปร $rnd มีค่าเท่ากับ 4
_IEFormElementSetValue ($Query, $txt4)
;ให้ส่งข้อความที่อยู่ในตัวแปร $txt4 ไปยังช่องสำหรับพิมพ์ข้อความ(ที่เราเก็บไว้ในตัวแปร $Query)
Case 5
;ถ้าตัวแปร $rnd มีค่าเท่ากับ 5
_IEFormElementSetValue ($Query, $txt5)
;ให้ส่งข้อความที่อยู่ในตัวแปร $txt5 ไปยังช่องสำหรับพิมพ์ข้อความ(ที่เราเก็บไว้ในตัวแปร $Query)
EndSwitch
;จบคำสั่ง Switch

_IEFormSubmit ($Form)
;สั่งให้คลิกปุ่มส่งข้อความในฟอร์ม หลังจากวางข้อความที่ผ่านการสุ่มลงในช่องข้อความเรียบร้อยแล้ว

_IELoadWait($IE)
;สั่งให้รอจะหน้าเว็บโหลดเสร็จเสียก่อนจึงค่อยเริ่มต้นคำสั่งถัดไป

WEnd
;บอกให้รู้ว่าลูปจบแล้ว ให้ย้อนกลับไปเริ่มต้นใหม่ที่ตำแหน่ While 1 อีกครั้ง

สำหรับคำสั่งแบบไม่มีคำอธิบายมาคั่น ดูได้จากด้านล่างนี้นะครับ (ท่านที่จะทดสอบในเว็บบอร์ด ขอให้ตั้งกระทู้ใหม่ทดสอบนะครับ อย่าใช้กระทู้ที่มีการถามตอบทั่วไปทดสอบ)

#include <ie.au3>
$txt1 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text1", "NotFound")
$txt2 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text2", "NotFound")
$txt3 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text3", "NotFound")
$txt4 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text4", "NotFound")
$txt5 = IniRead(@ScriptDir&"\autotxt.ini", "text", "text5", "NotFound")

$IE = _IECreate ("ใส่ลิงก์กระทู้ที่ต้องการให้เปิด")

While 1
$Form = _IEFormGetObjByName ($IE, "form1")
$Query = _IEFormElementGetObjByName ($Form, "message")
$rnd = Random(1,5,1)

Switch $rnd
Case 1
_IEFormElementSetValue ($Query, $txt1)
Case 2
_IEFormElementSetValue ($Query, $txt2)
Case 3
_IEFormElementSetValue ($Query, $txt3)
Case 4
_IEFormElementSetValue ($Query, $txt4)
Case 5
EndSwitch
_IEFormSubmit ($Form)
_IELoadWait($IE)
WEnd

รูปตัวอย่าง คำสั่งที่เขียนในโปรแกรม






###จบแล้วครับ###


2 comments:

  1. สามารถออโต้โพสของบอร์ด BBS ได้ไหมครับ แล้วตั้งเวลาในการหน่วงเวลาโพสอ่ะครับ พอทำได้ไหมครับ แบบ เปลื่ยนหน้าที่จะโพสๆไปเรื่อยๆอะครับ

    ReplyDelete
  2. ติดต่อกลับที่เมลล์ pa-170340(@)hotmail.คอม
    face msn google+

    ถ้าสามารถทำให้ออโต้โพสบนบอร์ด BBs โดยหน่วงเวลา และเปลื่ยนหน้าบอร์ดไปเรื่อยๆได้อ่ะครับ
    ขอบคุณครับ

    ReplyDelete

    ส่วนนี้สำหรับแสดงความคิดเห็นทั่วไป สอบถามปัญหาตั้งถามได้ที่ฟอรั่ม


>>> [โปรดอ่าน] เนื่องจาก บทความการใช้งานบางโปรแกรมได้โฟสไปนานแล้ว
โปรแกรมอาจมีการอัปเดท วิธีการใช้งาน อาจใช้ไม่ได้ หรือมีวิธีที่ง่ายกว่าในเวอร์ชั่นใหม่
หากคุณพบว่าวิธีการใช้งานไม่ตรงกับบทความในบล็อกนี้ สามารถแนะนำเพิ่มเติมได้ครับ