网站开发 小程序开发 APP开发 图片设计 UI设计 剪辑推广 运营策划

企业微信获取外部联系人external_userid获取

企业微信外部联系人批量获取工具 – 介绍与使用教程

一、工具介绍

这是一款可视化企业微信外部联系人管理工具,专为解决企业微信外部联系人 ID 查找困难、权限配置复杂等问题设计。通过简洁的 Web 界面,无需复杂命令操作,即可快速获取名下所有外部联系人的昵称、客户 ID,并支持导出数据,大幅降低企业微信接口使用门槛。

核心特点

  • 可视化操作:无需编写代码,通过网页按钮即可完成所有操作,非技术人员也能轻松使用;
  • 批量高效获取:支持分批获取联系人信息,避免接口调用限制,确保数据完整性;
  • 多格式导出:支持 CSV 完整列表、纯文本 ID 列表导出,方便后续对接企业微信消息发送功能;
  • 详细状态反馈:实时显示操作进度、成功率统计,错误信息一目了然;
  • 兼容性强:适配 PHP 7.0 + 环境,兼容 HTTP1.1/HTTP2 协议,支持服务器 / 本地运行。

二、环境准备

1. 运行环境要求

  • PHP 版本:7.0 及以上(推荐 7.4/8.0);
  • 扩展依赖:开启curl扩展(PHP 默认已开启,若未开启需在php.ini中启用);
  • 运行方式:支持服务器部署(Apache/Nginx)或本地环境(XAMPP/WAMP);
  • 网络要求:服务器 / 本地网络可访问企业微信 API(https://qyapi.weixin.qq.com)。

2. 企业微信权限准备(必做)

使用前需确保你的企业微信账号满足以下条件:
  • 拥有「客户联系」权限(个人角色需勾选「客户联系管理员」或「普通成员客户联系权限」);
  • 应用已配置「获取客户列表」「获取客户详情」权限(企业微信后台→应用管理→你的应用→权限管理);
  • 服务器 IP 已添加至企业微信应用的「IP 白名单」(若开启白名单限制)。

三、快速上手教程

步骤 1:配置工具参数

  1. 打开代码文件(如wecom_contacts.php),找到顶部$config配置区域:
  2. $config = [
        'corp_id' => '企业微信的id', // 替换为你的企业微信CorpID(后台「我的企业」可查)
        'app_secret' => '企业微信创建应用-应用秘钥', // 替换为应用的Secret(应用管理→你的应用→应用秘钥)
        'member_userid' => '你的企业微信ID-是企业微信的哈 管理员账户 查询你名下的外部联系人' // 替换为你的企业微信成员UserID(通讯录→你的账号→账号信息)
    ];
    

     

  3. 将占位符替换为你的真实信息(均从企业微信后台获取),保存文件。

步骤 2:部署与访问

  • 服务器部署:将代码文件上传至你的 PHP 服务器(如https://你的域名/wecom_contacts.php);
  • 本地运行:将文件放入本地 PHP 环境的根目录(如 XAMPP 的htdocs),访问http://localhost/wecom_contacts.php

步骤 3:使用核心功能

功能 1:获取所有联系人

  1. 打开工具页面,点击「🚀 快速获取所有联系人」按钮;
  2. 工具会自动执行三步操作:获取 Access Token→拉取联系人 ID 列表→批量获取姓名和 ID;
  3. 等待执行完成后,页面会显示:
    • 联系人总数、成功获取数、成功率统计;
    • 可视化联系人列表(含序号、姓名、客户 ID);
    • 失败项标注(可排查个别联系人获取失败原因)。

功能 2:导出联系人数据

  • 导出完整 CSV:点击「📊 导出完整 CSV」,可下载包含序号、姓名、客户 ID 的表格文件(支持 Excel 打开);
  • 导出简单文本:点击「📄 导出简单文本」,仅导出客户 ID 列表(方便直接复制用于消息发送)。

功能 3:刷新与重新操作

  • 点击「🔄 刷新页面」可重置状态;
  • 若获取失败,可检查页面提示的错误信息(如 Token 失效、权限不足),修正后重新点击获取按钮。

四、功能详情说明

1. 界面模块解析

  • 配置信息区:显示当前填写的 CorpID、成员 UserID 及服务器 IP,方便核对配置;
  • 操作按钮区:核心功能入口,一键触发获取 / 导出操作;
  • 进度反馈区:实时显示每一步操作结果(如 Token 获取成功、联系人列表数量);
  • 数据展示区:卡片式展示联系人信息,失败项标红提示;
  • 统计区:汇总数据获取情况,快速判断整体成功率。

2. 批量处理机制

工具采用分批获取策略(每批 25 个联系人),并加入短暂休眠(0.05 秒),避免触发企业微信 API 的频率限制,确保大批量联系人(如数百个)也能稳定获取。

五、常见问题解决

1. Token 获取失败

  • 检查corp_idapp_secret是否填写正确;
  • 确认应用是否已启用,且 Secret 未泄露 / 过期。

2. 联系人列表获取失败(错误码 48002/60020)

  • 48002:应用缺少「客户联系」权限,需在企业微信后台补全权限配置;
  • 60020:服务器 IP 未加入白名单,需添加当前服务器 IP 至应用的 IP 白名单。

3. 部分联系人姓名获取失败

  • 个别联系人可能因隐私设置或接口限制无法获取昵称,可直接使用客户 ID 进行后续操作。

4. HTTP2 协议错误(ERR_HTTP2_PROTOCOL_ERROR)

  • 工具已内置 HTTP1.1 兼容处理,若仍报错,可在服务器配置中关闭 HTTP2 协议(如 Nginx 删除http2关键字)。

六、扩展使用建议

获取到联系人 ID 后,可直接对接企业微信消息发送接口,实现:
  • 批量发送通知消息;
  • 定时推送个性化内容(如生日祝福、业务提醒)  企业微信对外联系api已经取消,目前仅支持通过企业微信 客服对外联系 同样有48小时聊天时效限制。
  • 联系人数据归档与管理。
工具轻量易用,可根据实际需求修改界面样式、调整分批数量或增加更多导出格式(如 JSON)。

企业微信获取外部联系人external_userid获取

 

代码示例:

<?php
// 修复版 - 快速获取所有联系人姓名和ID
set_time_limit(300);
header('Content-Type: text/html; charset=utf-8');

// 配置
$config = [
    'corp_id' => '企业微信的id',
    'app_secret' => '企业微信创建应用-应用秘钥',
    'member_userid' => '你的企业微信ID-是企业微信的哈 管理员账户 查询你名下的外部联系人'
];

// HTML界面
echo "<!DOCTYPE html>
<html lang='zh-CN'>
<head>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>快速获取所有联系人</title>
    <style>
        body { font-family: 'Microsoft YaHei', Arial, sans-serif; margin: 20px; background: #f8f9fa; }
        .container { max-width: 1000px; margin: 0 auto; background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { color: #333; text-align: center; margin-bottom: 30px; }
        .success { color: #28a745; background: #d4edda; padding: 15px; border-radius: 5px; margin: 10px 0; }
        .error { color: #dc3545; background: #f8d7da; padding: 15px; border-radius: 5px; margin: 10px 0; }
        .loading { color: #007bff; background: #cce5ff; padding: 10px; border-radius: 5px; margin: 10px 0; }
        .contact-item { background: #f8f9fa; padding: 10px; margin: 5px 0; border-radius: 3px; border-left: 3px solid #007bff; display: inline-block; width: 300px; vertical-align: top; }
        .btn { display: inline-block; padding: 10px 20px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; margin: 10px 5px; }
        .btn:hover { background: #0056b3; }
        .btn-success { background: #28a745; }
        .btn-success:hover { background: #218838; }
        .contact-grid { display: flex; flex-wrap: wrap; gap: 10px; }
        .stats { background: #fff3cd; padding: 15px; border-radius: 5px; margin: 20px 0; }
    </style>
</head>
<body>
    <div class='container'>
        <h1>🏢 快速获取所有联系人</h1>";

// 简化的API请求函数
function quick_api_request($url, $timeout = 5) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    $res = curl_exec($ch);
    
    if (curl_errno($ch)) {
        curl_close($ch);
        return null;
    }
    
    curl_close($ch);
    return json_decode($res, true);
}

// 显示配置信息
echo "<div style='background: #e9ecef; padding: 15px; border-radius: 5px; margin: 20px 0;'>
    <strong>📋 当前配置:</strong><br>
    Corp ID: {$config['corp_id']}<br>
    Member UserID: {$config['member_userid']}<br>
    服务器IP: " . ($_SERVER['SERVER_ADDR'] ?? '未知') . "<br>
    当前时间: " . date('Y-m-d H:i:s') . "
</div>";

// 操作按钮
echo "<div style='text-align: center; margin: 20px 0;'>";
echo "<a href='?action=get_all' class='btn btn-success'>🚀 快速获取所有联系人</a> ";
echo "<a href='?action=export_simple' class='btn'>📄 导出简单列表</a> ";
echo "<a href='?' class='btn'>🔄 刷新页面</a>";
echo "</div>";

$action = isset($_GET['action']) ? $_GET['action'] : '';

if ($action == 'get_all') {
    // 第一步:获取Token
    echo "<h2>🔐 步骤1:获取Access Token</h2>";
    $token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$config['corp_id']}&corpsecret={$config['app_secret']}";
    $token_data = quick_api_request($token_url, 10);
    
    if (!$token_data || $token_data['errcode'] != 0) {
        echo "<div class='error'>❌ 获取Token失败:" . ($token_data['errmsg'] ?? '网络错误') . "</div>";
        exit;
    }
    
    $access_token = $token_data['access_token'];
    echo "<div class='success'>✅ Access Token获取成功!</div>";
    
    // 第二步:获取联系人列表
    echo "<h2>👥 步骤2:获取联系人列表</h2>";
    $list_url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list?access_token={$access_token}&userid={$config['member_userid']}";
    $list_data = quick_api_request($list_url, 15);
    
    if (!$list_data || $list_data['errcode'] != 0) {
        echo "<div class='error'>❌ 获取联系人列表失败:" . ($list_data['errmsg'] ?? '网络错误') . "</div>";
        exit;
    }
    
    if (empty($list_data['external_userid'])) {
        echo "<div class='error'>📭 暂无外部联系人</div>";
        exit;
    }
    
    $all_contact_ids = $list_data['external_userid'];
    $total_count = count($all_contact_ids);
    echo "<div class='success'>✅ 找到 {$total_count} 个联系人ID!</div>";
    
    // 第三步:批量获取姓名和ID
    echo "<h2>📝 步骤3:获取联系人姓名和ID</h2>";
    echo "<div class='loading'>🚀 正在快速获取所有联系人信息(仅获取姓名和ID以提高速度)...</div>";
    
    $contacts = [];
    $batch_size = 25;
    $batches = ceil($total_count / $batch_size);
    
    for ($batch = 0; $batch < $batches; $batch++) {
        $start = $batch * $batch_size;
        $end = min($start + $batch_size, $total_count);
        
        echo "<div class='loading'>🔄 处理批次 " . ($batch + 1) . "/{$batches} (联系人 " . ($start + 1) . "-{$end})</div>";
        ob_flush();
        flush();
        
        for ($i = $start; $i < $end; $i++) {
            $external_userid = $all_contact_ids[$i];
            $detail_url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token={$access_token}&external_userid={$external_userid}";
            $detail_data = quick_api_request($detail_url, 3);
            
            if ($detail_data && $detail_data['errcode'] == 0 && isset($detail_data['external_contact'])) {
                $contacts[] = [
                    'index' => $i + 1,
                    'name' => $detail_data['external_contact']['name'] ?? '未知',
                    'external_userid' => $external_userid
                ];
            } else {
                $contacts[] = [
                    'index' => $i + 1,
                    'name' => '获取失败',
                    'external_userid' => $external_userid
                ];
            }
        }
        
        // 短暂休息防止API限制
        usleep(50000); // 0.05秒
    }
    
    echo "<div class='success'>✅ 所有联系人信息获取完成!</div>";
    
    // 统计信息
    $success_count = 0;
    foreach ($contacts as $contact) {
        if ($contact['name'] != '获取失败') {
            $success_count++;
        }
    }
    
    echo "<div class='stats'>
        <strong>📊 统计信息:</strong><br>
        总联系人: {$total_count} 个<br>
        成功获取: {$success_count} 个<br>
        获取失败: " . ($total_count - $success_count) . " 个<br>
        成功率: " . round(($success_count / $total_count) * 100, 1) . "%
    </div>";
    
    // 显示所有联系人
    echo "<h2>👥 所有联系人列表</h2>";
    echo "<div class='contact-grid'>";
    
    foreach ($contacts as $contact) {
        $success = $contact['name'] != '获取失败';
        $bg_color = $success ? '#f8f9fa' : '#f8d7da';
        $border_color = $success ? '#007bff' : '#dc3545';
        
        echo "<div class='contact-item' style='background: {$bg_color}; border-left-color: {$border_color};'>";
        echo "<strong>【{$contact['index']}】</strong><br>";
        echo "<strong>姓名:</strong>" . htmlspecialchars($contact['name']) . "<br>";
        echo "<strong>ID:</strong>" . htmlspecialchars($contact['external_userid']) . "<br>";
        if (!$success) {
            echo "<span style='color: red;'>❌ 获取失败</span>";
        }
        echo "</div>";
    }
    
    echo "</div>";
    
    // 导出功能
    echo "<h2>💾 导出功能</h2>";
    echo "<div style='text-align: center;'>";
    echo "<a href='?action=export_full' class='btn btn-success'>📊 导出完整CSV</a> ";
    echo "<a href='?action=export_simple' class='btn'>📄 导出简单文本</a> ";
    echo "<a href='?' class='btn'>🔄 重新获取</a>";
    echo "</div>";
    
} elseif ($action == 'export_full') {
    // 导出完整CSV
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="wechat_all_contacts.csv"');
    
    // 重新获取数据
    $token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$config['corp_id']}&corpsecret={$config['app_secret']}";
    $token_data = quick_api_request($token_url, 10);
    
    if ($token_data && $token_data['errcode'] == 0) {
        $access_token = $token_data['access_token'];
        $list_url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list?access_token={$access_token}&userid={$config['member_userid']}";
        $list_data = quick_api_request($list_url, 15);
        
        if ($list_data && $list_data['errcode'] == 0) {
            $all_contact_ids = $list_data['external_userid'];
            
            $output = fopen('php://output', 'w');
            fwrite($output, "\xEF\xBB\xBF");
            fputcsv($output, ['序号', '姓名', '客户ID']);
            
            foreach ($all_contact_ids as $index => $external_userid) {
                $detail_url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token={$access_token}&external_userid={$external_userid}";
                $detail_data = quick_api_request($detail_url, 3);
                
                $name = '获取失败';
                if ($detail_data && $detail_data['errcode'] == 0 && isset($detail_data['external_contact'])) {
                    $name = $detail_data['external_contact']['name'] ?? '未知';
                }
                
                fputcsv($output, [$index + 1, $name, $external_userid]);
            }
            
            fclose($output);
        }
    }
    exit;
    
} elseif ($action == 'export_simple') {
    // 导出简单文本
    header('Content-Type: text/plain; charset=utf-8');
    header('Content-Disposition: attachment; filename="wechat_contacts_simple.txt"');
    
    $token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$config['corp_id']}&corpsecret={$config['app_secret']}";
    $token_data = quick_api_request($token_url, 10);
    
    if ($token_data && $token_data['errcode'] == 0) {
        $access_token = $token_data['access_token'];
        $list_url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list?access_token={$access_token}&userid={$config['member_userid']}";
        $list_data = quick_api_request($list_url, 15);
        
        if ($list_data && $list_data['errcode'] == 0) {
            $all_contact_ids = $list_data['external_userid'];
            
            echo "企业微信联系人简单列表\n";
            echo "生成时间: " . date('Y-m-d H:i:s') . "\n";
            echo "总计: " . count($all_contact_ids) . " 个联系人\n";
            echo "================================\n\n";
            
            foreach ($all_contact_ids as $index => $external_userid) {
                echo ($index + 1) . ". " . $external_userid . "\n";
            }
        }
    }
    exit;
}

echo "</div>
</body>
</html>";
?>

 

声明与免责说明

  • 1. 本站部分图片来源于 Unsplash,版权归原作者所有。
  • 2. 本站文章、开源代码及免费下载资源仅供个人学习、研究或非商业用途参考,禁止用于商业盈利,版权归原作者所有。
  • 3. 内容(含图片、文章、代码)部分转载自网络,若存在侵权,请联系 meng@yimiaonet.com 处理。
  • 4. 未经本站书面许可,不得复制、盗用、采集、传播本站内容至任何平台。
  • 5.      本站内容不构成专业建议,“OKMG”为注册商标,官方网站:www.okmg.cn,本站保留修改本声明的权利。
免费源码

AI人工智能机器人研发展示网站模板

2025-11-26 11:14:06

科技资讯

想知道企业如何成功开发小程序?实战案例深度揭秘!

2025-11-18 13:55:53

0 条回复A文章作者M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
搜索