Python/Python Challenge

[Python Challenge 13] 자니??.... 그냥 전화해봤어...

Python Challenge 13의 url은 다음과 같다.

Python challenge 13 : http://www.pythonchallenge.com/pc/return/disproportional.html


구성

 

가운데 영어는 다음과 같은 의미이다.

 

"나쁜 놈에게 전화할 것"

 

상호작용은 5번 다이얼에 href로 phonebook.php로 이동할 수 있다. 주석 소스를 확인하자

저번 꿀벌 문제처럼 area태그에 걸려있는 coords와 href로 이동을 시켜주는구나 싶다.

phonebook.php의 페이지는 다음과 같다.

응? XML Error Code 105로 오류 페이지가 확인된다. 어허... 어디서부터 접근을 해야 되는 것일까


해결 아이디어

모르면 검색이다. 에러에 출력된 대로 XML faultCode 105를 검색하자. 검색에 많이 올라오는 것이 XML-RPC라는 keyword가 압도적으로 많이 보인다. 이게 무엇인지부터 알아보자

 

XML-RPC

RPC프로토콜을 아는가? 원격 프로시저 호출이라는 프로토콜이다. 분산 프로그램에서 많이 이용하는 방법으로 다른 주소 공간에서 함수나 프로시저를 실행시킬 수 있게 해주는 프로토콜로 JSON을 이용한 방법과 XML을 이용한 방법이 있다고 한다. 그럼 Python에서 XML-RPC를 사용할 수 있는 방법을 알아보자

 

Python에서 xmlrpc의 사용

일단 다음의 Doc에서 자세한 사용법을 설명한다.

https://docs.python.org/ko/3/library/xmlrpc.html

 

xmlrpc — XMLRPC 서버와 클라이언트 모듈 — Python 3.9.5 문서

xmlrpc — XMLRPC 서버와 클라이언트 모듈 XML-RPC는 HTTP를 트랜스포트로 사용해서 전달되는 XML을 사용하는 원격 프로시저 호출 방법입니다. 이를 통해, 클라이언트는 원격 서버(서버는 URI로 지정됩니

docs.python.org

 

서버는 Python Challenge에 있으니 우리는 client를 이용해서 붙으면 된다.

필자는 문제에 필요한 함수만을 사용할 것이며 그 항목은 다음과 같다.

  • xmlrpc.client.ServerProxy(url) : 서버에 붙을 수 있도록 client객체를 리턴한다.
  • ServerProxy.system.listMethods() : 서버에서 사용할 수 있는 매머드의 종류를 list로 리턴한다.
  • ServerProxy.system.methodSignature(method) : method의 인자 값의 종류와 리턴 값을 보여준다.
  • ServerProxy.system.methodHelp(method) : method의 사용법을 리턴한다.

다음은 phonebook.php에서 사용할 수 있는 함수를 찾는 코드이다.

### 13.py

import xmlrpc.client as xc

if __name__ == "__main__" :
    url = "http://www.pythonchallenge.com/pc/phonebook.php"
    serv = xc.ServerProxy(url)
    print(serv.system.listMethods())

결과는 다음과 같다.

['phone', 'system.listMethods', 'system.methodHelp', 
'system.methodSignature', 'system.multicall', 'system.getCapabilities']

phone이라는 매더스가 보인다. 사용법을 확인하기 위해 다음과 같은 코드를 작성하자

### 13_2.py

import xmlrpc.client as xc

if __name__ == "__main__" :
    url = "http://www.pythonchallenge.com/pc/phonebook.php"
    serv = xc.ServerProxy(url)

    ### phone메서드의 사용법을 알아낸다.
    print("Usage :",serv.system.methodHelp("phone"))

    ### phone메서드의 인자와 리턴값을 확인한다.
    ### 첫 인덱스는 입력, 두 번째 인덱스는 출력이다.
    sig = serv.system.methodSignature("phone")
    print("In :",sig[0][0]," / out :",sig[0][1])

결과는 다음과 같다.

Usage : Returns the phone of a person
In : string  / out : string

으흠 즉 phone매서드는 string을 받아들여서 string을 반환하는 매서드이다. 예시로 다음을 입력해보자

>>> serv.phone("REDUCTO")
'He is not the evil'

그렇구먼 이제 나쁜 놈을 찾으면 된다. 그런데 나쁜 놈이 누구지? 정답은 저번 글에 있다.

2021.05.19 - [Python/Python Challenge] - [Python Challenge 12] 나쁜놈은 누구인가

 

[Python Challenge 12] 나쁜놈은 누구인가

Python Challenge 12의 url은 다음과 같다. Python challenge 12 : http://www.pythonchallenge.com/pc/return/evil.html 구성 위와 같은 사진이 있다. 사진의 파일명은 evil1.jpg(응? 왜 1이지? 점 심나 가서 먹..

tutoreducto.tistory.com

Bert 네이놈!

>>> serv.phone("Bert")
'555-ITALY'

정답은 ITALY이다. 옛날 *023#을 알고 있는가? 장난전화할 때 많이 쓰던 번호인데(-틀-).... 되었다 하여튼 555는 미국식으로 없는 번호를 의미할 때 뭐 저렇게 한다고 한다. 정답 "ITALY" 찾았다.

Answer Url? : http://www.pythonchallenge.com/pc/return/ITALY.html

더럽게 깐깐하게 구네

Answer Url : http://www.pythonchallenge.com/pc/return/italy.html