python獲取微信企業(yè)號打卡數(shù)據(jù)并生成windows計劃任務(wù)
由于公司的系統(tǒng)用的是Java版本,開通了企業(yè)號打卡之后又沒有預(yù)算讓供應(yīng)商做數(shù)據(jù)對接,所以只能自己搗鼓這個,以下是個人設(shè)置的一些內(nèi)容,僅供大家參考
安裝python
python的安裝,這里就不詳細(xì)寫了,大家可自行度娘或google。
安裝第三方庫
python安裝好之后別忘記配置環(huán)境變量!另外,所以的內(nèi)容都是安裝在服務(wù)器上的,且服務(wù)器需要能夠上外網(wǎng),否則,只能配置在本地,因?yàn)樾枰饩W(wǎng)連接微信企業(yè)號的接口。這里需要用到幾個第三方庫:
python的pip命令,一般python安裝好之后都會默認(rèn)有,如果不確定,可輸入命令查詢,通過cmd進(jìn)入命令提示符,輸入
pip list
如果提示你需要更新,你可以更新,也可以不更新,更新命令其實(shí)給到你了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下載
下載好之后,進(jìn)入該文件所在的目錄,通過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 # 因微信企業(yè)號返回的格式為json,所以引入json import requests import pymssql import math # 引入數(shù)學(xué)方法 import time import datetime server = 'XX.XX.XX.XX' # 數(shù)據(jù)庫服務(wù)器地址 user = 'sa' # 數(shù)據(jù)庫登錄名,可以用sa password = '******' # 數(shù)據(jù)庫用戶對應(yīng)的密碼 dbName = 'DBNAME' # 數(shù)據(jù)庫名稱 CORP_ID = 'XXXXXX' # 微信企業(yè)號提供的CORP_ID CORP_SECRET = 'XXXXX' # 微信企業(yè)號提供的CORP_SECRET """
因微信接口所需要unix時間戳,所以需要把時間轉(zhuǎn)為為Unix時間戳格式
定義時間轉(zhuǎn)換為Unix時間方法
"""def datetime_timestamp(dt): # dt為字符串 # 中間過程,一般都需要將字符串轉(zhuǎn)化為時間數(shù)組 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"轉(zhuǎn)化為時間戳 s = time.mktime(time.strptime(dt, '%Y-%m-%d %H:%M:%S')) return int(s) # 定義連接數(shù)據(jù)庫方法 def get_link_server(): connection = pymssql.connect(server, user, password, database=dbName) if connection: return connection else: raise ValueError('Connect DBServer failed.') """
定義獲取用戶列表,因?yàn)槲⑿牌髽I(yè)號一次最大只能獲取100個,所以需要轉(zhuǎn)換為列表格式,分批次獲取
我這里設(shè)置是從DB中獲取有權(quán)限微信打卡的人員(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,因?yàn)門oken有時效(2小時),所以需要存在本地,這樣不需要頻繁調(diào)用,所以我定義了存儲過程(sP_GetWX_access_token)來判斷之前存儲的token是否有效,有效的話就不需要重復(fù)獲取了
""" 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.') # 調(diào)用接口,獲得數(shù)據(jù) if __name__ == '__main__': today = datetime.date.today() oneday = datetime.timedelta(days=3) # days,即獲取幾天內(nèi)的 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把獲取到的數(shù)據(jù)解析后存入數(shù)據(jù)庫中 conn.commit() conn.close() print ('Get punch card successed.') else: raise ValueError('No userlist exists')
設(shè)置Windows計劃任務(wù)
通過控制面板-管理工具-任務(wù)計劃程序,右擊選擇創(chuàng)建基本任務(wù),這里注意的是路徑和程序。
程序或腳本:python.exe
添加參數(shù)(可選)(A):你的py文件目錄
起始于:python目錄,如果不知道python安裝到哪去了,按照下列cmd命令,輸入python后進(jìn)入python命令查詢
import sys sys.prefix,回車
到此,配置完成,可自行右擊任務(wù)-執(zhí)行查詢效果,或者通過python命令執(zhí)行py文件
進(jìn)入到py文件目錄
python xxx.py
總結(jié)
以上所述是小編給大家介紹的python獲取微信企業(yè)號打卡數(shù)據(jù)并生成windows計劃任務(wù),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- python實(shí)現(xiàn)自動打卡小程序
- Python實(shí)現(xiàn)釘釘/企業(yè)微信自動打卡的示例代碼
- 基于python+selenium自動健康打卡的實(shí)現(xiàn)代碼
- python實(shí)現(xiàn)自動打卡的示例代碼
- python+selenium 簡易地疫情信息自動打卡簽到功能的實(shí)現(xiàn)代碼
- Python + selenium + crontab實(shí)現(xiàn)每日定時自動打卡功能
- Python 實(shí)現(xiàn)網(wǎng)課實(shí)時監(jiān)控自動簽到、打卡功能
- Python實(shí)現(xiàn)i人事自動打卡的示例代碼
- 使用Python實(shí)現(xiàn)企業(yè)微信的自動打卡功能
- Python實(shí)戰(zhàn)之單詞打卡統(tǒng)計
相關(guān)文章
Qt5.14 與 OpenCV4.5 教程之圖片增強(qiáng)效果
這篇文章主要介紹了Qt5.14 與 OpenCV4.5 教程之圖片增強(qiáng)效果的實(shí)現(xiàn),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11Python復(fù)合賦值運(yùn)算符由淺入深實(shí)例探究
這篇文章主要為大家介紹了Python復(fù)合賦值運(yùn)算符由淺入深實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01使用Python+Matplotlib制作時序動態(tài)圖
時序圖是一個二維圖,橫軸表示對象,縱軸表示時間,消息在各對象之間橫向傳遞,依照時間順序縱向排列,可以直觀的描述并發(fā)進(jìn)程,所以本文就使用Python和Matplotlib制作一個簡單的時許動態(tài)圖,感興趣的跟著小編一起來看看吧2023-07-07解決Django中修改js css文件但瀏覽器無法及時與之改變的問題
今天小編就為大家分享一篇解決Django中修改js css文件但瀏覽器無法及時與之改變的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python+Tkinter實(shí)現(xiàn)RGB數(shù)值轉(zhuǎn)換為16進(jìn)制碼
這篇文章主要為大家詳細(xì)介紹了Python如何利用Tkinter編寫一個RGB數(shù)值轉(zhuǎn)換為16進(jìn)制碼的小工具,文中的示例代講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01python批量從es取數(shù)據(jù)的方法(文檔數(shù)超過10000)
今天小編就為大家分享一篇python批量從es取數(shù)據(jù)的方法(文檔數(shù)超過10000),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12使用python+requests+pytest實(shí)現(xiàn)接口自動化
這篇文章主要介紹了使用python+requests+pytest實(shí)現(xiàn)接口自動化,在當(dāng)前互聯(lián)網(wǎng)產(chǎn)品迭代頻繁的背景下,回歸測試的時間越來越少,但接口自動化測試因其實(shí)現(xiàn)簡單、維護(hù)成本低,容易提高覆蓋率等特點(diǎn),越來越受重視,需要的朋友可以參考下2023-08-08