Linux上自动登录Lync会议

嘿哈布尔!

对我来说,这句话类似于 hello world,因为我终于发表了第一篇文章。 我把这个美好的时刻推迟了很长一段时间,因为没有什么可写的,而且我也不想吸吮已经吸了很多次的东西。 总的来说,对于我的第一篇出版物,我想要一些原创的、对其他人有用的东西,并包含某种挑战和解决问题的内容。 现在我可以分享这个了。 现在让我们按顺序谈谈一切。

输入

这一切都是从不久前我在工作计算机上下载 Linux Mint 开始的。 许多人可能知道带有 Sipe 插件的 Pidgin 是 Linux 系统上 Microsoft Lync(现在称为 Skype for Business)的完全合适的替代品。 由于工作的特殊性,我经常要参加SIP会议,当我还是一名Windows工作人员时,进入会议是初级的:我们收到邮件邀请,点击登录链接,然后就可以出发了。

当切换到 Linux 的黑暗面时,一切都变得更加复杂:当然,您也可以在 Pidgin 中登录会议,但要做到这一点,您需要在 SIP 帐户属性的菜单中选择加入会议选项,然后在打开的窗口中,插入会议链接或输入组织者的名称和会议 ID。 一段时间后,我开始思考:“是否有可能以某种方式简化这个过程?” 是的,你可能会说,你到底为什么需要这个?我宁愿坐在 Windows 上也不会让我大吃一惊。

第一步:研究

涅克拉索夫在他的著作《谁在罗斯生活得很好》中说道:“如果你脑子里突发奇想,你无法用木桩把它打倒。”

所以,一旦这个想法进入我的脑海,过了一段时间,第一个实施的想法就出现了。 一切看起来都很简单 - 您需要拦截对链接的访问 meet.company.com/user/confid — 在您的汽车上安装本地 Web 应用程序进程(地址为 127.0.0.1),并在 /etc/hosts 中为您进入会议的公司域添加一个静态条目,指向 localhost。 接下来,这个网络服务器必须处理到达它的链接,并以某种方式将其传输到 Pidgin 内部(我会立即说,在这个阶段我仍然不知道如何将其提供给它)。 当然,解决方案有点拐杖的味道,但我们是程序员,拐杖不会吓到我们(狗屎)。

然后,一个偶然的机会,我以某种方式在 Google Chrome 中打开了邀请链接(通常我总是使用 Mozilla Firefox)。 令我惊讶的是,该网页看起来完全不同 - 没有用于输入用户数据的表单,进入页面后立即有一个通过以下方式打开某些内容的请求 XDG开。 只是为了好玩,我单击“是”,然后出现一条错误消息 - 链接 lync15:confjoin?url=https://meet.company.com/user/confid 无法打开。 唔。 这是什么类型的 xdg-open?它需要什么才能打开此类链接? 对文档的事后分析表明,它是一个 GUI 处理程序,可帮助运行具有 uri 方案协议或特定文件类型的关联应用程序。 关联是通过 mime 类型映射来配置的。 因此,我们看到我们正在搜索名为 uri 方案的匹配应用程序 lync15 并且链接被传递给 xdg-open,理论上,xdg-open 应该将其传递给负责此类链接的某个应用程序。 当然,我们的系统中没有。 如果没有,那么他们在开源世界里做什么? 没错,我们自己写。

进一步沉浸在 Linux 世界中,特别是研究图形 shell(桌面环境,DE)如何工作,顺便说一句,我在 Linux Mint 中有 Xfce,表明应用程序和与之相关的 mime 类型通常直接编写在扩展名为 .desktop 的快捷方式文件。 好吧,为什么不呢,我创建一个简单的应用程序快捷方式,它应该简单地启动一个 bash 脚本并将传递给它的参数输出到控制台,我只提供快捷方式文件本身:

[Desktop Entry]
Name=Lync
Exec=/usr/local/bin/lync.sh %u
Type=Application
Terminal=false
Categories=Network;InstantMessaging;
MimeType=x-scheme-handler/lync15;

我从控制台启动 xdg-open,传递来自浏览器的相同链接,然后……真糟糕。 它再次表示无法处理该链接。

事实证明,我没有使用我的应用程序更新关联 mime 类型的目录。 这是通过一个简单的命令完成的:

xdg-mime default lync.desktop x-scheme-handler/lync15

它只是编辑文件 〜/.config/mimeapps.list.

尝试使用 xdg-open 调用进行 2 次尝试,但再次失败。 没什么,困难不会吓到我们,只会激发我们的兴趣。 并配备了 bash 的所有功能(即跟踪),我们一头扎进调试。 这里需要注意的是,xdg-open 只是一个 shell 脚本。

bash -x xdg-open $url

跟踪后分析输出,可以清楚地看出控制权随后转移到 外开放。 而且这已经是一个二进制文件,更难以理解为什么在参数中传递指向它的链接时它会返回不成功的返回代码。

在查看了 xdg-open 的内部结构后,我发现它会分析各种环境参数,并将控制进一步传递给一些用于打开特定于特定 DE 的文件链接的工具,或者它具有后备功能 开放通用

open_xfce()
{
if exo-open --help 2>/dev/null 1>&2; then
exo-open "$1"
elif gio help open 2>/dev/null 1>&2; then
gio open "$1"
elif gvfs-open --help 2>/dev/null 1>&2; then
gvfs-open "$1"
else
open_generic "$1"
fi

if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}

我将快速在这里嵌入一个小技巧,分析传递的参数以及我们的特定子字符串是否位于那里 lync15:,然后我们立即将控制权转移给该函数 开放通用.

尝试第三个,你认为它有效吗? 是的,现在,当然。 但是错误消息已经改变了,这已经是进步了 - 现在他告诉我找不到该文件,并且他以文件的形式给我写了作为参数传递的相同链接。

这次竟然是一个函数 is_file_url_or_path,它分析传递给输入的文件链接: file:// 或文件的路径或其他内容。 由于我们的前缀(url 方案)包含数字,并且正则表达式仅检查由 :alpha: 点和破折号组成的字符集,因此检查无法正常工作。 查阅了rfc3986标准后 统一资源标识符 很明显,这次微软没有违反任何规定(尽管我有这样的版本)。 仅字符类 :alpha: 仅包含拉丁字母表中的字母。 我很快将常规检查更改为字母数字。 完成了,你太棒了,一切终于开始了,所有检查后的控制权都交给了我们的脚本应用程序,我们的链接显示在控制台上,一切都是它应该的样子。 在此之后,我开始怀疑 exo-open 的所有问题也是由于方案中的数字对链接格式的验证造成的。 为了测试假设,我将应用程序的 mime 类型注册更改为一个方案 林肯 瞧 - 一切正常,无需覆盖 open_xfce 函数。 但这对我们没有任何帮助,因为进入会议的网页创建了与lync15的链接。

至此,旅程的第一部分已经完成。 我们知道如何拦截链接调用,然后需要以某种方式对其进行处理并在 Pidgin 内传递。 为了了解通过“加入会议”菜单中的链接输入数据时它的内部工作原理,我克隆了 Sipe 项目的 Git 存储库,并准备再次深入研究代码。 但后来幸运的是,我被目录中的剧本吸引了 贡献/dbus/:

  • sipe-加入会议-with-uri.pl
  • sipe-join-conference-with-organizer-and-id.pl
  • sipe-call-电话号码.pl
  • SipeHelper.pm

事实证明,Sipe 插件可通过 dbus(桌面总线)进行交互,并且在脚本内有通过链接加入会议的示例,可以通过组织者的名称和 conf-id,也可以通过 sip 发起呼叫。 这正是我们所缺少的。

步骤 2. 实现自动连接处理程序

由于 Pearl 中有现成的示例,所以我决定只使用 sipe-加入会议-with-uri.pl 并稍微修改一下以适合自己。 我可以用 Pearl 写,所以没有造成任何特别的困难。

单独测试脚本后,我将其调用写入文件中 lync.桌面。 这是一场胜利! 当进入会议加入页面并允许 xdg-open 运行时,来自 Pidgin 的会议弹出窗口将自动打开。 我多么高兴啊。
受到成功的鼓舞,我决定对我的主要浏览器 Mozilla Firefox 做同样的事情。 当你通过fox登录时,会打开一个授权页面,最底部有一个按钮 使用 Office Communicator 加入。 她是引起我注意的人。 当你在浏览器中点击它时,它会转到以下地址:

conf:sip:{user};gruu;opaque=app:conf:focus:id:{conf-id}%3Frequired-media=audio

他友善地告诉我,他不知道如何打开它,也许我没有此类协议的关联应用程序。 嗯,我们已经经历过这个了。

我也快速为 uri 方案注册我的脚本应用程序 CONF 然后……什么也没发生。 浏览器不断抱怨没有应用程序处理我的链接。 在这种情况下,从控制台使用参数调用 xdg-open 效果很好。

“在 Firefox 中设置自定义协议处理程序” - 我带着这个问题上网。 在对 stackoverflow 进行了多次讨论(以及没有它我们会怎样)之后,似乎找到了答案。 您需要在中创建一个特殊参数 about:config中 (当然用conf替换foo):

network.protocol-handler.expose.foo = false

我们创建了它,打开链接,然后……没有这样的运气。 浏览器就像什么都没发生一样,说它不知道我们的应用程序。

我正在阅读有关从 Mozilla 注册协议的官方文档,有一个选项可以在 gnome 桌面本身中注册关联(当然,用 conf 替换 foo):

gconftool-2 -s /desktop/gnome/url-handlers/foo/command '/path/to/app %s' --type String
gconftool-2 -s /desktop/gnome/url-handlers/foo/enabled --type Boolean true

我注册,打开浏览器……然后又是胡子。

文档中的一行引起了我的注意:

下次您单击协议类型 foo 的链接时,系统会询问您使用哪个应用程序打开它。

— 谢苗·谢梅内奇
- 啊啊

我们不点击链接,但网页只是通过 javascript 更改 window.location。 我编写了一个简单的 html 文件,其中包含 conf 协议的链接,在浏览器中打开它,单击该链接 - 哟! 将打开一个窗口,询问我们需要在哪个应用程序中打开链接,列表中已经有我们的 Lync 应用程序 - 我们诚实地以所有可能的方式注册了它。 窗口中有一个复选框“记住选择并始终在我们的应用程序中打开链接”,标记它,单击“确定”。 这是第二次胜利——会议窗口打开。 同时,打开会议不仅在点击链接时有效,而且在从我们需要的加入页面移动到会议时也有效。

然后我检查了一下,删除参数 网络.协议处理程序.expose.conf 不会以任何方式影响该协议在 Fox 中的运行。 这些链接继续有效。

结论

我已将所有工作上传到 GitHub 存储库;所有资源的链接将位于文章末尾。
我有兴趣收到那些想要使用我的作品的人的反馈。 我应该立即注意到,我只为我的 Linux Mint 系统进行了所有开发,因此其他一些发行版或桌面可能无法在该版本中运行。 或者更确切地说,我什至几乎可以肯定这一点,因为我只修补了 xdg-open 中仅与我的 DE 相关的 1 个函数。 如果您想添加对其他系统或桌面的支持,请在 Github 上向我写拉取请求。

整个工程花了1个晚上才完成。

参考文献:

来源: habr.com

添加评论