φυβλαςのβλογ
บล็อกของ phyblas



สร้างบอตด้วย pyautogui
เขียนเมื่อ 2017/01/01 01:28
pyautogui เป็นมอดูลสำหรับใช้ควบคุมเมาส์และคีย์บอร์ดซึ่งเขียนด้วยภาษาไพธอน

เราสามารถใช้เพื่อสั่งให้เครื่องคอมทำอะไรต่างๆเองตามที่เราเขียนโปรแกรมไว้ได้ เหมือนเป็นการสร้างบอตขึ้นมาช่วยทำงานแทนเรา



การติดตั้ง และเริ่มใช้งาน
สามารถติดตั้งได้ง่ายดายโดยใช้ pip สำหรับ windows นั้นสามารถลง pyautogui ได้ทันที
pip install pyautogui

แต่สำหรับ mac นั้นจะต้องลงอย่างอื่นก่อน ตามนี้
pip install pyobjc-core
pip install pyobjc
pip install pyautogui

หลังลงเสร็จแล้วพอต้องการใช้ก็ import ตามปกติ
import pyautogui

เนื่องจากชื่อยาวอาจเป็นการดีที่จะย่อมันสักหน่อยเวลาใช้ อย่างไรก็ตามตัวอย่างส่วนใหญ่ที่เจอก็ใช้เต็มไม่ได้ย่อดังนั้นในที่นี้ก็จะเขียนเต็มๆตามนั้น





การคลิกเมาส์
เริ่มลองจากคำสั่งแรกคือ click

แค่ลองพิมพ์ไปว่า
pyautogui.click()

พอรันโค้ดเมาส์ก็จะถูกคลิกตรงตำแหน่งที่วางอยู่ทันที

แต่หากต้องการระบุว่าจะคลิกตรงไหนก็ให้ใส่พิกัดตำแหน่งลงไปด้วย โดยค่าที่ใส่คือค่าตำแหน่งนับจากบนซ้ายสุด โดยหน่วยเป็นพิกเซล เช่น
pyautogui.click(500,400)

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

เพียงแต่การที่จะใช้วิธีนี้ได้เราจะต้องรู้ว่าสิ่งที่ต้องการคลิกอยู่ตรงไหน เพื่อที่จะรู้ได้มีคำสั่งที่สะดวกมากอยู่ นั่นก็คือ position

แค่พิมพ์ว่า
print(pyautogui.position()) # ได้ (346,551)

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

นอกจากนี้หากอยากรู้ว่าจอเรากว้างเท่าไหร่ก็ใช้คำสั่ง size ได้ จะคืนค่าขนาดของจอออกมา เช่น
print(pyautogui.size()) # ได้ (1280,800)



การคลิกเมาส์หลายครั้ง
ปกติคำสั่ง click จะทำการคลิกเมาส์แค่ครั้งเดียว แต่หากต้องการคลิกหลายครั้งก็ทำได้ง่ายโดยเพิ่มอาร์กิวเมนต์ตัวที่ ๓ เข้าไป เป็นจำนวนครั้ง เช่น ถ้าต้องการให้คลิก ๓ ครั้งก็
pyautogui.click(100,200,3)

หรือถ้าจะไม่ระบุตำแหน่งก็ใส่ในรูปคีย์เวิร์ด clicks ได้
pyautogui.click(clicks=3)

ปกติแล้วเมาส์จะคลิกกดอย่างต่อเนื่องในพริบตา แต่หากต้องการให้เว้นช่วงก็ทำได้โดยเพิ่มคียเวิร์ด interval ลงไป โดยใส่ระยะเวลาที่ต้องการเว้นเป็นหน่วยวินาที
pyautogui.click(700,300,7,interval=0.5)

แบบนี้ก็จะเป็นการคลิก ๗ ครั้งโดยเว้นระยะห่างครั้งละครึ่งวินาที

นอกจากนี้กรณีคลิก ๒ หรือ ๓ ครั้งมีคำสั่งที่อาจใช้แทนได้อีก นั่นคือ doubleClick สำหรับคลิก ๒ ครั้ง และ tripleClick สำหรับคลิก ๓ ครั้ง

เช่น
pyautogui.doubleClick(150,240)
pyautogui.tripleClick(250,300)



การคลิกขวาและคลิกกลาง
คำสั่ง click (รวมถึง doubleClick, tripleClick) ปกติจะเป็นการคลิกซ้าย แต่หากต้องการให้เป็นการคลิกขวาหรือคลิกกลางก็สามารถทำได้โดยเพิ่มคีย์เวิร์ด button

หากต้องการคลิกกลางให้ใส่ค่าเป็น middle หรือ 2

หากต้องการคลิกขวาให้ใส่ค่าเป็น right หรือ 3

ส่วนคลิกซ้ายนั้นที่จริงไม่ต้องใส่ก็ไดด้แต่ถ้าจะใส่ก็ใส่เป็น left หรือ 1

ตัวอย่างเช่น
pyautogui.click(500,100,button=3)

แบบนี้ก็จะเป็นการคลิกขวา

นอกจากนี้ยังมีคำสั่งเฉพาะสำหรับคลิกขวาด้วย คือ rightClick และคำสั่งสำหรับคลิกกลางคือ middleClick เช่น หากพิมพ์
pyautogui.rightClick(500,100)

ก็จะให้ผลเหมือนกับที่ใช้ button=3

เพียงแต่ว่าคำสั่ง rightClick กับ middleClick จะกำหนดจำนวนครั้งที่คลิกไม่ได้ ปกติจะใช้คลิกครั้งเดียว



การเลื่อนเมาส์
คำสั่งที่ใช้เลื่อนเมาส์ให้ไปยังจุดที่ต้องการคือ moveTo โดยใส่ตำแหน่งจุดที่ต้องการให้เมาส์ย้ายไป
pyautogui.moveTo(640,400)

เมาส์จะย้ายไปตำแหน่งที่ระบุทันที

แต่หากต้องการให้เมาส์ย้ายโดยกำหนดตำแหน่งเมื่อเทียบกับตำแหน่งปัจจุบันให้ใช้คำสั่ง moveRel เช่น
pyautogui.moveRel(100,-100)

เมาส์จะเลื่อนไปทางขวาบนเทียบกับตำแหน่งเดิม

หากไม่ต้องการให้เมาส์ย้ายไปตรงนั้นทันทีแต่ต้องการให้รอเวลาสักหน่อยก็ทำได้โดยใส่อาร์กิวเมนต์ตัวที่ ๓ ลงไปเป็นค่าระยะเวลา เช่น
pyautogui.moveRel(500,-500,3)

แบบนี้เมาส์ก็จะค่อยๆเคลื่อนไปโดยใช้เวลา ๓ วินาที



การกดเมาส์ค้างและลาก
ปกติเวลาใช้คำสั่ง click คือการคลิกเมาส์นั่นคือการกดเมาส์แล้วตามด้วยปล่อยเมาส์ทันที แต่หากต้องการแค่กดเมาส์ลงโดยไม่ปล่อยเมาส์ก็ใช้คำสั่ง mouseDown และหากต้องการปล่อยเมาส์ก็ใช้คำสั่ง mouseUp

ตัวอย่างเช่นหากสั่งแบบนี้ก็จะเป็นการกดเมาส์แล้วปล่อยทันที เท่ากับการใช้คำสั่ง click ทีเดียว
pyautogui.mouseDown()
pyautogui.mouseUp()

ทั้งสองคำสั่งก็สามารถระบุตำแหน่งพิกัดได้เช่นเดียวกับ click เช่นหากต้องการให้เมาส์ลากจากจุดหนึ่งไปอีกจุดหนึ่งก็ พิมพ์เป็น
pyautogui.mouseDown(215, 186)
pyautogui.mouseUp(188, 343)

สำหรับการลากเมาส์นั้นยังอาจใช้อีกคำสั่งซึ่งสะดวกกว่า นั่นคือ dragTo คำสั่งนี้จะทำการลากเมาส์จากจุดที่เมาส์อยุ่ตอนแรกไปยังจุดที่ระบุ

หากลองพิมพ์
pyautogui.moveTo(215, 186)
pyautogui.dragTo(188, 343)

ก็จะให้ผลเหมือนกับที่ใช้ mouseDown และ mouseUp

นอกจากนี้ยังมีคำสั่ง dragRel ซึ่งเอาไว้เลื่อนในตำแหน่งที่สัมพัทธ์กับตำแหน่งเดิม

เช่น ให้เลื่อนไปทางขวาล่างร้อยพิกเซล
pyautogui.dragRel(100,100)

ทั้ง mouseDown, mouseUp, dragTo และ dragRel ต่างก็สามารถใช้กับเมาส์กลางและเมาส์ขวาได้โดยกำหนดคีย์เวิร์ด button

dragTo และ dragRel สามารถกำหนดระยะเวลาลากได้ด้วยการใส่อาร์กิวเมนต์ตัวที่ ๓ ลงไปเป็นระยะเวลาเช่นเดียวกับใน moveTo และ moveRel

เช่นลองให้ค่อยๆลากไปโดยใช้เวลา ๒ วินาที
pyautogui.dragRel(100,100,2)



การหมุนลูกเลื่อนเมาส์
หากต้องการหมุนลูกเลื่อนเมาส์ก็ใช้คำสั่ง scroll โดยต้องใส่ค่าปริมาณการหมุนลงไป โดยถ้าค่าบวกเป็นการหมุนขึ้นบน ค่าถ้าลบเป็นการหมุนลงข้างล่าง เช่น
pyautogui.scroll(-10)

แบบนี้จะเป็นการหมุนลงข้างล่าง

สำหรับใน mac สามารถหมุนลูกเลื่อนในแนวนอนได้ด้วย จะสามารถใช้คำสั่ง hscroll เพื่อหมุนแนวนอนได้ เช่น
pyautogui.hscroll(10)





การพิมพ์ตัวอักษรบนคีย์บอร์ด
คำสั่งสำหรับพิมพ์ตัวอักษรจากคีย์บอร์ดเสมือนกับว่าเรากำลังเอามือกดแป้นพิมพ์อยู่ก็คือ typewrite การใช้ก็แค่ใส่ข้อความที่ต้องการพิมพ์ลงไป เช่น
pyautogui.typewrite('sawatdi')

เพียงแต่ต้องระวังว่าตัวที่ใส่ต้องเป็นอักษรที่อยู่บนแป้นคีย์บอร์ดภาษาอังกฤษเท่านั้น คำสั่งนี้แค่เป็นตัวสั่งให้กดแป้นคีย์บอร์ดแป้นนั้น หากต้องการพิมพ์ภาษาอื่นก็ต้องเทียบตำแหน่งแป้นพิมพ์เอา

ดังนั้นหากต้องการพิมพ์คำว่า "สวัสดี" ก็ให้ตั้งคีย์บอร์ดเป็นภาษาไทยไว้แล้วพิมพ์ว่า
pyautogui.typewrite('l;ylfu')

หากต้องการให้เว้นระยะเวลาในการพิมพ์แต่ละตัวก็ให้ใส่คีย์เวิร์ด interval เพิ่มเข้าไป เช่น
pyautogui.typewrite('l;ylfu',interval=0.1)

ในการใส่อักษรจะใส่ในรูปของลิสต์ทีละตัวอักษรก็ทำได้เช่นกัน
pyautogui.typewrite(['l',';','y','l','f','u'])



การสั่งให้กดปุ่ม
นอกจากปุ่มบนแป้นพิมพ์ที่เป็นตัวอักษรแล้วยังสามารถสั่งพวกปุ่มคำสั่งต่างๆบนแป้นพิมพ์ได้ด้วย เช่น
pyautogui.typewrite(['enter'])

แบบนี้จะเป็นการกด enter

เพียงแต่ว่าต้องเขียนในรูปของลิสต์ ถ้าใส่เป็น
pyautogui.typewrite('enter')

แบบนี้จะกลายเป็นเราสั่งให้พิมพ์คำว่า enter แบบนี้ไม่มีความหมาย

นอกจากนี้ยังมีอีกคำสั่งที่ใช้สั่งให้กดปุ่มได้เช่นกัน คือ press ถ้าต้องการให้กด enter ก็แค่พิมพ์
pyautogui.press('enter')

หากอยากรู้ว่าปุ่มไหนใช้ได้สามารถดูได้ที่ค่าแอตทริบิวต์ KEYBOARD_KEYS
print(pyautogui.KEYBOARD_KEYS)

เท่านี้ปุ่มทั้งหมดที่ใช้ได้ก็จะแสดงออกมา
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']

หากต้องการกดหลายปุ่มต่อๆกันไปก็ใส่ในรูปของลิสต์ กรณีนี้จะใช้ press หรือ typewrite ก็เหมือนกัน
pyautogui.press(['enter','left'])
# หรือ pyautogui.typewrite(['enter','left'])

แต่ press สามารถสั่งให้กดปุ่มเดิมซ้ำหลายครั้งได้ เช่น
pyautogui.press('enter',4)
# เท่ากับ pyautogui.typewrite(['enter','enter','enter','enter'])

จะให้วนซ้ำเป็นชุดหลายตัวก็ได้
pyautogui.press(['left','right'],40)

press สามารถใส่คีย์เวิร์ด interval ได้เช่นเดียวกัน แต่ความหมายจะต่างจากใช้กับ typewrite คือจะเป็นการเว้นช่วงในแต่ละรอบที่มีการซ้ำ ไม่ใช่การเว้นระหว่างแต่ละคีย์ในรอบ

เช่น ลองให้พิมพ์แล้วลบ สลับไปเรื่อยๆ
pyautogui.press(['o','k','backspace','backspace'],20,interval=0.3)



การกดปุ่มค้างไว้และการใช้ฮ็อตคีย์
เวลาใช้ press จะเป็นการกดปุ่มแล้วปล่อยทันที แต่หากต้องการแค่ให้กดปุ่มแช่ไว้ก็จะใช้คำสั่ง keyDown

จากนั้นเมื่อต้องการให้ปล่อยปุ่มก็ใช้คำสั่ง keyUp

ตัวอย่างเช่น ลองให้เขียนตัวอักษรขึ้นมาแล้วลากคลุมให้หมด
pyautogui.typewrite('12345')
pyautogui.keyDown('shift')
pyautogui.press('left',5)
pyautogui.keyUp('shift')

หรือกรณีที่จะใช้ฮ็อตคีย์ เช่น ctrl-a (ใน mac เป็น command-a) คือการลากคลุมอักษรทั้งหมด ก็กดแบบนี้
pyautogui.keyDown('ctrl')
pyautogui.press('a')
pyautogui.keyUp('ctrl')

การเขียนแบบนี้ออกจะดูยุ่งยากเล็กน้อย ที่จริงแล้วมีคำสั่งที่ช่วยให้ทำแบบนี้ได้ง่ายกว่า นั่นคือใช้คำสั่ง hotkey

เช่น สามบรรทัดนั้นอาจเขียนแทนด้วย
pyautogui.hotkey('ctrl','a')
# สำหรับ mac จะเป็น pyautogui.hotkey('command','a')

แบบนี้ก็เท่ากับการกดปุ่ม ctrl แล้วค่อยกด a จากนั้นก็ค่อยปล่อย ctrl อีกที

จะใส่ทีกี่ตัวก็ได้ เช่น ๓ ตัว
pyautogui.hotkey('ctrl','alt','del')



การหน่วงเวลา
ปกติถ้าเราเขียนคำสั่งต่อเนื่องเวลารันแล้วคำสั่งจะถูกทำต่อเนื่องไปทันที แต่ถ้าหากหน่วงเวลาให้มีการเว้นช่วงก็สามารถทำได้โดยใช้คำสั่ง sleep จากมอดูล time

เช่น
import time
pyautogui.click(200,200)
time.sleep(1)
pyautogui.click(400,300)

แบบนี้จะเป็นการหยุด ๑ วินาทีหลังคำสั่งแรก

หรืออีกวิธีหนึ่งที่น่าจะง่ายกว่าก็คือการเพิ่มคีย์เวิร์ด pause ลงไปในฟังก์ชัน ก็จะเป็นการหยุดหลังจากทำคำสั่งเสร็จตามเวลาที่กำหนด เช่น
pyautogui.moveRel(50,-50,pause=1)
pyautogui.moveRel(60,100)

ทุกคำสั่งของ pyautogui สามารถใส่ pause ลงไปได้หมด

นอกจากนี้สำหรับบางฟังก์ชัน เช่น click หรือ press ก็มีอีกวิธีหนึ่งก็คือใส่ interval ก็จะให้ผลเหมือนกับใส่ pause
pyautogui.click(200,200,interval=1)
pyautogui.click(400,300)

เพราะปกติ interval ใช้กำหนดช่วงเวลาที่รอระหว่างการคลิกแต่ละครั้ง ถ้าคลิกครั้งเดียวก็จะเป็นการรอเพื่อเว้นช่วงระหว่างการทำคำสั่งต่อไป

ถ้าหากใส่ทั้ง interval ทั้ง pause ระยะเวลาที่รอก็จะบวกกันไป

และนอกจากนี้แล้ว หากต้องการให้มีการหน่วงเวลาเหมือนกันหมดไม่ว่าจะทำคำสั่งอะไรก็ให้ไปแก้ค่าแอตทริบิวต์ PAUSE ของมอดูลเอาไว้ก่อนเริ่มใช้คำสั่ง เช่นทำแบบนี้
pyautogui.PAUSE = 0.5

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

เพียงแต่ว่าหากคำสั่งไหนใส่คีย์เวิร์ด pause ลงไปก็จะเว้นระยะเวลาหยุดตามที่ใส่ลงไปนั้นแทน



การหยุดฉุกเฉิน
ระหว่างที่สั่งให้มันทำงานไปเรื่อยๆนั้นปกติโปรแกรมจะไม่สามารถหยุดเองได้จนกว่าจะสิ้นสุดการทำงาน หรือเกิดข้อผิดพลาดขึ้นกลางคัน

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

การหยุดกลางคันสามารถทำได้โดยเลื่อนเมาส์ไปยังมุมซ้ายบนสุดของหน้าจอ เท่านี้การทำงานทั้งหมดก็จะหยุด

แต่บางครั้งเราอาจไม่ต้องการ เช่นกลัวจะเผลอเลื่อนเมาส์ไปตรงนั้นระหว่างกำลังทำงานอยู่โดยไม่ได้ตั้งใจ ในกรณีแบบนั้นก็สามารถยกเลิกการใช้วิธีการหยุดฉุกเฉินนี้ได้โดยพิมพ์
pyautogui.FAILSAFE = 0
# หรือ pyautogui.FAILSAFE = False

เท่านี้ก็จะไม่มีทางหยุดการทำงานได้กลางคันแล้ว (ค่าตั้งต้นจะเป็น True)

แต่นอกจากนี้ก็ยังมีวิธีอื่นในการหยุดอยู่อีก คือไปกลับยังคอมมานด์ไลน์ที่ใช้ตอนสั่งรันโปรแกรม แล้วสั่งหยุดโปรแกรมด้วย ctrl-c ตามปกติ แบบนี้ก็ได้เช่นกัน



การบันทึกภาพหน้าจอ
pyautogui นั้นนอกจากจะใช้ควบคุมเมาส์และคีย์บอร์ดแล้วก็ยังมีคำสั่งที่เกี่ยวกับการจัดการภาพที่แสดงบนหน้าจอด้วย

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

คำสั่งสำหรับบันทึกภาพหน้าจอก็คือ screenshot

ตัวอย่างการใช้
pyautogui.screenshot('ss.png')

เพียงแค่นี้ภาพก็จะถูกบันทึกอยู่ในไฟล์ชื่อ ss.png

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

เช่น
pyautogui.screenshot('ss.png',region=(0,0,100,100))
# หรือ pyautogui.screenshot('ss.png',(0,0,100,100))

แบบนี้ภาพก็จะตัดแค่ส่วนมุมบนซ้ายสุดขนาดกว้างร้อยสูงร้อย



การเอาข้อมูลสีของภาพบนหน้าจอ
หากไม่ต้องการให้เซฟภาพก็แค่ใส่คีย์เวิร์ด region ไปโดยไม่ต้องใส่อาร์กิวเมนต์ตัวแรกเป็นชื่อไฟล์ลงไป

เช่น
print(pyautogui.screenshot(region=(0,0,100,100)))

ได้
<PIL.Image._ImageCrop image mode=RGB size=100x100 at 0x9181B38>

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

วิธีการนำไปใช้อาจมีอยู่หลากหลาย แต่ในที่นี่จะใช้วิธีการแปลงเป็นอาเรย์ของ numpy เพื่อนำไปใช้

เช่น
import numpy as np
ss = pyautogui.screenshot(region=(86,32,2,3))
ss = np.array(ss)
print(ss)
print(ss.shape)

ได้
[[[219 144  58]
  [  0 102 182]]

 [[144  58   0]
  [102 182 255]]

 [[ 58   0 102]
  [182 255 255]]

 [[  0 102 182]
  [255 255 255]]]
(3, 2, 3)

พอแปลงเป็นอาเรย์แบบนี้แล้วก็จะได้อาเรย์สามมิติที่มีขนาดเป็น (ความสูง,ความกว้าง,3) โดยมิติสุดท้ายที่เพิ่มเข้ามาคือค่าสี (แดง,เขียว,น้ำเงิน) จะมี ๓ ค่าเสมอ

หรือหากต้องการภาพแค่จุดเดียวอาจใช้คำสั่ง pixel ก็ได้ โดยใส่ตำแหน่งของจุดที่ต้องการหาค่าสีลงไป เช่น
pyautogui.pixel(555,555) # ได้ (240, 240, 240)

ถ้าต้องการหาสีตำแหน่งที่เมาส์ชี้อยู่ก็อาจเขียนแบบนี้
pyautogui.pixel(*pyautogui.position()) # ได้ (219, 213, 58)

หากแค่ต้องการเทียบว่าสีของจุดนั้นๆตรงกับค่าที่ต้องการหรือไม่ก็อาจใช้คำสั่ง pixelMatchesColor
print(pyautogui.pixelMatchesColor(300,300,(248,248,248)))

จะได้ค่า Trur หรือ False ออกมา

เทียบเท่ากับการพิมพ์ว่า
print(pyautogui.pixel(300,300)==(248,248,248))



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

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



ลองหาค่าสีของไอคอนโดยใช้ screenshot เอาค่าสีในตำแหน่งไอคอนนั้นมาเก็บค่าเอาไว้ อาจใช้แค่ไม่กี่จุด พอที่จะให้ไม่เผลอไปซ้ำกับสีที่อื่นโดยบังเอิญได้ ในที่นี้ใช้ ๕ จุดในแนวนอนบริเวณแถวกลางๆไอคอน
ssnp = np.array(pyautogui.screenshot(region=(556,776,5,1)))
print(ssnp[0])

ได้
[[157 208 219]
 [146 202 215]
 [138 198 212]
 [137 193 207]
 [210 227 232]]

จากนั้นสามารถหำตำแหน่งที่โน้ตแพ็ดตั้งอยู่ได้โดย screenshot เอาค่าสีในบริเวณแถวทัสก์บาร์ จากนั้นไล่ค้นหาสีที่ต้องการ
notepad = np.array([[157,208,219],[146,202,215],[138,198,212],[137,193,207],[210,227,232]])
ss = np.array(pyautogui.screenshot(region=(0,776,1280,1)))
for x in range(1276):
    if(np.all(ss[0,x:x+5]==notepad)):
        pyautogui.click(x,776)
        break
else: raise

เท่านี้โปรแกรมก็จะทำการค้นหาตำแหน่งไอคอนโน้ตแพ็ดบนทัสก์บาร์แล้วก็คลิกตรงนั้น แต่ถ้าหาไม่เจอก็จะขึ้น error

ในตัวอย่างนี้เรารู้ตำแหน่งในแนวตั้งอยู่แล้วจึงให้โปรแกรมแค่ไล่หาตามแนวนอน จึงง่ายและทำได้รวดเร็ว

แต่กรณีที่ไม่รู้ตำแหน่งตามแนวตั้งด้วยก็ต้องไล่หาตามแนวตั้งด้วย อาจเขียนใหม่ได้ดังนี้
notepad = np.array([[157,208,219],[146,202,215],[138,198,212],[137,193,207],[210,227,232]])
ss = np.array(pyautogui.screenshot(region=(0,0,1280,800)))
for x,y in ((x,y) for y in range(800) for x in range(1276)):
    if(np.all(ss[y,x:x+5]==notepad)):
        pyautogui.click(x,y)
        break
else: raise

แบบนี้ก็จะซับซ้อนขึ้น และระยะเวลาในการค้นหาก็จะค่อนข้างนาน กว่าจะกวาดหาจบทั้งหน้าจอ ดังนั้นหากรู้ขอบเขตว่ามันควรอยู่ตรงไหนอยู่แล้วหาแค่แถวๆนั้นจะเร็วกว่ามาก

นี่เป็นแค่ตัวอย่างการลองใช้ ยังไงก็สามารถลองไปปรับใช้ดูอีกที



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

คำสั่งสำหรับสร้างกล่องข้อความให้เด้งขึ้นมาอย่างง่ายสุดคือ alert เป็นหน้าต่างง่ายๆที่มีปุ่มให้กดอันเดียว

ตัวอย่างการใช้
pyautogui.alert(text='ข้อความ',title='หัวข้อ',button='ปุ่มกด')
# หรือ pyautogui.alert('ข้อความ','หัวข้อ','ปุ่มกด')

ผลที่ได้



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

ค่าตั้งต้นจะเป็น text='', title='', button='OK'

คำสั่งต่อมาที่ใช้ได้คือ confirm จะคล้ายกับ alert แต่จะใส่ปุ่มได้หลายอัน

ตัวอย่าง
cf = pyautogui.confirm(text='ข้อความ', title='หัวข้อ', buttons=['ปุ่ม 1','ปุ่ม 2','ปุ่ม 3'])

ผลที่ได้



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

ค่าตั้งต้นเป็น text='', title='', buttons=['OK', 'Cancel']



สร้างกล่องข้อความให้ป้อนข้อความ
นอกจากกล่องข้อความง่ายๆที่มีแค่ให้กดปุ่มก็ยังสามารถสร้างกล่องข้อความที่มีให้พิมพ์ข้อความอะไรได้ สามารถทำได้โดยใช้คำสั่ง prompt

ตัวอย่าง
pyautogui.prompt(text='ข้อความอธิบายด้านบน', title='หัวข้อ' , default='ข้อความตั้งต้นในกล่องที่ให้พิมพ์')

ผลที่ได้



จากนั้นถ้ากด ok จะคืนค่าข้อความที่พิมพ์กลับมา นำไปใช้ในโปรแกรมต่อ

ถ้ากด cancel ไปจะไม่มีการคืนค่ากลับมา


ค่าตั้งต้นคือว่างเปล่าไม่มีอะไรเลย text='', title='', default=''



สำหรับกรณีที่สิ่งที่ต้องการพิมพ์นั้นเป็นพวกพาสเวิร์ดก็ใช้คำสั่ง password กล่องข้อความจะไม่แสดงข้อความที่พิมพ์ไปจริงๆ

ตัวอย่าง
pyautogui.password(text='ข้อความอธิบายด้านบน', title='หัวข้อ', default='พาสเวิร์ดตั้งต้น', mask='x')

ผลที่ได้



mask ในที่นี้คือตัวกำหนดว่าพอพิมพ์ลงไปจะกลายเป็นอักษรอะไร ถ้าไม่ใส่ก็จะเป็นดอกจัน *

ค่าตั้งต้นคือ text='', title='', default='', mask='*'


อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

-----------------------------------------

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

-- pandas
-- pytorch
maya
การเรียนรู้ของเครื่อง
-- โครงข่ายประสาทเทียม
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัพเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
บ้านเก่าของจางเสวียเหลียงในเทียนจิน
เที่ยวจิ่นโจว ๓ วัน ๒ คืน 23 - 25 พ.ค. 2015
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เที่ยวฮ่องกงในคืนคริสต์มาสอีฟ เดินทางไกลจากสนามบินมาทานติ่มซำอร่อยโต้รุ่ง
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนคำทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

ไทย

日本語

中文