persepolisdm / Persepolis-WebExtension

WebExtension integration for Persepolis download manager
http://persepolisdm.github.io
GNU General Public License v3.0
74 stars 9 forks source link

افزونه فایرفاکس #1

Closed ghost closed 7 years ago

ghost commented 7 years ago

سلام. من دارم با استفاده از فایلهای افزونه شما و تغییر آنها، برای فایرفاکس یه افزونه میسازم. چون تازه کارم میخواستم از ساده ترین حالتش شروع کنم. تا جایی که میشد ساده ش کردم طوری که الان فقط یک آیتم توی منوی کلیک راسته که اگر روی لینکی کلیک راست بشه ظاهر میشه و میتونه لینک رو به پرسپولیس بفرسته و ادامه ش فرایندی مشابه با همین کاری که افزونه کروم میکنه. دارم توی اوبونتو ۱۶٫۰۴ و با آخرین نسخه های فایرفاکس معمولی و فایرفاکس developer edition تستش میکنم. مشکلی که دارم اینه که با فایرفاکس
developer edition درست کار میکنه ولی با نسخه معمولی فایرفاکس فقط تا اونجایی ‍پیش میره که پرسپولیس رو بالا میاره ولی صفحه تایید دانلود ظاهر نمیشه.

حالا یک درخواست و یک سوال دارم. درخواستم اینه که اگه ممکنه شما هم افزونه رو تست کنید. test و سوالم: تا جایی که فهمیدم جاوا اسکریپت افزونه کروم، پیامی به صورت json میفرسته. سوالم اینه که پرسپولیس انتظار چه پیامی رو میکشه. آیا برای پرسپولیس فرقی میکنه ‍پیام از چه نرم افزار یا افزونه ای فرستاده شده؟

JafarAkhondali commented 7 years ago

@Zamaaan سلام بخاطر تلاشتون ممنونیم ایکاش افزونه رو فرک میکردین که از تغییرات افزونه هم بهتر اطلاع پیدا میکردین در حقیقت ما از یه فایل پایتون به عنوان واسط برای برقراری ارتباط بین افزونه و پرسپولیس استفاده کردیم که اطلاعات رو برای پرسپولیس میفرسته. برای پرسپولیس فرقی نداره از کجا فرستاده شده باشه میتونید یک ترمینال باز کنین و دستور

persepolis --link=http://www.google.com

رو اجرا کنین و ببینین که نتیجه توی پرسپولیس اجرا میشه

سعی میکنیم به زود افزونه رو در فایرفاکس تست کنیم و نتیجه رو بهتون اعلام میکنیم.

ghost commented 7 years ago

ممنون این ریپوزیتوری رو محض تست ساختم. امشب فورک میکنم و تغییرات رو وارد میکنم.

با کمک این مثال خود فایرفاکس https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Examples#native-messaging یه واسط ساده ساختم. با این واسط هر دو نسخه فایرفاکس درست کار میکنند.

#!/usr/bin/env python
import json
import struct
import sys
import os

c = 'persepolis --link="'
rawLength = sys.stdin.read(4)
if len(rawLength) == 0:
    sys.exit(0)
messageLength = struct.unpack('@I', rawLength)[0]
message = sys.stdin.read(messageLength)
userMessage = json.loads(message)
c += userMessage['url'] + '"'
os.system(c)   
sys.exit(0)

نتیجه ای که گرفتم اینه که هر دو نسخه فایرفاکس اطلاعات مشابهی رو میفرستند.

ولی اینکه کروم و کرومیوم و نسخه developer فایرفاکس به درستی با همین واسط فعلی پرسپولیس ارتباط برقرار می کنند و فقط نسخه معمولی فایرفاکس نمیتونه، عجیبه یه کم.

alireza-amirsamimi commented 7 years ago

سلام ممنونم از تلاشتون :) یه توضیحاتی رو لازم میدونم که بدم و احتمالا بهتون کمک خواهد کرد پرسپولیس با کروم از طریق سیستم Native messaging https://developer.chrome.com/extensions/nativeMessaging

ارتباط برقرار میکنه ولی هیچ فایل پایتونی به عنوان واسطه قرار نداره و خود فایل اجرایی پرسپولیس که در لینوکس در این آدرست هست /usr/share/persepolis/persepolis درخواست های کروم رو بررسی میکنه و با این خطوط کدی که اضافه کردم اطلاعات رو استخراج میکنه

if args.chromium != 'no':

    text_length_bytes = sys.stdin.buffer.read(4)

        # Unpack message length as 4 byte integer.
    text_length = struct.unpack('i', text_length_bytes)[0]

        # Read the text (JSON object) of the message.
    text = sys.stdin.buffer.read(text_length).decode("utf-8")
    if text:
        if not 'url' in text:
            sys.exit(0)

        data = json.loads(text)
        url = str(data['url'])

        if url:
            args.link = str(url)
            if 'referrer' in data.keys():
                args.referer = data['referrer']

            if 'filename' in data.keys():
                args.name = data['filename']

            if 'cookies' in data.keys():
                args.cookie = data['cookies']

برای اینکه اون if اول برقرار باشه کافی هست شما اطلاعات رو برای فایل اجرایی بدون هیچ سوییچی بفرستی و خود پرسپولیس بدون هیچ واسط پایتونی اطلاعات رو استخراج میکنه

فقط یه فایل .json واسط هست که وقتی کاربر از منوی help پرسپولیس وارد گزینه Browser integration میشه و با توجه به مرورگرش (کروم یا کرومیوم) دکمه مناسب رو میزنه پرسپولیس بر اساس نوع سیستم عامل (مک یا توزیع های گنو/لینوکس) و نوع مرورگر (کروم یا کرومیوم) فایل لازم رو طبق راهنمایی که خود شرکت گوگل نوشته و لینکش رو دادم خدمتتون در مسیر لازم ایجاد میکنه

البته این نکته رو هم اضافه کنم که فلش گات فایرفاکس از جیسون استفاده نمیکنه و مستقیما درخواست ها رو با شل و با توجه به سوییچ های برنامه مثل link , cookie , referer , agent , name , headers میفرسته

شما آزادی از هر روشی که دوست داری استفاده کنی :)

سوالی بود در خدمتم

ghost commented 7 years ago

@alireza-amirsamimi خیلی ممنون از وقتی که گذاشتید و اطلاعاتتون که خیلی به دردم خورد.

:اول یه مقدمه بگم طبق توصیه فایرفاکس https://developer.mozilla.org/en-US/Add-ons#Developing_add-ons ترجیح میدم از همین روش فعلی که فقط میشه از JavaScript, CSS, HTML و چندتا JavaScript API استفاده کرد افزونه رو بنویسم. این شیوه افزونه نویسی cross-browser هم هست و میشه از کدها (احتمالا با تغییرات کمی) برای کروم و اپرا استفاده کرد. منم از همین قابلیت و ازکدهای این ریپوزیتوری استفاده کردم. به خاطر همین نمیتونم مثل فلش گات مستقیم با سوییچ و .. کار کنم.

: حالا بحث اصلیم پیاده سازی اون چندتا API توی مروگرهای مختلف هنوز استاندارد نشده. نمونه ش همین native messaging api که ما داریم برای ارتباط با نرم افزارهای سیستم استفاده میکنم. توی پیاده سازی کروم، اگر اول یک پورت ایجاد کنیم و بعد پیام بدیم، با اتمام کار پورت، به هر نحوی، نرم افزار سیستم هم بسته میشه. که به درد ما نمیخوره روش دیگه اینه که بدون ایجاد پورت و مستقیم پیام رو بفرستیم، همین کاری که خط

chrome.runtime.sendNativeMessage(hostName, message, function)

.توی این افزونه میکنه اینجوری نرم افزار سیستم بعد از بسته شدن کروم هم به کارش ادامه میده. https://developer.chrome.com/extensions/nativeMessaging#native-messaging-host-protocol

فایرفاکس توی پیاده سازیش هر دوی این روشها رو ساپورت میکنه ولی هر دو، نرم افزار اصلی رو خواهند بست. توی اولی مشابه با کروم، بعد از اتمام کار پورت، نرم افزار سیستم رو میبنده و توی دومی حداکثر تا وقتی که پنجره فایرفاکس رو نبستیم نرم افزارسیستم در حال اجرا خواهد ماند. https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/connectNative https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/sendNativeMessage

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

حالا سوالم اینه که: ازطرف شما امکانش هست چنین واسطی به فایلهای پرسپولیس اضافه بشه؟ یا اون قسمتی که شما توی راهنماییتون برای پردازش ‍پیامهای کرومیوم نوشتید از فایل اصلی و اجرایی پرسپولیس جدا و توی یه فایل دیگه قرار داده بشه؟ با سپاس

یه سوال دیگه اینکه هیچ جوری نمیشه اینجا راست به چپ نوشت؟ :)

alireza-amirsamimi commented 7 years ago

@Zamaaan سلام چون برنامه برای مک به شکل یک پکیج standalone هست و در آینده هم برای ویندوز همین برنامه رو داریم نمیشه از فایل واسط استفاده کرد و برای همین فایل واسط رو حذف کردم و اطلاعات مستقیم به فایل اجرایی برنامه میره. از همین امکانات فعلی استفاده کنید برای اینکه برنامه بسته نشه ، کافی هست که کاربر از قبل پرسپولیس رو اجرا کنه

alireza-amirsamimi commented 7 years ago

@Zamaaan راستی من با افزونه کروم هم امتحان کردم وقتی کروم بسته میشه پرسپولیس رو نمیبنده ، حتی اگر از قبل پرسپولیس باز نباشه هم مشکلی پیش نمیاد احتمالا هم دلیلش فایل .json واسطی هست که پرسپولیس طبق راهنمای گوگل ایجاد میکنه فکر میکنم از این روش استفاده بفرمایید مشکل حل میشه

ghost commented 7 years ago

@alireza-amirsamimi فایرفاکس از روی کروم این قابلیتها رو اضافه کرده ولی یه جاهایی رو متفاوت کار کرده من خیلی امتحان کردم. فعلا نتونستم کاری کنم که برنامه رو نبنده. داکیومنت های فایرفاکس هم که بالا لینک دادم دقیقا گفتن که میبندن برنامه رو. حالا باز وقت میگذارم باقی داکیومنتها رو میخونم شاید راه حل جدیدی پیدا کردم. فعلا که عجله ای نیست، فلش گات عالیه. :)

JafarAkhondali commented 7 years ago

@Zamaaan

سلام یه سری قابلیت جدید اضافه شده به افزونه، همین هارو دوباره با WebExtensions مینیویسم و دوباره میزارم که بردنش به firefox و opera راحتتر باشه. اگه تمایل به همکاری داشتین بگین که دوباره کاری نشه. ممنون:)