签到检测程序,解析github提供的api内的json,解决了服务器和本地时间不同步的问题(时差+8H),实现按日期更新当前签到表。下一步是从api获取organization的信息,求出未签到的成员ID。(女朋友在写啦~)

  1 #coding=utf-8
  2 import urllib
  3 import re
  4 import json
  5 import time
  6
  7 # 记录签到情况的set
  8 check = set()
  9
 10 # 日期
 11 class Date:
 12     year = 0
 13     month = 0
 14     day = 0
 15     hour = 0
 16     minute = 0
 17     second = 0
 18     def __init__(self, year, month, day, hour, minute, second, cflag):
 19         # 处理本地与服务器所在地的时差问题 +8h
 20         if cflag == 1:
 21             common = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
 22             leap = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
 23             hour += 8
 24             if hour > 24:
 25                 hour -= 24
 26                 day += 1
 27                 if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
 28                     if day > leap[month]:
 29                         day -= leap[month]
 30                         month += 1
 31                 else:
 32                     if day > common[month]:
 33                         day -= common[month]
 34                         month += 1
 35                 if month > 12:
 36                     year += 1
 37                     month -= 12
 38         self.year = year
 39         self.month = month
 40         self.day = day
 41         self.hour = hour
 42         self.minute = minute
 43         self.second = second
 44
 45
 46 # 存储用户信息
 47 class User:
 48     name = ''
 49     date = Date(0, 0, 0, 0, 0, 0, 0)
 50     def __init__(self, name, date):
 51         self.name = name
 52         self.date = date
 53
 54 # GitHub Api URL
 55 gitHubCommitsApi = 'https://api.github.com/repos/aplusb/Let-the-bass-kick/commits'
 56
 57 # 获取json
 58 def getJson(url):
 59     page = urllib.urlopen(url)
 60     html = page.read()
 61     return html
 62
 63 # 保存json, commits.json
 64 def saveJSON(html, fileNeme):
 65     fileWrite = open(fileNeme, 'w')
 66     fileWrite.write(html)
 67     fileWrite.close()
 68
 69 # 处理json
 70 def processJSON(commits):
 71     users = []
 72     pr = json.loads(commits)
 73     for each in pr:
 74         name = each["commit"]["author"]["name"]
 75         date = each["commit"]["author"]["date"]
 76         yy = int(date[:4])
 77         mm = int(date[5:7])
 78         dd = int(date[8:10])
 79         hh = int(date[11:13])
 80         mi = int(date[14:16])
 81         ss = int(date[17:19])
 82         users.append(User(name, Date(yy, mm, dd, hh, mi, ss, 1)))
 83     return users
 84
 85 # 获取当天信息
 86 def getToday():
 87     ISOTIMEFORMAT = '%Y-%m-%dT%XZ'
 88     curDate = time.strftime(ISOTIMEFORMAT, time.localtime())
 89     yy = int(curDate[:4])
 90     mm = int(curDate[5:7])
 91     dd = int(curDate[8:10])
 92     hh = int(curDate[11:13])
 93     mi = int(curDate[14:16])
 94     ss = int(curDate[17:19])
 95     return Date(yy, mm, dd, hh, mi, ss, 0)
 96
 97 # 统计当天的commit情况
 98 def checkTimes(users):
 99     today = getToday()
100     for each in users:
101         if  today.year == each.date.year and today.month == each.date.month and today.day == each.date.day:
102             check.add(each.name)
103
104 # 展示当天签到情况
105 def show(users, check):
106     for each in users:
107         print '%-20s %s-%s-%s %s:%s:%s' % (each.name, str(each.date.year).zfill(4),
108                                            str(each.date.month).zfill(2), str(each.date.day).zfill(2),
109                                            str(each.date.hour).zfill(2), str(each.date.minute).zfill(2),
110                                            str(each.date.second).zfill(2))
111     print '----------------------Today checked----------------------'
112     for each in check:
113         print '%s' % each
114
115 # 读取之前的签到情况
116 def readStatus():
117     fileRead = open('checked.txt', 'r')
118     ISOTIMEFORMAT = '%Y-%m-%dT%XZ'
119     today = time.strftime(ISOTIMEFORMAT, time.localtime())
120     curDate = fileRead.readline()
121     done = 0
122     # 初始化新文件
123     if curDate == '':
124         return
125     # 判断是不是today保存过的签到情况,如果是则读取信息
126     if int(curDate[:4]) == int(today[:4]) and int(curDate[5:7]) == int(today[5:7]) and int(curDate[8:10]) == int(today[8:10]):
127         while not done:
128             entry = fileRead.readline()
129             # 去空行
130             entry = entry.strip('\n')
131             if entry != '':
132                 check.add(entry)
133             else:
134                 done = 1
135     fileRead.close()
136
137 # 保存统计结果
138 def saveStatus():
139     fileWrite = open('checked.txt', 'w')
140     # 打时间戳
141     ISOTIMEFORMAT = '%Y-%m-%dT%XZ'
142     today = time.strftime(ISOTIMEFORMAT, time.localtime())
143     fileWrite.write(today)
144     fileWrite.write('\n')
145     # 保存信息
146     for each in check:
147         fileWrite.write(each)
148         fileWrite.write('\n')
149     fileWrite.close()
150
151
152 # 保存当前仍未签到的ID
153
154 def __main__():
155     commits = getJson(gitHubCommitsApi)
156     fileName = 'commits.json'
157     readStatus()
158     saveJSON(commits, fileName)
159     users = processJSON(commits)
160     checkTimes(users)
161     saveStatus()
162     show(users, check)
163
164
165 __main__()

转载于:https://www.cnblogs.com/kirai/p/5469055.html

[每天一道A+B]签到检测程序相关推荐

  1. 只需6步,教你从零开发一个签到小程序

    摘要:针对于具备瞬时流量.业务场景比较简单的小程序,开发者借助FunctionGraph,可以方便快捷的搭建一个健壮的小程序后台. 本文分享自华为云社区<智慧校园想搞好,FunctionGrap ...

  2. 基于微软DEVCON的[一键禁用前面板插孔检测]程序

    一.问题概述 许多带有还原卡的计算机(比如学校机房的电脑),没有音响设备,需要佩戴耳机才能听到声音.但是由于初始配置问题,有些机房的电脑插入耳机仍然听不到声音. 电脑右下角任务栏音量调节图标状态如下图 ...

  3. Python与OpenCV(二)——基于背景差分法的运动目标检测程序分析

    背景差分法是传统运动目标检测算法中最常用的方法.其基本原理如图所示. 从图中可知,背景差分法是通过建立背景模型,比较当前帧与背景模型对应像素的差异点来检测运动目标的方法. 背景模型的建立主要通过两种方 ...

  4. 如何制作人脸微笑检测程序

    这里介绍一个深度学习的简单应用,制作一个微笑检测程序.用深度学习技术做分类,然后再用OpenCV的级联分类器做人脸识别,基本可以做到实时检测. 下面介绍微笑脸分类模型的构建: 数据介绍 数据地址:ht ...

  5. MFC检测程序未响应

    MFC检测程序未响应 | 火苗999℃的博客 UpdateData();CWnd* hwnd = FindWindow(NULL, m_szName);// m_szName 程序名称if (NULL ...

  6. 【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计]

    ✅ 通过对 [计算机与UNIX汇编原理 ① ~ ⑫]的学习,我们已经大致掌握了汇编程序设计的相关知识 接下来,我将其分栏名改为 [计算机原理与接口技术(UNIX) ],重点将放在 "计算机原 ...

  7. node.js毕业设计微信签到小程序(源码+程序+LW+部署)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: Node.js+ Vscode + Mysql5.7 + HBuilderX+Navicat11+Vue ...

  8. 硬盘检测程序HDTunePro V4.6

    硬盘检测程序HDTunePro  V4.6 转载于:https://blog.51cto.com/162810/571068

  9. android内存检测方法,Android_Android系统检测程序内存占用各种方法,1.检查系统总内存 复制代码 - phpStudy...

    Android系统检测程序内存占用各种方法 1.检查系统总内存 liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal:         840868 kB ...

最新文章

  1. Express4.x API (四):Router (译)
  2. JQUERY 阻止a 标签链接
  3. photoshop ps 拉长裙子 方法
  4. Django(part3)--制作我的第一个网页
  5. 简述python爬虫_python爬虫入门篇了解
  6. MyBatis映射文件1(增删改、insert获取自增主键值)
  7. GPS围栏两个多边形相交问题的奇葩解法
  8. C++学到什么程度才算是精通?
  9. 自然语言处理能够把全网内容组织到什么程度?
  10. css 3 制作水波状进度条
  11. libvpx enabled but no supported decoders found
  12. liunx Swap 分区的作用
  13. 2021 CSDN查看自己关注的人
  14. 企业级即时通讯通信平台的实现
  15. 一键批量修改文件夹名称
  16. 【电脑讲解】电脑知识入门大全,超详细电脑基础知识讲解
  17. ecshop 添加php标签,ECSHOP模板标签【ecshop标签大全】ecshop标签手册
  18. 阿里云IOT设备数据接入 (从阿里云IOT云平台获取设备数据)
  19. HTTP状态码--1XX
  20. dns服务器配置(本地dns,自己当服务器,自己测试自己)

热门文章

  1. android6.0源码分析之Camera API2.0简介
  2. clickhouse数据手动迁移
  3. JZOJ 5234. 【NOIP2017模拟8.7A组】外星人的路径
  4. JZOJ 100043. 【NOIP2017提高A组模拟7.13】第K小数
  5. 世界地图20亿像素_高通骁龙690 5G平台发布,支持1.92亿像素性能提升20%
  6. linux查看fifo内容,linux 有名管道(FIFO)
  7. VS中怎么新建Web服务器项目,VS中新建网站和新建WEB项目的区别
  8. python网络爬虫(14)使用Scrapy搭建爬虫框架
  9. HailStone序列
  10. 程序员的数学--排列组合(2)