package QQ::weixin::work::externalcontact::groupchat; =encoding utf8 =head1 Name QQ::weixin::work::externalcontact::groupchat =head1 DESCRIPTION 客户è”ç³»->离èŒç»§æ‰¿ =cut use strict; use base qw(QQ::weixin::work::externalcontact); use Encode; use LWP::UserAgent; use JSON; use utf8; our $VERSION = '0.06'; our @EXPORT = qw/ transfer list get add_join_way get_join_way update_join_way del_join_way statistic statistic_group_by_day /; =head1 FUNCTION =head2 transfer(access_token, hash); 分é…离èŒæˆå‘˜çš„客户群 =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92127> =head3 请求说明: ä¼ä¸šå¯é€šè¿‡æ¤æŽ¥å£ï¼Œå°†å·²ç¦»èŒæˆå‘˜ä¸ºç¾¤ä¸»çš„群,分é…ç»™å¦ä¸€ä¸ªå®¢æœæˆå‘˜ã€‚ =head4 请求包结构体为: { "chat_id_list" : ["wrOgQhDgAAcwMTB7YmDkbeBsgT_AAAA", "wrOgQhDgAAMYQiS5ol9G7gK9JVQUAAAA"], "new_owner" : "zhangsan" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ chat_id_list 是 需è¦è½¬ç¾¤ä¸»çš„客户群ID列表。å–值范围: 1 ~ 100 new_owner 是 新群主ID 注æ„: 群主离èŒäº†çš„客户群,æ‰å¯ç»§æ‰¿ 继承给的新群主,必须是é…置了客户è”系功能的æˆå‘˜ 继承给的新群主,必须有设置实å 继承给的新群主,必须有激活ä¼ä¸šå¾®ä¿¡ åŒä¸€ä¸ªäººçš„群,é™åˆ¶æ¯å¤©æœ€å¤šåˆ†é…300个给新群主 =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 第三方应用需拥有“ä¼ä¸šå®¢æˆ·æƒé™->客户è”ç³»->分é…离èŒæˆå‘˜çš„客户群â€æƒé™ 对于第三方/自建应用,群主必须在应用的å¯è§èŒƒå›´ã€‚ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok", "failed_chat_list": [ { "chat_id": "wrOgQhDgAAcwMTB7YmDkbeBsgT_KAAAA", "errcode": 90500, "errmsg": "the owner of this chat is not resigned" } ] } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 failed_chat_list 没能æˆåŠŸç»§æ‰¿çš„群 failed_chat_list.chat_id 没能æˆåŠŸç»§æ‰¿çš„群ID failed_chat_list.errcode 没能æˆåŠŸç»§æ‰¿çš„群,错误ç failed_chat_list.errmsg 没能æˆåŠŸç»§æ‰¿çš„群,错误æè¿° =cut sub transfer { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/transfer?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 list(access_token, hash); 获å–客户群列表 =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92120> =head3 请求说明: 该接å£ç”¨äºŽèŽ·å–é…置过客户群管ç†çš„客户群列表。 =head4 请求包结构体为: { "status_filter": 0, "owner_filter": { "userid_list": ["abel"] }, "cursor" : "r9FqSqsI8fgNbHLHE5QoCP50UIg2cFQbfma3l2QsmwI", "limit" : 10 } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ status_filter å¦ å®¢æˆ·ç¾¤è·Ÿè¿›çŠ¶æ€è¿‡æ»¤ã€‚ 0 - 所有列表(å³ä¸è¿‡æ»¤) 1 - 离èŒå¾…继承 2 - 离èŒç»§æ‰¿ä¸ 3 - 离èŒç»§æ‰¿å®Œæˆ 默认为0 owner_filter å¦ ç¾¤ä¸»è¿‡æ»¤ã€‚ 如果ä¸å¡«ï¼Œè¡¨ç¤ºèŽ·å–应用å¯è§èŒƒå›´å†…全部群主的数æ®ï¼ˆä½†æ˜¯ä¸å»ºè®®è¿™ä¹ˆç”¨ï¼Œå¦‚æžœå¯è§èŒƒå›´äººæ•°è¶…过1000人,为了防æ¢æ•°æ®åŒ…过大,会报错 81017) owner_filter.userid_list å¦ ç”¨æˆ·ID列表。最多100个 cursor å¦ ç”¨äºŽåˆ†é¡µæŸ¥è¯¢çš„æ¸¸æ ‡ï¼Œå—符串类型,由上一次调用返回,首次调用ä¸å¡« limit 是 分页,预期请求的数æ®é‡ï¼Œå–值范围 1 ~ 1000 如果ä¸æŒ‡å®š owner_filter,会拉å–应用å¯è§èŒƒå›´å†…的所有群主的数æ®ï¼Œä½†æ˜¯ä¸å»ºè®®è¿™æ ·ä½¿ç”¨ã€‚如果å¯è§èŒƒå›´å†…人数超过1000人,为了防æ¢æ•°æ®åŒ…过大,会报错 81017。æ¤æ—¶ï¼Œè°ƒç”¨æ–¹éœ€é€šè¿‡æŒ‡å®š owner_filter æ¥ç¼©å°æ‹‰å–范围 旧版接å£ä»¥offset+limit分页,è¦æ±‚offset+limitä¸èƒ½è¶…过50000,该方案将废弃,请改用cursor+limit分页 =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 第三方应用需具有“ä¼ä¸šå®¢æˆ·æƒé™->客户基础信æ¯â€æƒé™ 对于第三方/自建应用,群主必须在应用的å¯è§èŒƒå›´ã€‚ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok", "group_chat_list": [{ "chat_id": "wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA", "status": 0 }, { "chat_id": "wrOgQhDgAAcwMTB7YmDkbeBsAAAA", "status": 0 }], "next_cursor":"tJzlB9tdqfh-g7i_J-ehOz_TWcd7dSKa39_AqCIeMFw" } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 group_chat_list 客户群列表 group_chat_list.chat_id 客户群ID group_chat_list.status 客户群跟进状æ€ã€‚ 0 - 跟进人æ£å¸¸ 1 - è·Ÿè¿›äººç¦»èŒ 2 - 离èŒç»§æ‰¿ä¸ 3 - 离èŒç»§æ‰¿å®Œæˆ next_cursor åˆ†é¡µæ¸¸æ ‡ï¼Œä¸‹æ¬¡è¯·æ±‚æ—¶å¡«å†™ä»¥èŽ·å–之åŽåˆ†é¡µçš„记录。如果该å—æ®µè¿”å›žç©ºåˆ™è¡¨ç¤ºå·²æ²¡æœ‰æ›´å¤šæ•°æ® =cut sub list { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/list?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 get(access_token, hash); 获å–客户群详情 =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92122> =head3 请求说明: 通过客户群ID,获å–详情。包括群åã€ç¾¤æˆå‘˜åˆ—表ã€ç¾¤æˆå‘˜å…¥ç¾¤æ—¶é—´ã€å…¥ç¾¤æ–¹å¼ã€‚(客户群是由具有客户群使用æƒé™çš„æˆå‘˜åˆ›å»ºçš„外部群) 需注æ„的是,如果å‘生群信æ¯å˜åŠ¨ï¼Œä¼šç«‹å³æ”¶åˆ°ç¾¤å˜æ›´äº‹ä»¶ï¼Œä½†æ˜¯éƒ¨åˆ†ä¿¡æ¯æ˜¯å¼‚æ¥å¤„ç†ï¼Œå¯èƒ½éœ€è¦ç‰ä¸€æ®µæ—¶é—´è°ƒæ¤æŽ¥å£æ‰èƒ½å¾—到最新结果 =head4 请求包结构体为: { "chat_id":"wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA", "need_name" : 1 } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ chat_id 是 客户群ID need_name å¦ æ˜¯å¦éœ€è¦è¿”回群æˆå‘˜çš„åå—group_chat.member_list.name。0-ä¸è¿”回;1-返回。默认ä¸è¿”回 =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?) 第三方应用需具有“ä¼ä¸šå®¢æˆ·æƒé™->客户基础信æ¯â€æƒé™ 对于第三方/自建应用,群主必须在应用的å¯è§èŒƒå›´ã€‚ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok", "group_chat": { "chat_id": "wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA", "name": "销售客æœç¾¤", "owner": "ZhuShengBen", "create_time": 1572505490, "notice": "文明沟通,拒ç»è„è¯", "member_list": [{ "userid": "abel", "type": 1, "join_time": 1572505491, "join_scene": 1, "invitor": { "userid": "jack" }, "group_nickname" : "客æœå°å¼ ", "name" : "å¼ ä¸‰ä¸°" }, { "userid": "wmOgQhDgAAuXFJGwbve4g4iXknfOAAAA", "type": 2, "unionid": "ozynqsulJFCZ2z1aYeS8h-nuasdAAA", "join_time": 1572505491, "join_scene": 1, "group_nickname" : "顾客è€çŽ‹", "name" : "王è¯å«£" }], "admin_list": [{ "userid": "sam" }, { "userid": "pony" }] } } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 group_chat 客户群详情 group_chat.chat_id 客户群ID group_chat.name 群å group_chat.owner 群主ID group_chat.create_time 群的创建时间 group_chat.notice 群公告 group_chat.member_list 群æˆå‘˜åˆ—表 group_chat.member_list.userid 群æˆå‘˜id group_chat.member_list.type æˆå‘˜ç±»åž‹ã€‚ 1 - ä¼ä¸šæˆå‘˜ 2 - 外部è”系人 group_chat.member_list.unionid 外部è”系人在微信开放平å°çš„å”¯ä¸€èº«ä»½æ ‡è¯†ï¼ˆå¾®ä¿¡unionid),通过æ¤å—段ä¼ä¸šå¯å°†å¤–部è”系人与公众å·/å°ç¨‹åºç”¨æˆ·å…³è”èµ·æ¥ã€‚仅当群æˆå‘˜ç±»åž‹æ˜¯å¾®ä¿¡ç”¨æˆ·ï¼ˆåŒ…括ä¼ä¸šæˆå‘˜æœªæ·»åŠ 好å‹ï¼‰ï¼Œä¸”ä¼ä¸šç»‘定了微信开å‘者ID有æ¤å—段(查看绑定方法)。第三方ä¸å¯èŽ·å–,上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šå®¢æˆ·çš„unionidå—段 group_chat.member_list.join_time 入群时间 group_chat.member_list.join_scene 入群方å¼ã€‚ 1 - 由群æˆå‘˜é‚€è¯·å…¥ç¾¤ï¼ˆç›´æŽ¥é‚€è¯·å…¥ç¾¤ï¼‰ 2 - 由群æˆå‘˜é‚€è¯·å…¥ç¾¤ï¼ˆé€šè¿‡é‚€è¯·é“¾æŽ¥å…¥ç¾¤ï¼‰ 3 - 通过扫æ群二维ç 入群 group_chat.member_list.invitor 邀请者。目å‰ä»…当是由本ä¼ä¸šå†…部æˆå‘˜é‚€è¯·å…¥ç¾¤æ—¶ä¼šè¿”回该值 group_chat.member_list.invitor.userid 邀请者的userid group_chat.member_list.group_nickname 在群里的昵称 group_chat.member_list.name åå—。仅当 need_name = 1 时返回 如果是微信用户,则返回其在微信ä¸è®¾ç½®çš„åå— å¦‚æžœæ˜¯ä¼ä¸šå¾®ä¿¡è”系人,则返回其设置对外展示的别å或实å group_chat.admin_list 群管ç†å‘˜åˆ—表 group_chat.admin_list.userid 群管ç†å‘˜userid =cut sub get { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 add_join_way(access_token, hash); é…ç½®å®¢æˆ·ç¾¤è¿›ç¾¤æ–¹å¼ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92229#é…置客户群进群方å¼> =head3 请求说明: ä¼ä¸šå¯ä»¥åœ¨ç®¡ç†åŽå°-客户è”ç³»ä¸é…ç½®ã€ŒåŠ å…¥ç¾¤èŠã€çš„二维ç 或者å°ç¨‹åºæŒ‰é’®ï¼Œå®¢æˆ·é€šè¿‡æ‰«æ二维ç 或点击å°ç¨‹åºä¸Šçš„按钮,å³å¯åŠ 入特定的客户群。 ä¼ä¸šå¯é€šè¿‡æ¤æŽ¥å£ä¸ºå…·æœ‰å®¢æˆ·è”系功能的æˆå‘˜ç”Ÿæˆä¸“属的二维ç 或者å°ç¨‹åºæŒ‰é’®ã€‚ 如果é…置的是å°ç¨‹åºæŒ‰é’®ï¼Œéœ€è¦å¼€å‘者的å°ç¨‹åºæŽ¥å…¥å°ç¨‹åºæ’件。 注æ„: 通过APIæ·»åŠ çš„é…ç½®ä¸ä¼šåœ¨ç®¡ç†ç«¯è¿›è¡Œå±•ç¤ºï¼Œæ¯ä¸ªä¼ä¸šå¯é€šè¿‡API最多é…ç½®50ä¸‡ä¸ªã€ŒåŠ å…¥ç¾¤èŠã€(与「è”系我ã€å…±ç”¨50万的é¢åº¦)。 =head4 请求包结构体为: { "scene": 2, "remark": "aa_remark", "auto_create_room": 1, "room_base_name" : "销售客æœç¾¤", "room_base_id" : 10, "chat_id_list": [ "wrOgQhDgAAH2Yy-CTZ6POca8mlBEdaaa", "wrOgQhDgAALPUthpRAKvl7mgiQRwAAA" ], "state" : "klsdup3kj3s1" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ scene 是 场景。 1 - 群的å°ç¨‹åºæ’件 2 - 群的二维ç æ’件 remark å¦ è”系方å¼çš„备注信æ¯ï¼Œç”¨äºŽåŠ©è®°ï¼Œè¶…过30个å—ç¬¦å°†è¢«æˆªæ– auto_create_room å¦ å½“ç¾¤æ»¡äº†åŽï¼Œæ˜¯å¦è‡ªåŠ¨æ–°å»ºç¾¤ã€‚0-å¦ï¼›1-是。 默认为1 room_base_name å¦ è‡ªåŠ¨å»ºç¾¤çš„ç¾¤åå‰ç¼€ï¼Œå½“auto_create_room为1时有效。最长40个utf8å—符 room_base_id å¦ è‡ªåŠ¨å»ºç¾¤çš„ç¾¤èµ·å§‹åºå·ï¼Œå½“auto_create_room为1时有效 chat_id_list 是 使用该é…置的客户群ID列表,支æŒ5个。è§å®¢æˆ·ç¾¤ID获å–方法 state å¦ ä¼ä¸šè‡ªå®šä¹‰çš„stateå‚数,用于区分ä¸åŒçš„å…¥ç¾¤æ¸ é“。ä¸è¶…过30个UTF-8å—符 如果有设置æ¤å‚数,在调用获å–客户群详情接å£æ—¶ä¼šè¿”回æ¯ä¸ªç¾¤æˆå‘˜å¯¹åº”的该å‚数值,详è§æ–‡æœ«é™„录2 room_base_name å’Œ room_base_id 两个å‚æ•°é…åˆï¼Œç”¨äºŽæŒ‡å®šè‡ªåŠ¨æ–°å»ºç¾¤çš„群å 例如,å‡å¦‚ room_base_name = "销售客æœç¾¤", room_base_id = 10 那么,自动创建的第一个群,群å为“销售客æœç¾¤10â€ï¼›è‡ªåŠ¨åˆ›å»ºçš„第二个群,群å为“销售客æœç¾¤11â€ï¼Œä¾æ¬¡ç±»æŽ¨ =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 使用人员需è¦é…置了客户è”系功能。 第三方应用暂ä¸å¯è°ƒç”¨ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok", "config_id": "9ad7fa5cdaa6511298498f979c472aaa" } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 config_id é…ç½®id =cut sub add_join_way { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/add_join_way?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 get_join_way(access_token, hash); 获å–客户群进群方å¼é…ç½® =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92229#获å–客户群进群方å¼é…ç½®> =head3 请求说明: ä¼ä¸šå¯ä»¥åœ¨ç®¡ç†åŽå°-客户è”ç³»ä¸é…ç½®ã€ŒåŠ å…¥ç¾¤èŠã€çš„二维ç 或者å°ç¨‹åºæŒ‰é’®ï¼Œå®¢æˆ·é€šè¿‡æ‰«æ二维ç 或点击å°ç¨‹åºä¸Šçš„按钮,å³å¯åŠ 入特定的客户群。 ä¼ä¸šå¯é€šè¿‡æ¤æŽ¥å£ä¸ºå…·æœ‰å®¢æˆ·è”系功能的æˆå‘˜ç”Ÿæˆä¸“属的二维ç 或者å°ç¨‹åºæŒ‰é’®ã€‚ 如果é…置的是å°ç¨‹åºæŒ‰é’®ï¼Œéœ€è¦å¼€å‘者的å°ç¨‹åºæŽ¥å…¥å°ç¨‹åºæ’件。 注æ„: 通过APIæ·»åŠ çš„é…ç½®ä¸ä¼šåœ¨ç®¡ç†ç«¯è¿›è¡Œå±•ç¤ºï¼Œæ¯ä¸ªä¼ä¸šå¯é€šè¿‡API最多é…ç½®50ä¸‡ä¸ªã€ŒåŠ å…¥ç¾¤èŠã€(与「è”系我ã€å…±ç”¨50万的é¢åº¦)。 =head4 请求包结构体为: { "config_id":"9ad7fa5cdaa6511298498f979c472aaa" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ config_id 是 è”系方å¼çš„é…ç½®id =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 使用人员需è¦é…置了客户è”系功能。 第三方应用暂ä¸å¯è°ƒç”¨ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok", "join_way": { "config_id": "9ad7fa5cdaa6511298498f979c472aaa", "type": 3, "scene": 3, "remark": "aa_remark", "auto_create_room": 1, "room_base_name" : "销售客æœç¾¤", "room_base_id" : 10, "chat_id_list": ["wrOgQhDgAAH2Yy-CTZ6POca8mlBEdaaa", "wrOgQhDgAALPUthpRAKvl7mgiQRw_aaa"], "qr_code": "http://p.qpic.cn/wwhead/nMl9ssowtibVGyrmvBiaibzDtp703nXuzpibnKtbSDBRJTLwS3ic4ECrf3ibLVtIFb0N6wWwy5LVuyvMQ22/0", "state" : "klsdup3kj3s1" } } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 join_way é…置详情 config_id 新增è”系方å¼çš„é…ç½®id scene 场景。 1 - 群的å°ç¨‹åºæ’件 2 - 群的二维ç æ’件 remark è”系方å¼çš„备注信æ¯ï¼Œç”¨äºŽåŠ©è®°ï¼Œè¶…过30个å—ç¬¦å°†è¢«æˆªæ– auto_create_room 当群满了åŽï¼Œæ˜¯å¦è‡ªåŠ¨æ–°å»ºç¾¤ã€‚0-å¦ï¼›1-是。 默认为1 room_base_name 自动建群的群åå‰ç¼€ï¼Œå½“auto_create_room为1时有效。最长40个utf8å—符 room_base_id 自动建群的群起始åºå·ï¼Œå½“auto_create_room为1时有效 chat_id_list 使用该é…置的客户群ID列表。è§å®¢æˆ·ç¾¤ID获å–方法 qr_code è”系二维ç çš„URL,仅在é…置为群二维ç 时返回 state ä¼ä¸šè‡ªå®šä¹‰çš„stateå‚数,用于区分ä¸åŒçš„å…¥ç¾¤æ¸ é“。ä¸è¶…过30个UTF-8å—符 如果有设置æ¤å‚数,在调用获å–客户群详情接å£æ—¶ä¼šè¿”回æ¯ä¸ªç¾¤æˆå‘˜å¯¹åº”的该å‚数值,详è§æ–‡æœ«é™„录2 =cut sub get_join_way { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get_join_way?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 update_join_way(access_token, hash); 更新客户群进群方å¼é…ç½® =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92229#更新客户群进群方å¼é…ç½®> =head3 请求说明: 更新进群方å¼é…置信æ¯ã€‚注æ„:使用覆盖的方å¼æ›´æ–°ã€‚ =head4 请求包结构体为: { "config_id": "9ad7fa5cdaa6511298498f979c4722de", "scene": 2, "remark": "bb_remark", "auto_create_room": 1, "room_base_name" : "销售客æœç¾¤", "room_base_id" : 10, "chat_id_list": ["wrOgQhDgAAH2Yy-CTZ6POca8mlBEdaaa", "wrOgQhDgAALPUthpRAKvl7mgiQRw_aaa"], "state" : "klsdup3kj3s1" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ config_id 是 ä¼ä¸šè”系方å¼çš„é…ç½®id scene 是 场景。 1 - 群的å°ç¨‹åºæ’件 2 - 群的二维ç æ’件 remark å¦ è”系方å¼çš„备注信æ¯ï¼Œç”¨äºŽåŠ©è®°ï¼Œè¶…过30个å—ç¬¦å°†è¢«æˆªæ– auto_create_room å¦ å½“ç¾¤æ»¡äº†åŽï¼Œæ˜¯å¦è‡ªåŠ¨æ–°å»ºç¾¤ã€‚0-å¦ï¼›1-是。 默认为1 room_base_name å¦ è‡ªåŠ¨å»ºç¾¤çš„ç¾¤åå‰ç¼€ï¼Œå½“auto_create_room为1时有效。最长40个utf8å—符 room_base_id å¦ è‡ªåŠ¨å»ºç¾¤çš„ç¾¤èµ·å§‹åºå·ï¼Œå½“auto_create_room为1时有效 chat_id_list 是 使用该é…置的客户群ID列表,支æŒ5个。è§å®¢æˆ·ç¾¤ID获å–方法 state å¦ ä¼ä¸šè‡ªå®šä¹‰çš„stateå‚数,用于区分ä¸åŒçš„å…¥ç¾¤æ¸ é“。ä¸è¶…过30个UTF-8å—符 如果有设置æ¤å‚数,在调用获å–客户群详情接å£æ—¶ä¼šè¿”回æ¯ä¸ªç¾¤æˆå‘˜å¯¹åº”的该å‚数值,详è§æ–‡æœ«é™„录2 =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 使用人员需è¦é…置了客户è”系功能。 第三方应用暂ä¸å¯è°ƒç”¨ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok" } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 =cut sub update_join_way { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/update_join_way?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 del_join_way(access_token, hash); åˆ é™¤å®¢æˆ·ç¾¤è¿›ç¾¤æ–¹å¼é…ç½® =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92229#åˆ é™¤å®¢æˆ·ç¾¤è¿›ç¾¤æ–¹å¼é…ç½®> =head3 请求说明: åˆ é™¤ä¸€ä¸ªè¿›ç¾¤æ–¹å¼é…置。 =head4 请求包结构体为: { "config_id": "42b34949e138eb6e027c123cba77faaa" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ config_id 是 ä¼ä¸šè”系方å¼çš„é…ç½®id =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 使用人员需è¦é…置了客户è”系功能。 第三方应用暂ä¸å¯è°ƒç”¨ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok" } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 =cut sub del_join_way { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/del_join_way?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 statistic(access_token, hash); 获å–「群èŠæ•°æ®ç»Ÿè®¡ã€æ•°æ®-按群主èšåˆçš„æ–¹å¼ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92133#按群主èšåˆçš„æ–¹å¼> =head3 请求说明: 获å–指定日期的统计数æ®ã€‚注æ„,ä¼ä¸šå¾®ä¿¡ä»…å˜å‚¨180天的数æ®ã€‚ =head4 请求包结构体为: { "day_begin_time": 1600272000, "day_end_time": 1600444800, "owner_filter": { "userid_list": ["zhangsan"] }, "order_by": 2, "order_asc": 0, "offset" : 0, "limit" : 1000 } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ day_begin_time 是 起始日期的时间戳,填当天的0æ—¶0分0秒(å¦åˆ™ç³»ç»Ÿè‡ªåŠ¨å¤„ç†ä¸ºå½“天的0分0秒)。å–值范围:昨天至å‰180天。 day_end_time å¦ ç»“æŸæ—¥æœŸçš„时间戳,填当天的0æ—¶0分0秒(å¦åˆ™ç³»ç»Ÿè‡ªåŠ¨å¤„ç†ä¸ºå½“天的0分0秒)。å–值范围:昨天至å‰180天。 如果ä¸å¡«ï¼Œé»˜è®¤åŒ day_begin_time(å³é»˜è®¤å–一天的数æ®ï¼‰ owner_filter 是 群主过滤。 如果ä¸å¡«ï¼Œè¡¨ç¤ºèŽ·å–应用å¯è§èŒƒå›´å†…全部群主的数æ®ï¼ˆä½†æ˜¯ä¸å»ºè®®è¿™ä¹ˆç”¨ï¼Œå¦‚æžœå¯è§èŒƒå›´äººæ•°è¶…过1000人,为了防æ¢æ•°æ®åŒ…过大,会报错 81017) owner_filter.userid_list 是 群主ID列表。最多100个 order_by å¦ æŽ’åºæ–¹å¼ã€‚ 1 - æ–°å¢žç¾¤çš„æ•°é‡ 2 - 群总数 3 - 新增群人数 4 - 群总人数 æ¤æŽ¥å£æŸ¥è¯¢çš„时间范围为 [day_begin_time, day_end_time],å‰åŽå‡ä¸ºé—区间(å³åŒ…å«day_end_time当天的数æ®ï¼‰ï¼Œæ”¯æŒçš„最大查询跨度为30天; 用户最多å¯èŽ·å–最近180天内的数æ®ï¼ˆè¶…过180天ä¼ä¸šå¾®ä¿¡å°†ä¸å†å˜å‚¨ï¼‰ï¼› å½“ä¼ å…¥çš„æ—¶é—´ä¸ä¸º0点时,会å‘下å–æ•´ï¼Œå¦‚ä¼ å…¥1554296400(Wed Apr 3 21:00:00 CST 2019)会被自动转æ¢ä¸º1554220800(Wed Apr 3 00:00:00 CST 2019); =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 第三方应用使用,需具有“ä¼ä¸šå®¢æˆ·æƒé™->客户群->获å–客户群的数æ®ç»Ÿè®¡â€æƒé™ã€‚ 对于第三方/自建应用,群主必须在应用的å¯è§èŒƒå›´ã€‚ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok", "total": 2, "next_offset": 2, "items": [{ "owner": "zhangsan", "data": { "new_chat_cnt": 2, "chat_total": 2, "chat_has_msg": 0, "new_member_cnt": 0, "member_total": 6, "member_has_msg": 0, "msg_total": 0, "migrate_trainee_chat_cnt": 3 } }, { "owner": "lisi", "data": { "new_chat_cnt": 1, "chat_total": 3, "chat_has_msg": 2, "new_member_cnt": 0, "member_total": 6, "member_has_msg": 0, "msg_total": 0, "migrate_trainee_chat_cnt": 3 } } ] } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 total 命ä¸è¿‡æ»¤æ¡ä»¶çš„记录总个数 next_offset 当å‰åˆ†é¡µçš„下一个offset。当next_offsetå’Œtotal相ç‰æ—¶ï¼Œè¯´æ˜Žå·²ç»å–完所有 items 记录列表。表示æŸä¸ªç¾¤ä¸»æ‰€æ‹¥æœ‰çš„å®¢æˆ·ç¾¤çš„ç»Ÿè®¡æ•°æ® items.owner 群主ID items.data 详情 items.data.new_chat_cnt æ–°å¢žå®¢æˆ·ç¾¤æ•°é‡ items.data.chat_total æˆªè‡³å½“å¤©å®¢æˆ·ç¾¤æ€»æ•°é‡ items.data.chat_has_msg 截至当天有å‘过消æ¯çš„å®¢æˆ·ç¾¤æ•°é‡ items.data.new_member_cnt 客户群新增群人数。 items.data.member_total 截至当天客户群总人数 items.data.member_has_msg 截至当天有å‘过消æ¯çš„群æˆå‘˜æ•° items.data.msg_total 截至当天客户群消æ¯æ€»æ•° items.data.migrate_trainee_chat_cnt 截至当天新增è¿ç§»ç¾¤æ•°(仅教培行业返回) =cut sub statistic { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/statistic?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 statistic_group_by_day(access_token, hash); 获å–「群èŠæ•°æ®ç»Ÿè®¡ã€æ•°æ®-按自然日èšåˆçš„æ–¹å¼ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92133#按自然日èšåˆçš„æ–¹å¼> =head3 请求说明: 获å–指定日期的统计数æ®ã€‚注æ„,ä¼ä¸šå¾®ä¿¡ä»…å˜å‚¨180天的数æ®ã€‚ =head4 请求包结构体为: { "day_begin_time": 1600272000, "day_end_time": 1600358400, "owner_filter": { "userid_list": ["zhangsan"] } } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ day_begin_time 是 起始日期的时间戳,填当天的0æ—¶0分0秒(å¦åˆ™ç³»ç»Ÿè‡ªåŠ¨å¤„ç†ä¸ºå½“天的0分0秒)。å–值范围:昨天至å‰180天。 day_end_time å¦ ç»“æŸæ—¥æœŸçš„时间戳,填当天的0æ—¶0分0秒(å¦åˆ™ç³»ç»Ÿè‡ªåŠ¨å¤„ç†ä¸ºå½“天的0分0秒)。å–值范围:昨天至å‰180天。 如果ä¸å¡«ï¼Œé»˜è®¤åŒ day_begin_time(å³é»˜è®¤å–一天的数æ®ï¼‰ owner_filter 是 群主过滤。 如果ä¸å¡«ï¼Œè¡¨ç¤ºèŽ·å–应用å¯è§èŒƒå›´å†…全部群主的数æ®ï¼ˆä½†æ˜¯ä¸å»ºè®®è¿™ä¹ˆç”¨ï¼Œå¦‚æžœå¯è§èŒƒå›´äººæ•°è¶…过1000人,为了防æ¢æ•°æ®åŒ…过大,会报错 81017) owner_filter.userid_list 是 群主ID列表。最多100个 æ¤æŽ¥å£æŸ¥è¯¢çš„时间范围为 [day_begin_time, day_end_time],å‰åŽå‡ä¸ºé—区间(å³åŒ…å«day_end_time当天的数æ®ï¼‰ï¼Œæ”¯æŒçš„最大查询跨度为30天; 用户最多å¯èŽ·å–最近180天内的数æ®ï¼ˆè¶…过180天ä¼ä¸šå¾®ä¿¡å°†ä¸å†å˜å‚¨ï¼‰ï¼› å½“ä¼ å…¥çš„æ—¶é—´ä¸ä¸º0点时,会å‘下å–æ•´ï¼Œå¦‚ä¼ å…¥1554296400(Wed Apr 3 21:00:00 CST 2019)会被自动转æ¢ä¸º1554220800(Wed Apr 3 00:00:00 CST 2019); =head4 æƒé™è¯´æ˜Žï¼š ä¼ä¸šéœ€è¦ä½¿ç”¨â€œå®¢æˆ·è”ç³»â€secret或é…置到“å¯è°ƒç”¨åº”用â€åˆ—表ä¸çš„自建应用secret所获å–çš„accesstokenæ¥è°ƒç”¨ï¼ˆaccesstoken如何获å–?)。 第三方应用使用,需具有“ä¼ä¸šå®¢æˆ·æƒé™->客户群->获å–客户群的数æ®ç»Ÿè®¡â€æƒé™ã€‚ 对于第三方/自建应用,群主必须在应用的å¯è§èŒƒå›´ã€‚ =head3 RETURN 返回结果: { "errcode": 0, "errmsg": "ok", "items": [{ "stat_time": 1600272000, "data": { "new_chat_cnt": 2, "chat_total": 2, "chat_has_msg": 0, "new_member_cnt": 0, "member_total": 6, "member_has_msg": 0, "msg_total": 0, "migrate_trainee_chat_cnt": 3 } }, { "stat_time": 1600358400, "data": { "new_chat_cnt": 2, "chat_total": 2, "chat_has_msg": 0, "new_member_cnt": 0, "member_total": 6, "member_has_msg": 0, "msg_total": 0, "migrate_trainee_chat_cnt": 3 } } ] } =head4 RETURN å‚数说明: å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 items 记录列表。表示æŸä¸ªè‡ªç„¶æ—¥å®¢æˆ·ç¾¤çš„ç»Ÿè®¡æ•°æ® items.stat_time æ•°æ®æ—¥æœŸï¼Œä¸ºå½“æ—¥0点的时间戳 items.data 详情 items.data.new_chat_cnt æ–°å¢žå®¢æˆ·ç¾¤æ•°é‡ items.data.chat_total æˆªè‡³å½“å¤©å®¢æˆ·ç¾¤æ€»æ•°é‡ items.data.chat_has_msg 截至当天有å‘过消æ¯çš„å®¢æˆ·ç¾¤æ•°é‡ items.data.new_member_cnt 客户群新增群人数。 items.data.member_total 截至当天客户群总人数 items.data.member_has_msg 截至当天有å‘过消æ¯çš„群æˆå‘˜æ•° items.data.msg_total 截至当天客户群消æ¯æ€»æ•° items.data.migrate_trainee_chat_cnt 截至当天新增è¿ç§»ç¾¤æ•°(仅教培行业返回) =cut sub statistic_group_by_day { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/statistic_group_by_day?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } 1; __END__