Têketina otomatîkî ya konferansên Lync-ê li ser Linux

Hey Habr!

Ji bo min, ev hevok dişibihe silava cîhanê, ji ber ku ez di dawiyê de gihîştim weşana xweya yekem. Min ev kêliya ecêb ji bo demek dirêj paş xist, ji ber ku tiştek ku ez li ser binivîsim tune bû, û di heman demê de min nexwest tiştekê ku berê çend caran hatî mêjandin jî bipije. Bi gelemperî, ji bo weşana xweya yekem min tiştek orîjînal, ji yên din re bikêr û cûreyek pirsgirêk û çareserkirina pirsgirêkê dihewîne xwest. Û niha ez dikarim vê parve bikim. Niha em li ser her tiştî bi rêzê bipeyivin.

entry

Hemî gava ku demek berê min Linux Mint li ser komputera xebata xwe dakêşand dest pê kir. Pir kes belkî dizanin ku Pidgin bi pêveka Sipe re ji bo pergalên Linux-ê ji bo Microsoft Lync (niha jê re Skype ji bo karsaziyê tê gotin) veguhezek bi tevahî maqûl e. Ji ber taybetîyên xebata xwe, ez pir caran neçar im ku beşdarî konferansên SIP-ê bibim, û dema ku ez xebatkarê Windows-ê bûm, têketina konferansan bingehîn bû: em bi e-nameyê vexwendnameyek werdigirin, li ser girêdana têketinê bikirtînin, û em amade ne ku biçin. .

Dema ku derbasî aliyê tarî yê Linux-ê bû, her tişt hinekî tevlihevtir bû: bê guman, hûn dikarin di Pidgin de jî têkevin konferansan, lê ji bo vê yekê hûn hewce ne ku vebijarka konferansa tevlêbûnê di menuyê de di taybetmendiyên hesabê xweya SIP-ê de û di nav menuyê de hilbijêrin. pencereya ku vedibe, lînka konferansê têxin an jî navê organîzator û nasnameya konfêransê binivîsin. Û piştî demekê min dest pê kir ku ez bifikirim: "ma mimkun e ku meriv vê yekê bi rengek hêsan bike?" Erê, hûn dikarin bêjin, çima hûn bi vê yekê hewce ne ku ez li ser Windows-ê rûnim û hişê xwe neteqînim?

Gav 1: Lêkolîn

Nekrasov di berhema xwe ya bi navê "Kî li Rûsyayê baş dijî."

Ji ber vê yekê, gava ku fikir ket serê min, piştî demekê yekem ramana ji bo bicihkirinê derket holê. Her tişt hêsan xuya bû - hûn hewce ne ku hûn gihîştina girêdanan bigirin meet.company.com/user/confid - pêvajoyek serîlêdana webê ya herêmî li ser gerîdeya xwe li 127.0.0.1 saz bikin û di /etc/hosts de têketinek statîk ji bo domaina pargîdanî ya ku hûn tê de têkevin konferansê lê zêde bikin, nîşan bide localhost. Dûv re, pêdivî ye ku ev servera malperê zencîreya ku jê re hatî pêvajoy bike û bi rengekî wê veguhezîne hundurê Pidgin (ez ê tavilê bibêjim ku di vê qonaxê de min hîn jî nizanibû ku meriv wê çawa bide wê). Çareserî, bê guman, bêhna kêzikan distîne, lê em bernamenûs in, kêzik me natirsînin (xemgîn).

Dûv re, bi şens, min bi rengekî zencîreya vexwendinê li Google Chrome vekir (û bi gelemperî ez her gav Mozilla Firefox bikar tînim). Û bi şaşwaziya min, rûpela malperê bi tevahî cûda xuya bû - formek ji bo têketina daneyên bikarhêner tune bû û tavilê piştî têketina rûpelê daxwazek ji bo vekirina tiştek hebû xdg-vekirî. Tenê ji bo kêfê, ez "erê" bikirtînim û peyamek xeletiyek xuya dike - lînka lync15:confjoin?url=https://meet.company.com/user/confid nayê vekirin. Hmm. Ev çi celeb xdg-vekirî ye û ji bo vekirina girêdanên weha çi hewce dike? Xwendinek piştî mirinê ya belgeyê eşkere kir ku ew rêvekerek GUI ye ku bi protokolên ji bo nexşeya uri an bi celebên pelên taybetî re dibe alîkar ku serlêdanên têkildar bimeşîne. Komel bi riya nexşeya mime-type têne mîheng kirin. Ji ber vê yekê em dibînin ku em ji bo nexşeyek uri ya bi navê lêgerînek ji bo serîlêdanek hevgirtî dimeşînin lync15 û zencîre ji xdg-open re derbas dibe, ku wê hingê, di teoriyê de, divê wê ji hin serîlêdana ku berpirsiyarê vî rengî girêdanê ye re derbas bike. Ya ku, bê guman, di pergala me de tune. Heke ne, wê hingê ew di cîhana çavkaniya vekirî de çi dikin? Rast e, em ê bi xwe binivîsin.

Zêdetir binavbûna di cîhana Linux-ê de û nemaze di lêkolîna ku çawa şêlê grafîkî (hawirdora sermaseyê, DE) dixebite, bi awayê, min Xfce di Linux Mint de heye, destnîşan kir ku serîlêdan û tîpa mîmîka ku pê re têkildar in bi gelemperî rasterast di nav de têne nivîsandin. pelên kurtebirê yên bi dirêjkirina .desktop. Welê, çima na, ez kurtenivîsek serîlêdanê ya sade diafirînim, ku pêdivî ye ku bi hêsanî skrîptek bash bide destpêkirin û argumana ku jê re derbas dibe ji konsolê re derxe, ez tenê pelê kurtebirê bixwe peyda dikim:

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

Ez xdg-open-ê ji konsolê vedikim, heman lînka ku ji gerokê tê û ... derbas dikim. Dîsa dibêje ku ew nikare girêdanê pêvajoyê bike.

Wekî ku diqewime, min pelrêça cûreyên mime yên têkildar bi serîlêdana xwe re nûve nekir. Ev bi fermanek hêsan pêk tê:

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

ku bi tenê pelê biguherîne ~/.config/mimeapps.list.

Hewldana hejmara 2 bi banga xdg-vekirî - û dîsa têkçûn. Tiştek, zehmetî me natirsînin, lê tenê berjewendiya me geş dikin. Û bi hemû hêza bash (ango şopandin) çekdarî, em bi serê xwe davêjin nav debugkirinê. Li vir girîng e ku meriv bala xwe bide xdg-open tenê skrîptek şêlê ye.

bash -x xdg-open $url

Analîzkirina encam piştî şopandinê hinekî zelal dibe ku paşê kontrol tê veguheztin exo-vekirî. Û ev jixwe pelek binary e û dijwartir e ku meriv fêm bike ka çima ew kodek vegerê ya neserkeftî vedigerîne dema ku di argumanekê de girêdanek jê re derbas dike.

Piştî ku li hundurê xdg-open mêze kir, min fêr kir ku ew pîvanên cûda yên hawîrdorê analîz dike û kontrolê bêtir ji hin amûrên vekirina girêdanên pelan ên taybetî yên DE-ya taybetî re derbas dike, an jî ew fonksiyonek paşvegerê heye. 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
}

Ez ê tavilê li vir hackek piçûk bi analîzkirina argumana derbasbûyî bi cih bikim û heke binê meya taybetî li wir be lync15:, wê hingê em tavilê kontrolê vediguhezînin fonksiyonê open_generic.

Hewldana hejmara 3 û hûn difikirin ku ew xebitî? Erê, niha, bê guman. Lê peyama xeletiyê jixwe guherî, ev jixwe pêşkeftin e - aniha wî ji min re digot ku pel nehat dîtin û di forma pelê de wî ji min re nivîsand ku heman girêdan wekî arguman derbas bû.

Vê carê ew fonksiyonek derket is_file_url_or_path, ku zencîreya pelê ku ji têketinê re derbas bûye analîz dike: file: // an riya pelê an tiştek din. Û kontrol rast nexebitî ji ber vê yekê ku pêşgira me (şerê url) jimare heye, û bêjeya birêkûpêk tenê koma karakterê ya ku ji :alpha: xal û daçekan pêk tê kontrol dike. Piştî şêwirdariya standard rfc3986 ji bo nasnameya çavkaniya yekgirtî Eşkere bû ku vê carê Microsoft tiştek binpê nake (tevî ku min guhertoyek wusa hebû). Tenê sinifa karakterê :alpha: tenê tîpên alfabeya latînî dihewîne. Ez tavilê kontrolkirina birêkûpêk diguhezim alfanjimarî. Kirin, hûn ecêb in, her tişt di dawiyê de dest pê dike, kontrol piştî hemî kontrolê ji serîlêdana skrîpta me re tê dayîn, girêdana me li ser konsolê tê xuyang kirin, her tişt wekî ku divê be. Piştî vê yekê, ez dest bi gumanê dikim ku hemî pirsgirêkên bi exo-open jî ji ber pejirandina formata girêdanê ji ber hejmarên di pileyê de ne. Ji bo ceribandina hîpotezê, ez qeydkirina mim-type ya serîlêdanê bi tenê nexşeyek diguhezim lync û voila - her tişt bêyî derbaskirina fonksiyona open_xfce dixebite. Lê ev ê bi tu awayî alîkariya me neke, ji ber ku rûpela malperê ji bo têketina konferansê bi lync15 re girêdanek çêdike.

Ji ber vê yekê, beşa yekem a rêwîtiyê qediya. Em dizanin ka meriv çawa bangek girêdanê digire û dûv re pêdivî ye ku ew bi rengekî were pêvajo kirin û di hundurê Pidgin de derbas bibe. Ji bo ku ez fêm bikim ka ew di hundurê xwe de çawa dixebite dema ku daneyan bi zencîreyekê di menuya "tevlî konferansê de" dike, min depoya Git ya projeya Sipe klon kir û min amade kir ku ez dîsa bi kodê vekim. Lê paşê, bi bextewarî, ez ji hêla senaryoyên di katalogê ve hatim kişandin tevkarî/dbus/:

  • sipe-join-conference-with-uri.pl
  • sipe-join-conference-with-organizer-and-id.pl
  • sipe-call-phone-number.pl
  • SipeHelper.pm

Derket holê ku pêveka Sipe ji bo danûstendinê bi dbus (otobusa sermaseyê) ve heye û di hundurê skrîptan de mînakên tevlêbûna konferansek bi lînkê heye, an bi nav û konf-id-ê organîzator, an jî hûn dikarin bi riya sip bangek bidin destpêkirin. . Tişta ku me ji dest dabû ev e.

Gav 2. Bicîhkirina handlerek xweser

Ji ber ku di Pearl de mînakên amade hene, min biryar da ku tenê bikar bînim sipe-join-conference-with-uri.pl û wê hinekî biguhezînin da ku li gorî xwe bikin. Ez dikarim bi Pearl binivîsim, ji ber vê yekê ew nebû sedema ti dijwariyek taybetî.

Piştî ceribandina senaryoyê ji hev cuda, min banga wê di pelê de nivîsand lync.desktop. Û ew serkeftinek bû! Dema ku têkevin rûpela tevlêbûna konferansê û destûrê dide xdg-open ku bixebite, pencereya popupê ya konferansê ji Pidgin bixweber vedibe. Ez çiqas şa bûm.
Bi serketinê cesaret da min, min biryar da ku ez heman tiştî ji bo geroka xweya sereke, Mozilla Firefox bikim. Dema ku hûn bi navgîniya fox ve têkevin, rûpelek ji bo destûrnameyê vedibe û di binê jêrîn de bişkokek heye bi karanîna ragihandina ofîsê re beşdarî bibin. Yê ku bala min kişand ew bû. Dema ku hûn di gerokê de li ser bikirtînin, ew diçe navnîşanê:

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

ya ku ew bi dilovanî ji min re dibêje ku ew nizane wê çawa veke û, dibe ku, ji bo protokolek weha serîlêdanek min tune. Welê, me berê jî di vê yekê de derbas kir.

Ez zû serlêdana xweya skrîptê jî ji bo nexşeya uri tomar dikim Conf û... tiştek nabe. Gerok gilî dike ku tu serîlêdanek ku girêdanên min digire tune. Di vê rewşê de, gazîkirina xdg-open ji konsolê bi parameteran re bêkêmasî dixebite.

"Li firefox-ê rêvekerê protokola xwerû bicîh bikin" - Ez bi vê pirsê serhêl çûm. Piştî derbasbûna çend nîqaşên li ser stackoverflow (û em ê bêyî wê li ku bin), wusa dixuye ku bersiv hate dîtin. Pêdivî ye ku hûn di nav de pîvanek taybetî çêbikin about: config (bê guman li şûna foo bi conf):

network.protocol-handler.expose.foo = false

Em wê diafirînin, lînkê vedikin û... bextekî wisa tune. Gerok, mîna ku tiştek nebûbe, dibêje ku ew serlêdana me nizane.

Ez belgeya fermî ya li ser qeydkirina protokolek ji Mozilla dixwînim, vebijarkek heye ku meriv di sermaseya gnome bixwe de komeleyan tomar bike (bêguman li şûna foo bi conf)

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

Ez qeyd dikim, gerokê vedikim... û dîsa rîh.

Li vir rêzek ji belgeyê bala min dikişîne:

Cara din ku hûn zencîreyek protokol-cûreya foo bikirtînin dê ji we were pirsîn ka hûn bi kîjan serîlêdanê vekin.

- Semyon Semenych
- Ax

Em li ser lînkê klîk nakin, lê rûpela malperê bi javascript-ê tenê window.location diguhere. Ez pelek html-a hêsan bi girêdanek bi protokola conf re dinivîsim, wê di gerokê de vekim, li ser zencîreyê bikirtînim - Yos! Pencereyek vedibe ku dipirse di kîjan serîlêdanê de em hewce ne ku girêdana xwe vekin, û li wir me serlêdana Lync-a xwe jixwe di navnîşê de heye - me bi dilpakî ew bi hemî awayên gengaz tomar kir. Li wir di pencereyê de qutiyek kontrolê heye "Hilbijartinê bi bîr bîne û her gav di serlêdana me de zencîreyan veke", wê nîşan bikin, ok bikirtînin. Û ev serkeftina duyemîn e - pencereya konferansê vedibe. Di heman demê de, vekirina konferansan ne tenê gava ku hûn li ser zencîreyekê bitikînin, di heman demê de dema ku ji rûpela tevlêbûnê diçin ku em hewce ne konferansê jî dixebitin.

Dûv re min kontrol kir, parametre jêbirin network.protocol-handler.expose.conf bi tu awayî bandor li operasyona protokola li Fox nekir. Têkiliyan xebata xwe berdewam kirin.

encamê

Min hemî karên xwe li depoya GitHub barkirî, girêdanên hemî çavkaniyan dê di dawiya gotarê de bin.
Ez ê meraq bikim ku ji wan kesên ku dixwazin xebata min bikar bînin bersivê werbigirim. Divê ez tavilê zanibim ku min hemî pêşkeftin tenê ji bo pergala xweya Linux Mint kir, ji ber vê yekê dibe ku hin belavkirin an sermaseyên din di wê guhertoyê de nexebitin. An jî, ez hema hema ji vê yekê piştrast im, ji ber ku min di xdg-open de tenê 1 fonksiyonê ku tenê bi DE-ya min ve girêdayî ye, patch kir. Heke hûn dixwazin ji bo pergalên an sermaseyên din piştgirî zêde bikin, ji min re daxwazên kişandinê li ser Github binivîsin.

Tevahiya projeyê 1 êvar girt ku biqede.

References:

Source: www.habr.com

Add a comment