====== Python Internet ====== ===== Python Socket ===== refer: https://docs.python.org/2/library/socket.html ==== Echo Server and Client ==== === Simple Echo Server and Client === * Echo Server # Echo server program import socket HOST = '' # Symbolic name meaning all available interfaces PORT = 50007 # Arbitrary non-privileged port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) print 'server is listening' conn, addr = s.accept() print 'Connected by', addr while 1: data = conn.recv(1024) if not data: break conn.sendall(data) conn.close() output: server is listening * Echo Client # Echo client program import socket HOST = '127.0.0.1' # The remote host PORT = 50007 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall('Hello, world') data = s.recv(1024) s.close() print 'Received', repr(data) server output: server is listening Connected by ('127.0.0.1', 56354) client output: Received 'Hello, world' === Custom Echo Server for multiple client === The above example only service for 1 client, after the server receive connection and send data to client, the echoserver program will end. The below example will service for multiple clients * Echo server # Echo server program import socket HOST = '' # Symbolic name meaning all available interfaces PORT = 50007 # Arbitrary non-privileged port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(10) print 'server is listening' while 1: conn, addr = s.accept() print 'Connected by', addr data = conn.recv(1024) if not data: break conn.sendall(data) conn.close() ==== Connect to google with socket and receive data ==== #Socket client example in python import socket #for sockets import sys #for exit #create an INET, STREAMing socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error: print 'Failed to create socket' sys.exit() print 'Socket Created' host = 'www.google.com'; port = 80; try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print 'Hostname could not be resolved. Exiting' sys.exit() #Connect to remote server s.connect((remote_ip , port)) print 'Socket Connected to ' + host + ' on ip ' + remote_ip #Send some data to remote server message = "GET / HTTP/1.1\r\n\r\n" try : #Set the whole string s.sendall(message) except socket.error: #Send failed print 'Send failed' sys.exit() print 'Message send successfully' #Now receive data reply = s.recv(4096) print reply output Socket Created Socket Connected to www.google.com on ip 125.235.30.157 Message send successfully HTTP/1.1 302 Found Cache-Control: private Content-Type: text/html; charset=UTF-8 Location: http://www.google.com.vn/?gfe_rd=cr&ei=Cd_gU72uKIiK8Qe6koDICQ Content-Length: 262 Date: Tue, 05 Aug 2014 13:41:29 GMT Server: GFE/2.0 Alternate-Protocol: 80:quic 302 Moved

302 Moved

The document has moved here.
===== httplib and urllib2(with addinfourl) ===== * The basic class for processing http is httplib package * urllib2 is a Python module that can be used for fetching URLs. It defines functions and classes to help with URL actions (basic and digestauthentication, redirections, cookies, etc). urllib2 handle object types below: default_classes = [ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor] With http, urllib2 using httplib for sending and receiving data ==== urllib2.urlopen return addinfourl and debug send data in request ===== * addinfourl have basic methods below: class addinfourl(addbase): """class to add info() and geturl() methods to an open file.""" def __init__(self, fp, headers, url, code=None): addbase.__init__(self, fp) self.headers = headers self.url = url self.code = code def info(self): return self.headers def getcode(self): return self.code def geturl(self): return self.url * debug send data in request: Edit send function in httplib.HTTPConnection: def send(self, data): """Send `data' to the server.""" ............................... else: self.sock.sendall(data) print data and other methods the same read and write file such as **read, readlines, next, close** class addbase: """Base class for addinfo and addclosehook.""" def __init__(self, fp): self.fp = fp self.read = self.fp.read self.readline = self.fp.readline if hasattr(self.fp, "readlines"): self.readlines = self.fp.readlines if hasattr(self.fp, "fileno"): self.fileno = self.fp.fileno else: self.fileno = lambda: None if hasattr(self.fp, "__iter__"): self.__iter__ = self.fp.__iter__ if hasattr(self.fp, "next"): self.next = self.fp.next def __repr__(self): return '<%s at %r whose fp = %r>' % (self.__class__.__name__, id(self), self.fp) def close(self): self.read = None self.readline = None self.readlines = None self.fileno = None if self.fp: self.fp.close() self.fp = None ==== simple request(GET) ==== * Simple request with httplib import httplib url = 'www.python.org' conn = httplib.HTTPConnection(url) conn.request('GET', '') res = conn.getresponse() print res.status, res.reason print res.read() => output: 301 Moved Permanently * Simple request with urllib2: import urllib2 response = urllib2.urlopen('http://www.python.org') print response.read() or import urllib2 req = urllib2.Request('http://www.python.org') response = urllib2.urlopen(req) print response.read() => response is **urllib.addinfourl** object and output are full html data ==== simple post ==== * POST with httplib import httplib, urllib params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} conn = httplib.HTTPConnection("bugs.python.org") conn.request("POST", "", params, headers) response = conn.getresponse() print response.status, response.reason data = response.read() print data conn.close() output: 302 Found Redirecting to http://bugs.python.org/issue12524 * POST with urllib2 import urllib, urllib2 params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} req = urllib2.Request("http://bugs.python.org", data = params, headers = headers) response = urllib2.urlopen(req) data = response.read() print data => Output with full html data ==== urllib2.build_opener(replace urlopen) and post with cookies ==== * Using build_opener for sending request: import urllib2 opener = urllib2.build_opener(urllib2.HTTPHandler()) response = opener.open('http://www.python.org') print response.read() and for sending post: import urllib, urllib2 params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} req = urllib2.Request("http://bugs.python.org", data = params, headers = headers) opener = urllib2.build_opener(urllib2.HTTPHandler()) response = opener.open(req) print 'headers:', response.info() print response.read() output: headers: Date: Wed, 06 Aug 2014 04:01:39 GMT Server: BaseHTTP/0.3 Python/2.6.6 Expires: Wed, 06 Aug 2014 04:01:38 GMT Content-Type: text/html; charset=utf-8 Cache-Control: no-cache Via: 1.1 bugs.python.org Connection: close Transfer-Encoding: chunked * Send normal login to OpenCart: import urllib, urllib2 loginurl = 'http://dacsan.babies.vn/index.php?route=account/login' params = urllib.urlencode({'email': 'itanhchi@yahoo.com', 'password':'8941362', 'redirect':'http://dacsan.babies.vn/index.php?route=account/account'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} req = urllib2.Request(loginurl, data = params, headers = headers) response = urllib2.urlopen(req) data = response.read() with open('loginresult.html', 'wb') as f: f.write(data) Debug in httplib.HTTPConnection send: POST /index.php?route=account/login HTTP/1.1 Accept-Encoding: identity Content-Length: 122 Host: dacsan.babies.vn Accept: text/plain User-Agent: Python-urllib/2.7 Connection: close Content-Type: application/x-www-form-urlencoded redirect=http%3A%2F%2Fdacsan.babies.vn%2Findex.php%3Froute%3Daccount%2Faccount&password=8941362&email=itanhchi%40yahoo.com GET /index.php?route=account/account HTTP/1.1 Accept-Encoding: identity Host: dacsan.babies.vn Connection: close Accept: text/plain User-Agent: Python-urllib/2.7 GET /index.php?route=account/login HTTP/1.1 Accept-Encoding: identity Host: dacsan.babies.vn Connection: close Accept: text/plain User-Agent: Python-urllib/2.7 * Send login to OpenCart with cookies header: import urllib, urllib2 loginurl = 'http://dacsan.babies.vn/index.php?route=account/login' params = urllib.urlencode({'email': 'itanhchi@yahoo.com', 'password':'8941362', 'redirect':'http://dacsan.babies.vn/index.php?route=account/account'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} req = urllib2.Request(loginurl, data = params, headers = headers) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) response = opener.open(req) data = response.read() with open('loginresult.html', 'wb') as f: f.write(data) Debug in httplib.HTTPConnection send: POST /index.php?route=account/login HTTP/1.1 Accept-Encoding: identity Content-Length: 122 Host: dacsan.babies.vn Accept: text/plain User-Agent: Python-urllib/2.7 Connection: close Content-Type: application/x-www-form-urlencoded redirect=http%3A%2F%2Fdacsan.babies.vn%2Findex.php%3Froute%3Daccount%2Faccount&password=8941362&email=itanhchi%40yahoo.com GET /index.php?route=account/account HTTP/1.1 Accept-Encoding: identity Host: dacsan.babies.vn Cookie: currency=VND; language=vn; PHPSESSID=h1mr19s902mekq25ubccsn4k22 Connection: close Accept: text/plain User-Agent: Python-urllib/2.7 ==== Get Cookie Information ==== import urllib, urllib2 import cookielib loginurl = 'http://dacsan.babies.vn/index.php?route=account/login' params = urllib.urlencode({'email': 'itanhchi@yahoo.com', 'password':'8941362', 'redirect':'http://dacsan.babies.vn/index.php?route=account/account'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} req = urllib2.Request(loginurl, data = params, headers = headers) cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) response = opener.open(req) for cookie in cj: print cookie.name, cookie.value data = response.read() with open('loginresult.html', 'wb') as f: f.write(data) output: currency VND language vn PHPSESSID 01eg0u7uf5bm3r01h6pnrv3q33 ==== Post multipart form data ==== === post with encode_multipart_formdata === Post with httplib import httplib, mimetypes def post_multipart(host, selector, fields, files): """ Post fields and files to an http host as multipart/form-data. fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return the server's response page. """ content_type, body = encode_multipart_formdata(fields, files) h = httplib.HTTP(host) h.putrequest('POST', selector) h.putheader('content-type', content_type) h.putheader('content-length', str(len(body))) h.endheaders() h.send(body) errcode, errmsg, headers = h.getreply() return h.file.read() def encode_multipart_formdata(fields, files): """ fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return (content_type, body) ready for httplib.HTTP instance """ BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$' CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) for (key, filename, value) in files: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) L.append('Content-Type: %s' % get_content_type(filename)) L.append('') L.append(value) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body def get_content_type(filename): return mimetypes.guess_type(filename)[0] or 'application/octet-stream' === fix encode_multipart_formdata for posting binary file === def encode_multipart_formdata(fields, files): """ fields is a sequence of (name, value) elements for regular form fields. files is a sequence of (name, filename, value) elements for data to be uploaded as files Return (content_type, body) ready for httplib.HTTP instance """ buf = StringIO() boundary = mimetools.choose_boundary() for (key, value) in fields: buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"' % key) buf.write('\r\n\r\n' + value + '\r\n') for (key, filename, value) in files: contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)) buf.write('Content-Type: %s\r\n' % contenttype) buf.write('\r\n' + value + '\r\n') buf.write('--' + boundary + '--\r\n\r\n') buf = buf.getvalue() content_type = 'multipart/form-data; boundary=%s' % boundary return content_type, buf === Post using MultipartPostHandler === * Install: pip install MultipartPostHandler * example: import MultipartPostHandler, urllib2, cookielib cookies = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies), MultipartPostHandler.MultipartPostHandler) params = { "username" : "bob", "password" : "riviera", "file" : open("filename", "rb") } opener.open("http://wwww.bobsite.com/upload/", params) ===== twisted internet ===== ==== Simple Request ==== from sys import argv from pprint import pformat from twisted.internet.task import react from twisted.web.client import Agent, readBody from twisted.web.http_headers import Headers def cbRequest(response): print 'Response version:', response.version print 'Response code:', response.code print 'Response phrase:', response.phrase print 'Response headers:' print pformat(list(response.headers.getAllRawHeaders())) d = readBody(response) d.addCallback(cbBody) return d def cbBody(body): print 'Response body:' print body def main(reactor, url=b"http://www.google.com/"): agent = Agent(reactor) d = agent.request( 'GET', url, Headers({'User-Agent': ['Twisted Web Client Example']}), None) d.addCallback(cbRequest) return d react(main, argv[1:])