在办公自动化领域,Python有非常大的优势。但是随着SaaS化产品越来越多,我们很多办公场景极其依赖浏览器,但是如何从浏览器中触发Python自动化程序,目前还没有一个特别好的方案,本文就试图提供一种沟通浏览器和Python程序的方案,让Python自动化程序可以在浏览器网页上被触发,且可以携带浏览器中的数据作为Python程序的输入参数。

为方便理解,我们以一个实际的外呼系统案例(在PC端网页上直接用我们手机拨号并通话),来一步步拆解这个过程。

在Windows11环境下安装Intel Unison

Intel Unison是一款PC手机互联的工具,相比微软自带的「手机连接」,它不仅支持更多型号的安卓手机型号,而且还支持iPhone。通过Intel Unison把PC和手机连接后,可以在PC端使用手机拨打电话、发送短信、查看图库、接收通知。

安装使用Intel Unison有一些条件:

  • 需要Windows11的操作系统;
  • 只能在Microsoft Store中安装(点击安装);
  • 需要PC拥有蓝牙模块;
  • 虽然软件名字叫Intel Unison,但亲测AMD设备也是可以安装的;
  • 手机端也需要安装Intel Unison软件(安卓版本在国内应用商店没有上架,只能搜索APK文件安装,这里就不提供链接了);
 

 

Intel Unison的详细使用帮助可以查看其它文章,在这一步我们完成了PC端打电话的可能,但是怎么自动拨号呢?我们继续往下走。

Python自动化拨号程序

1、Python自动化程序主要是使用了「pywinauto」包,来实现UI自动化。

2、将以下程序保存为intelunison.py文件,并放在C盘intelunison目录,形成C://intelunison//intelunison.py的目录结构。

# 本程序由另外一位同伴:罗典 开发完成,在此鸣谢。
import pywinauto
from pywinauto.application import Application
import time
import sys

def intelunison(telnumber):
    # 链接已启动的unison
    app = Application(backend='uia').connect(title='Intel® Unison™')    
    # 找到任务栏点击unison图标显示在台前
    app_icons = Application(backend='uia').connect(class_name='Shell_TrayWnd')
    unison_icons = app_icons['任务栏']
    unison_icons.child_window(title="Intel® Unison™ - 1 个运行窗口", auto_id="AppUp.IntelTechnologyMDE_8j3eq9eme6ctt!App", control_type="Button").click()
    # 获取unison窗口
    dlg = app["Intel® Unison™"]
    # 获取侧边栏控件
    menu = dlg['GroupBox0']
    # 获取通话控件并点击
    telButton = menu.child_window(title="通话", control_type="Button")
    telButton.click()
    time.sleep(0.5)
    dialinput = menu.child_window(title='输入电话号码',control_type='Edit')
    dialinput.set_focus()
    time.sleep(0.5)
    pywinauto.keyboard.send_keys(telnumber)
    time.sleep(0.5)
    # 移动至拨号键
    dailButton = menu.child_window(title="电话", control_type="Button")
    dailButton.click()

if __name__ == '__main__':
    # 通过命令行参数获取电话号码的参数值
    telnumber = sys.argv[1].split(':',)[1]
    intelunison(telnumber)

3、在intelunison文件夹中,右键「在终端中打开」,运行以下命令,就可以自动拨号了。10086可以换成其他任何想要拨打的号码。

python .\intelunison.py intelunison:10086

4、演示动图:

图片

5、在终端中可以手动运行,如何在浏览器中触发呢?我们继续往下走。

将Python自动化程序构建为exe程序

Windows环境在网页上不能直接触发一个Python程序,但是有方法可以触发一个exe程序(具体方案见下文),所以我们需要把写好的Python程序,构建为一个exe程序。

这里需要用到构建exe程序的包:pyinstaller,在终端中运行 pip install pyinstaller 进行安装。

在intelunison文件夹中,右键「在终端中打开」,运行以下命令

 pyinstaller -F C:\intelunison\intelunison.py 

运行完成后,生成的exe程序会放在,新生成的dist文件夹下,文件路径结构:C:\intelunison\dist\intelunison.exe。

图片

在网页上触发程序的原理

我们经常遇到的一个场景:点击网页上的一个邮箱,会自动唤起已经安装的邮件客户端,并且把刚刚点击的邮箱作为收件人。

这里其实用到的是Windows「文件类型/链接类型」的概念。

  • 1、「文件类型」是软件和文件之间的绑定关系,比如安装并设置了默认音乐播放器后,音乐播放器会自动绑定.mp3、.wma的音频文件。
  • 2、「链接类型」是软件和链接地址之间的绑定关系,比如安装并设置了默认浏览器后,浏览器会自动绑定http://www.baidu.com、https://www.baidu.com的链接地址,其中http和https就是链接协议或链接类型。这样在聊天软件中点击一个链接,就会使用默认浏览器打开该链接。
图片

还是回到「网页上点击邮箱唤起邮件客户端」这个场景上来,我们分析这个邮箱的html代码会看到如下的写法:

<a href="mailto:1000@qq.com">1000@qq.com</a>

 

这个a标签的href属性并不是常见的http或https而是mailto,正是这个mailto让浏览器知道要唤起另外一个程序。类似这样的功能,我们可以自定义吗?答案是可以的,修改注册表就可以,实际步骤如下:

  • 1、在intelunison文件夹下,新建一个txt文件,名字叫intelunison.txt。
  • 2、复制以下内容到这个txt文件,这里我们定义了一个链接类型叫callto(不能用intelunison,软件本身已经占用了这个链接类型),并且指向到了 C:\\intelunison\\dist\\intelunison.exe  这个软件。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\callto]
"URL Protocol"="C:\\intelunison\\dist\\intelunison.exe"
@="intelunison"
[HKEY_CLASSES_ROOT\callto\DefaultIcon]
@="C:\\intelunison\\dist\\intelunison.exe"
[HKEY_CLASSES_ROOT\callto\shell]
[HKEY_CLASSES_ROOT\callto\shell\open]
[HKEY_CLASSES_ROOT\callto\shell\open\command]
@="\"C:\\intelunison\\dist\\intelunison.exe" %1"
  • 3、 保存后,修改文件后缀为.reg,也就是变为intelunison.reg。
  • 4、双击intelunison.reg运行即可。

特别注意,@=""C:\intelunison\dist\intelunison.exe" %1" 中的 %1 是一个占位符,实际运行时会替换为a标签的href属性值,传递给exe程序,也就是传递给Python程序作为命令行参数。以此来实现,点击哪个号码,拨打哪个号码的效果。

DEMO应用场景

  • 1、在intelunison文件夹下,新建一个intelunison.txt的文件,并且右键用记事本打开。
  • 2、复制以下html内容到文件中保存。
<!DOCTYPE html>
<head>
    <title> DEMO</title>
</head>
<body>
    <p>中国移动:<a href="callto:10086">10086</a></p>
    <p>中国电信:<a href="callto:10000">10000</a></p>
    <p>中国联通:<a href="callto:10010">10010</a></p>
</body>
</html>
  • 3、 保存后,修改文件后缀为.html,也就是变为intelunison.html。
  • 4、双击在浏览器中打开。
  • 5、点击号码进行测试,首次点击会有一个提示,勾选「始终允许」,并打开。
图片
  • 6、至此,我们整个流程都拉通了,我们用动图看一下整个流程。
图片

适配实际应用场景

在实际的工作场景中,网页上的电话号码并不会按照我们预想的方式来呈现。这个时候有两种方法:

  • 1、如果你可推动页面修改,可以请开发同学,在所有手机号码上加一个a标签,且href属性为:callto:手机号码;
  • 2、如果你没有能力或权限推送页面修改,可以使用油猴浏览器插件对页面进行个性化定制。这个时候,也可以请开发同学帮忙,这种修改是不需要做任何系统发布就可以实现的。

软硬件需求清单

  • Windows11系统的PC(Intel Unison软件需要Win11才支持),且拥有蓝牙功能;
  • PC端、手机端均安装Intel Unison软件;
  • PC端安装Python及必要的第三方包;
  • PC端安装Google Chrome浏览器且安装「油猴插件」。

总结与拓展

完成整个流程后,我们按照用户流程来再梳理一遍:

  1. 用户点击网页上的一个手机号码;
  2. 激活一个exe程序,并且把a标签的href属性值作为参数传递;
  3. exe程序是由Python程序打包来的,href属性值在Python程序中被分隔,仅留下手机号码传递Python程序函数中;
  4. Python程序接收手机号码作为参数,并使用pywinauto包来控制Intel Unison软件完成自动化拨号动作。

这样一个一键拨号的流程,对于有大量外呼需求的客服、售后、销售,效率提升是非常显著的。当然现在市面上有专业的外呼系统,但是这些外呼系统都是按坐席收费且价格不低,外呼号码固定容易被标记。而本方案可以无限制复制,且可使用个人号码进行外呼。

除此之外,使用本方案经过简单改动拓展,还可以实现批量发送个性化短信,一键加微信好友,批量发送个性化微信消息等效果。更多的使用场景,大家可以一起探索,但是不要发垃圾消息哦。