上网计时【Python】

用 Python 写的一个记录上网用时的小脚本(自用),上网时间记录在 sqllite 数据库中

通过访问某个网站来判断网络是否连接或断开

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import urllib2
import ConfigParser
import sqlite3

# 记录上网时长,并将数据写入到数据库

# 插入数据
def insert_data(xcur, start_time, end_time, total_time):
    sql = 'INSERT INTO time(starttime, endtime, totaltime) VALUES (?, ?, ?)'
    values = (start_time, end_time, total_time)
    xcur.execute(sql, values) # 执行 SQL 语句

# 查询总上网时长
def query_sum(xcur):
    xcur.execute('select sum(totaltime) as total from time')
    total = xcur.fetchone()[0] # 获取单一结果集
    return total

# 设置默认配置
def default_config( configs, configfile):
    configs.add_section('General')
    configs.set('General', 'URL', 'http://www.baidu.com/favicon.ico')
    with open(configfile, 'wb') as config_file:
        configs.write(config_file)
        config_file.close()

CONFIGFILE = 'config.ini'  # 配置文件名称
config = ConfigParser.RawConfigParser()

# 获取配置文件中 URL 的值
while True:
    try:
        config.read(CONFIGFILE)
        url = config.get('General', 'URL').decode('utf-8')
    except:
        default_config(config, CONFIGFILE)
    else:
        break

# 模拟浏览器
user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) \
                            Gecko/20100101 Firefox/4.0.1'
headers = { 'User-Agent' : user_agent }
request = urllib2.Request(url=url, headers=headers)
# dbfolder = 'DB' 一个文件夹(如果不存在则创建)保存数据库文件
# if not os.path.exists(dbfolder):
#    os.mkdir(dbfolder)
# dbfile = dbfolder + time.strftime('%Y_%m',time.localtime()) + '.db' 

# 每个月一个数据库(e.g. 2011_05.db)
dbfile = time.strftime('%Y_%m',time.localtime()) + '.db' 
isconnected = False  # 网络连接状态
starttime = endtime = None
sleep_time = 30 # 每次循环的间隔(秒)

while True:
    try:
        urllib2.urlopen(request)
    except:# Exception, e:
        # print e
        # print isconnected
        if isconnected: # 连接第一次断开
            print 'end'
            endtime = time.time()
            # print endtime
            totaltime = (endtime - starttime)/60.0 #以1分钟为单位计时
            if totaltime%1 > 0:
                totaltime = int(totaltime) + 1 # 结果舍弃秒数,秒入为分
            print totaltime
            starttime = time.strftime('%Y/%m/%d %H:%M:%S',
                                time.localtime(starttime)) #格式化日期
            endtime = time.strftime('%Y/%m/%d %H:%M:%S',
                                time.localtime(endtime)) # 格式化日期
            print starttime
            print endtime
            while True:
                try:
                    conn = sqlite3.connect(dbfile)  # 连接数据库
                    cur = conn.cursor()  # 获取游标
                    insert_data(cur, starttime, endtime, totaltime) # 插入数据
                    total_month = query_sum(cur) # 获取当月中上网时间
                except:# Exception, e:
                    # print e
                    # 建表
                    cur.execute('''
                    CREATE TABLE time (
                      id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT DEFAULT 1,
                      starttime TEXT,
                      endtime   TEXT,
                      totaltime REAL
                    )
                    ''')
                else:
                    break
                finally:
                    conn.commit()  # 提交挂起的事务
                    cur.close() # 关闭游标
                    conn.close() # 关闭数据库连接
            print u'当月总上网时间:%s 分钟(%.2f 小时)' % (total_month, total_month/60.0)
            # pass
            isconnected = False # 标记连接状态为断开
    else:
        # print 'ok'
        if not isconnected: # 第一次连接
            print 'start'
            starttime = time.time()
            # print starttime
            isconnected = True
            # print isconnected
            # pass
    time.sleep(sleep_time) # 每过一段时间(秒)循环一次

posted @ 2011-06-03 14:27  mozillazg  阅读(859)  评论(1编辑  收藏  举报