วันศุกร์ที่ 28 ตุลาคม พ.ศ. 2554

XviD Configuration AVI


แปลงหนังDVDลงแผ่นCDให้ได้คุณภาพสุดยอดน้องๆDVD 

หลายๆคนชื่นชอบDVDตรงที่ภาพมันชัดสวยงามfunctionเยอะ แต่เนื่องด้วยขนาดๆใหญ่โตมโหราฬของมัน ทำให้บางครั้งก็เอาไปทำอย่างอื่นต่อลำบาก เช่น เครื่องอื่นไม่มีDrive DVD หรือจะอัพส่งทางnetก็ไม่ไหว หรือจะด้วยเหตุผลอื่นต่างๆแล้วแต่จะเกิด ดังนั้นถ้าเราลดขนาดมันลงได้โดนไม่สูญเสียด้านอื่นมากนักก็คงดี ดูอย่างหนังVCDก็มี ใช้แค่แผ่นCDเอง แต่ก็อย่างที่รู้ๆ คุณภาพมันต่างกันมากมาย และต่อไปนี้คือทางออกๆหนึ่ง ก็คือ การเข้ารหัสมันซะใหม่(Encode)
บางคนรู้ดีแต่ไม่รู้จริงก็สงสัย ทำไมต้องทำอะไรให้ยุ่งยากด้วยพวกโปรแกรมง่ายๆคลิ๊กไปมาไม่กี่ทีก็ได้มีเยอะแยะ ทำไมไม่ใช้ ก็ขอตอบง่ายๆเลยว่าคุณภาพที่ได้มันห่วยแตกมากครับ จบ...
มาดูจุดเด่น
 1. หนังทั้งเรื่องลงCDแค่1แผ่นหรือ2แผ่น(แล้วแต่ว่าจะเอาสวยแค่ไหน)แต่ภาพสวยสุดๆ น้องๆDVD ชนิดVCDชิดซ้ายไปเลย
 2. ระบบเสียงมี2ภาษาเปลี่ยนไปมาได้แบบDVD
 3. เลือกSubtitleได้ จะใส่กี่ภาษาก็ได้ เปิด-ปิดซับได้ แบบDVD เช่นกัน
 ข้อจำกัดในการทำ
 1. การทำยุ่งยากซับซ้อนไม่เหมาะสำหรับคนสมาธิสั้นและไม่มีความอดทน
2. เตรียมHarddiskไว้ประมาณ10Gb ไม่ต้องถึงก็ได้แค่เผื่อไว้ก่อน
3. ใช้เวลาencodeนานมากหลายชั่วโมงประมาณว่าไปหลับได้ตื่นนึง ใครCPUแรงๆจะได้เปรียบ
4. จากข้อ3 ทำให้เปลืองไฟ555
โปรแกรมที่ต้องใช้หลักๆ
1. Gordian Knot Rip Pack
2. Codec Xvid : www.xvid.org
แต่ผมว่าลงK-Lite Mega Codec Pack ตัวนี้เลยดีกว่า เพราะอุปกรณ์ครบที่จะต้องใช้ต่อไป
http://www.free-codecs.com/download/K_Lite_Mega_Codec_Pack.htm
3. DVDShrinkหรือDVDDecrypter ก็ได้http://www.dvdshrink.org
4. Vobsub ตัวนี้จะมีรวมอยู่ในชุด K-Lite Mega Codec Pack ทั้งหมดแล้วครับ
ทุกอย่างเป็นFreewareหมดไม่เสียตังค์ 
1. Prepare DVD2AVI
1. เอา DVD ลง Harddisk (เช่น DVDShrink, DVDDecrypter, UltraISO)

2. ใช้ไดร์ฟเสมือนสำหรับ image file(เช่น Nero ImageDrive, Daemon tool)
โปรแกรมที่แนะนำในวงเล็บจะใช้อันไหนก็ได้ แต่ตัวแรกสุดจะเป็นตัวที่ผมใช้ ไม่ใช่ว่าดีกว่ามากมายยังไง เพียงแต่ลงไว้แล้ว ขี้เกียจลงซ้ำซ้อนกันหลายตัว และใครจะประยุกต์ใช้ตัวอื่นแทนก็ได้ครับ มีอีกหลายๆตัว เพียงแค่ยกตัวอย่างให้เป็นแนวทาง เพราะผมคิดว่ามันใช้ดี
และใครจะทำเป็นimage หรือจะเอาลงเลยก็แล้วแต่ครับ เพราะถ้าไม่ทำเป็นimage จะช่วยประยุกต์การripได้อีกนิดครับ เช่น กรณีจะตัดต่อไฟล์ vob ก่อน
3. รัน GordianKnot > Ripping > DGIndexàPrepare the VOBs > เลือก VOB ไฟล์ > กด F5 เพื่อ Prevew สังเกต Statistic Widows ดีๆ กด ESC เพื่อหยุด Preview 
NTSC
- ถ้า Video Type เป็น Film มากกว่า 95% ให้เลือก เมนู Video -> Field Operation -> Force-Film 23.976fps นี่คือการทำ Inverse Telecine
- ถ้าเป็น Video Type เป็น Interlaced หรือสลับไปมา ให้เลือก Non ครับ สัญญาณภาพที่ได้ จะเป็น Interlaced ที่ 29.97fps
PAL
- เลือก Non ก็จะได้สัญญาณภาพแบบ Progressive
ถ้างงก็ข้ามๆไปละกัน

4. Save Project > จะได้ DVD2AVI Project (.D2V) และ Dolby Digital Track (.AC3) 
2. Audio Encoding
รัน BeSweet GUI (อยู่ในfolderที่ลงGKnotไว้)
เลือกprofiles DSPguru_MP3_for_AVI
เลือก Input File (.ac3) และ Output File (.mp3)

ตั้งค่าดังนี้
OTA Overall Track Adjustment
- ตรง Set Delay to.... ให้ติ๊ก DVD2AVI เพื่อให้มันตั้งค่า Delay อัตโนมัติ
ไปที่ "Lame 1"
- เอาเครื่องหมายถูกหน้า Alt Preset ตรงมุมซ้ายล่างออก
- ติ๊กถูกหน้า Mode และเลือก โหมดตามแต่ชนิดไฟล์ AC3 ที่คุณมี ถ้า AC3 เป็น แบบ 2.0 ให้เลือก Stereo ถ้าเป็น 5.1 ให้เลือก Joit-Stereo (เพื่อทำ Dolby Prologic)
ไปที่ "Lame 2"
- มี 3 ทางเลือก CBR ABR VBR ง่ายที่สุดและไม่ยุ่งยากคือ CBR-128kbps สำหรับมือใหม่
แต่ถ้าสนที่เหลือ ไว้ติดต่อทีอีกที หรือจะลองเองก็ได้
กลับมาที่หน้า "BeSweet"
- กดปุ่ม AC3 to MP3 จะได้ MP3 soundtrack

Note : AVI สามารถมี track เสียงได้ 2 track 
3. Subtitles
จะทำ Subtitle แบบเป็นไฟล์แยกนะครับ สามารถเลือกภาษาและเปิด-ปิดได้

1. ไปที่ tab "Subtitles" > Configure > Open แล้วเปลี่ยน File Type เป็น ifo & vob จากนั้นให้เลือกไฟล์ .IFO ที่เก็บข้อมูลตัวหนัง เลือกภาษาที่ต้องการ จะเอากี่ภาษาก็เลือกเอาครับ

2. พอได้มาแล้วก็ตั้งชื่อตามชื่อไฟล์aviของเรา

3. ย่อไฟล์ Subtitles ด้วย WinRar ย่อเฉพาะ .sub ครับ ส่วนไฟล์ .idx ไม่ต้องไปยุ่งกับมัน แล้วลบ .sub ทิ้งไปได้ครับ โปรแกรม Direct VobSub จะสามารถอ่านไฟล์ Subtitles ที่ผ่านการย่อขนาดมาแสดงผลตอนดูหนังได้โดยตรง

4. กรณีแบ่งลง2แผ่นขึ้นไป ต้องมาตัดsubเองอีกที โดยใช้ฟังค์ชั่น Cutter 
4. Video Encoding 
1. ที่ tab “bitrate” > open เลือกไฟล์ DVD2AVI Project (.D2V) ที่เราทำไว้
- Resize Filter ให้เลือก Lancoszo
- Field Operation
NTSC
A. ถ้าเราทำ Inverse Telecine มาแล้ว (Framerate=23.976fps) ตั้งแต่ขั้นตอนการทำ DVD2AVI Project (เลือก Force Film) ให้เลือก None ครับ
B. ถ้าเราไม่ได้ทำ Inverse Telecine ใน DVD2AVI แต่เรามั่นใจว่า Source ของ Video มันมาจาก Film หนัง ให้เราเลือก Inverse Telecine
C. ถ้า Source ของ Video เป็น กล้องวิดีโอ (เช่น คอนเสิร์ต) ให้เลือก Field Deinterlace
PAL
A. ถ้า Source เป็น Film ให้เลือก Non
B. ถ้า Sorce เป็น กล้องวีดีโอให้เลือก Field Deinterlace

- กรณี Interlace ให้ Deinterlace ด้วย filter เช่น Tomsmocomp
เสร็จแล้วให้เลือก Save & Encode

2. เลือกชนิด Codec > XviD

3. เลือกขนาดรวมทั้งหมด ก็แล้วแต่ว่าจะเอาขนาดเท่าไหร่ 1CD, 2CD (ติ๊กSplit… ด้วย)

4. ในช่อง Audio ให้กดปุ่ม Select แล้วเลือกไฟล์ MP3 ที่ทำไว้ 
Audio A= trackที่1 B=trackที่2 ถ้าเอาภาษาเดียวที่B ให้แน่ใจว่าเป็น 0

5. ในช่อง Files อันนี้จะมีไว้สำหรับให้เราใส่ขนาดรวมของไฟล์อื่นๆ ที่เราจะ Write ลงไปใน CD ด้วย เช่น ไฟล์ Subtitles พวก Codec และโปรแกรม VobSub (ถ้าจะเอาพวกมันใส่ไปด้วยน่ะนะ) ในที่นี้ เราจะใส่แค่ไฟล์ Subtitle สองไฟล์ คือ __.rar (ถ้าไม่ย่อก็ .sub) และ __.idx เราสามารถคิดขนาดไฟล์บวกกันด้วยเครื่องคิดเลข แล้วนำผลบวกไปคีย์ใส่ในช่อง หรือให้ G-Knot มันบวกเลขให้เราก็ได้ วิธีหลังเราจะต้องเซ็ตค่าให้เป็น 0 ก่อน แล้วใช้ปุ่ม Add เลือกทีละไฟล์

6. ในช่อง Interleaving and AVI Overhead 
- ถ้า Audio คือ CBR MP3 เลือก No Audio
- ถ้าเป็น ABR MP3 หรือ VBR MP3 เลือก 1x vbr-mp3

7. ไปที่ Tab "Resolution" > เลือก Input Resolution ระหว่าง NTSC และ PAL > ตัดขอบภาพให้เหลือแต่ภาพ (Crop) ใช้แบบ Smart Crop > เลือก Resolution ตั้งค่าดังนี้
- ตั้ง W-Modul และ H-Modul เป็น 8
- ดูค่า Bits/(pixel*frame) ที่เหมาะสม จะอยู่ที่ประมาณ...ดังนี้
- 1 cd ให้ set bits/pixel*frame 0.17
- 2 cd ให้ set bits/pixel*frame 0.25 
- Aspect error ไม่เกิน 0.3 Doom9 บอกไม่ให้ต่ำกว่า 0.13
แต่ผมมักให้ได้ค่าประมาณ 640 * 480 
และต่อไปนี้อ่านกันให้ดีๆ ตั้งค่ากันดีๆนะครับ จุดสำคัญมาก 


Config XVID Encoder

8. tab Options > XviD setting ตั้งค่าดังนี้ ทั้ง first pass และ two pass ( ยกเว้น VHQ Mode: 4 - Wide Search ใน first pass ให้ set เป็น VHQ Mode: 1 - Decision ไม่งั้นจะใช้เวลามาก)
>> คุณภาพสูง Very High Bitrate (> 1500kps)
Ouant. Matrix: MPEG or High Quality Custom Matrix (e.g. HVS Best)
Adaptive Quant.: Off
Q-Pel: On
GMC: Off
BVOBs: Not Use
Motion Search Precision: 6 - Ultra High
VHQ Mode: 4 - Wide Search 
Chroma Motion: On
Trellis: Off

>> Medium-High Bitrate (> 900kps)
Ouant. Matrix: MPEG
Adaptive Quant.: Off
Q-Pel: On
GMC: Off
BVOBs (max consecutive frame : quant. ratio : quant. offeset): 1.0 : 1.5 : 0
Motion Search Precision: 6 - Ultra High
VHQ Mode: 4 - Wide Search 
Chroma Motion: On
Trellis: On

Low Bitrate (< 900kps)
Ouant. Matrix: H.263
Adaptive Quant.: On
Q-Pel: Off
GMC: Off
BVOBs (max consecutive frame : quant. ratio : quant. offeset): 2.0 : 1.5 : 1
Motion Search Precision: 6 - Ultra High
VHQ Mode: 4 - Wide Search 
Chroma Motion: On
Trellis: On
ค่าอื่นๆ ใช้ค่า deault ครับ
Note: การตั้งค่าXvid Creditคุณ Stoneroses ThaiDVD

9. tab Encoder > Add > Audio1 เลือกไฟล์ mp3 ที่เราทำไว้ และให้เลือก "Just Mux" เพื่อสั่งให้ Nandub ทำการ Multiplex ไฟล์เสียงเข้าไปใน AVI แบบตรงๆ ไม่ต้องประมวลผลใดๆ
Audio2 ก็ทำเหมือนกัน แต่ถ้ามี track เดียวให้เลือก Disable

10. ถ้าแน่ใจว่าทำหมดทุกขั้นตอนและถูกต้องแล้ว ก็ให้กด start encoding ได้เลย
รอ 5-10 ชม. เร็วช้าตาม Option ในการเลือกที่ Xvid, ความสั้นยาวของหนัง และ Spec.Com ไปนอนรอได้เลย และสามารถตั้งให้มัน shutdown เครื่องเองหลังencodeเสร็จได้ด้วย
G-Knot จะควบคุมการทำงานของโปรแกรมอื่นๆ ทั้งหมด ระหว่าง Encode จะเห็นหน้าต่างของ VirtualDub โผล่ขึ้นมา อย่าไปยุ่งกับมัน มันกำลังทำงานอย่างหนักอยู่ พอทำ First Pass มันก็จะต่อด้วย Second พอเสร็จไฟล์หนัง__.avi ไฟล์นี้จะมีแต่ภาพไม่มีเสียง และสุดท้าย G-Knot จะเปิดโปรแกรม NanDub เพื่อทำการ Mux เสียงลงไปในตัวหนัง (ราว 2 นาที) หลังจากนั้นคุณจะได้ไฟล์หนังที่สมบูรณ์ เอาไปเก็บรวมกับ Subtitles (__.idx และ __.sub (หรือ__.rar)) แล้วเปิดดูได้เลย ถ้าทุกอย่างไม่มีอะไรผิดพลาด เราก็ลบไฟล์ที่เกิดขึ้นระหว่างระหว่างขั้นตอนได้เลย (ควรตรวจสอบว่า OK แล้วจริงๆ ก่อนลบไฟล์อื่นๆ ทิ้งไม่งั้นดับอนาถ)

และขอขอบคุณแหล่งข้อมูลอีกครั้ง :
- StoneRoses และ pitiwat @ThaiDVD.net
- www.doom9.org
- www.xvid.org 
ปลีกย่อยเพิ่มเติมต่างๆจะเสนอในโอกาสต่อไป ดังนั้นถ้าสงสัยตรงไหนให้ถามมาหรือติดตามตอนต่อไป
หมายเหตุ : 
1. อาจมีข้อผิดพลาด ตกหล่น เพราะเขียนจากบทความ ไม่ได้ทำไปด้วย(เนื่องจากยังไม่รู้ว่าจะRipเรื่องไหน) และไม่ได้Ripมานานแล้ว อาจมีการเปลี่ยนแปลงแก้ไขเพิ่มเติมในภายหลัง
2. Software มีการ update ตลอด การตั้งค่าบางจุดอาจคลาดเคลื่อนไปบ้าง และควรอัพซะจะดียิ่ง หาได้ที่ไหนล่ะ ก็ Google ไงล่ะครับ
3. ทั้งหมดนี่เป็นแบบสรุปเท่านั้น ความจริงแล้วมีรายละเอียดและเหตุผลมากกว่านี้อีกเยอะมาก ไม่ได้ใส่มาด้วยครับ กลัวว่ามันจะทำให้งงซะเปล่าๆ เลยเอาแต่ขั้นตอนเพรียวๆเลย
4. อยากได้แบบไหนเพิ่มเติมก็ประยุกต์กันเอานะครับ 
ยาวสะใจมั๊ยครับพี่น้อง นี่ขนาดคร่าวๆ แถมมีแต่คำพูดไม่มีรูปประกอบก็ปาไป 5 หน้ากว่า สำหรับกระดาษA4
เปิดประเด็นวันแรกก็ซัดเลย ใครไม่มีความรู้ทางด้านนี้เลยรับรอง งง แน่ๆ 555 
อ่านแล้วก็Commentซะ 555
สำหรับผู้ที่จะเอาไปเผยแพร่ที่อื่นโปรดบอกที่ๆเอาไปปล่อยและลงCreditด้วยนะครับ

http://www.cutetyclub.net/board/index.php?/topic/15118-mini-hd-doraemon-the-movie-%E0%B9%82%E0%B8%99%E0%B8%9A%E0%B8%B4%E0%B8%95%E0%B8%B0%E0%B8%99%E0%B8%B1%E0%B8%81%E0%B8%9A%E0%B8%B8%E0%B8%81%E0%B9%80%E0%B8%9A%E0%B8%B4%E0%B8%81%E0%B8%AD%E0%B8%A7%E0%B8%81%E0%B8%B2%E0%B8%A8-720p-%E0%B8%9E%E0%B8%B2/page__st__40

วันพุธที่ 19 ตุลาคม พ.ศ. 2554

Php + Autoit3 ดึงข้อมูลจากหน้า Website ทั่วไป ไปเก็บลงใน Database

1. โหลด Autoit3 ก่อนที่ http://www.autoitscript.com/site/autoit/downloads/

2. เขียน Script ให้โหลดข้อมูลจากหน้า Web

 เปิดเว็บสำรวจก่อนทำ     เมื่อจะเริ่มเขียนโปรแกรมที่เกี่ยวข้องกับเว็บหรืออะไรอื่น ก็ต้องทำความเข้าใจในสิ่งที่เราจะเขียนเสียก่อน ลองเปิดเว็บ http://th.wikipedia.org ขึ้นมาดู ข้อความที่เราจะดึงออกมาคือคอลัมน์ คำที่เขียนถูก และ มักเขียนผิดเป็น


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


เริ่มเขียนสคริปต์ AutoIt ดึงข้อมูลจากเว็บ
    เริ่มแรกก็เขียนสคริปต์เปิดหน้าเว็บ ด้วยความที่ URL ค่อนข้างยาวผมจะใช้ตัว  & _ (Line Continuation) ในการเชื่อม URL ที่แยกไปแต่ละบรรทัด

#include <IE.au3>
$oIE = _IECreate ("http://th.wikipedia.org/wiki/"
& _
"%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%" & _
"8A%E0%B8%B7%E0%B9%88%E0%B8%AD" & _
"%E0%B8%84%E0%B8%B3%E0%B9%83%E0%B8%" & _
"99%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0" & _
"%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%" & _
"E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8" & _
"%B1%E0%B8%81%E0%B9%80%E0%B8%82%E0%B8%B5%" & _
"E0%B8%A2%E0%B8%99%E0%B8%9C%E0%B8%B4%E0%B8%94")

ตอนนี้ก็ได้สคริปต์เปิดหน้าเว็บมาแล้ว จากนั้นก็เขียนสคริปต์ต่อเพื่อตรวจดูว่าในเว็บมีตารางจำนวนกี่ตารางกันแน่ สรุปแล้วในหน้าเว็บมีตาราง 41 อัน (เริ่มต้นที่ 0)

#include <IE.au3>
$oIE = _IECreate ("http://th.wikipedia.org/wiki/" & _
"%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%" & _
"8A%E0%B8%B7%E0%B9%88%E0%B8%AD" & _
"%E0%B8%84%E0%B8%B3%E0%B9%83%E0%B8%" & _
"99%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0" & _
"%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%" & _
"E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8" & _
"%B1%E0%B8%81%E0%B9%80%E0%B8%82%E0%B8%B5%" & _
"E0%B8%A2%E0%B8%99%E0%B8%9C%E0%B8%B4%E0%B8%94")

  $oTable = _IETableGetCollection ($oIE)
  $iNumTables = @extended
MsgBox(0, "Table Info", "There are " & $iNumTables & " tables on the page")


     ลองใช้คำสั่งดึงเอาตารางแต่ละอันมาดู และเนื่องจากคำสั่ง _IETableGetCollection  จะดึงเอาข้อมูลไปเก็บไว้ในอาเรย์อัตโนมัติ จึงต้องเพิ่มคำสั่ง #include <Array.au3> เข้ามาด้วย เพื่อใช้คำสั่ง  _ArrayDisplay ในการแสดงข้อมูลในอาเรย์ จากนั้นก็ไล่ดูทีละตารางว่ามีข้อมูลอะไรอยู่


#include <IE.au3>
#include <Array.au3>
$oIE = _IECreate ("http://th.wikipedia.org/wiki/" & _
"%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%" & _
"8A%E0%B8%B7%E0%B9%88%E0%B8%AD" & _
"%E0%B8%84%E0%B8%B3%E0%B9%83%E0%B8%" & _
"99%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0" & _
"%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%" & _
"E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8" & _
"%B1%E0%B8%81%E0%B9%80%E0%B8%82%E0%B8%B5%" & _
"E0%B8%A2%E0%B8%99%E0%B8%9C%E0%B8%B4%E0%B8%94")

  $oTable = _IETableGetCollection ($oIE,1)
    $aTable = _IETableWriteToArray ($oTable, True)
    _ArrayDisplay(  $aTable)


   ไล่ดูแล้วปรากฏว่าตารางแรกไม่ต้องดึงออกมา และตารางสุดท้ายก็ไม่จำเป็น สรุปแล้วเราจะดึงเอาข้อมูลจากตาราง 1 ถึง 39 เท่านั้น ทดลองเขียนคำสั่งดึงเอาตาราง 1 ถึง 39 ออกมาได้ดังนี้

#include <IE.au3>
#include <Array.au3>
$oIE = _IECreate("http://th.wikipedia.org/wiki/" & _
        "%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%" & _
        "8A%E0%B8%B7%E0%B9%88%E0%B8%AD" & _
        "%E0%B8%84%E0%B8%B3%E0%B9%83%E0%B8%" & _
        "99%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0" & _
        "%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%" & _
        "E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8" & _
        "%B1%E0%B8%81%E0%B9%80%E0%B8%82%E0%B8%B5%" & _
        "E0%B8%A2%E0%B8%99%E0%B8%9C%E0%B8%B4%E0%B8%94")

For $i = 1 To 39
    $oTable = _IETableGetCollection($oIE, $i)
    $aTable = _IETableWriteToArray($oTable, True)
    _ArrayDisplay($aTable)
Next


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



#include <IE.au3>
#include <Array.au3>
$oIE = _IECreate("http://th.wikipedia.org/wiki/" & _
        "%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%" & _
        "8A%E0%B8%B7%E0%B9%88%E0%B8%AD" & _
        "%E0%B8%84%E0%B8%B3%E0%B9%83%E0%B8%" & _
        "99%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0" & _
        "%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%" & _
        "E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8" & _
        "%B1%E0%B8%81%E0%B9%80%E0%B8%82%E0%B8%B5%" & _
        "E0%B8%A2%E0%B8%99%E0%B8%9C%E0%B8%B4%E0%B8%94")

For $i = 1 To 39
    $oTable = _IETableGetCollection($oIE, $i)
    $aTable = _IETableWriteToArray($oTable, True)
    _ArrayDelete($aTable, 0)
    _ArrayDisplay($aTable)
Next


     ปัญหาถัดมาคือคอลัมน์ที่ 3 ซึ่งเป็นคอลัมน์ที่แสดง หมายเหตุ วิธีการแก้ไขปัญหาตรงนี้ก็ง่ายๆ เลยคือ สร้างตัวแปรแบบอาเรย์ที่เก็บค่าได้แค่ 2 คอลัมน์ โดยใช้คำสั่ง Dim $tb[1][2] เพื่อนำเอาข้อมูลคอลัมน์แรกและคอลัมน์ที่สองใส่ไปเท่านั้น ปัญหาสุดท้ายก็คือเราจะเอาตารางทั้งหมดมารวมกันเป็นตารางเดียวได้อย่างไร วิธีแก้ไขปัญหาก็อาศัยตัวแปรแบบอาเรย์ที่เราสร้างขึ้นมานั่นเอง โดยเอาค่าตารางที่ได้แต่ละอันจับมาใส่ในตัวแปรแบบอาเรย์นั้นครับ เพื่อให้เข้าใจยิ่งขึ้นต้องเขียนโค้ดแยกออกมาต่างหาก จะได้ดังนี้

For $i = 0 To UBound($aTable) - 1
        ReDim $tb[UBound($tb) + 1][2]
        $tb[UBound($tb, 1) - 1][0] = $aTable[$i][0]
        $tb[UBound($tb, 1) - 1][1] = $aTable[$i][1]
    Next


     ผมจะใช้คำสั่ง for ในการวนลูป แต่จำนวนการวนแต่ละลูปจะไม่เท่ากันเพราะจะอ้างอิงขนาดข้อมูลในตารางจึงต้องใช้คำสั่ง UBound มานับข้อมูลในตาราง แต่จะติดปัญหานิดหนึ่งคือมันจะข้อมูลเป็นจำนวนไม่ใช่แถวที่อ้างอิงในอาเรย์ดังนั้นต้องใส่ –1 ต่อลงไป เพราะแถวข้อมูลในอาเรย์จะเริ่มต้นที่แถว 0 นั่นเอง

เสร็จแล้วก็เปลี่ยนขนาดของอาเรย์เดิมโดยใช้คำสั่ง ReDim คือ
    ReDim $tb[UBound($tb) + 1][2]

เพื่อปรับขนาดของอาเรย์ให้เท่ากับจำนวนข้อมูลในตาราง หลักการคือบวกเพิ่มแถวเก็บข้อมูลอาเรย์ทุกครั้งที่มีการวนลูป อีกสองแถวถัดมาคือ

        $tb[UBound($tb, 1) - 1][0] = $aTable[$i][0]
        $tb[UBound($tb, 1) - 1][1] = $aTable[$i][1] 


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

tbsum($tb, $aTable) ส่วนหัวฟังก์ชันก็จะได้ดังนี้ (ชื่อตัวแปรไม่จำเป็นต้องเขียนเหมือนตัวแปรที่ส่งเข้าไป แต่เพื่อให้เข้าใจง่ายผมจะเขียนชื่อเหมือนเดิม)

Func tbsum(ByRef $tb,$aTable)

เมื่อนำมาแก้ไขก็จะได้ดังนี้ (ลองเอาไปรันดู)

#include <IE.au3>
#include <Array.au3>
$oIE = _IECreate("http://th.wikipedia.org/wiki/" & _
        "%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%" & _
        "8A%E0%B8%B7%E0%B9%88%E0%B8%AD" & _
        "%E0%B8%84%E0%B8%B3%E0%B9%83%E0%B8%" & _
        "99%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0" & _
        "%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%" & _
        "E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8" & _
        "%B1%E0%B8%81%E0%B9%80%E0%B8%82%E0%B8%B5%" & _
        "E0%B8%A2%E0%B8%99%E0%B8%9C%E0%B8%B4%E0%B8%94")

Dim $tb[1][2]
For $i = 1 To 39
    $oTable = _IETableGetCollection($oIE, $i)
    $aTable = _IETableWriteToArray($oTable, True)
    _ArrayDelete($aTable, 0)
    tbsum($tb, $aTable)
Next

    _ArrayDelete($aTable, 0)
_ArrayDisplay($tb)
Func tbsum(ByRef $tb,$aTable)
    For $i = 0 To UBound($aTable) - 1
        ReDim $tb[UBound($tb) + 1][2]
        $tb[UBound($tb, 1) - 1][0] = $aTable[$i][0]
        $tb[UBound($tb, 1) - 1][1] = $aTable[$i][1]
    Next
EndFunc


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

 $file = FileOpen("test.txt", 2)


For $i = 0 To UBound($tb) - 1
FileWriteLine($file, "ลำดับที่:"&$i+1&$tb[$i][1]&" คำที่เขียนถูกคือ "&$tb[$i][0] & @CRLF)
Next


FileClose($file)
Run("notepad.exe test.txt")

สคริปต์โปรแกรมเมื่อทำเสร็จสิ้นแล้วก็จะได้ดังตัวอย่างนี้ด้านล่างนี้ครับ



#include <IE.au3>
#include <Array.au3>


$oIE = _IECreate("http://th.wikipedia.org/wiki/" & _
        "%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%" & _
        "8A%E0%B8%B7%E0%B9%88%E0%B8%AD" & _
        "%E0%B8%84%E0%B8%B3%E0%B9%83%E0%B8%" & _
        "99%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0" & _
        "%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%" & _
        "E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8" & _
        "%B1%E0%B8%81%E0%B9%80%E0%B8%82%E0%B8%B5%" & _
        "E0%B8%A2%E0%B8%99%E0%B8%9C%E0%B8%B4%E0%B8%94")

Dim $tb[1][2]
For $i = 1 To 39
    $oTable = _IETableGetCollection($oIE, $i)
    $aTable = _IETableWriteToArray($oTable, True)
    _ArrayDelete($aTable, 0)
    tbsum($tb, $aTable)
Next
_ArrayDelete($tb, 0)

$file = FileOpen("test.txt", 2)
For $i = 0 To UBound($tb) - 1
FileWriteLine($file, "ลำดับที่:"&$i+1&$tb[$i][1]&" คำที่เขียนถูกคือ  "&$tb[$i][0] & @CRLF)
Next
FileClose($file)
Run("notepad.exe test.txt")

Func tbsum(ByRef $tb, $aTable)
    For $i = 0 To UBound($aTable) - 1
        ReDim $tb[UBound($tb) + 1][2]
        $tb[UBound($tb, 1) - 1][0] = $aTable[$i][0]
        $tb[UBound($tb, 1) - 1][1] = $aTable[$i][1]
    Next
EndFunc


// ไฟล์ที่ใช้งานจริง

#include <IE.au3>
#include <Array.au3>

$oIE = _IECreate("c:\wlevel.htm")
Dim $tb[1][2]
For $i = 1 To 4
    $oTable = _IETableGetCollection($oIE, $i)
    $aTable = _IETableWriteToArray($oTable, True)
    _ArrayDelete($aTable, 0)
    tbsum($tb, $aTable)
Next
_ArrayDelete($tb, 0)
$file = FileOpen("test.txt", 2)
For $i = 0 To UBound($tb) - 1
FileWriteLine($file, &$tb[$i][1] @CRLF)
Next
FileClose($file)
_IEQuit($oIE)
Func tbsum(ByRef $tb, $aTable)
    For $i = 0 To UBound($aTable) - 1
        ReDim $tb[UBound($tb) + 1][2]
        $tb[UBound($tb, 1) - 1][0] = $aTable[$i][0]
  $tb[UBound($tb, 1) - 1][1] = $aTable[$i][1]
     
    Next
EndFunc



** เสร็จแล้ว Compile ให้เป็น exe file
ทดลอง Run ดูจะได้ text file ผลลัพธ์ดังนี้


3. สร้างไฟล์ PHP สำหรับดึงข้อมูลไปใช้งาน
<?php
$cmd = 'C:\AppServ\www\sk_forebay\headlevel.exe'; //บอกที่อยู่ไฟล์ exe ที่ comfile จาก autoit
exec($cmd); //run file ที่ comfile จาก autoit
// ข้อมูลที่ได้จากการใช้ Function file() จะได้ออกมาเป็น Array แต่ละบัีนทัดข้อมูลที่เก็บใน File คือ 1 ค่า index ของ Array
$data=file("C:/AppServ/www/sk_forebay/test.txt"); 
//for($i=0;$i<count($data);$i++){  // วนรอบเพื่อแสดงผลขอ้มูล
//echo $data[1]."<br>";
//}
//แยกวัน-เวลา
 $myhead = substr($data[0],0,6);
 $myyear = substr($data[1],0,4);
 $mymonth = substr($data[1],4,2);
 $mydate = substr($data[1],6,2);
 $myhour = substr($data[1],9,2);
 $myminute = substr($data[1],11,2);
  $mysec = substr($data[1],13,2);
  $mydate =  $myyear."-".$mymonth."-".$mydate." ".$myhour.":".$myminute.":".$mysec;
  echo "วันเวลา = ".$mydate." ข้อมูลระดับน้ำ  = ".$myhead." เมตร รทก.";
?>

............................. function _IETagnameGetCollection------

#include <IE.au3>

$oIE = _IECreate("http://www.facebook.com")
_IELoadWait($oIE)
$oDiv = _IEGetObjById($oIE, 'contentArea')
$oLinks = _IETagnameGetCollection($oDiv, "span");ถ้าไม่ได้ลองเปลี่ยนจาก span เป็น div หรือ button
For $oLink In $oLinks
$text = $oLink.innerText
If StringInStr($Text, "ถูกใจ") Then
_IEAction($oLink, "click")
MsgBox(0,"คลิกถูกใจ",$text )
Sleep(100)
EndIf
Next


----


$oInputs = _IETagNameGetCollection($oIE, "input"); Input Fields For $oInput In $oInputs     If $oInput.name = "RITD_NAME" Then $oInput.Value = "COMPANY NAME - PolType"     If $oInput.name = "CONTENT.POLEFFDATEmin"  Then $oInput.Value = "01/01/2003"     If $oInput.name = "CONTENT.POLEFFDATEmax"  Then $oInput.Value = "01/01/2008"     If $oInput.name = "RITD_NOTIFYIND" Then $oInput.Checked = False     If $oInput.name = "CONTENT.GP_FINANCIAL_SLRmin" Then $oInput.Value = "1"     If $oInput.name = "OPTIONS.RPTTITLE" Then $oInput.Value = "COMPANY NAME"     If $oInput.name = "OPTIONS.TXTTRLR" Then $oInput.Checked = False Next


--


$oInputs = _IETagNameGetCollection($oIE, "span") ; @extended would be 38 at this point     For $oInput in $oInputs         If $oInput.id = 0 Then             $oInput.Click; Clicks the first 'span' then exits the For loop             ExitLoop         EndIf     Next


If String(_IEPropertyGet($oInput, "innerText")) = "Submit" Then

ตัวอย่างทำสั่งทั้งหมดของ autoit
http://www.autoitscript.com/autoit3/docs/libfunctions/