微信客服,有新客户发起会话时,没有提示怎么办

不得不说,微信客服+微信公众号,为我们的客户提供服务,是个物美价廉的选择,尤其是对于以服务为主的小型团队。

但也有个很痛苦的地方:当有新客户发起会话时,没有提示。我们不得不安排多人,不定时地查看客服界面。

这种主动式的查询,真正体验了才知道有多痛苦,最终结果就是经常性地在客户发消息后长时间没人回应。

方法概要

我们小团队决定解决这个烦恼,方法如下:

1、用C#+WPF应用程序模式,给微信客服加个壳;

2、注入一段监听代码到微信客服代码中,当有新客户会话时,给”壳“发通知;

3、”壳“收到通知,根据情况播放提示音。

实现细节

打开VS开发平台(笔者用的是Visual Studio 2019),建立一个C#语言的WPF应用程序。

使用NuGet包管理器,安装CefSharp.Wpf。这是一个以谷歌的chromium为内核的浏览器组件。

界面很简单,就一个主界面,并放入CefSharp的ChromiumWebBrowser,并填充整个界面,XAML代码如下:

接下来,新建一个类CustomerMonitor,其主要目的就是响应客服监听代码的回调,播放提示音或者暂停提示音。代码如下:

namespace MPKFWeixin
{
    public class CustomerMonitor
    {
        public CustomerMonitor()
        {
            player = new SoundPlayer(Properties.Resources.has_customer);
        }

        SoundPlayer player;
        public void onCustomerChanged(String strCount)
        {
            int count = 0;
            int.TryParse(strCount, out count);
            if (count > 0)
            {
                //有新会话,循环播放提示音。count是新会话数量。
                player.PlayLooping();
            }
            else
            {
                //无会话,停止提示音。
                player.Stop();
            }
        }
    }
}

接下来我们的工作在主窗体代码中。主窗口有两个重要成员。

        //计时器,用于在监听代码注入成功之前,间隔一段时间再次尝试。
        System.Timers.Timer loopTimer;
        //监听回调类
        public CustomerMonitor m_monitor;

在浏览器组件成功加载网页后,为程序”壳“与微信客服的web代码搭建互通桥梁,并启动计时器尝试注入监听代码。

        private void webView_Loaded(object sender, RoutedEventArgs e)
        {
            IBrowser browser = webView.GetBrowser();
            if(browser != null)
            {
                //浏览器组件与回调类绑定,建立通信桥梁
                m_monitor = new CustomerMonitor();
                webView.JavascriptObjectRepository.Register("monitor", m_monitor, true, BindingOptions.DefaultBinder);

                //启动计时器,每10秒尝试一次注入
                loopTimer = new System.Timers.Timer(10000);
                loopTimer.Elapsed += new System.Timers.ElapsedEventHandler(onTimerHandle);
                loopTimer.AutoReset = true;
                loopTimer.Enabled = true;
            }
        }

在计时器的处理过程中,我们尝试注入监听代码,如果成功,销毁计时器。之所以这样,是因为需要监听的目标出现之前,微信客服还需要登录、选择公众号两个步骤。

        public async void onTimerHandle(object source, System.Timers.ElapsedEventArgs e)
        {
            bool br = await bindMonitor();
            if (br)
            {
                //注入成功,销毁计时器
                loopTimer.Close();
                loopTimer = null;
            }
        }

bindMonitor内容如下:

 private async Task<bool> bindMonitor()
        {
            IBrowser browser = webView.GetBrowser();
            if (browser == null) return false;
            String bindscript = @"(function(){obj = $(""span[data-reactid = '.0.5.0.0.1.1']"");
                                    if(obj.length > 0){
                                        obj.bind('DOMNodeInserted',async function(e) {
                                            await CefSharp.BindObjectAsync('monitor');
                                            monitor.onCustomerChanged($(e.target).text());
                                        });
                                        return 1;
                                    }
                                    return 0;
                                })()";
            JavascriptResponse result = await browser.EvaluateScriptAsync(bindscript);
            if(result != null && result.Success)
            {
                String strCount = result.Result.ToString();
                int count = 0;
                int.TryParse(strCount, out count);
                if (count == 1)
                {
                    return true;
                }
            }

            return false;
        }

这个代码的核心就是 bindscript 这个内容。这是一串js代码。首先查找需要监听的DOM对象,绑定监听代码,绑定成功返回1,否则0。

监听代码的内容为,当发生 DOMNodeInserted 事件时(内容发送变化时),就通知“壳”。

那么我们需要监听变化的目标是什么呢?实际上就是微信客服中X人等待接入那个数字标签,我们用浏览器的调试功能打开仔细看它的特征就比较明白了。

好了,很简单的一个小程序,解决我们长期头痛的大问题。

程序我们也打包,有需要的小伙伴可以下载使用。

链接:https://pan.baidu.com/s/16bkgm5G1eiKKhkT37QutOQ
提取码:umpm

附上界面截图