#!/usr/bin/python3 import gi, json, os gi.require_version("Gtk", "3.0") gi.require_version("WebKit2", "4.1") from gi.repository import Gtk, WebKit2 # 优先尝试使用指示器, 没有再使用 Gtk.StatusIcon try: gi.require_version('AyatanaAppIndicator3', '0.1') from gi.repository import AyatanaAppIndicator3 as AppIndicator3 except (ValueError, ImportError): AppIndicator3 = None class WebKitWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title="WebKit Example") self.set_default_size(800, 600) settings = WebKit2.Settings() settings.set_enable_page_cache(True) settings.set_enable_offline_web_application_cache(True) settings.set_property('javascript-can-access-clipboard', True) settings.set_property('javascript-can-open-windows-automatically', True) settings.set_property("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) weapp/1.0.0 Version/16.4 Safari/605.1.15") manager = WebKit2.UserContentManager() script = open(self.file_path('./inject.js'), 'r').read() frame = WebKit2.UserContentInjectedFrames.ALL_FRAMES time = WebKit2.UserScriptInjectionTime.END script = WebKit2.UserScript(script, frame, time, None, None) manager.add_script(script) manager.connect('script-message-received::app', self.on_script_message) manager.register_script_message_handler('app') self.webview = WebKit2.WebView.new_with_user_content_manager(manager) self.webview.set_settings(settings) self.webview.connect("decide-policy", self.on_decide_policy) self.webview.load_uri("http://127.0.0.1:10086/index.html") # self.webview.load_uri("https://benchmark.wkit.fun") self.add(self.webview) def create_tray(self): if AppIndicator3 : indicator = AppIndicator3.Indicator.new( "youtube", "youtube", AppIndicator3.IndicatorCategory.APPLICATION_STATUS ) else: indicator = Gtk.StatusIcon.new_from_icon_name('youtube') return indicator def file_path(self, filepath): root = os.path.dirname(os.path.realpath(__file__)) return os.path.join(root, filepath) def on_script_message(self, webview, message): data = message.get_js_value() data = json.loads(data.to_json(0)) print('这是py收到的值: ',data) key = data.get('key') if key : scripts = 'native.$emit("' + key + '", "这是py返回的值 ' + data.get('value') + '")' self.webview.evaluate_javascript(scripts, -1) def on_decide_policy(self, webview, decision, decision_type): if decision_type == WebKit2.PolicyDecisionType.NAVIGATION_ACTION: navigation_action = decision.get_navigation_action() request = navigation_action.get_request() uri = request.get_uri() if uri == "about:blank": # Open the developer tools window inspector = webview.get_inspector() inspector.show() else: decision.use() win = WebKitWindow() win.connect("destroy", Gtk.main_quit) win.show_all() tray = win.create_tray() print(tray) Gtk.main()