fcitx / fcitx5-lua

25 stars 7 forks source link

Is it possible to reach the Internet in a Lua IMEAPI Extension? #20

Closed SkymontVibe closed 2 years ago

SkymontVibe commented 2 years ago

Discussed in https://github.com/fcitx/fcitx5/discussions/579

Originally posted by **TheInterestingSoul** August 21, 2022 我这边想做一个在快速输入 (`QuickPhrase`) 中查询热词的脚本,访问下面这个API,然后把返回值添加到快速输入的候选词中: ```plain URL: https://api.jikipedia.com/go/get_hot_search Method: POST Content-Type: "application/json;charset=UTF-8" Body: "{}" (就一对大括号,即一个空对象) Response: { "updated_at": "2022-08-19T14:51:46+08:00", "data": [ { "phrase": "冈本六君子", "description": "卖套博主" }, { "phrase": "回国了开始复仇", "description": "势必夺回自己的摊位" }, ...(一共10个) ] } ``` 在arch下安装`lua-socket`和`lua-dkjson`包后,编写如下脚本: ```lua local HTTPClient = require("socket.http") local ltn12 = require("ltn12") local JSONParser = require("dkjson") local fcitx = require("fcitx") --[[ 原生Lua调试时临时换掉fcitx包 local fcitx = {} fcitx.log = function(x) return print(x) end ]] local function requestResult() fcitx.log("开始调用requestResult方法") local response_body = {} fcitx.log("开始请求:https://api.jikipedia.com/go/get_hot_search") local _, code = HTTPClient.request { url = "https://api.jikipedia.com/go/get_hot_search", method = "POST", headers = { ["accept"] = "application/json, text/plain, */*", ["content-type"] = "application/json;charset=UTF-8", ["user-agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54", ["content-length"] = 2 }, source = ltn12.source.string("{}"), sink = ltn12.sink.table(response_body), } fcitx.log("请求结果:" .. table.concat(response_body)) if code == 200 then return table.concat(response_body) else fcitx.log("请求失败 状态码:" .. code) return nil end end function getSearchCommand() fcitx.log("开始调用getSearchCommand方法") local originJSON = requestResult() local responseData, _, errorMessage = JSONParser.decode(originJSON, 1, nil) if responseData ~= nil then fcitx.log("解析成功") local wordsTable = {} for i = 1, 10 do wordsTable[i] = responseData.data[i].phrase end return wordsTable else fcitx.log("解析失败 原JSON:" .. originJSON .. "\n错误信息:" .. errorMessage) return nil end end ime.register_command("xg", "getSearchCommand", "新梗速查", "digit", "从小鸡词典获取的热搜列表") --fcitx.log(getSearchCommand()[4]) ``` 把`fcitx`包换掉后,用Lua直接执行它 `lua xg.lua` 时一切正常;将脚本复制到插件目录后重启fcitx5再执行,vxg刚打完,进程就挂了 ```plain D2022-08-21 22:47:22.822174 luaaddonstate.cpp:127] quickphrase input xg D2022-08-21 22:47:22.822224 luaaddonstate.cpp:127] quickphrase call getSearchCommand D2022-08-21 22:47:22.822259 luaaddonstate.cpp:127] 开始调用getSearchCommand方法 D2022-08-21 22:47:22.822291 luaaddonstate.cpp:127] 开始调用requestResult方法 D2022-08-21 22:47:22.822323 luaaddonstate.cpp:127] 开始请求:https://api.jikipedia.com/go/get_hot_search ========================= Fcitx 5.0.19 -- Get Signal No.: 11 Date: try "date -d @1661093242" if you are using GNU date *** ProcessID: 6276 fcitx5(+0x172bc)[0x55bdb53c72bc] /usr/lib/libc.so.6(+0x38a40)[0x7fc75da51a40] /usr/lib/libc.so.6(__libc_free+0x69)[0x7fc75c6eaa29] /usr/lib/libcrypto.so.1.1(ERR_clear_error+0x85)[0x7fc74f712695] /usr/lib/libcrypto.so.1.1(+0x136da6)[0x7fc74f736da6] /usr/lib/libc.so.6(+0x8b717)[0x7fc75c6df717] /usr/lib/libcrypto.so.1.1(CRYPTO_THREAD_run_once+0xe)[0x7fc74f7780ce] /usr/lib/libcrypto.so.1.1(OPENSSL_init_crypto+0x400)[0x7fc74f737830] /usr/lib/libcrypto.so.1.1(+0x136b45)[0x7fc74f736b45] /usr/lib/libc.so.6(+0x8b717)[0x7fc75c6df717] /usr/lib/libcrypto.so.1.1(CRYPTO_THREAD_run_once+0xe)[0x7fc74f7780ce] /usr/lib/libcrypto.so.1.1(OPENSSL_init_crypto+0x36c)[0x7fc74f73779c] /usr/lib/libssl.so.1.1(OPENSSL_init_ssl+0x36)[0x7fc74fafc5c6] /usr/lib/libssl.so.1.1(SSL_CTX_new+0x2b)[0x7fc74fb080bb] /usr/lib/lua/5.4/ssl.so(+0x6c8c)[0x7fc7544e8c8c] /usr/lib/liblua.so.5.4(+0x126a2)[0x7fc75c9356a2] /usr/lib/liblua.so.5.4(+0x2128f)[0x7fc75c94428f] /usr/lib/liblua.so.5.4(+0x12c86)[0x7fc75c935c86] /usr/lib/liblua.so.5.4(+0xd1f4)[0x7fc75c9301f4] /usr/lib/liblua.so.5.4(+0xd510)[0x7fc75c930510] /usr/lib/liblua.so.5.4(lua_pcallk+0x90)[0x7fc75c935d50] /usr/lib/lua/5.4/socket/core.so(+0x669c)[0x7fc75c4fe69c] /usr/lib/liblua.so.5.4(+0x126a2)[0x7fc75c9356a2] /usr/lib/liblua.so.5.4(+0x2128f)[0x7fc75c94428f] /usr/lib/liblua.so.5.4(+0x12c86)[0x7fc75c935c86] /usr/lib/liblua.so.5.4(+0xd1f4)[0x7fc75c9301f4] /usr/lib/liblua.so.5.4(+0xd510)[0x7fc75c930510] /usr/lib/liblua.so.5.4(lua_pcallk+0x90)[0x7fc75c935d50] /usr/lib/fcitx5/libluaaddonloader.so(+0xf12b)[0x7fc75c99612b] /usr/lib/fcitx5/libquickphrase.so(+0x126ba)[0x7fc75d3916ba] /usr/lib/fcitx5/libquickphrase.so(+0xfdb7)[0x7fc75d38edb7] /usr/lib/fcitx5/libquickphrase.so(+0x10e56)[0x7fc75d38fe56] 段错误 (核心已转储) ``` 经过多次log定位,是在request语句上出了问题
附上 `fcitx5-diagnose` ,点击展开 # 系统信息: 1. `uname -a`: Linux tis 5.19.2-arch1-1 fcitx/fcitx5#1 SMP PREEMPT_DYNAMIC Wed, 17 Aug 2022 13:48:51 +0000 x86_64 GNU/Linux 2. `lsb_release`: `lsb_release` 未找到. 3. `/etc/lsb-release`: `/etc/lsb-release` 未找到. 4. `/etc/os-release`: NAME="Arch Linux" PRETTY_NAME="Arch Linux" ID=arch BUILD_ID=rolling ANSI_COLOR="38;2;23;147;209" HOME_URL="https://archlinux.org/" DOCUMENTATION_URL="https://wiki.archlinux.org/" SUPPORT_URL="https://bbs.archlinux.org/" BUG_REPORT_URL="https://bugs.archlinux.org/" LOGO=archlinux-logo 5. 桌面环境: 桌面环境为 `kde`。 6. XDG 会话类型: XDG_SESSION_TYPE='wayland' 7. Bash 版本: BASH_VERSION='5.1.16(1)-release' # 环境: 1. DISPLAY: DISPLAY=':1' WAYLAND_DISPLAY='wayland-0' 2. 键盘布局: 1. `setxkbmap`: WARNING: Running setxkbmap against an XWayland server xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" }; xkb_geometry { include "pc(pc105)" }; }; 2. `xprop`: _XKB_RULES_NAMES(STRING) = "evdev", "pc105", "us", "", "" 3. Locale: 1. 全部可用 locale: C C.UTF-8 POSIX zh_CN.utf8 2. 当前 locale: LANG=zh_CN.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC="zh_CN.UTF-8" LC_TIME="zh_CN.UTF-8" LC_COLLATE="zh_CN.UTF-8" LC_MONETARY="zh_CN.UTF-8" LC_MESSAGES="zh_CN.UTF-8" LC_PAPER="zh_CN.UTF-8" LC_NAME="zh_CN.UTF-8" LC_ADDRESS="zh_CN.UTF-8" LC_TELEPHONE="zh_CN.UTF-8" LC_MEASUREMENT="zh_CN.UTF-8" LC_IDENTIFICATION="zh_CN.UTF-8" LC_ALL= 4. 目录: 1. 主目录: /home/tis 2. `${XDG_CONFIG_HOME}`: 环境变量 `XDG_CONFIG_HOME` 没有设定。 `XDG_CONFIG_HOME` 的当前值是 `~/.config` (`/home/tis/.config`)。 3. Fcitx5 设置目录: 当前 fcitx5 设置目录是 `~/.config/fcitx5` (`/home/tis/.config/fcitx5`)。 5. 当前用户: 脚本作为 tis (1000) 运行。 # Fcitx 状态: 1. 可执行文件: 在 `/usr/bin/fcitx5` 找到了 fcitx5。 2. 版本: Fcitx 版本: `5.0.19` 3. 进程: 找到了 2 个 fcitx5 进程: 6322 fcitx5 6327 fcitx5-plasma-t 4. `fcitx5-remote`: `fcitx5-remote` 工作正常。 5. DBus 界面: 使用 `dbus-send` 来检查 dbus。 DBus 名称 `org.fcitx.Fcitx5` 的所有者是 `:1.268`。 DBus 名称 `org.fcitx.Fcitx5` 的 PID 所有者是 `6322`。 来自 dbus 的调试信息: Group [x11::1] has 1 InputContext(s) IC [9c7f276f076f472a9bfed346efaa6b26] program:microsoft-edge frontend:dbus cap:6000000012 focus:0 Group [wayland:] has 6 InputContext(s) IC [206f995d4eab42a1a9617994896cd297] program:plasmashell frontend:dbus cap:e001800072 focus:0 IC [836502ff715d44d6a16f856f157663d5] program:plasmashell frontend:dbus cap:e001820072 focus:0 IC [3b5d80761a4348ef9564c4959af1ef95] program:plasmashell frontend:dbus cap:e801800072 focus:0 IC [593d7f046fdb44799b06297dec03a903] program:kate frontend:dbus cap:e001800072 focus:0 IC [c30787b8423a49d79bd182f874e8ac30] program:konsole frontend:dbus cap:e001800072 focus:1 IC [b1e05a645e884b45a9e9b9134d47731f] program:dolphin frontend:dbus cap:e001800072 focus:0 Input Context without group # Fcitx 配置界面: 1. 配置工具封装: 在 `/usr/bin/fcitx5-configtool` 找到了 fcitx5-configtool。 2. Qt 的配置界面: 在 `/usr/bin/fcitx5-config-qt` 找到了 `fcitx5-config-qt`。 3. KDE 的配置界面: 找到了 fcitx5 的 kcm 模块。 kcm_fcitx5 - 配置输入法 # 前端设置: ## Xim: 1. `${XMODIFIERS}`: 环境变量 XMODIFIERS 已经正确地设为了“@im=fcitx”。 从环境变量中获取的 Xim 服务名称为 fcitx. 2. 根窗口上的 XIM_SERVERS: Xim 服务的名称与环境变量中设置的相同。 ## Qt: 1. qt4 - `${QT4_IM_MODULE}`: 环境变量 QT_IM_MODULE 已经正确地设为了“fcitx”。 2. qt5 - `${QT_IM_MODULE}`: 环境变量 QT_IM_MODULE 已经正确地设为了“fcitx”。 3. Qt 输入法模块文件: 找到了未知的 fcitx qt 模块:`/usr/lib/office6/qt/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so`。 找到了 fcitx5 qt5 模块:`/usr/lib/fcitx5/qt5/libfcitx-quickphrase-editor5.so`。 找到了 fcitx5 的 qt6 输入法模块:`/usr/lib/qt6/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so`。 找到了 fcitx5 的 qt 输入法模块:`/usr/lib/qt/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so`。 找到了未知的 fcitx qt 模块:`/usr/lib/qt/plugins/kcms/kcm_fcitx5.so`。 **无法找到 Qt4 的 fcitx5 输入法模块。** ## Gtk: 1. gtk - `${GTK_IM_MODULE}`: 环境变量 GTK_IM_MODULE 已经正确地设为了“fcitx”。 2. `gtk-query-immodules`: 1. gtk 2: 在 `/usr/bin/gtk-query-immodules-2.0` 找到了 gtk `2.24.33` 的 `gtk-query-immodules`。 版本行: # Created by /usr/bin/gtk-query-immodules-2.0 from gtk+-2.24.33 已找到 gtk `2.24.33` 的 fcitx5 输入法模块。 "/usr/lib/gtk-2.0/2.10.0/immodules/im-fcitx5.so" "fcitx" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" "fcitx5" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" 2. gtk 3: 在 `/usr/bin/gtk-query-immodules-3.0` 找到了 gtk `3.24.34` 的 `gtk-query-immodules`。 版本行: # Created by /usr/bin/gtk-query-immodules-3.0 from gtk+-3.24.34 已找到 gtk `3.24.34` 的 fcitx5 输入法模块。 "/usr/lib/gtk-3.0/3.0.0/immodules/im-fcitx5.so" "fcitx" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" "fcitx5" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" 3. Gtk 输入法模块缓存: 1. gtk 2: 在 `/usr/lib/gtk-2.0/2.10.0/immodules.cache` 找到了 gtk `2.24.33` 的输入法模块缓存。 版本行: # Created by /usr/bin/gtk-query-immodules-2.0 from gtk+-2.24.33 已找到 gtk `2.24.33` 的 fcitx5 输入法模块。 "/usr/lib/gtk-2.0/2.10.0/immodules/im-fcitx5.so" "fcitx" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" "fcitx5" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" 2. gtk 3: 在 `/usr/lib/gtk-3.0/3.0.0/immodules.cache` 找到了 gtk `3.24.34` 的输入法模块缓存。 版本行: # Created by /usr/bin/gtk-query-immodules-3.0 from gtk+-3.24.34 已找到 gtk `3.24.34` 的 fcitx5 输入法模块。 "/usr/lib/gtk-3.0/3.0.0/immodules/im-fcitx5.so" "fcitx" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" "fcitx5" "Fcitx5 (Flexible Input Method Framework5)" "fcitx5" "/usr/locale" "ja:ko:zh:*" 3. gtk 4: **无法找到 gtk 4 的输入法模块缓存** **无法在缓存中找到 gtk 4 的 fcitx5 输入法模块。** 4. Gtk 输入法模块文件: 1. gtk 2: 找到的全部 Gtk 2 输入法模块文件均存在。 2. gtk 3: 找到的全部 Gtk 3 输入法模块文件均存在。 3. gtk 4: 找到的全部 Gtk 4 输入法模块文件均存在。 # 配置: ## Fcitx 插件: 1. 插件配置文件目录: 找到了 fcitx5 的插件配置目录:`/usr/share/fcitx5/addon`。 2. 插件列表: 1. 找到了 28 个已启用的插件: Simplified and Traditional Chinese Translation 5.0.14 Classic User Interface 5.0.19 Clipboard 5.0.19 Cloud Pinyin 5.0.14 DBus 5.0.19 DBus Frontend 5.0.19 Emoji 5.0.19 Fcitx4 Frontend 5.0.19 Full width character 5.0.14 IBus Frontend 5.0.19 Lua IME API 5.0.9 Input method selector 5.0.19 Keyboard 5.0.19 KDE Input Method Panel 5.0.19 Lua Addon Loader 5.0.9 Status Notifier 5.0.19 Notification 5.0.19 Pinyin 5.0.14 Extra Pinyin functionality 5.0.14 Punctuation 5.0.14 Quick Phrase 5.0.19 Spell 5.0.19 Table 5.0.14 Unicode 5.0.19 Wayland 5.0.19 Wayland Input method frontend 5.0.19 XCB 5.0.19 X Input Method Frontend 5.0.19 2. 找到了 0 个被禁用的插件: 3. 插件库: 所有插件所需的库都被找到。 4. 用户界面: 找到了 2 个已启用的用户界面插件: Classic User Interface KDE Input Method Panel ## 输入法: 1. `/home/tis/.config/fcitx5/profile`: [Groups/0] # Group Name Name=默认 # Layout Default Layout=us # Default Input Method DefaultIM=pinyin [Groups/0/Items/0] # Name Name=keyboard-us # Layout Layout= [Groups/0/Items/1] # Name Name=pinyin # Layout Layout= [GroupOrder] 0=默认 # 日志: 1. `date`: 2022年 08月 21日 星期日 22:49:39 CST 2. `/home/tis/.config/fcitx5/crash.log`: ========================= Fcitx 5.0.19 -- Get Signal No.: 11 Date: try "date -d @1661093242" if you are using GNU date *** ProcessID: 6276 fcitx5(+0x172bc)[0x55bdb53c72bc] /usr/lib/libc.so.6(+0x38a40)[0x7fc75da51a40] /usr/lib/libc.so.6(__libc_free+0x69)[0x7fc75c6eaa29] /usr/lib/libcrypto.so.1.1(ERR_clear_error+0x85)[0x7fc74f712695] /usr/lib/libcrypto.so.1.1(+0x136da6)[0x7fc74f736da6] /usr/lib/libc.so.6(+0x8b717)[0x7fc75c6df717] /usr/lib/libcrypto.so.1.1(CRYPTO_THREAD_run_once+0xe)[0x7fc74f7780ce] /usr/lib/libcrypto.so.1.1(OPENSSL_init_crypto+0x400)[0x7fc74f737830] /usr/lib/libcrypto.so.1.1(+0x136b45)[0x7fc74f736b45] /usr/lib/libc.so.6(+0x8b717)[0x7fc75c6df717] /usr/lib/libcrypto.so.1.1(CRYPTO_THREAD_run_once+0xe)[0x7fc74f7780ce] /usr/lib/libcrypto.so.1.1(OPENSSL_init_crypto+0x36c)[0x7fc74f73779c] /usr/lib/libssl.so.1.1(OPENSSL_init_ssl+0x36)[0x7fc74fafc5c6] /usr/lib/libssl.so.1.1(SSL_CTX_new+0x2b)[0x7fc74fb080bb] /usr/lib/lua/5.4/ssl.so(+0x6c8c)[0x7fc7544e8c8c] /usr/lib/liblua.so.5.4(+0x126a2)[0x7fc75c9356a2] /usr/lib/liblua.so.5.4(+0x2128f)[0x7fc75c94428f] /usr/lib/liblua.so.5.4(+0x12c86)[0x7fc75c935c86] /usr/lib/liblua.so.5.4(+0xd1f4)[0x7fc75c9301f4] /usr/lib/liblua.so.5.4(+0xd510)[0x7fc75c930510] /usr/lib/liblua.so.5.4(lua_pcallk+0x90)[0x7fc75c935d50] /usr/lib/lua/5.4/socket/core.so(+0x669c)[0x7fc75c4fe69c] /usr/lib/liblua.so.5.4(+0x126a2)[0x7fc75c9356a2] /usr/lib/liblua.so.5.4(+0x2128f)[0x7fc75c94428f] /usr/lib/liblua.so.5.4(+0x12c86)[0x7fc75c935c86] /usr/lib/liblua.so.5.4(+0xd1f4)[0x7fc75c9301f4] /usr/lib/liblua.so.5.4(+0xd510)[0x7fc75c930510] /usr/lib/liblua.so.5.4(lua_pcallk+0x90)[0x7fc75c935d50] /usr/lib/fcitx5/libluaaddonloader.so(+0xf12b)[0x7fc75c99612b] /usr/lib/fcitx5/libquickphrase.so(+0x126ba)[0x7fc75d3916ba] /usr/lib/fcitx5/libquickphrase.so(+0xfdb7)[0x7fc75d38edb7] /usr/lib/fcitx5/libquickphrase.so(+0x10e56)[0x7fc75d38fe56] **警告:fcitx5-diagnose 的输出可能包含敏感信息,包括发行版名称,内核版本,正在运行的程序名称等。** **尽管这些信息对于开发者诊断问题有帮助,请在公开发送到在线网站前检查并且根据需要移除的对应信息。**
pacman -Qs lua
local/fcitx5-lua-git 5.0.9.r1.gd8d2c3d-1
    Lua support for fcitx5, with an imeapi addon implementing googlepinyin api
local/lua 5.4.4-2
    Powerful lightweight programming language designed for extending applications
local/lua-basexx 0.4.1-2
    A Lua library which provides base2(bitfield), base16(hex), base32(crockford/rfc), base64(rfc/url), base85(z85) decoding and encoding for Lua 5.4
local/lua-binaryheap 0.4-2
    Binary heap implementation for Lua 5.4
local/lua-cjson 2.1.0-5
    A fast JSON parsing and encoding support for Lua.
local/lua-cqueues 20200726-3
    Continuation Queues: Embeddable asynchronous networking, threading, and notification framework for Lua 5.4
local/lua-dkjson 2.6-1
    David Kolf’s Pure Lua JSON module with UTF-8 support and no external dependencies for Lua 5.4
local/lua-fifo 0.2-1
    Fifo library for Lua 5.4
local/lua-http 0.4-1
    HTTP Library for Lua 5.4
local/lua-language-server 3.5.3-1
    Lua Language Server coded by Lua
local/lua-lpeg 1.0.2-4
    Pattern-matching library for Lua 5.4
local/lua-lpeg-patterns 0.5-1
    A collection of LPEG patterns for Lua 5.4
local/lua-luaossl 20220711-1
    Most comprehensive OpenSSL module in the Lua universe for Lua 5.4
local/lua-sec 2:1.1.0-1
    Lua bindings for OpenSSL library to provide TLS/SSL communication for Lua 5.4
local/lua-socket 1:3.1.0-1
    Networking support library for the Lua language
local/lua51 5.1.5-9
    Powerful lightweight programming language designed for extending applications
local/lua52 5.2.4-5
    Powerful lightweight programming language designed for extending applications
local/lua53 5.3.6-1
    Powerful lightweight programming language designed for extending applications
wengxt commented 2 years ago

你crash的原因,我还不太确定问题是什么,但可能和 dlmopen 有关系 https://stackoverflow.com/questions/70030529/manually-loading-libcrypto-dlmopen-dlsym-segfaults-dynamically-linked-works https://sourceware.org/bugzilla/show_bug.cgi?id=24776

网络问题主要有两个 1、同步请求网络可能造成阻塞,如果真的要实现也得考虑异步 2、异步的情形那还得需要和 fcitx 的事件循环有所集成,换句话说主要是 lua 内部的 io 可能都有一些问题

wengxt commented 2 years ago

用 dlmopen 开 lua 库的根本原因是 rime-lua 用的 lua 版本和 fcitx 的不一样,同时加载会 crash。