파이썬으로 네크워크 프로그래밍을 할때 일반적으로 아래의 모듈들을 사용한다.
socket, httplib,urllib, urllib2, etc..
상황에 따라 다르겠지만 urllib, urllib2, httplib 애들은 이름부터 비슷해서 기능들도 비슷비슷하다
각각 사용해야 될 상황이 있을 법한데 그때 그때 구현해서 쓰다보니 뭐가 뭔지 헷갈림..
그래서 구글링을 해보니 생각보다 간단하다.
1) urllib2는 Request class를 통해서 헤더를 조작할수 있다는 것과
2) urlencode는 urllib에만 있다는 것
그러니깐 urllib2는 보다 디테일한 제어가 가능하지만 몇몇 기능 떄문에 urllib를 써야 한다는 정도.
httplib는 아래 코멘트로 설명이 될듯.
If you're dealing solely with http/https and need access to HTTP specific stuff, use httplib. For all other cases, use urllib2.
urllib/urllib2 is built on top of httplib. It offers more features than writing to httplib directly.
example. socket
from socket import *
host = "blabla"
port = 80
payload = "GET / HTTP/1.1\r\n"
s = socket(AF_INET, SOCK_STREAM)
s.connect((host, port))
s.send(payload)
r = s.recv(1024)
print "[+] Receive - %s" % r
example urllib2,urllib
wechall.net에 있는 문제 중에 하나.
urllib2에서 Request 클래스를 생성할 때, data 값이 있으면 POST 로 전송한다.
따라서 GET으로 전송하고 싶으면 add_header 메소드로 추가.
import urllib,urllib2,re
url = 'http://www.wechall.net/challenge/training/programming1/index.php?action=request'
callback_url = 'http://www.wechall.net/challenge/training/programming1/index.php?answer='
#param = {'action':'request'}
#data = urllib.urlencode(param)
sid = "WC4_SID=921244-6205-R8w9DSKbppv6P4pE"
req = urllib2.Request(url)
req.add_header('cookie',sid)
f = urllib2.urlopen(req)
text = f.read()
#answer = re.findall('page_wrap\">\n[a-zA-Z0-0]{9}',text)
t = re.findall('[a-zA-Z0-9]+',text)
t.reverse()
answer = t[0]
req = urllib2.Request(callback_url+answer)
req.add_header('cookie',sid)
f = urllib2.urlopen(req)
print f.read()