ورود خودکار به کنفرانس های Lync در لینوکس

هی هابر!

برای من، این عبارت شبیه به سلام دنیاست، از زمانی که بالاخره به اولین انتشارم رسیدم. من این لحظه شگفت انگیز را برای مدت طولانی به تعویق انداختم، زیرا چیزی برای نوشتن وجود نداشت، و همچنین نمی خواستم چیزی را که قبلاً چندین بار مکیده شده بود بمکم. به طور کلی، برای اولین انتشارم چیزی بدیع، مفید برای دیگران و حاوی نوعی چالش و حل مسئله می خواستم. و اکنون می توانم این را به اشتراک بگذارم. حالا بیایید در مورد همه چیز به ترتیب صحبت کنیم.

ورود

همه چیز از زمانی شروع شد که مدتی پیش لینوکس مینت را روی رایانه کاری خود دانلود کردم. احتمالاً بسیاری از مردم می دانند که Pidgin با افزونه Sipe جایگزینی کاملاً مناسب برای Microsoft Lync (که اکنون Skype برای تجارت نامیده می شود) برای سیستم های لینوکس است. به دلیل ویژگی‌های کارم، اغلب مجبورم در کنفرانس‌های SIP شرکت کنم و زمانی که کارمند ویندوز بودم، ورود به کنفرانس‌ها ابتدایی بود: ما یک دعوت نامه از طریق پست دریافت می‌کنیم، روی لینک ورود کلیک می‌کنیم و آماده رفتن هستیم. .

هنگام تغییر به سمت تاریک لینوکس، همه چیز تا حدودی پیچیده‌تر شد: البته، می‌توانید در Pidgin نیز وارد کنفرانس‌ها شوید، اما برای انجام این کار باید گزینه join کنفرانس را در منوی ویژگی‌های حساب SIP خود انتخاب کنید و در پنجره ای که باز می شود، پیوندی را به کنفرانس وارد کنید یا نام سازمان دهنده و شناسه conf را وارد کنید. و بعد از مدتی شروع به فکر کردن کردم: "آیا می توان این را به نحوی ساده کرد؟" بله، ممکن است بگویید، لعنتی چرا به این نیاز دارید؟

مرحله 1: تحقیق

نکراسوف در اثر خود "چه کسی در روسیه خوب زندگی می کند" می گوید: "اگر در سر خود هوس کنید، نمی توانید با یک چوب آن را از بین ببرید."

بنابراین، زمانی که این فکر به ذهنم خطور کرد، پس از مدتی اولین ایده برای اجرا به وجود آمد. همه چیز ساده به نظر می رسید - شما باید دسترسی به پیوندها را قطع کنید meet.company.com/user/confid — یک فرآیند برنامه کاربردی وب محلی را روی ماشین خود در 127.0.0.1 نصب کنید و در /etc/hosts یک ورودی ثابت برای دامنه شرکتی که از طریق آن وارد کنفرانس می‌شوید، اضافه کنید و به localhost اشاره کنید. در مرحله بعد، این وب سرور باید پیوندی را که به آن وارد شده است پردازش کند و به نوعی آن را به داخل Pidgin منتقل کند (من بلافاصله می گویم که در این مرحله هنوز اصلاً نمی دانستم چگونه آن را به آن بدهم). راه حل، البته، بوی عصا می دهد، اما ما برنامه نویس هستیم، عصا ما را نمی ترساند.

سپس، به طور تصادفی، لینک دعوت را در گوگل کروم باز کردم (و معمولا همیشه از موزیلا فایرفاکس استفاده می کنم). و در کمال تعجب، صفحه وب کاملاً متفاوت به نظر می رسید - هیچ فرمی برای وارد کردن اطلاعات کاربر وجود نداشت و بلافاصله پس از ورود به صفحه درخواستی برای باز کردن چیزی از طریق وجود داشت. xdg-open. فقط برای سرگرمی، روی "yes" کلیک می کنم و یک پیام خطا ظاهر می شود - پیوند lync15:confjoin?url=https://meet.company.com/user/confid باز نمی شود. هوم این چه نوع xdg-open است و برای باز شدن چنین پیوندهایی به چه چیزی نیاز دارد؟ مطالعه پس از مرگ اسناد نشان داد که این یک کنترلر رابط کاربری گرافیکی است که به اجرای برنامه های مرتبط با پروتکل هایی برای طرح uri یا با انواع فایل های خاص کمک می کند. انجمن ها از طریق نقشه برداری از نوع mime پیکربندی می شوند. بنابراین می بینیم که در حال جستجو برای یک برنامه منطبق برای یک طرح uri به نام هستیم lync15 و پیوند به xdg-open ارسال می‌شود، که در تئوری باید آن را به برنامه‌ای که مسئول این نوع پیوند است، ارسال کند. که البته ما در سیستم خود نداریم. اگر نه، پس آنها در دنیای متن باز چه می کنند؟ درست است، خودمان می نویسیم.

غوطه ور شدن بیشتر در دنیای لینوکس و به ویژه در مطالعه نحوه عملکرد پوسته گرافیکی (محیط دسکتاپ، DE)، اتفاقاً من Xfce را در Linux Mint دارم، نشان داد که برنامه ها و نوع mime مرتبط با آن معمولاً مستقیماً در نوشته می شوند. فایل های میانبر با پسوند دسکتاپ. خوب، چرا که نه، من یک میانبر برنامه ساده ایجاد می کنم، که باید به سادگی یک اسکریپت 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.

تلاش شماره 2 با تماس xdg-open - و دوباره شکست. هیچ چیز، مشکلات ما را نمی ترسانند، بلکه فقط به علاقه ما دامن می زنند. و با تمام قدرت bash (یعنی ردیابی)، ما با سر به دیباگ می‌رویم. در اینجا ذکر این نکته مهم است که xdg-open فقط یک اسکریپت پوسته است.

bash -x xdg-open $url

تجزیه و تحلیل خروجی پس از ردیابی، کمی روشن می شود که سپس کنترل به آن منتقل می شود خارجی باز. و این قبلاً یک فایل باینری است و درک اینکه چرا یک کد بازگشتی ناموفق را هنگام ارسال پیوند به آن در یک آرگومان برمی گرداند دشوارتر است.

با نگاهی به قسمت‌های داخلی 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:// یا مسیر فایل یا چیز دیگری را تجزیه و تحلیل می کند. و چک به دلیل اینکه پیشوند ما (طرح آدرس اینترنتی) دارای اعداد است، به درستی کار نمی کند و عبارت منظم فقط مجموعه کاراکترهای متشکل از :alpha: نقطه و خط تیره را بررسی می کند. پس از مشورت با استاندارد rfc3986 برای تعیین کننده هویت منابع یکشکل مشخص شد که این بار مایکروسافت چیزی را نقض نمی کند (اگرچه من چنین نسخه ای داشتم). فقط کلاس کاراکتر :alpha: فقط شامل حروف الفبای لاتین است. من به سرعت چک معمولی را به حروف عددی تغییر می دهم. تمام شد، شما شگفت انگیز هستید، همه چیز در نهایت شروع می شود، کنترل پس از همه بررسی ها به برنامه اسکریپت ما داده می شود، پیوند ما در کنسول نمایش داده می شود، همه چیز همانطور که باید باشد. پس از این، من شروع به شک کردم که تمام مشکلات مربوط به exo-open نیز به دلیل اعتبارسنجی قالب پیوند به دلیل اعداد موجود در طرح است. برای آزمایش این فرضیه، ثبت نوع mime برنامه را به یک طرح تغییر می‌دهم همسر شدن و voila - همه چیز بدون نادیده گرفتن تابع open_xfce کار می کند. اما این به هیچ وجه کمکی به ما نمی کند، زیرا صفحه وب برای ورود به کنفرانس یک لینک با lync15 ایجاد می کند.

بنابراین، بخش اول سفر به پایان رسید. ما می دانیم که چگونه یک تماس پیوند را رهگیری کنیم و سپس باید به نحوی پردازش شود و در Pidgin ارسال شود. برای اینکه بفهمم هنگام وارد کردن داده ها از طریق پیوندی در منوی "پیوستن به کنفرانس" چگونه به صورت داخلی کار می کند، مخزن Git پروژه Sipe را کلون کردم و آماده شدم تا دوباره به کد وارد شوم. اما پس از آن، خوشبختانه، من جذب فیلمنامه های موجود در کاتالوگ شدم contribut/dbus/:

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

به نظر می رسد که پلاگین Sipe برای تعامل از طریق dbus (گذرگاه دسکتاپ) در دسترس است و در داخل اسکریپت ها نمونه هایی از پیوستن به یک کنفرانس از طریق یک پیوند وجود دارد، یا از طریق نام سازمان دهنده و شناسه مخفی، یا می توانید یک تماس را از طریق sip شروع کنید. . این دقیقا همان چیزی است که ما از دست داده بودیم.

مرحله 2. پیاده سازی یک کنترل کننده اتصال خودکار

از آنجایی که نمونه های آماده در Pearl وجود دارد، تصمیم گرفتم فقط استفاده کنم sipe-join-conference-with-uri.pl و آن را کمی تغییر دهید تا مناسب خودتان باشد. من می توانم در مروارید بنویسم، بنابراین مشکل خاصی ایجاد نکرد.

پس از تست جداگانه اسکریپت، فراخوانی آن را در فایل نوشتم lync.desktop. و این یک پیروزی بود! هنگام ورود به صفحه عضویت در کنفرانس و اجازه اجرای xdg-open، پنجره بازشو کنفرانس از Pidgin به طور خودکار باز می شود. چقدر خوشحال شدم
با تشویق از موفقیت، تصمیم گرفتم همین کار را برای مرورگر اصلی خود، موزیلا فایرفاکس، انجام دهم. هنگامی که از طریق فاکس وارد می شوید، صفحه ای برای مجوز باز می شود و در پایین آن یک دکمه وجود دارد با استفاده از رابط اداری بپیوندید. او بود که توجه من را جلب کرد. وقتی در مرورگر روی آن کلیک می کنید به آدرس زیر می رود:

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

که او با مهربانی به من می‌گوید که نمی‌داند چگونه آن را باز کند و شاید من برنامه مرتبطی برای چنین پروتکلی ندارم. خوب، ما قبلاً این را پشت سر گذاشته ایم.

من به سرعت برنامه اسکریپت خود را برای طرح uri نیز ثبت می کنم کنفرانس و ... هیچ اتفاقی نمی افتد. مرورگر مدام شکایت می‌کند که هیچ برنامه‌ای وجود ندارد که پیوندهای من را مدیریت کند. در این حالت، فراخوانی xdg-open از کنسول با پارامترها کاملاً کار می کند.

"تنظیم کنترل کننده پروتکل سفارشی در فایرفاکس" - من با این سوال آنلاین شدم. پس از گذراندن چندین بحث در مورد stackoverflow (و ما بدون آن کجا خواهیم بود)، به نظر می رسد که پاسخ پیدا شده است. شما باید یک پارامتر خاص در آن ایجاد کنید about: config را (البته به جای foo با conf):

network.protocol-handler.expose.foo = false

ما آن را ایجاد می کنیم، لینک را باز می کنیم و ... چنین شانسی ندارد. مرورگر، انگار هیچ اتفاقی نیفتاده است، می گوید که برنامه ما را نمی شناسد.

من در حال خواندن اسناد رسمی در مورد ثبت پروتکل از موزیلا هستم، گزینه ای برای ثبت انجمن ها در خود دسکتاپ gnome وجود دارد (البته جایگزین foo با 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

ثبت نام می کنم، مرورگر را باز می کنم ... و دوباره ریش.

در اینجا خطی از مستندات توجه من را جلب می کند:

دفعه بعد که روی پیوندی از نوع پروتکل foo کلیک کنید، از شما پرسیده می شود که آن را با کدام برنامه باز کنید.

- سمیون سمنیچ
- آهان

ما روی پیوند کلیک نمی کنیم، اما صفحه وب به سادگی window.location را از طریق جاوا اسکریپت تغییر می دهد. من یک فایل html ساده با پیوندی به پروتکل conf می نویسم ، آن را در مرورگر باز می کنم ، روی پیوند کلیک می کنم - Yos! پنجره ای باز می شود که از شما می پرسد در کدام برنامه باید پیوند خود را باز کنیم، و در آنجا برنامه Lync خود را قبلاً در لیست داریم - صادقانه آن را به همه روش های ممکن ثبت کردیم. در پنجره، یک چک باکس وجود دارد "انتخاب را به خاطر بسپار و همیشه پیوندها را در برنامه ما باز کنید"، آن را علامت بزنید، روی ok کلیک کنید. و این دومین پیروزی است - پنجره کنفرانس باز می شود. در عین حال، باز کردن کنفرانس‌ها نه تنها زمانی که روی یک پیوند کلیک می‌کنید، بلکه هنگام انتقال از صفحه پیوستن به کنفرانس نیز کار می‌کند.

سپس بررسی کردم، پارامترها را حذف کردم network.protocol-handler.expose.conf به هیچ وجه بر عملکرد پروتکل در فاکس تأثیری نداشت. پیوندها به کار خود ادامه دادند.

نتیجه

من تمام کارهایم را در مخزن GitHub آپلود کرده ام؛ پیوندها به همه منابع در انتهای مقاله خواهد بود.
من علاقه مند به دریافت بازخورد از کسانی هستم که می خواهند از کار من استفاده کنند. فوراً باید توجه داشته باشم که من تمام توسعه را فقط برای سیستم Linux Mint خود انجام دادم، بنابراین برخی از توزیع‌ها یا دسکتاپ‌های دیگر ممکن است در آن نسخه کار نکنند. یا بهتر است بگویم، من حتی تقریباً از این موضوع مطمئن هستم، زیرا من فقط 1 تابع را در xdg-open وصله کردم که فقط به DE من مربوط می شود. اگر می‌خواهید برای سیستم‌ها یا دسکتاپ‌های دیگر پشتیبانی اضافه کنید، درخواست‌های کشش را در Github برای من بنویسید.

کل پروژه 1 شب طول کشید تا تکمیل شود.

لینک ها:

منبع: www.habr.com

اضافه کردن نظر