φυβλαςのβλογ
บล็อกของ 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
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2019年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2018年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2017年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2016年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2015年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文