Cloudflare Worker 阅后即焚 脚本有没有?

想自己搭建一个分享东西。有现成的吗?

2 Likes

帮顶

1 Like

用worker?

1 Like

简单搭建并且快速分享。问题不大吧?结合一个Vercel前端也不错啊。

1 Like

测试
试试

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url)
  if (request.method === 'POST' && url.pathname === '/create') {
    return await createSecret(request)
  } else if (request.method === 'GET' && url.pathname.startsWith('/secret/')) {
    return await getSecret(url.pathname.replace('/secret/', ''))
  } else {
    return new Response(renderHTML(), {
      headers: { 'Content-Type': 'text/html; charset=UTF-8' }
    })
  }
}

async function createSecret(request) {
  const { text } = await request.json()
  const id = generateId()
  const data = { text, views: 0 }
  await works_data.put(id, JSON.stringify(data))
  const link = `${new URL(request.url).origin}/secret/${id}`
  return new Response(JSON.stringify({ link }), {
    headers: { 'Content-Type': 'application/json; charset=UTF-8' }
  })
}

async function getSecret(id) {
  const value = await works_data.get(id)
  if (!value) {
    return new Response('Not Found', { status: 404 })
  }
  
  const data = JSON.parse(value)
  data.views += 1
  
  if (data.views >= 2) {
    await works_data.delete(id)
  } else {
    await works_data.put(id, JSON.stringify(data))
  }
  
  return new Response(data.text, {
    headers: { 'Content-Type': 'text/plain; charset=UTF-8' }
  })
}

function generateId() {
  return Math.random().toString(36).substr(2, 10)
}

function renderHTML() {
  return `
  <!DOCTYPE html>
  <html lang="zh">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>阅后即焚服务</title>
  </head>
  <body>
    <h1>创建一个阅后即焚的链接</h1>
    <textarea id="secretText" rows="4" cols="50" placeholder="输入你的秘密"></textarea><br>
    <button onclick="createSecret()">生成链接</button>
    <p id="link"></p>
    
    <script>
      async function createSecret() {
        const text = document.getElementById('secretText').value
        const response = await fetch('/create', {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json; charset=UTF-8'
          },
          body: JSON.stringify({ text })
        })
        const data = await response.json()
        document.getElementById('link').textContent = \`你的链接: \${data.link}\`
      }
    </script>
  </body>
  </html>
  `
}

绑定一下kv变量works_data
设定是生成的链接可以访问两次就销毁,仅支持文本

4 Likes
1 Like

感谢:heart:,拿走了

1 Like

哈哈哈,不错,就是界面丑了点。
CHATGPT写的还是你自己写的?

1 Like

AI啊,有现成的干嘛不用

优化了一下:
1.美化分享和查看页面
2.生成链接后自动复制
3.设置与查看(剩余查看次数)
代码


image

8 Likes

复制粘贴部署即可
https://pastebin.mathisall.cf/hD43
编辑界面默认 short_link_admin
记得创建kv并设置Variable name为shortlink,KV Namespace自己选。
改自这个项目
其实就是在 let link = await shortlink.get(key)加了行let deletedata = await shortlink.delete(key)

2 Likes

能增加 确认阅读 按钮,防止误操作吗。
你这是自己写的还是AI?

1 Like

万一忘了点呢,不如给点冗余的访问次数

1 Like

这种链接发微信,会不会被微信先过滤一遍给你阅读了?

1 Like

那你就多给点次数,给个五六次次就行,我最新话题有个支持markdown文档的,可以试试

1 Like

主要就是防止微信机器人给扫一遍收集信息的,所以才阅后即焚。

1 Like

我试了下,微信没扫,也可能是我这个域名还没解析好,它扫不了:joy:

1 Like

啊哈哈哈,你这都是机器人写的吗?
还是说你自己写的?

1 Like

我不会js,提个需求然后ai生成一下改一改呗

1 Like

这个需求感觉没太大必要,同类型的好像都没,都是用GPT改的,自己提需求

1 Like