利用python获取微信企业号打卡数据,并生成windows计划任务

  • 安装python
  • 安装第三方库
  • 写主程序
  • 设置Windows计划任务

由于公司的系统用的是Java版本,开通了企业号打卡之后又没有预算让供应商做数据对接,所以只能自己捣鼓这个,以下是个人设置的一些内容,仅供大家参考

安装python

python的安装,这里就不详细写了,大家可自行度娘或google。

安装第三方库

python安装好之后别忘记配置环境变量!另外,所以的内容都是安装在服务器上的,且服务器需要能够上外网,否则,只能配置在本地,因为需要外网连接微信企业号的接口。这里需要用到几个第三方库:

  1. python的pip命令,一般python安装好之后都会默认有,如果不确定,可输入命令查询,通过cmd进入命令提示符,输入

    pip list
    

    如果提示你需要更新,你可以更新,也可以不更新,更新命令其实给到你了

    python -m pip install --upgrade pip
    
  2. 安装所需要的库
    Step.1

    pip install pymssql
    

    如果安装pymssql出错,提示什么visual C++ 14,则先安装wheel,如不报错则忽略step2、step3
    Step.2

    pip install wheel
    

    Step.3
    下载pymssql-2.1.4.dev5-cp37-cp37m-win_amd64.whl
    可去这里下载最新版本的。pymssql下载
    下载好之后,进入该文件所在的目录,通过pip install安装即可

    cd D:\
    pip install pymssql-2.1.4.dev5-cp37-cp37m-win_amd64.whl
    

    step.4

    pip install requests
    

至此,所有第三方库都配置好了。

写主程序

# !/usr/bin/python
# -*- coding:utf-8 -*-
# @Time: 2018/7/26 16:05
# @Author: hychen.cc
import json # 因微信企业号返回的格式为json,所以引入json
import requests
import pymssql
import math # 引入数学方法
import time
import datetimeserver = 'XX.XX.XX.XX'    # 数据库服务器地址
user = 'sa'  # 数据库登录名,可以用sa
password = '******'  # 数据库用户对应的密码
dbName = 'DBNAME'    # 数据库名称
CORP_ID = 'XXXXXX'   # 微信企业号提供的CORP_ID
CORP_SECRET = 'XXXXX'    # 微信企业号提供的CORP_SECRET"""
因微信接口所需要unix时间戳,所以需要把时间转为为Unix时间戳格式
定义时间转换为Unix时间方法
"""
def datetime_timestamp(dt):# dt为字符串# 中间过程,一般都需要将字符串转化为时间数组time.strptime(dt, '%Y-%m-%d %H:%M:%S')## time.struct_time(tm_year=2018, tm_mon=10, tm_mday=25, tm_hour=10, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=88, tm_isdst=-1)# 将"2018-10-25 10:00:00"转化为时间戳s = time.mktime(time.strptime(dt, '%Y-%m-%d %H:%M:%S'))return int(s)# 定义连接数据库方法
def get_link_server():connection = pymssql.connect(server, user, password, database=dbName)if connection:return connectionelse:raise ValueError('Connect DBServer failed.')"""
定义获取用户列表,因为微信企业号一次最大只能获取100个,所以需要转换为列表格式,分批次获取
我这里设置是从DB中获取有权限微信打卡的人员(Select * From Table),换成自己的方式即可
"""
def get_userid_list():"""获取用户列表:return:"""conn = get_link_server()cursor = conn.cursor()sql = "Select * From Table"cursor.execute(sql)row = cursor.fetchone()userlist = []while row:userlist.append(row[0])row = cursor.fetchone()if userlist:return userlistelse:raise ValueError('Get Userlist failed.')conn.close()"""
获取Access_Token,因为Token有时效(2小时),所以需要存在本地,这样不需要频繁调用,所以我定义了存储过程(sP_GetWX_access_token)来判断之前存储的token是否有效,有效的话就不需要重复获取了
"""
def get_access_token(refresh=False):"""获取Access Token:return:"""if not refresh:API_ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s" % (CORP_ID, CORP_SECRET)response = requests.get(API_ACCESS_TOKEN_URL, verify=False)if response.status_code == 200:rep_dict = json.loads(response.text)errcode = rep_dict.get('errcode')if errcode:raise ValueError('Get wechat Access Token failed, errcode=%s.' % errcode)else:access_token = rep_dict.get('access_token')if access_token:conn = get_link_server()cursor = conn.cursor()cursor.execute('exec sP_GetWX_access_token @Access_Token=%s', access_token)conn.commit()conn.close()return access_tokenelse:raise ValueError('Get wechat Access Token failed.')else:raise ValueError('Get wechat Access Token failed.')else:conn = get_link_server()cursor = conn.cursor()cursor.execute("Select Access_Token From wx_AccessToken Where ID=1")access_token = cursor.fetchone()if access_token:return access_token[0]conn.close()else:API_ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s" % (CORP_ID, CORP_SECRET)response = requests.get(API_ACCESS_TOKEN_URL, verify=False)if response.status_code == 200:rep_dict = json.loads(response.text)errcode = rep_dict.get('errcode')if errcode:raise ValueError('Get wechat Access Token failed, errcode=%s.' % errcode)else:access_token = rep_dict.get('access_token')if access_token:conn = get_link_server()cursor = conn.cursor()cursor.execute('exec sP_GetWX_access_token @Access_Token=%s', access_token)conn.commit()conn.close()return access_tokenelse:raise ValueError('Get wechat Access Token failed.')else:raise ValueError('Get wechat Access Token failed.')# 获取微信打卡的json格式
def get_punchcard_info(access_token, opencheckindatatype, starttime, endtime, useridlist):API_PUNCH_CARD_URL = 'https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=' + access_tokenjson_str = json.dumps({'opencheckindatatype': opencheckindatatype, 'starttime': starttime, 'endtime': endtime, 'useridlist': useridlist})response = requests.post(API_PUNCH_CARD_URL, data=json_str, verify=False)if response.status_code == 200:rep_dic = json.loads(response.text)errcode = rep_dic.get('errcode')if errcode == 42001:access_token = get_access_token(True)API_PUNCH_CARD_URL = 'https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=' + access_tokenjson_str = json.dumps({'opencheckindatatype': opencheckindatatype, 'starttime': starttime, 'endtime': endtime,'useridlist': useridlist})response = requests.post(API_PUNCH_CARD_URL, data=json_str, verify=False)rep_dic = json.loads(response.text)errcode = rep_dic.get('errcode')if errcode:raise ValueError('Get punch data failed1, errcode=%s' % errcode)else:value_str = rep_dic.get('checkindata')if value_str:return value_strelse:raise ValueError('Get punch data failed2.')elif errcode:raise ValueError ('Get punch data failed3, errcode=%s' % errcode)else:value_str = rep_dic.get('checkindata')if value_str:return value_strelse:raise ValueError('I do not find employee punch data.')else:raise ValueError ('Get punch data failed5.')# 调用接口,获得数据
if __name__ == '__main__':today = datetime.date.today()oneday = datetime.timedelta(days=3)   # days,即获取几天内的yesterday = today - onedaystarttime = datetime_timestamp(yesterday.strftime('%Y-%m-%d') + ' 00:00:00')endtime = datetime_timestamp(today.strftime('%Y-%m-%d') + ' 23:59:59')opencheckindatatype = 3access_token = get_access_token()if access_token:useridlist = get_userid_list()if useridlist:step = 100total = len(useridlist)n = math.ceil(total/step)for i in range(n):# print (useridlist[i*step:(i+1)*step])punch_card = get_punchcard_info(access_token, opencheckindatatype, starttime, endtime,useridlist[i*step:(i+1)*step])# print (punch_card)if punch_card:conn = get_link_server()cursor = conn.cursor()for dic_obj in punch_card:cursor.execute('exec sp_AnalysisPunchCard @Json=%s',(json.dumps(dic_obj, ensure_ascii=False)))# print((json.dumps(dic_obj, ensure_ascii=False))),sp_AnalysisPunchCard把获取到的数据解析后存入数据库中conn.commit()conn.close()print ('Get punch card successed.')else:raise ValueError('No userlist exists')

设置Windows计划任务

通过控制面板-管理工具-任务计划程序,右击选择创建基本任务,这里注意的是路径和程序。





程序或脚本:python.exe
添加参数(可选)(A):你的py文件目录
起始于:python目录,如果不知道python安装到哪去了,按照下列cmd命令,输入python后进入python命令查询

import sys
sys.prefix,回车

到此,配置完成,可自行右击任务-执行查询效果,或者通过python命令执行py文件

  1. 进入到py文件目录
  2. python xxx.py

利用python获取微信企业号打卡数据,并生成windows计划任务相关推荐

  1. python 打卡程序_python获取微信企业号打卡数据并生成windows计划任务

    由于公司的系统用的是Java版本,开通了企业号打卡之后又没有预算让供应商做数据对接,所以只能自己捣鼓这个,以下是个人设置的一些内容,仅供大家参考 安装python python的安装,这里就不详细写了 ...

  2. uni-app利用uniCloud获取微信步数并将数据写入数据库

    uni-app利用uniCloud获取微信步数并将数据写入数据库 本项目依赖了uni-id 只是毕业设计,想法不完善,没有对用户授权失败做处理,如果编写的时候需要注意 第一步:调用wx.login() ...

  3. 实战教程!利用Python获取数据,并在地图上批量标注

    我们想要在地图上批量标注某一类的大量点位,该怎么操作呢?没有它的坐标数据,就没有办法批量标注.今天给大家介绍下,来自图新地球用户王泽的原创教程--利用Python获取数据,并在地图上批量标注的方法! ...

  4. 可转债代码交流第二期:利用Python获取集思录数据(改)

    上期内容讲解了宁稳网数据获取的方法(用于初步计算未上市可转债价格),具体方法参考第一期:可转债代码交流第一期:利用Python获取宁稳网数据(包含基本的环境搭建与Python编辑器安装方法) 本人并非 ...

  5. 利用python获取word图表数据和修改图表信息

    利用python获取word图表数据和修改图表信息 起因咸鱼有个人问word怎么修改图表信息,想用docx库找不到关于图表的方法,这里用了Win32com. import time import wi ...

  6. 利用 Python 获取余额宝历史收益数据

    最近想做一个关于用一些指数基金与余额宝组成的简单 风险-无风险 投资组合的实验计算,发现通达信之类的行情软件并没有提供完整的余额宝收益信息,如通达信仅有年化收益率的数据,并没有万份收益的数据.因此考虑 ...

  7. 利用Python制作微信机器人(二)

    上次写了利用Python制作微信机器人,其中只实现了通过api来控制微信机器人来给自己发送消息,具体详情可查看: 利用Python制作微信机器人(一) 本篇博客主要编写如何是实现给微信机器人发送消息, ...

  8. python为啥爬取数据会有重复_利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?...

    原标题:利用Python来爬取"吃鸡"数据,为什么别人能吃鸡? 首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波 ...

  9. 利用Python制作微信机器人(三)实现爬取JD商品价格

    从前两篇的博客来看,目前已经实现了机器人单向给微信发消息,和与机器人进行交互式发消息,详情如下: 利用Python制作微信机器人(一)机器人单向发消息 利用Python制作微信机器人(二)与机器人进行 ...

最新文章

  1. 从零开始写个编译器吧 - 单词化简述(Tokenization)
  2. Java平均工资再次上涨!这份宝藏资料限量免费送!
  3. JAVA 中BIO,NIO,AIO的理解
  4. python语言编程入门先学什么-初学者先学习python语言还是C语言
  5. 鸟哥的Linux私房菜(基础篇)- 第十五章、磁碟配额(Quota)与进阶文件系统管理
  6. G1垃圾收集器设计目标与改良手段【纯理论】
  7. 映射到另一台计算机,远程服务器硬盘映射到本地电脑
  8. CentOS 6.5源码编译安装MySQL 5.6
  9. python基础之模块初识
  10. vue 前端使用 element-ui 实现省市级联动
  11. 2021年道路运输企业安全生产管理人员考试试卷及道路运输企业安全生产管理人员实操考试视频
  12. 经典面试题 Ipv4 和 Ipv6 是什么
  13. 服务器gpu芯片排行,GPU云服务器排行榜
  14. 概率逗号分号_概率P中有多个逗号表示什么意思
  15. c语言打鱼晒网问题报告书,2021年C语言渔夫打鱼晒网问题.pdf
  16. 心流_追求生命的意义
  17. vue获取上一个页面路由地址
  18. con 元器件符号_关于元器件名称、符号和封装的命名问题
  19. 常见思维模型汇总(一)
  20. 流量监控-ntopng

热门文章

  1. Laravel 5中文视频教程和学习资源收集
  2. 【ChatGLM】使用ChatGLM-6B-INT4模型进行P-Tunning训练记录及参数讲解
  3. 银行微信小游戏平台构建
  4. 收到“云栖”寄送的丁酉鸡年礼物“阿里家书”
  5. Latex+英文论文+工具+邮箱客户端不能登录
  6. 拿到一台新Windows 10电脑后,我将如何配置电脑/安装软件
  7. jfinal mysql存储过程_jfinal如何调用存储过程?
  8. Chromium分发输入事件给WebKit处理的过程分析
  9. 安装或卸载软件提示权限不足
  10. 终极面试技巧——催眠对话和反面试