次放漂流瓶•公告频道


Гео и язык канала: не указан, не указан
Категория: не указана


次放漂流瓶,你的文字漂流瓶
机器人: @cfplp_bot

Связанные каналы

Гео и язык канала
не указан, не указан
Категория
не указана
Статистика
Фильтр публикаций






次放漂流瓶App
限制还是三次






重大喜讯:
Telegram客户端,使用"次放漂流瓶"bot发出的漂流瓶,上限为999!


次放漂流瓶 - 一款文字漂流瓶
由频道 @WaterChisato 进行研究开发
仅支持文字,没有图片哦~


Репост из: 千束の频道 QAQ
关注水喝千束喵喵喵

求求你啦


理论上的QQbot的经过cf中转的转发脚本


// cloudflare-workers-bottle-relay.js
import { kv } from '@cloudflare/kv';
import { v4 as uuidv4 } from 'uuid';

// 配置参数(需替换为实际值)
const CONFIG = {
cfAccountId: 'YOUR_CF_ACCOUNT_ID',
qqAppId: 'YOUR_QQ_APP_ID',
qqClientSecret: 'YOUR_QQ_CLIENT_SECRET',
qqBotToken: 'YOUR_MIRAI_BOT_TOKEN',
phpApiBaseUrl: 'https://your-php-domain.com/',
sharedSecret: 'YOUR_SHARED_SECRET', // 与PHP端保持一致的密钥
kvNamespace: 'BOTTLE_RELAY_KV' // 已创建的KV命名空间
};

// 初始化KV存储
const kvStore = kv.namespace(CONFIG.kvNamespace);

// 定时刷新Access Token(每30分钟检查一次)
setInterval(async () => {
await refreshToken();
}, 1800000); // 30分钟

// 获取/刷新Access Token
async function refreshToken() {
const now = Date.now() / 1000;
const storedToken = await kvStore.get('qq_access_token');

if (storedToken && storedToken.expire > now + 60) {
return storedToken.token;
}

try {
const response = await fetch('https://bots.qq.com/app/getAppAccessToken', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
appId: CONFIG.qqAppId,
clientSecret: CONFIG.qqClientSecret
})
});

if (!response.ok) throw new Error('Token获取失败');

const data = await response.json();
if (data.code !== 0) throw new Error(data.message);

await kvStore.put('qq_access_token', {
token: data.access_token,
expire: now + data.expires_in - 60 // 提前60秒刷新
});

return data.access_token;
} catch (error) {
console.error('Token刷新错误:', error);
throw error;
}
}

// 处理QQ机器人消息
export async function handleQQMessage(request) {
try {
const token = await refreshToken();
const authHeader = `Bearer ${token}`;

const event = await request.json();
const message = event.messageChain.find(item => item.type === 'Plain')?.text;
const chatId = event.sender.id;

if (!message) {
return new Response('无效消息格式', { status: 400 });
}

// 解析命令
let command, params;
if (/^\/throw\s/.test(message)) {
command = 'throw';
params = message.replace(/^\/throw\s*/, '');
} else if (message === '/pick') {
command = 'pick';
params = '';
} else {
return new Response('未知命令', { status: 400 });
}

// 生成签名
const timestamp = Date.now();
const signData = `content=${encodeURIComponent(params)}×tamp=${timestamp}`;
const signature = crypto.subtle.digest('SHA-256', new TextEncoder().encode(signData + CONFIG.sharedSecret))
.then(buffer => Array.from(new Uint8Array(buffer))
.map(b => b.toString(16).padStart(2, '0')).join('')
);

// 转发请求到PHP API
const phpResponse = await fetch(`${CONFIG.phpApiBaseUrl}${command}.php`, {
method: 'POST',
headers: {
'Authorization': authHeader,
'Content-Type': 'application/x-www-form-urlencoded',
'X-Signature': await signature,
'X-Timestamp': timestamp
},
body: new URLSearchParams({
content: params,
sender_id: chatId
}).toString()
});

if (!phpResponse.ok) {
throw new Error(`PHP API错误: ${phpResponse.status} ${await phpResponse.text()}`);
}

const responseBody = await phpResponse.text();
return new Response(responseBody, { status: 200 });
} catch (error) {
console.error('处理错误:', error);
return new Response('服务器内部错误', { status: 500 });
}
}

// Cloudflare Workers入口函数
addEventListener('fetch', event => {
event.respondWith(handleQQMessage(event.request));
});


Репост из: 千束の频道 QAQ
搞好了喵
【次放_的个人空间-哔哩哔哩】 https://b23.tv/atvhfvU


漂流瓶机器人持续运行中
点击这段文字即可使用次放漂流瓶


要不要开发“漂流瓶回复”功能(只能在网页发 机器人不支持喵)
Опрос
  •   ✅
  •   😭
18 голосов


修复了:
在输入 /privacy@cfplp_bot 和/start@cfplp_bot ,机器人无法发送的奇妙问题

这个陈年积蓄老bug终于修好了




稍稍改了下,输入命令
/pickbottle 或 /pickbottle@cfplp_bot
也会捡瓶子了




Репост из: 千束の频道 QAQ
​​祝我生日快乐~


临时修了下,将“telegram_user.json”数据转移至数据库内


目前,“群扔出”占用的是群ID,所以如果在群里扔不了,请尝试私信使用机器人扔出
这也是一个bug,但是我不知道咋修,因为读取的都是同一行的数字

Показано 20 последних публикаций.

5

подписчиков
Статистика канала