wallleap / myblogs

blog, Issue
https://myblog.wallleap.cn
4 stars 1 forks source link

写两个简单的 Raycast 脚本 #109

Open wallleap opened 6 months ago

wallleap commented 6 months ago

title: 写两个简单的 Raycast 脚本 date: 2024-05-06 23:16 updated: 2024-05-06 23:16 cover: //cdn.wallleap.cn/img/pic/cover/raycast.jpg category: 技术杂谈 tags:

好早之前就弃用了 Alfred,转用了 Raycast,最主要的一个原因就是后者免费开源。但是换了之后一直用的就是 store 里的脚本,还没自己写过,最近正好有需求,简单记录一下。

创建 Node 脚本

第一次创建脚本需要选择一个目录存放,步骤为:进入 Raycast 设置,点击加号,点击 Add Script Directory,我设置的目录为 ~/.raycast

Add Script Directory

接着在这个页面点击 Create Script Command,填写信息,看情况是否需要勾选下面两个选项,之后点击 Create Script 就创建好了脚本

填写信息

生成好的脚本可以在 Scripts 下找到,在搜索的时候,输入标题、别名或包名都可以找到这个脚本

脚本

生成随机字符串

根据上述步骤创建一个脚本

修改生成的 randstring.js 写一个生成随机字符串的脚本(可能后面会想要指定长度,这里先不写死 16)

function randomStr(length) {
  if (typeof length !== 'number' || isNaN(length) || length <= 0)
    return ''
  else if (length <= 11)
    return Math.random().toString(36).slice(2, length + 2).padEnd(length, '0')
  else
    return randomStr(11) + randomStr(length - 11)
}

调用这个函数,并且需要直接复制到剪贴板(Node.js 在不使用第三方包情况下可以这样操作)

const { exec } = require('child_process')

// Windows
exec('clip').stdin.end('some text')

// Mac
exec('pbcopy').stdin.end('some text')

// Linux
exec('xclip').stdin.end('some text')

所以完整的代码为(不包括脚本自带的描述信息):

const { exec } = require('child_process')

function randomStr(length) {
  if (typeof length !== 'number' || isNaN(length) || length <= 0)
    return ''
  else if (length <= 11)
    return Math.random().toString(36).slice(2, length + 2).padEnd(length, '0')
  else
    return randomStr(11) + randomStr(length - 11)
}

const rs = randomStr(16)
exec('pbcopy').stdin.end(rs)
console.log(`✅ 复制 ${rs} 成功`)

如果后面需要传入长度的话,可以重新创建一条脚本,并勾选 With Argument,之后调用的时候传入参数即可 randomStr(Number(process.argv.slice(2)[0]))

简单翻译脚本

找一个免费的翻译 API:https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl=zh-cn&q=English

通过 Node.js 的 https 模块进行请求

创建脚本

将下述内容添加到生成的 fanyi.js 文件中

const https = require('https')
const querystring = require('querystring')

const translate = (q) => {
  let tl = 'en'
  if (/[a-zA-Z]/.test(q[0])) {
    tl = 'zh-cn'
  }
  // 对参数进行拼接
  const query = querystring.stringify({
    client: "dict-chrome-ex",
    sl: "auto",
    tl,
    q
  })

  const options = {
    hostname: 'clients5.google.com',
    port: 443,
    path: '/translate_a/t?' + query,
    method: 'GET',
  }

  const request = https.request(options, (response) => {
    let chunks = []
    response.on('data', (chunk) => {
      chunks.push(chunk)
    })
    response.on('end', () => {
      const string = Buffer.concat(chunks).toString()
      const object = JSON.parse(string)
      console.log(object[0][0]) // 打印结果
    })
  })
  request.on('error', (e) => {
    console.error(e)
  })
  request.end()
}

translate(process.argv.slice(2)[0])

注:我对 google 域名进行了代理,不知道正常网络能否正常请求,如果不行的话可以按照这个思路换一个免费 API 试试

使用效果如下:

使用效果