公司内部的信息分享平台(用的是Windows SharePoint)最近被要求备案,虽然我不是IT,也瞎捣鼓了一下可能的解决方案。
域名是在1and1注册的,所以不备案其实也没关系。但其服务器是在我们办公室里,用的宽带连接到internet,所以IP是不固定的,于是想了一个自动更新IP的域名转发的办法。80端口是老早就被“有关部门”下令统统封掉了,我们用端口8080吧~当然,用花生壳的动态解析也会很方便,可谁叫我有点geek呢。好,动手~
准备工作
- 域名一个(这个是废话)
- 空间一个,免费的就可以
- PHP+PYTHON+其他什么的编程基础一点点
空间上的工作
首先,我们需要一个文件来存储那个会变动的服务器的IP,当然用数据库也可以。假设是server.txt。
然后,需要一个PHP文件来把获得的IP写入server.txt。假设是record.php。代码如下
<?php
$ip=$_GET["ip"];
$f=fopen(“./server.txt”,”w”);
fwrite($f,$ip);
fclose($f);
?>
最后,一个简单的index.php读取server.txt中的IP地址并且转向。
<?
$fp = fopen(“server.txt”,”r”);
$buf = fread($fp,filesize(“ip.txt”));
fclose($fp);
$buf2 = file_get_contents(“ip.txt”);
$GoTo = “http://”.$buf2.”:8080/”;
header(sprintf(“Location: %s”, $GoTo));
?>
服务器上的工作
想了想还是用python来自动获取本机公网IP然后提交给空间里的server.txt。下面是get-ip.py的代码
import sys
import re
import urllib2
import urllib
ip = re.search(‘\d+\.\d+\.\d+\.\d+’,urllib2.urlopen(“http://www.whereismyip.com”).read()).group(0)
print ip
def addGETdata(url, data):
return url + ‘?’ + urllib.urlencode(data)
url = addGETdata(‘http://xxx.abc.com/record.php’, [('ip', ip)])
print ‘Using URL’, url
req = urllib2.Request(url)
fd = urllib2.urlopen(req)
while True:
data = fd.read(1024)
if not len(data):
break
sys.stdout.write(data)
当然以上代码参考了很多地方啦~用正则从whereismyip.com获得公网IP,然后提交到空间里的record.php写入server.txt。
最后的工作
这样每次IP变动之后在服务器上运行一下get-ip.py就可以了。对python的多线程实在不熟悉,本来想让它自动5分钟10分钟运行一次的,就不用手动了……
后来想到个笨办法,用py2exe把get-ip.py转成exe,然后用其他编程语言写个小程序定时调用就行了。比如最弱智的VB……其实wxpython用个timer控件貌似也可以,还没试过……