精华内容
下载资源
问答
  • 如何拉取企业微信打卡数据

    千次阅读 2020-07-02 14:47:39
    拉取企业微信打卡数据这个功能我很早就做了,对于我来说我感觉挺简单的,今天我想把他分享出来了,帮助更多有需要的人。 本文涉及到阿里巴巴的JsonObject的解析,可参考我的另一篇blog。 1)了解企业微信相关...

    前言: 

    本篇文章主要介绍 拉取企业微信打卡数据这个功能。

    本文涉及到阿里巴巴的JsonObject的解析,可参考我的另一篇blog

    1)了解企业微信相关文档

    本文中涉及的一些专业术语可以参考:https://work.weixin.qq.com/api/doc/90000/90135/90665#corpid

     

    拉取企业微信打卡数据在OA数据接口这块, 这块的功能逻辑主要是这样的,

    a.企业微信会提供一个接口给你,你需要传入你们公司对应的打卡应用的id 和 打卡应用的秘钥,

    b.通过发送post 请求,封装请求的参数,

    c.得到企业微信返回的数据,一般情况下数据为json,接下来就可以解析json

     

    打卡的Api文档地址:

    https://work.weixin.qq.com/api/doc/90000/90135/90262

    2)获取打卡数据

    可以看到:要做拉取打卡数据功能,我们首先需要获取AccessToken,获取到AccessToken 后我们需要传入用户id.     

     

    A.TestController

        @GetMapping(value = "/listPushCardData")
        public void listPushCardData() {
            //获取本地打卡数据
            pushCardService.listPushCardData();
        }

    B.PushCardServiceImpl

    package com.test.service;
    
    /**
     * @Author tanghh
     * @Date 2020/7/2 11:40
     */
    public interface PushCardService {
        /**
         * 获取打卡数据
         */
        void listPushCardData();
    }

    C.PushCardServiceImpl

    package com.test.service.impl;
    
    import com.alibaba.fastjson.JSONObject;
    import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
    import com.test.model.PushCardVo;
    import com.test.service.PushCardService;
    import com.test.util.DateUtil;
    import com.test.util.QiWeiParametersUtil;
    import com.test.wechat.SendRequest;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Author tanghh
     * @Date 2020/7/2 11:40
     */
    @Service
    public class PushCardServiceImpl implements PushCardService {
    
        private Logger logger = LoggerFactory.getLogger(PushCardServiceImpl.class);
        /**
         * 获取打卡数据
         */
        /**
         * {
         * "opencheckindatatype": 3,
         * "starttime": 1492617600,
         * "endtime": 1492790400,
         * "useridlist": ["james","paul"]
         * }
         */
        @Override
        public void listPushCardData() {
            try {
                //1.获取打卡数据
                String accessToken = QiWeiParametersUtil.getPushCardAccessToken();
                //2.获取当天的开始时间和结束时间
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                String todayTime = simpleDateFormat.format(new Date());
                Map<String, Long> map = DateUtil.getStartTimeAndEndTime(todayTime);
                Long startTime = map.get("startTime");
                Long endTime = map.get("endTime");
    
                //3.封装请求参数
                PushCardVo vo = new PushCardVo();
                vo.setOpencheckindatatype(3);
                vo.setStarttime(startTime);
                vo.setEndtime(endTime);
                List userList = new ArrayList();
                userList.add("*****");
                vo.setUseridlist(userList);
                String jsonStr = JSONObject.toJSONString(vo);
                //4.发送请求
                String url = QiWeiParametersUtil.getPushCardUrl.replace("ACCESS_TOKEN",accessToken);
                JSONObject jsonObject = SendRequest.sendPost(url,jsonStr);
                List list = (List) jsonObject.get("checkindata");
                for (Object o : list) {
                    Map dataMap = (Map) o;
                    System.out.println("wifi的名字为:----"+dataMap.get("wifiname"));
                    System.out.println("用户id:----"+dataMap.get("userid"));
                    System.out.println("地址详情:----"+dataMap.get("location_detail"));
                    System.out.println("打卡类型:----"+dataMap.get("checkin_type"));
                }
    
    
    
    
            } catch (Exception e) {
                logger.error("获取打卡记录数据失败",e);
            }
        }
    }
    

    D.其中涉及的类

    QiWeiParametersUtil

    package com.test.util;
    
    import com.alibaba.fastjson.JSONObject;
    import com.test.wechat.SendRequest;
    
    /**
     * 企业微信参数配置类
     *
     * @Author: tanghh18
     * @Date: 2019/8/30 16:21
     */
    public class QiWeiParametersUtil {
        /**
         * 1.获取AccessToken
         */
        public static String getAccessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}";
    
        /**
         * 发送企业微信AccessToken
         */
        public static String sendAccessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";
    
        /**
         * 上传临时文件素材
         * @param
         * @return
         */
        public static String uploadMediaUrl="https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
        /**
         * 本地打卡数据
         */
        public static String getPushCardUrl = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=ACCESS_TOKEN";
    
        /**
         * 企业ID
         */
        public final static String corpId = "企业id";
    
        /**
         * 企业应用的id,整型。可在应用的设置页面查看(yes)项目测试(ebo0.2版本)
         */
        public final static int agentId = 1000049;
        /**
         * 应用secret
         */
        public static String secret = "yin";
        /**
         * 打卡应用的agentid
         */
        public static String punch_card_agentId = "3010011";
        /**
         * 打卡应用的secret
         */
        public static String punch_card_secret = "在打卡应用中可以看到";
    
        /**
         * 获得各种access_token
         *
         * @return
         */
        public static String getAccessToken() {
            String url = getAccessTokenUrl.replace("{corpid}", corpId).replace("{corpsecret}", secret);
            JSONObject departmentJson = SendRequest.sendGet(url);
            return departmentJson.getString("access_token");
        }
        /**
         * 获取打卡应用的Secret
         */
    
        public static String getPushCardAccessToken(){
            String url = getAccessTokenUrl.replace("{corpid}", corpId).replace("{corpsecret}", punch_card_secret);
            JSONObject pushCardJsonObject = SendRequest.sendGet(url);
            return pushCardJsonObject.getString("access_token");
        }
    }
    
    
     

    E.DateUtil

    package com.test.util;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Author tanghh
     * @Date 2020/7/2 11:30
     */
    public class DateUtil {
        /**
         * 获取一天的开始时间和结束时间
         */
        public static Map<String,Long> getStartTimeAndEndTime(String dateTime) throws ParseException {
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Map<String,Long>  map = new HashMap(3);
            Date date2 = format.parse(dateTime);
            // 一天的毫秒-1
            int dayMis = 1000 * 60 * 60 * 24;
            // 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
            // 当天的毫秒
            long curMillisecond = date2.getTime();
            // 当天最后一秒
            long resultMis = curMillisecond + (dayMis - 1);
            // 得到我需要的时间 当天最后一秒
            Date endDate = new Date(resultMis);
    
            //将数据保存到Map中
            map.put("startTime",date2.getTime()/1000);
            map.put("endTime",endDate.getTime()/1000);
            return map;
        }
    }
    

    SendRequest

    package com.test.wechat;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.io.*;
    import java.net.URL;
    import java.net.URLConnection;
    
    /**
     * 用来发送请求的类
     *
     * @Author: tanghh18
     * @Date: 2019/8/30 16:21
     */
    
    public class SendRequest {
        /**
         * 发送GET请求
         *
         * @param url
         * @return
         */
        public static JSONObject sendGet(String url) {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            HttpSession session = request.getSession();
            JSONObject jsonObject = null;
            StringBuffer sb = new StringBuffer();
            BufferedReader in = null;
            try {
                String urlName = url;
                URL realUrl = new URL(urlName);
                // 打开和URL之间的连接
                URLConnection conn = realUrl.openConnection();
                // 设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
                //针对群晖NAS请求,加一个Cookie
                if (session.getAttribute("sid") != null) {
                    conn.addRequestProperty("Cookie", "id=" + session.getAttribute("sid"));
                }
                conn.setConnectTimeout(10000);
                // 建立实际的连接
                conn.connect();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    sb.append(line);
                }
                jsonObject = JSON.parseObject(sb.toString());
            } catch (Exception e) {
                System.out.println("发送GET请求出现异常!" + e);
            } finally {
                // 使用finally块来关闭输入流
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException ex) {
                    System.out.println("关闭流异常");
                }
            }
            return jsonObject;
        }
    
    
        /**
         * 发送post请求(返回json)
         *
         * @param url
         * @param param
         * @return
         */
        public static JSONObject sendPost(String url, String param) {
            PrintWriter out = null;
            BufferedReader in = null;
            JSONObject jsonObject = null;
            String result = "";
            try {
                URL realUrl = new URL(url);
                // 打开和URL之间的连接
                URLConnection conn = realUrl.openConnection();
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
    //            conn.addRequestProperty("Cookie", "stay_login=1 smid=DumpWzWQSaLmKlFY1PgAtURdV_u3W3beoei96zsXkdSABwjVCRrnnNBsnH1wGWI0-VIflgvMaZAfli9H2NGtJg id=EtEWf1XZRLIwk1770NZN047804");//设置获取的cookie
                // 获取URLConnection对象对应的输出流(设置请求编码为UTF-8)
                out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
                // 发送请求参数
                out.print(param);
                // flush输出流的缓冲
                out.flush();
                // 获取请求返回数据(设置返回数据编码为UTF-8)
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                jsonObject = JSONObject.parseObject(result);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            return jsonObject;
        }
    
    }
    

    3) 测试拉取打卡数据

    访问:http://localhost:8084/listPushCardData

    本篇文章就到这里了 ,感谢阅读。

     

     

     

    展开全文
  • Android 钉钉、企业微信打卡小助手的源码;具体使用方法:安装个人端在自己手机上,公司端安装在放在公司的一台闲置手机上;打开公司端APP,复制ID粘贴到个人端上,就可以随时随地通过个人端发送消息给公司APP实现...
  • Android 钉钉、企业微信打卡小助手的APK;具体使用方法:安装个人端在自己手机上,公司端安装在放在公司的一台闲置手机上;打开公司端APP,复制ID粘贴到个人端上,就可以随时随地通过个人端发送消息给公司APP实现...
  • 最近接到一个类似钉钉打卡和企业微信打卡的项目。找我们开发的一个主要原因是,他们希望打卡记录能和具体的项目关联起来。后台在进行统计处理。钉钉和企业微信无法满足此功能。 涉及资料 1、企业微信定位功能。 ...

    背景
    最近接到一个类似钉钉打卡和企业微信打卡的项目。找我们开发的一个主要原因是,他们希望打卡记录能和具体的项目关联起来。后台在进行统计处理。钉钉和企业微信无法满足此功能。
    涉及资料
    1、企业微信定位功能。
    https://open.work.weixin.qq.com/api/doc/90000/90136/90504#%E8%8E%B7%E5%8F%96%E5%9C%B0%E7%90%86%E4%BD%8D%E7%BD%AE%E6%8E%A5%E5%8F%A3
    2、jqweui用来美化界面,让项目和微信界面看起来相对协调。
    http://www.jqweui.cn/
    主要问题
    1、jqweui的select是没有自带搜索功能的。要想实现搜索功能,把基础组件中的搜索栏和select结合起来使用。这里需要用到select的update方法,具体看文档。也就是搜索后更新下拉列表。
    2、select的change方法做好是用jqweiui封装起来的方法,利于获取回调的值。
    3、企业微信调用的授权采用easyWechat包来实现,非常快。页面上需要获取地理位置,用到企业微信的jssdk授权,有相关文档。如果采用框架模板输出,直接复制文档的js代码即可。
    jssdk授权文档地址:https://www.easywechat.com/docs/4.x/basic-services/jssdk
    4、获取企业微信用户信息文档:https://www.easywechat.com/docs/4.x/wework/oauth

    展开全文
  • 企业微信打卡神器

    2018-11-01 23:34:36
    一个修改应用位置工具,可以用来测试打卡,修改正打卡位置不正确等问题,同时可以分享自己的位置给好友。
  • python获取微信企业号打卡数据并生成windows计划任务来源:中文源码网浏览: 次日期:2019年11月5日python获取微信企业号打卡数据并生成windows计划任务由于公司的系统用的是Java版本,开通了企业号打卡之后又没有...

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

    来源:中文源码网    浏览: 次    日期:2019年11月5日

    python获取微信企业号打卡数据并生成windows计划任务由于公司的系统用的是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.cc

    import json # 因微信企业号返回的格式为json,所以引入json

    import requests

    import pymssql

    import math # 引入数学方法

    import time

    import datetime

    server = '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 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 = "http://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 = "http://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 = 'http://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 = 'http://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 sys

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

    进入到py文件目录

    python xxx.py总结

    以上所述是小编给大家介绍的python获取微信企业号打卡数据并生成windows计划任务,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对中文源码网网站的支持!

    如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    亲,试试微信扫码分享本页! *^_^*

    展开全文
  • 企业微信怎么设置打卡规则企业微信的考勤规则只有管理员才可以设置,管理员进入企业微信管理后台的「应用管理」页面,就可以看到「打卡」应用,进行规则设置了。也可以进入手机企业微信「工作台」的打卡功能,点击...

    0a4bfd06bfba0f7722bc6b03b2870fc2.png

    很多公司都会设置考勤要求,记录员工的出勤时长,与上下班时间。当企业使用企业微信移动办公时,可以直接使用企业微信自带的考勤功能进行记录,那么企业微信的考勤规则该如何设置呢?

    企业微信怎么设置打卡规则

    企业微信的考勤规则只有管理员才可以设置,管理员进入企业微信管理后台的「应用管理」页面,就可以看到「打卡」应用,进行规则设置了。

    6e34384eb7f3ac1a73f3b0dc79c80c3c.png

    也可以进入手机企业微信「工作台」的打卡功能,点击规则,进行设置。

    038a426598af2ff5cd19b4852c7e0a41.png

    进入页面后,按照公司情况,设置好打卡规则名称、规则类型、打卡人员、打卡地点、打卡时间等信息,并保存,规则就设置好了。

    f0b100b3552c582c9290757757404001.png

    企业微信管理员怎么看员工考勤

    设置好考勤规则后,员工就可以每天在企业微信中进行打卡了,当管理员需要查看员工的出勤情况,计算工资时,该如何查看出勤数据呢?

    这时依旧可以在手机端与管理端进行查看。手机端,我们进入打卡功能,点击统计,就可以查看到员工的出勤情况,还可以点击上方的月报,查看本月的出勤情况。

    5052574315a352fdd597e2359d54b5b7.png

    管理后台中,我们从「应用管理」中进入打卡功能,点击查看,就可以查看到具体的出勤情况,同样可以按月统计。

    798fa2d921fb33ee25418c5f7205c1f8.png

    有些朋友想要将员工的出勤记录导出,进行查看,这时只能在管理后台中导出哦,手机端不能进行导出。

    进入上述的考勤记录页面,在页面右上角中,就可以导出考勤日报或者考勤月报了。

    b18a197775694b1e068c4930db38bb36.png

    以上就是查看企业微信考勤记录方法了,企业微信除了可以用于移动办公外,还可以用来运营客户,但是企业微信的运营功能还不完善,大家如果想要高效运营客户,提升运营效率,可以使用企业微信SCRM系统的功能进行辅助。

    比如说微伴助手渠道活码、客户订单同步、外部红包、客户画像、企业微信会话存档等功能,可以帮助企业了解不同渠道的引流效果,完善客户画像,给客户精准推荐,提升转化率。需要体验这些功能,可以在微伴助手官网申请免费使用!

    企业微信营销_企业微信会话存档_私域流量运营-微伴助手官网weibanzhushou.com
    f2d98d6ee00a25d1de3b05c58038921b.png
    展开全文
  • 企业微信打卡统计员工考勤

    千次阅读 2020-08-13 10:50:50
    【第一步】调用企业微信的api接口获取当天的打卡记录 (获取的打卡记录是根据自己提交的时间戳来获取的,我只获取当天的打卡记录,是因为设置了定时器,每天11点自动调用接口插入到数据库) 企业微信api地址 获取...
  • kettle实例(获取企业微信打卡数据并将数据入库)Kettle简介流程简介从数据库中取出人员信息处理人员信息获取人员打卡信息将打卡信息入库如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • 开发企业微信打卡API笔记

    千次阅读 2018-12-11 16:21:00
    获取企业微信打开API上面的数据 根据企业ID和打卡模块的secret获取access_token 打卡传参body为json格式的字符传 创建打卡对象把参数写入,useridlist为list格式。转json 返回数据 企业微信调用代码 ...
  • 利用kettle获取企业微信打卡数据

    千次阅读 2018-10-29 13:53:12
    利用kettle创建转换,把转换根据顺序执行,生成作业,通过计划任务定时执行作业,把企业微信打卡记录插入到本地数据库中。   一、先获取打卡应用和通讯录的access_token,由于access_token是2小时的有效期,...
  • 调用企业微信打卡记录

    千次阅读 2019-10-30 10:01:21
    logger.error("企业微信调用失败 HttpClientPost " + jsobj.getShort("errcode")); return ""; } } catch (IOException e) { logger.error("getPunchRecord Error{}", e); } return ""; }  
  • <p>kettle新手,看完论坛相关帖子,仍无法进行实施,望各位大佬指点</p>
  • C#获取企业微信打卡数据

    千次阅读 2020-05-05 11:48:14
    }) /// /// 获取考勤打卡数据 /// public void GetAttendanceData() { ErrMessage msg = new ErrMessage(); msg.Message = ""; msg.Result = true; body rt = new body(); rt.opencheckindatatype = 3; rt....
  • 上班打卡是大多数上班狗每天都会做的事情,打卡的方式多种多样,越来越多企业通过企业微信进行考勤打卡,员工不用排队,直接在PC端或者手机端就可以进行打卡,高效又快捷。 但是面对新兴的打卡方式,有些企业员工也...
  • 苹果手机免越狱修改虚拟定位,需连接电脑。。
  • 原标题:微信打卡小程序上线,你会用吗?对于微信,这是大家都比较熟悉的东西,尤其是在当前,旗下用户量可以说达到了数亿的人脉。对此不少商家都很关注这个,尤其是该平台推出的小程序出现,更让很多企业为此受益。...
  • ThinkPHP微信打卡签到源码,对接支付,签到积分可兑奖,引流必备。 玩法规则 1、用户每日可支付 1 元参与早起打卡挑战 2、次日 5:00–8:00 打卡(高级版时间可自定义) 3、8 点 10 分后(定时任务会自动执行),按时打卡...
  • 企业微信的模拟打卡可以用这个,亲测有效,不会被查到, 不需要root,操作简单方便,内置视频教程,傻瓜也能学会。 自己用了三年了,一点儿问题都没有,妥妥的。
  • 一、背景目前有在项目分组...二、代码2.1 企业微信相关信息企业ID:corpidPython构建企业微信自动消息转发服务端自建应用appid自建应用secretPython构建企业微信自动消息转发服务端获取access_token api发送消息 api...
  • 【转】企业微信自动打卡设置

    千次阅读 2020-07-07 11:37:35
    企业微信没有打卡功能怎么办 现在企业微信是很多公司的首选的办公软件,其中打卡是员工不可缺少的一项任务,那么在企业微信上怎么打卡呢? 打卡功能是在企业微信工作台中使用的,如果员工打开企业微信手机端进入...
  • python +appium实现企业微信自动打卡

    千次阅读 2020-04-17 15:50:16
    利用appium启动企业微信,通过企业微信自动触发自动打卡。并截图。后续通过邮件发送附件至邮箱 from appium import webdriver import time class APP: def __init__(self, desired_caps, image_name): self....
  • # 滑动屏幕 os.popen("adb shell input swipe 300 2000 300 500") time.sleep(1) # 输入密码 os.popen("adb shell input text 密码") # 你的手机密码 time.sleep(1) def openwework(): """ 企业微信打卡 clock in ...
  • 本文演示利用企业微信群机器人,配置定时提醒群内所有人打卡。 一、添加机器人 建群后添加机器人,拿到Webhook地址: 二、编写Shell脚本 新建脚本文件workwx.sh,内容如下: #!/bin/bash curl '...
  • 企业微信_Java_项目版

    千人学习 2019-03-09 10:32:22
    针对企业微信项目开发遇到的AccessToken缓存,整合企业微信OA的企业微信打卡、企业微信审批、企业微信公费电话等知识点进行讲解。 课程给出蒲公英解决企业微信外网访问局域网的解决方案。

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 197
精华内容 78
关键字:

企业微信打卡