侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 5年前   875

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

安装python

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

安装第三方库

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

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

pip list

如果提示你需要更新,你可以更新,也可以不更新,更新命令其实给到你了python -m pip install --upgrade pip

安装所需要的库

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.ccimport json # 因微信企业号返回的格式为json,所以引入jsonimport requestsimport pymssqlimport math # 引入数学方法import timeimport datetimeserver = 'XX.XX.XX.XX' # 数据库服务器地址user = 'sa' # 数据库登录名,可以用sapassword = '******' # 数据库用户对应的密码dbName = 'DBNAME' # 数据库名称CORP_ID = 'XXXXXX' # 微信企业号提供的CORP_IDCORP_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 connection else:  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 userlist else:  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_token    else:     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_token     else:      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_token json_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_token   json_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_str    else:     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_str   else:    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 - oneday starttime = datetime_timestamp(yesterday.strftime('%Y-%m-%d') + ' 00:00:00') endtime = datetime_timestamp(today.strftime('%Y-%m-%d') + ' 23:59:59') opencheckindatatype = 3 access_token = get_access_token() if access_token:  useridlist = get_userid_list()  if useridlist:   step = 100   total = 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 syssys.prefix,回车

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

进入到py文件目录

python xxx.py

总结

以上所述是小编给大家介绍的python获取微信企业号打卡数据并生成windows计划任务,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


  • 上一条:
    局域网内python socket实现windows与linux间的消息传送
    下一条:
    Python第三方库face_recognition在windows上的安装过程
  • 昵称:

    邮箱:

    1条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客