在Linux上自动登录Lync会议

哈Ha!

对我来说,这句话类似于“ hello world”,因为我终于找到了第一本出版物。 由于没有什么可写的,所以我将这一美好的时光推迟了很长一段时间,但是我也不想浪费很多时间已经吸走的东西。 总的来说,对于我的第一本出版物,我想要一些新颖的东西,对他人有用,并且包含一些挑战和解决问题的方法。 现在我可以分享这个。 现在,首先是第一件事。

参赛作品


一切始于一个事实,即不久前我将自己的Linux Mint放在一台可以运行的计算机上。 许多人可能都知道带有Sipe插件的Pidgin可以完全替代Linux系统的Microsoft Lync(现在称为商务Skype)。 由于工作的特殊性,我经常必须参加SIP会议,而当面包师进来时,会议的入口很基本:我们收到邮件邀请,单击登录链接,我们就可以准备就绪。

切换到Linux的阴暗面时 ,事情变得有些复杂:当然,会议有一个Pidgin条目,但是为此,您需要从sip帐户属性的菜单中选择加入会议的选项,并在打开或输入组织者名称的窗口中插入会议链接。和conf ID。 一段时间后,我开始思考:“有可能以某种方式简化它吗?” 是的,您说的是,为什么您要用它,为什么会坐在Windows上,而不会吹胡须呢。

步骤1.研究


涅克拉索夫(Nekrasov)在他的作品“谁能在俄罗斯生活得很好”中说:“真是个奇思妙想-它将一路狂奔-你不会击败她。”

因此,自从想法浮出水面以来,一段时间后第一个想法应运而生。 一切似乎都很简单-您需要截取对Meet.company.com/user/confid链接的调用-将Web应用程序的本地进程放在独轮车上的127.0.0.1上,并输入公司域的静态条目,通过该条目在/ etc / hosts中在指向本地主机的会议中。 此外,此网络服务器应处理链接到它的链接,并以某种方式将其传输到Pidgin中(我会马上说,在这个阶段,我完全不知道如何将其提供给他)。 解决方案当然闻起来像拐杖,但我们是程序员,拐杖不会吓scar我们(吱吱声)。

然后偶然地我以某种方式打开了一个指向Google Chrome邀请函的链接(通常我总是使用Mozilla Firefox)。 令我惊讶的是,该网页看起来完全不同-没有用户数据输入表单,进入该页面后立即有一个请求,要求通过xdg-open打开某些内容。 出于娱乐目的,我单击“是”,然后出现一条错误消息-无法打开链接lync15:confjoin?Url = https://meet.company.com/user/confid。 嗯 这是什么样的xdg-open?打开此类链接需要什么? 仔细阅读文档后发现,这是一个图形化的shell处理程序,可以使用uri方案的协议或某些类型的文件来帮助启动关联的应用程序。 关联是通过mime类型映射配置的。 因此,我们看到我们正在开始搜索名称为lync15的 uri方案的映射应用程序,并将链接传递给xdg-open,从理论上讲,它应该将其传递给负责此类链接的某些应用程序。 我们在系统中当然没有这些。 如果没有,他们在开源世界中的表现如何? 没错,我们将自己编写。

进一步沉浸在Linux世界中,尤其是在研究图形外壳(桌面环境,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,并使用来自浏览器和... bummer的相同链接。 他再次说不能处理链接。

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

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

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

通过xdg-open调用尝试2号,然后再次失败。 没什么,困难不会吓我们,而只会激发人们的兴趣。 并掌握了bash的所有功能(即跟踪),我们全力投入调试工作。 重要的是在这里注意xdg-open只是一个shell脚本。

 bash -x xdg-open $url 

分析跟踪后的输出,将进一步的控制权转移到exo-open变得有点清楚。 而且这已经是一个二进制文件,并且理解为什么在参数中传递指向它的链接时为什么返回不成功的返回代码已经变得更加困难。

通过xdg-open的内部运行,我发现它可以分析各种环境参数,并将控制权传递给某些工具来打开特定于特定DE的文件/链接,或者具有open_generic函数形式的后备

 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 ,那么我们会立即将控制权传递给open_generic函数。

尝试3号,您认为它有用吗? 是的,现在如何。 但是错误消息已经更改,这已经在进行-现在他告诉我找不到该文件,他以文件的形式给我写了作为参数传递的链接。

这次结果是函数is_file_url_or_path ,它分析到文件的链接:// file或文件的路径或其他内容。 而且由于前缀(URL方案)具有数字这一事实,所以检查无法正常进行,并且正则表达式仅检查由以下字符组成的字符集:alpha:点和破折号。 在咨询了rfc3986标准的统一资源标识符之后,很明显,这次Microsoft没有违反任何内容(尽管我有这样的版本)。 只是一个字符类:alpha:仅包含拉丁字母。 我迅速将常规检查更改为字母数字。 做完了,您很高兴,一切终于开始了,在对脚本应用程序进行了所有检查之后进行控制,我们的链接显示在控制台上,一切都按预期进行。 在那之后,我开始怀疑exo-open的所有问题也是由于图中的数字所导致的链接格式的验证。 为了检验假设,我将应用程序的mime类型注册更改为lync方案和voila-一切正常,而无需重新定义open_xfce函数。 但这对我们没有任何帮助,因为进入会议的网页正是使用lync15创建链接。

至此,路径的第一部分已经完成。 我们可以拦截链接调用,然后我们需要对其进行某种处理并将其传递到Pidgin中。 为了了解使用“加入会议”菜单中的链接输入数据时内部工作的方式,我克隆了Sipe项目存储库并准备再次探究代码。 但是幸运的是,在这里,我被contrib / dbus /目录中的脚本所吸引:

  • 通过uri.pl进行Sipe参加会议
  • 与组织者和ID.pl参加Sipe参加会议
  • 速记电话号码
  • Sipehelp.pm

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

步骤2.为自动加入实现处理程序


既然有珍珠的现成示例,我决定只使用sipe-join-conference-with-uri.pl并为自己进行一些修改。 我可以用珍珠写,所以这没有造成任何特别的困难。

分别测试脚本后,我将其调用输入到lync.desktop文件中。 这是一次胜利! 当您进入加入会议的页面并允许启动xdg-open时,来自Pidgin的会议弹出窗口将自动打开。 我多么高兴。
受到成功的鼓舞,我决定对主浏览器Mozilla Firefox执行相同的操作。 通过狐狸进入时,将打开一个授权页面,并且在最底部有一个使用office communicator加入按钮。 她也引起了我的注意。 当您在浏览器中单击它时,链接将转到:

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

他亲切地告诉我,他不知道如何打开它,也许我没有与此协议相关的应用程序。 好吧,我们已经通过了。

快速也为uri-scheme 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。 我正在编写一个带有conf协议链接的简单html文件,在浏览器中将其打开,然后单击链接-哟! 随即打开一个窗口,询问您需要在哪个应用程序中打开我们的链接,并且列表中已经有Lync应用程序-我们已以各种可能的方式诚实地进行了注册。 窗口中有一个选中标记“记住选择并始终在我们的应用程序中打开链接”,请注意,单击“确定”。 这是第二次胜利-会议窗口打开。 同时,打开会议不仅在单击链接时有效,而且在从所需页面切换为加入会议时也已有效。

然后,我检查了删除network.protocol-handler.expose.conf参数是否不会以任何方式影响Fox中的协议操作。 链接继续起作用。

结论


我将我的所有成就上传到了github仓库,所有资源的链接将在本文的结尾。
从那些想使用我的最佳实践的人那里获得反馈对于我来说将是很有趣的。 我必须马上说我只对我的Linux Mint系统执行了所有操作,因此某些其他发行版或台式机可能无法在该版本中使用。 相反,我什至几乎可以肯定这一点,因为我在xdg-open中仅修补了1个仅与我的DE相关的功能。 如果要添加对其他系统或dekstopov的支持,请在github中向我发送一个池请求。

整个项目的实施耗时1个晚上。

参考文献:

Source: https://habr.com/ru/post/zh-CN471434/


All Articles