Hyrja automatike në konferencat e Lync në Linux

Hej Habr!

Për mua, kjo frazë është e ngjashme me hello botë, pasi më në fund arrita në botimin tim të parë. E shtyva për një kohë të gjatë këtë moment të mrekullueshëm, pasi nuk kishte asgjë për të shkruar, dhe gjithashtu nuk doja të thithja diçka që tashmë ishte thithur shumë herë. Në përgjithësi, për botimin tim të parë doja diçka origjinale, të dobishme për të tjerët dhe që përmbante një lloj sfide dhe zgjidhjeje problemesh. Dhe tani mund ta ndaj këtë. Tani le të flasim për gjithçka në rregull.

Hyrje

Gjithçka filloi kur disa kohë më parë shkarkova Linux Mint në kompjuterin tim të punës. Shumë njerëz ndoshta e dinë se Pidgin me shtojcën Sipe është një zëvendësim plotësisht i përshtatshëm për Microsoft Lync (tani i quajtur Skype për biznes) për sistemet Linux. Për shkak të specifikave të punës sime, shpesh më duhet të marr pjesë në konferencat SIP, dhe kur isha punëtor i Windows, hyrja në konferenca ishte elementare: marrim një ftesë me postë, klikojmë në lidhjen e hyrjes dhe jemi gati të shkojmë. .

Kur kaloni në anën e errët të Linux-it, gjithçka u bë disi më e ndërlikuar: natyrisht, mund të regjistroheni edhe në konferenca në Pidgin, por për ta bërë këtë, duhet të zgjidhni opsionin e bashkimit të konferencës në menunë në vetitë e llogarisë suaj SIP dhe në dritaren që hapet, futni një lidhje me konferencën ose shkruani emrin e organizatorit dhe konf id-in. Dhe pas ca kohësh fillova të mendoj: "a është e mundur ta thjeshtojmë disi këtë?" Po, mund të thuash, pse dreqin të duhet kjo? Më mirë do të ulem në Windows dhe të mos e lë mendjen.

Hapi 1: Hulumtimi

"Nëse të vjen një trill në kokën tënde, nuk mund ta rrëzosh atë me një kunj," tha Nekrasov në veprën e tij "Kush jeton mirë në Rusi".

Kështu, sapo më hyri në kokë mendimi, pas disa kohësh lindi ideja e parë për zbatim. Gjithçka dukej e thjeshtë - ju duhet të përgjoni aksesin në lidhje meet.company.com/user/confid — instaloni një proces aplikimi lokal në ueb në makinën tuaj në 127.0.0.1 dhe në /etc/hosts shtoni një hyrje statike për domenin e kompanisë përmes së cilës hyni në konferencë, duke treguar lokalin host. Tjetra, ky server në internet duhet të përpunojë lidhjen që i erdhi dhe ta transferojë disi brenda Pidgin (do të them menjëherë se në këtë fazë ende nuk e kisha idenë se si t'ia jepja fare). Zgjidhja, natyrisht, mban erë patericash, por ne jemi programues, paterica nuk na tremb (mut).

Pastaj, rastësisht, hapa disi lidhjen e ftesës në Google Chrome (dhe zakonisht përdor gjithmonë Mozilla Firefox). Dhe për habinë time, faqja e internetit dukej krejtësisht ndryshe - nuk kishte asnjë formë për futjen e të dhënave të përdoruesit dhe menjëherë pas hyrjes në faqe kishte një kërkesë për të hapur diçka përmes xdg-hapur. Thjesht për argëtim, klikoj "po" dhe shfaqet një mesazh gabimi - lidhja lync15:confjoin?url=https://meet.company.com/user/confid nuk mund të hapet. Hmm. Çfarë lloj xdg-open është ky dhe çfarë i nevojitet që të hapen lidhje të tilla? Një lexim pas vdekjes i dokumentacionit zbuloi se është një mbajtës GUI që ndihmon në ekzekutimin e aplikacioneve të lidhura ose me protokolle për skemën uri ose me lloje të veçanta skedarësh. Asociacionet konfigurohen nëpërmjet hartës së tipit mime. Pra, ne shohim që po bëjmë një kërkim për një aplikacion të përputhur për një skemë uri të quajtur lync15 dhe lidhja kalohet te xdg-open, e cila më pas, në teori, duhet ta kalojë atë te ndonjë aplikacion që është përgjegjës për këtë lloj lidhjeje. Të cilat, natyrisht, nuk i kemi në sistemin tonë. Nëse jo, atëherë çfarë bëjnë ata në botën me burim të hapur? Ashtu është, do ta shkruajmë vetë.

Zhytja e mëtejshme në botën e Linux-it dhe veçanërisht në studimin se si funksionon guaska grafike (mjedisi i desktopit, DE), meqë ra fjala, unë kam Xfce në Linux Mint, tregoi se aplikacionet dhe lloji mime i lidhur me të zakonisht shkruhen drejtpërdrejt në skedarët e shkurtoreve me shtesën .desktop. Epo, pse jo, unë krijoj një shkurtore të thjeshtë aplikacioni, e cila thjesht duhet të nisë një skript bash dhe të nxjerrë argumentin e kaluar tek ai në tastierë, unë jap vetëm skedarin e shkurtoreve vetë:

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

Nis xdg-open nga tastiera, duke kaluar të njëjtën lidhje që vjen nga shfletuesi dhe... bummer. Përsëri thotë se nuk mund ta përpunojë lidhjen.

Siç doli, unë nuk e përditësova drejtorinë e llojeve të mimave të lidhura me aplikacionin tim. Kjo bëhet me një komandë të thjeshtë:

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

i cili thjesht redakton skedarin ~/.config/mimeapps.list.

Përpjekja numër 2 me thirrjen e hapur xdg - dhe përsëri dështim. Asgjë, vështirësitë nuk na frikësojnë, por vetëm ushqejnë interesin tonë. Dhe të armatosur me gjithë fuqinë e bash-it (d.m.th. gjurmimin), ne zhytemi me kokë në korrigjimin e gabimeve. Është e rëndësishme të theksohet këtu se xdg-open është vetëm një skrip shell.

bash -x xdg-open $url

Duke analizuar rezultatin pas gjurmimit, bëhet paksa e qartë se kontrolli më pas transferohet te ekzo-hapur. Dhe ky është tashmë një skedar binar dhe është më e vështirë të kuptohet pse kthen një kod kthimi të pasuksesshëm kur kalon një lidhje në të në një argument.

Duke parë pjesët e brendshme të xdg-open, zbulova se ai analizon parametra të ndryshëm mjedisor dhe kalon kontrollin më tej ose në disa mjete për hapjen e lidhjeve të skedarëve specifike për një DE të veçantë, ose ka një funksion kthimi e hapur_gjenerike

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
}

Unë do të fut shpejt këtu një hak të vogël me analizën e argumentit të kaluar dhe nëse nënvargu ynë specifik ndodhet atje lync15:, atëherë ne transferojmë menjëherë kontrollin në funksion e hapur_gjenerike.

Përpjekja numër 3 dhe a mendoni se funksionoi? Po, tani, sigurisht. Por mesazhi i gabimit ka ndryshuar tashmë, ky është tashmë përparim - tani ai më thoshte se skedari nuk u gjet dhe në formën e një skedari më shkroi të njëjtën lidhje të kaluar si argument.

Këtë herë doli të ishte një funksion is_file_url_or_path, i cili analizon lidhjen e skedarit të kaluar në hyrje: file:// ose shtegun për në skedar ose diçka tjetër. Dhe kontrolli nuk funksionoi si duhet për faktin se prefiksi ynë (skema url) ka numra, dhe shprehja e rregullt kontrollon vetëm grupin e karaktereve që përbëhet nga :alfa: pika dhe viza. Pas konsultimit me standardin rfc3986 për identifikues uniform i burimit U bë e qartë se këtë herë Microsoft nuk po shkel asgjë (megjithëse unë kisha një version të tillë). Vetëm klasa e karaktereve :alpha: përmban vetëm shkronja të alfabetit latin. Ndryshoj shpejt kontrollin e rregullt në alfanumerik. U krye, ju jeni të mrekullueshëm, gjithçka më në fund fillon, kontrolli pas të gjitha kontrolleve i jepet aplikacionit tonë të skriptit, lidhja jonë shfaqet në tastierë, gjithçka është ashtu siç duhet. Pas kësaj, filloj të dyshoj se të gjitha problemet me exo-open janë gjithashtu për shkak të vërtetimit të formatit të lidhjes për shkak të numrave në skemë. Për të testuar hipotezën, unë ndryshoj regjistrimin e aplikacionit të tipit mime në vetëm një skemë lync dhe voila - gjithçka funksionon pa anashkaluar funksionin open_xfce. Por kjo nuk do të na ndihmojë në asnjë mënyrë, sepse faqja e internetit për hyrjen në konferencë krijon një lidhje me lync15.

Pra, pjesa e parë e udhëtimit ka përfunduar. Ne e dimë se si të përgjojmë një telefonatë lidhjeje dhe më pas duhet të përpunohet disi dhe të kalohet brenda Pidgin. Për të kuptuar se si funksionon nga brenda kur futni të dhëna përmes një lidhjeje në menynë "bashkohuni në një konferencë", klonova depon e Git të projektit Sipe dhe u bëra gati të zhytem përsëri në kod. Por më pas, për fat, më tërhoqën skenarët në katalog kontribut/dbus/:

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

Rezulton se shtojca Sipe është e disponueshme për ndërveprim përmes dbus (autobusi i desktopit) dhe brenda skripteve ka shembuj të bashkimit në një konferencë përmes një lidhjeje, qoftë përmes emrit të organizatorit dhe konf-id-it, ose mund të nisni një telefonatë përmes sip . Kjo është pikërisht ajo që na mungonte.

Hapi 2. Zbatimi i një mbajtësi të bashkimit automatik

Meqenëse ka shembuj të gatshëm në Pearl, vendosa të përdor vetëm sipe-bashkohem-konference-me-uri.pl dhe modifikojeni pak për t'iu përshtatur vetes. Mund të shkruaj në Pearl, kështu që nuk shkaktoi ndonjë vështirësi të veçantë.

Pasi testova skriptin veç e veç, shkrova thirrjen e tij në skedar lync.desktop. Dhe ishte një fitore! Kur hyni në faqen e bashkimit të konferencës dhe lejoni xdg-open të ekzekutohet, dritarja kërcyese e konferencës nga Pidgin do të hapet automatikisht. Sa u gëzova.
I inkurajuar nga suksesi, vendosa të bëj të njëjtën gjë për shfletuesin tim kryesor, Mozilla Firefox. Kur hyni përmes dhelprës, hapet një faqe për autorizim dhe në fund ka një buton bashkohuni duke përdorur komunikuesin e zyrës. Ishte ajo që më tërhoqi vëmendjen. Kur klikoni mbi të në shfletues, ai shkon në adresën:

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

për të cilën ai me dashamirësi më thotë se nuk di ta hapë dhe, ndoshta, nuk kam ndonjë aplikacion të lidhur për një protokoll të tillë. Epo, ne e kemi kaluar tashmë këtë.

Regjistroj shpejt aplikimin tim për skriptin edhe për skemën uri conf dhe... asgjë nuk ndodh. Shfletuesi vazhdon të ankohet se nuk ka asnjë aplikacion që trajton lidhjet e mia. Në këtë rast, thirrja e xdg-open nga tastiera me parametra funksionon në mënyrë perfekte.

"Vendosni mbajtësin e personalizuar të protokollit në firefox" - Unë shkova në internet me këtë pyetje. Pasi kaluam disa diskutime mbi stackoverflow (dhe ku do të ishim pa të), duket se përgjigja u gjet. Ju duhet të krijoni një parametër të veçantë në about: config (sigurisht duke zëvendësuar foo me conf):

network.protocol-handler.expose.foo = false

Ne e krijojmë atë, hapim lidhjen dhe... nuk ka fat të tillë. Shfletuesi, sikur të mos kishte ndodhur asgjë, thotë se nuk e njeh aplikacionin tonë.

Po lexoj dokumentacionin zyrtar për regjistrimin e një protokolli nga Mozilla, ekziston një mundësi për të regjistruar shoqatat në vetë desktopin gnome (duke zëvendësuar foo me conf, natyrisht):

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

Regjistrohem, hap shfletuesin... dhe përsëri mjekrën.

Këtu më bie në sy një rresht nga dokumentacioni:

Herën tjetër që të klikoni një lidhje të tipit të protokollit foo do t'ju kërkohet se me cilin aplikacion duhet ta hapni atë.

- Semyon Semenych
- Ahh

Ne nuk klikojmë në lidhje, por faqja e internetit thjesht ndryshon window.location nëpërmjet javascript. Unë shkruaj një skedar të thjeshtë html me një lidhje në protokollin conf, e hap atë në shfletues, klikoni në lidhjen - Yos! Hapet një dritare që pyet se në cilin aplikacion duhet të hapim lidhjen tonë, dhe atje tashmë e kemi aplikacionin tonë Lync në listë - e kemi regjistruar sinqerisht në të gjitha mënyrat e mundshme. Atje në dritare ka një kuti "mbani mend zgjedhjen dhe hapni gjithmonë lidhjet në aplikacionin tonë", shënoni atë, klikoni ok. Dhe kjo është fitorja e dytë - hapet dritarja e konferencës. Në të njëjtën kohë, hapja e konferencave funksionon jo vetëm kur klikoni në një lidhje, por edhe kur lëvizni nga faqja e bashkimit që na nevojitet në konferencë.

Pastaj kontrollova, duke fshirë parametrat rrjet.protocol-handler.ekspozoj.conf nuk ndikoi në asnjë mënyrë në funksionimin e protokollit në Fox. Lidhjet vazhduan të funksionojnë.

Përfundim

Unë kam ngarkuar të gjithë punën time në depon e GitHub; lidhjet me të gjitha burimet do të jenë në fund të artikullit.
Do të jem i interesuar të marr reagime nga ata që duan të përdorin punën time. Duhet të theksoj menjëherë se i bëra të gjithë zhvillimin vetëm për sistemin tim Linux Mint, kështu që disa shpërndarje të tjera ose desktop mund të mos funksionojnë në atë version. Ose më mirë, jam pothuajse i sigurt për këtë, sepse kam rregulluar vetëm 1 funksion në xdg-open që lidhet vetëm me DE-në time. Nëse dëshironi të shtoni mbështetje për sisteme të tjera ose desktop, më shkruani kërkesa për tërheqje në Github.

I gjithë projekti mori 1 mbrëmje për të përfunduar.

referencat:

Burimi: www.habr.com

Shto një koment