Python脚本内自定义域名解析的IP

今天因为网站上有一个小功能,原先单台服务器时执行一条url即可完成功能,但目前执行URL只会作用在某一台服务器。遂想着用Python写一段脚本然后放在集中管理平台上对所有服务器下发。其实这种情形,用shell脚本执行curl也可实现相同效果。

由于服务器走公网解析我们域名的话,同样只有一台服务器完成功能。所以我想着是不是在不修改本机hosts的情况下,在Python脚本内实现对域名的解析。带着这个想法,终于在stackoverflow上找到了可行的答案。

大致思路是,首先定义一个函数,记录你需要自定义IP的域名,并建立一个httplib.HTTPConnection的子类,在参数传递给socket.create_connection前修改self.host以封装connection方法。然后继承HTTPHandler这个类,用上面的HTTPConnection替换httplib内自带的HTTPConnection,并重写http_open方法;最后把HTTPHandler放到自定义的opener。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python

import urllib2
import httplib
import socket

def req_host(host):
if host == 'www.***.cn':
return '8.8.8.8'

class MyHTTPConnection(httplib.HTTPConnection):
def connect(self):
self.sock = socket.create_connection((req_host(self.host),self.port),self.timeout)

class MyHTTPHandler(urllib2.HTTPHandler):
def http_open(self,req):
return self.do_open(MyHTTPConnection,req)

opener = urllib2.build_opener(MyHTTPHandler)
urllib2.install_opener(opener)

url = 'http://'
f = urllib2.urlopen(url)
req = f.read()
print req