[개인 프로젝트] Python 메이플스토리 원카드 매크로 제작 + 영상,코드 (Macro for Maplestory One Card + Video,Code) [학습용]

2019.10.04 19:28프로젝트

[ 개인 프로젝트 ]

 저는 약 1년 전 메이플스토리 라는 게임을 즐기고 있던 도중 원카드라는 컨텐츠를 하기도 귀찮은데 매크로를 만들면 편리 하지 않을까? 라는 의문점이 들어 시작하게되었습니다. 메이플스토리의 운영정책을 위반한 행위이지만 많은 고민끝에 계정정지를 감수하고 기록으로 남기고싶은 마음에 포스팅을 하게되었습니다.

 

https://github.com/Mr-DooSun/Macro-for-Maplestory-OneCard

 

Mr-DooSun/Macro-for-Maplestory-OneCard

Contribute to Mr-DooSun/Macro-for-Maplestory-OneCard development by creating an account on GitHub.

github.com

 

[ 개발 기간 ]

  • 2019.01 ~ 2019.01 ( 10일 소요 )

[ 개발언어 ]

  • Python

[ 사용한 툴 및 스킬  ]

  • Sublime Text 3 - 프로그래밍 할 때 사용
  • Visual Studio Code - 프로그래밍, 깃허브 이용할 때 사용
  • Github - 코드공유하기 위해 사용

 

  • Opencv - 색 감지 하기 위해 사용
  • Pytesseract - 글자를 감지하기 위해 사용
  • Pynput - 키보드 제어를 위해 사용

[ 핵심 코드 ]

 

Check_number() =

메이플스토리 컨텐츠 매크로를 방지하기위해 만들어놓은 숫자 검사기를 화면에서 찍은 후 이미지를 가져와 pytesseract를 이용하여 숫자를 감지한다. 읽어온 숫자를 pynput을 이용해 입력한다

def Check_number():
	before_passoword="true"
	TrueOrFalse=False
	for_check=True
	# while True:
	pixel=0

	# printscreen_pil =  ImageGrab.grab(bbox=(475,520,750,530))
	printscreen_pil =  ImageGrab.grab(bbox=(440,390,530,420))
	printscreen_numpy =   np.array(printscreen_pil.getdata(),dtype='uint8').reshape((printscreen_pil.size[1],printscreen_pil.size[0],3)) 

	img=cv2.cvtColor(printscreen_numpy,cv2.COLOR_BGR2RGB)
	# img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

	lower_color=(255, 255, 255)
	upper_color=(255,255, 255)

	img_mask = cv2.inRange(img, lower_color, upper_color)

	password = image_to_string(img)

	for num in range(0,len(password)) : #비밀번호 타이핑을 한다
		try :
			print(int(password[num]))
		except :
			return

	for num in range(0,len(password)) : #비밀번호 타이핑을 한다
		print(password[num])
		keyboard_button.press(password[num])
		keyboard_button.release(password[num])
		TrueOrFalse=True

	if before_passoword==password: #이전 비번과 이번 비번이 같을때(무한) 멈춘다
		TrueOrFalse=False
		Only_number() #숫자만 입력하시오 문구가 뜨는 함수로 넘어간다

	if TrueOrFalse : #타이핑된 비밀번호를 확인 시킨다
		mouse_controller.position=(910,485)
		mouse_controller.press(mouse_button.left)
		mouse_controller.release(mouse_button.left)
		before_passoword=password
		TrueOrFalse=False
		sleep(1)

 

Play() =

숫자 검사기를 통해 통과 될경우 원카드가 시작하기 때문에 play() 함수가 동작한다. 원카드게임은 자기 차례될때 낼수 있는 카드가 있을경우 회색카드에서 밝은 카드로 바뀌기때문에 밝은 부분이 감지되는부분을 마우스를 누르게 한다.

def Play(): #원카드 플레이
	playOrstop=True
	while playOrstop:
		printscreen_pil =  ImageGrab.grab(bbox=(475,520,750,530))
		printscreen_numpy =   np.array(printscreen_pil.getdata(),dtype='uint8').reshape((printscreen_pil.size[1],printscreen_pil.size[0],3)) 

		img=cv2.cvtColor(printscreen_numpy,cv2.COLOR_BGR2RGB)

		lower_color=(255, 255, 255)
		upper_color=(255,255, 255)

		img_mask = cv2.inRange(img, lower_color, upper_color)

		for y in range(0,10) :
			for x in range(0,275) :
				if img_mask[y,x] == 255 :
					break

		print("x : "+str(475+x)+" y : "+str(520+y))

		if (475+x) > 748 :
			if (520+y) > 528 :
				mouse_controller.position=(475,420)
				mouse_controller.press(mouse_button.left)
				mouse_controller.release(mouse_button.left)
		else : 
			mouse_controller.position=(str(475+x),str(520+y))
			mouse_controller.press(mouse_button.left)
			mouse_controller.release(mouse_button.left)

		sleep(0.5)
		mouse_controller.position=(600,460)
		mouse_controller.press(mouse_button.left)
		mouse_controller.release(mouse_button.left)
		sleep(0.5)
		playOrstop=Check_end()

		# cv2.imshow("img",img_mask)

		sleep(1)

 

[ 시연 영상 ]

https://www.youtube.com/watch?v=lF5NRwf6LZ0

이후 테스트 영상을 끝으로 해당 매크로를 사용 하지 않았습니다.

이상 포스팅을 마치도록 하겠습니다

 

[ 완성된 코드 ]

 

https://github.com/Mr-DooSun/Macro-for-Maplestory-OneCard

 

Mr-DooSun/Macro-for-Maplestory-OneCard

Contribute to Mr-DooSun/Macro-for-Maplestory-OneCard development by creating an account on GitHub.

github.com