如何获取剪贴板的内容,并输出,代码怎么写?
// 封装获取大麦APP内节目ID
function getDamaiAppItemId() {
// 点击分享,根据自己界面调整坐标/xpath
var s = id("project_detail_new_share_lottie").findOne();
btn_position_click(s);
sleep(500);
// 点击复制链接
var s = text("复制链接").findOne();
btn_position_click(s);
sleep(800);
let link = getClip();
log(link);
log(getClip());
let match = link.match(/id=(\d+)/);
return match ? match[1] : null;
}
// 调用
let itemId = getDamaiAppItemId();
if (itemId) {
toast("获取ID成功:" + itemId);
log("节目ID =", itemId);
} else {
toast("获取ID失败,请检查页面是否为演出详情页");
}
function btn_position_click(x) {
if (x) {
var b = x.bounds();
var c = click(b.centerX(), b.centerY())
console.log("点击是否成功:"+c);
}
}那为什么log(link)没有输出内容?剪贴板已有内容
回答
// 文档地址 https://docs.hamibot.com/
// 获取剪贴板内容
var clipText = getClip();
// 输出内容,使用 toast 气泡显示
toast('剪贴板内容是: ' + clipText);
说明:getClip() 函数用于获取系统剪贴板的文本内容。注意在 Android 10 及以上版本,需要先将 Hamibot 应用切换到前台再调用该函数,否则可能无法获取到内容。
可能的原因有几个:
-
Android 10+ 剪贴板限制
在 Android 10 及以上系统中,只有前台应用才能读取剪贴板。如果 Hamibot 在点击“复制链接”后没有立即回到前台,getClip()就会返回空字符串。
你可以在调用getClip()前加一句app.launchApp("Hamibot 的包名")让其回到前台,或直接使用app.launch("com.hamibot.hamibot")。 -
“复制链接”按钮点击失败
虽然btn_position_click打印了“点击是否成功”,但可能点击坐标偏移,或控件不可点击,导致复制并未真正执行。
可以改用click()或s.click()直接点击控件,而不通过坐标,例如:var s = text("复制链接").findOne(); if (s && s.click()) { sleep(800); } -
log(link)返回空字符串显示不直观
如果getClip()返回"",log("")会输出一个空行,你可能误以为没有输出。建议这样写:let link = getClip(); log("剪切板内容: [" + link + "]");这样可以清楚看到是否为空。
-
Hamibot 的“读取剪贴板”权限未开启
部分系统需要手动授权。进入手机「设置」→「应用」→「Hamibot」→「权限」,检查“读取剪贴板”权限是否为开启状态。
更稳妥的方案:直接从页面控件提取链接,不依赖剪贴板
如果大麦的分享弹窗中含有包含链接的控件,可以直接读取其文本属性,例如:
var s = text("复制链接").findOne();
if (s) {
s.click();
sleep(500);
// 尝试从弹窗中获取链接控件
var linkView = textContains("http").findOne(3000);
if (linkView) {
var link = linkView.text();
log("链接: " + link);
var match = link.match(/id=(\d+)/);
return match ? match[1] : null;
}
}
这样就不用受剪贴板限制,也更稳定。