LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4702|回复: 5

长城宽带认证方法

[复制链接]
发表于 2004-12-4 01:34:46 | 显示全部楼层 |阅读模式
====================================
下面是auth.py,认证主程序,程序是用python写的,参考了论坛里的精华帖子,在这里表示感谢
///////////auth.py/////////////

#! /usr/bin/env python
import os
import re
import httplib, urllib
temp = os.popen('ifconfig eth0 | awk \'/inet/{print $2}\' | awk -F: \'{print $2}\'')                 ////获取自己的ip地址
IP = temp.read()
err = temp.close()
m = re.search("(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{2,3})", IP)
MYIP = m.group(1)            ////获取自己的ip地址的标准格式
ff = open('/etc/auth.conf','r',-1)      ////在/etc/auth.conf里放自己的密码和id.格式为myid=xxxxxxxxxxxxmypasswd=xxxxxxxxx
idpasswd = ff.readline()
ff.close
m = re.search("myid=(\d{12})mypasswd=(.*)$",idpasswd)
MYID = m.group(1)
MYPASSWD = m.group(2)

path = '/cgi-bin/authcgi_login'                ////构造http请求,获得认证界面
conn = httplib.HTTPConnection('vip.163.com')
conn.request('GET','','')
r = conn.getresponse()
body = r.read()
conn.close

r1 = re.compile(r'.*http://(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\d{2,5})/cgi-bin/authcgi_login',re.MULTILINE)
m = r1.search(body)        ////获取认证服务器的地址和端口

SERVER=m.group(1)
PORT=m.group(2)

params = urllib.urlencode([
('sip',SERVER),
('uip',MYIP),
('url','vip.163.com'),
('uact','login'),
('uact_status',1),
('uid',MYID),
('upwd',MYPASSWD),
('vpn','0'),
('go','用户登入'),
('btype','0')
])


ff = open('/var/tmp/server.conf','w+',-1)
HOST = 'server='+SERVER+'port='+PORT
ff.write(HOST)
ff.flush()
ff.close        ////把认证服务器的地址和端口写入临时文件中给后面的logout使用

cmd = 'POST '+path
header =' HTTP/1.1'+'\x0d\x0a'+'Accept: *.*'+'\x0d\x0a'+'Content-Type: application/x-www-form-urlencoded'+'\x0d\x0a'+'User-Agent: Microsoft Internet Explorer 6.0'+'\x0d\x0a'+'HOST:'+SERVER+':'+PORT
length = len(params)
control = '\x0d\x0a'+'Content-Length: '+str(length)+'\x0d\x0a'+'Cache-Control: no-cache'+'\x0d\x0a'+'Cookie: sid=20040706210751'+'\x0d\x0a\x0d\x0a'
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((SERVER,int(PORT)))
sock.send(cmd+header+control+params)         ////登录认证
s = sock.recv(8192)
r1 = re.compile(r'.*srvip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})&sport=(\d{2,5})&sid=(\d{8,10})&stime=(\d{9,11})&rmtime=(.?\d{1,2})&interval=(\d{1,2}).*chkey=(\d{14})',re.MULTILINE)
m = r1.search(s)
SERVER = m.group(1)
PORT = m.group(2)             ////获得keep-alive服务器的地址和端口
ff = open('/var/tmp/auth.conf','w+',-1)
ff.write(params)
ff.flush()
ff.close            ////keep-alive服务器的地址和端口写入零时文件中给keep-alive程序使用
SID = m.group(3)
STIME = m.group(4)
RMTIME = m.group(5)
INTERVAL = m.group(6)
CHKEY = m.group(7)
params = urllib.urlencode([
('uid',MYID),
('uip',MYIP),
('srvip',SERVER),
('sport',PORT),
('sid',SID),
('stime',STIME),
('rmtime',RMTIME),
('interval',INTERVAL),
('btype','0'),
('vpn','0'),
('wtype','0'),
('chkey',CHKEY),
])
header =' HTTP/1.1'+'\x0d\x0a'+'Accept: *.*'+'\x0d\x0a'+'User-Agent: Microsoft Internet Explorer 6.0'+'\x0d\x0a'+'HOST:'+SERVER+':'+PORT+'\x0d\x0a'+'Cache-Control: no-cache'+'\x0d\x0a'+'Cookie: sid=20040706210751'+'\x0d\x0a\x0d\x0a'
path = '/cgi-bin/timer'
cmd='GET '+path+'?'+params+header
sock.send(cmd)          ////发送认证成功确认包
s = sock.recv(8192)
sock.close
params = urllib.urlencode([
('uid',MYID),
('uip',MYIP),
('sid',SID),
('srvip',SERVER),
('sport',PORT),
('stime',STIME),
('rmtime',RMTIME),
('interval',INTERVAL),
('time_span','0'),
('act','logout')
])
ff = open('/var/tmp/auth.conf','w+',-1)
ff.write(params)
ff.flush()
ff.close          ////把认证返回的keep-alive所需要的id,interval等写入零时文件
print 'Login OK'
sock.close
os.system('/etc/rc.d/init.d/UDP.py')       ////运行keep-alive程序
os._exit(0)           ////退出认证程序
 楼主| 发表于 2004-12-4 01:53:11 | 显示全部楼层

keep-alive程序(UDP.py)

///////////UDP.py///////////

#! /usr/bin/env python
#
# Filename UDP.py
import os
pid=os.fork() ////获取自己的pid并创建一个守护进程
if pid:
        ff = open('/var/tmp/authpid.conf','w+',-1)
        ff.write(str(pid))        ////写入进程pid
        ff.flush()
        ff.close
        print 'pid='+str(pid)
        os._exit(0)             ////关闭自身进程
from socket import socket,AF_INET,SOCK_DGRAM
ff = open('/var/tmp/auth.conf','r',-1) ////读取keep-alive参数
bufread=ff.readline()
ff.close
import re
r1 = re.compile(r'.*sid=(\d{8,10})&srvip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})&sport=(\d{2,5}).*interval=(\d{1,2})',re.MULTILINE)
m = r1.search(bufread)
print 'Start to Send UDP package'
SID=m.group(1)
HOST=m.group(2)
PORT=int(m.group(3))
interval=int(m.group(4))
import signal
def onSignal(signum, stackframe):
        if signum==signal.SIGALRM:
                s = socket(AF_INET,SOCK_DGRAM)
                s.sendto(SID,(HOST,PORT))  ////如果收到alarm信号则发送keep-alive包(udp包,只是简单的一个SID)
                s.close

        if signum==9:
                os._exit(0) ////如果收到信号9就退出
while 1:
        signal.signal(signal.SIGALRM, onSignal)
        signal.alarm(interval) ////定时发出alarm信号
        signal.pause()  ////休眠
 楼主| 发表于 2004-12-4 02:01:47 | 显示全部楼层

logout程序(logout.py)

///////logout.py////////


#! /usr/bin/env python
import re
ff = open('/var/tmp/server.conf','r',-1)
HOST = ff.readline()
ff.close
m = re.search("server=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})port=(\d{2,5})",HOST)
SERVER = m.group(1)
PORT = m.group(2)   ////读取服务器地址和端口
                     
ff = open('/var/tmp/auth.conf','r',-1)
params=ff.readline()
ff.close

path = '/cgi-bin/timer'

cmd = 'POST '+path
header =' HTTP/1.1'+'\x0d\x0a'+'Accept: *.*'+'\x0d\x0a'+'Content-Type: application/x-www-form-urlencoded'+'\x0d\x0a'+'User-Agent: Microsoft Internet Explorer 6.0'+'\x0d\x0a'+'HOST:'+SERVER+':'+PORT
length = len(params)
control = '\x0d\x0a'+'Content-Length: '+str(length)+'\x0d\x0a'+'Cache-Control: no-cache'+'\x0d\x0a'+'Cookie: sid=20040706210751'+'\x0d\x0a\x0d\x0a'    ////构造logout包
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((SERVER,int(PORT)))
sock.send(cmd+header+control+params)   ////发送logout命令
import os
ff = open('/var/tmp/authpid.conf','r',-1)
pid = ff.readline()
cmd='kill -9 '+pid
os.system(cmd)       ////杀掉keep-alive进程   
print 'logout ok'
 楼主| 发表于 2004-12-4 02:04:42 | 显示全部楼层

所有的程序打包

在附件里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-12-4 10:51:20 | 显示全部楼层
谢谢。试试。
发表于 2006-8-28 19:34:15 | 显示全部楼层
这个东西怎么用呢?我运行下来提示:

Traceback (most recent call last):
  File "./auth.py", line 15, in ?
    MYID = m.group(1)
AttributeError: 'NoneType' object has no attribute 'group'




其实我只想要第二个东西,keep-alive程序,这样我长宽就不会掉线~
有其他能实现这个功能的也可以阿,不过要运行在文本模式~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表