使用Python来自动反复拨号

01 Sep, 2011

宽带拨号直接点击连接就可以了,何必蛋疼的去写一段代码来拨号呢?难道学软件的都这么无聊。这个问题的答案当然是否,虽然自己常常蛋疼,但还没有到那种地步,先说说我们学校的网络情况。我们学校可以说上网费还真不是一般的贵,只能包时,不能包月,而且网络情况十分糟糕,服务态度也十分糟糕,这个在我们学校是出了名的。

每到用网高峰期,比如中午,更加厉害的是晚上,在那个时候才联网的话,你就得饱受错误代码之734之痛,由于上网人数过度,学校网络估计IP地址有限或者其他原因,在这种情况下很难连接上,唯一的办法是,一直在那里连啊连,运气一好,就挤上去了,不过是人都是很懒的,谁愿意一直守着电脑在那里无聊的点着连接呢,所以还是交给程序吧,Python已经安装了,所以决定用Python写,简单啊。

第一个想法就是用Python操作系统命令,这个在标准库中有os,所以比较简单,于是搞出了以下代码,具体意思看注释。

# -*- coding:utf-8 -*-

import os
import time

result = os.system("rasdial entyname user pass") # entyname:连接名称 user:用户帐号 pass:密码

while result: # 如果连接成功,result为0
    time.sleep(10) # 暂停10s然后继续,当然你也可以不用
    result = os.system("rasdial entyname user pass")

不过这种方法有个缺点,因为是调用的DOS,所以会出现窗口,为了避免这种情况,在网上找到了用pywin32来实现拨号的方法,不过要使用这种方法的话,必须先下载pywin32这个库,安装过后代码如下。

# -*- coding:utf-8 -*-

import win32ras
import time

def connect (dialname, account, passwd):
  dial_params = (dialname, '', '', account, passwd, '')
  return win32ras.Dial(None, None, dial_params, None)

def main():
  dialname = '宽带连接'  # 我的连接名称,在网络连接里可手动重命名
  account = 'username'
  passwd = 'pass'
  handle, result = connect(dialname, account, passwd)
  # handle为pid可用于后期结束,成功则result返回0,
  # account为拨号帐号,passwd为密码
  return result

result = main()

while result:
  print("拨号失败,等待10s继续。。。。")
  time.sleep(10) # 这个也可以不用
  result = main()

有了上面的代码,就可以不用自己手动在那里重复拨号了,让程序自己来拨号吧,自己可以去冲个凉什么的,说不定就已经联上了,最后觉得Python不太普遍,所以写了个C语言版的,当然为了简单,使用的是Python的第一种解决方案,其实就是DOS中的rasdial命令,参考代码如下。

#include <conio.h>

int main()
{
    int result;
    do{
        result=system("rasdial entyname user pass") //entyname:连接名称 user:用户帐号 pass:密码;
    }while(result!=0)
}

当然,这个是超级简化版,如果你要添加其他功能,自己修改吧,提供一个思路而已。我使用不来Windows的bat,或许可以使用bat来解决,可能更简单。最后,我用的是Python的第二种方法,效果不错,解放双手,哈哈。使用Python来做一些小事,还是非常方便的,人生苦短,我用Python。