92 lines
2.6 KiB
Python
92 lines
2.6 KiB
Python
|
#!/usr/bin/python3
|
||
|
|
||
|
import gi, json, os
|
||
|
|
||
|
gi.require_version("Gtk", "3.0")
|
||
|
gi.require_version("WebKit2", "4.1")
|
||
|
# gi.require_version("JavaScriptCore", "4.1")
|
||
|
|
||
|
from gi.repository import Gtk, WebKit2, JavaScriptCore
|
||
|
|
||
|
class MyScriptMessageHandler(WebKit2.ScriptMessageReply):
|
||
|
def __init__(self):
|
||
|
super().__init__()
|
||
|
|
||
|
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 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 = '$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()
|
||
|
|
||
|
Gtk.main()
|