@starryeye-0001 做不到,应用卡片消息需要腾讯签名,不然发出来就封号,建议用图片绘制md

Dituon 发布的帖子
-
RE: 樱&花动漫接口逆向
更新: 爬虫示例代码
export const config = { fetchHeader: { "Sec-Ch-Ua": '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"', "Dnt": '1', "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0" } } export interface VideoInfo { url: string // type: string } export abstract class Parser { public abstract parse(raw: string): Promise<VideoInfo> } import fetch from 'node-fetch' import * as cookie from 'cookie' const exp = /www\.yhmgo\.com\/vp\/(\d+)-(\d+)-(\d+)/ const API_BASE = 'https://www.yhmgo.com/playurl' const PAGE_BASE = 'https://www.yhmgo.com/vp' export class YhmgoParser extends Parser { async parse(url: string): Promise<VideoInfo> { const [match, id, channel, ep] = url.match(exp) if (!match) { throw new Error('Invalid url') } const pageUrl = `${PAGE_BASE}/${id}-${channel}-${ep}.html` const page = await fetch(pageUrl) let {t1, k1} = page.headers.raw()['set-cookie'].reduce((obj, str) => { return {...cookie.parse(str), ...obj} }, {}) let cookies = parseCookie(t1, k1) const raw = await fetch( `${API_BASE}?aid=${id}&playindex=${channel}&epindex=${ep}&r=${Math.random()}`, { headers: { ...config.fetchHeader, referer: pageUrl, cookie: Object.entries(cookies) .map(c => cookie.serialize(c[0], c[1])) .join('; ') } } ) const {vurl} = parseResult(await raw.text()) return { url: decodeURIComponent(vurl), // type: 'm3u8', } } } export function parseCookie(t1: number, k1: number) { let pos = Math.floor(t1 / 0x3e8) >> 0x5 let offset = 0x89a4 let k2 = '' + (((((pos * (pos % 0x100) + 0x1) + offset) * ((pos % 0x80) + 0x1)) * ((pos % 0x10) + 0x1)) + pos) let t2 = '' while (true) { t2 = '' + Math.floor(new Date().getTime()) let tOffset = t2.slice(t2.length - 0x3) let kOffset = k2.slice(k2.length - 0x1) if (tOffset.indexOf(kOffset) >= 0x0) { break } } let start = 0x0 let timeOffset = Math.floor(new Date().getTime() / 0x3e8) >> (0x11 + start) let m2t = ((((timeOffset * 0x15 + 0x9a) * (((timeOffset % 0x40) + 0xd)) * ((timeOffset % 0x20) + 0x22) * ((timeOffset % 0x10) + 0x57)) * ((timeOffset % 0x8) + 0x41)) + 0x2ef) return { t1, k1, t2, k2, m2t } } export function parseResult(raw: string): { purl: string, vurl: string, inv: string } { let result = '' const offset = 0x619 const rawLength = raw.length for (let i = 0x0; i < rawLength; i += 0x2) { let temp = parseInt(raw[i] + raw[i + 1], 0x10) temp = ( (temp + 0x100000 - offset) - (((rawLength / 0x2) - 0x1) - (i / 0x2)) ) % 0x100 result = String.fromCharCode(temp) + result } return JSON.parse(result) }
使用
import {YhmgoParser} from "./parser/yhmgo"; const parser = new YhmgoParser() const video = await parser.parse('https://www.yhmgo.com/vp/11141-2-0.html') console.log(video) // 输出: { url: 'https://vip.lz-cdn16.com/20230317/13224_75d9217b/index.m3u8' }
-
RE: [教程] 使用 cloud flare worker 实现免费接口代理
cloud flare worker 的域名
workers.dev
可能在中国某些地区被污染,挂梯子后重试,之后挂载到自己的域名上 -
年度总结插件开发计划
刚刚看到了腾讯官方的年度总结界面,感觉数据统计项不尽人意,打算开发一个统计群内聊天数据,在 年底/月底 进行总结的插件。
本人文化造纸堪忧,想不到有趣的统计项,希望坛友集思广益提出建议。
一些有趣的统计项:
群员
对每个群员分别统计
- 被回复的次数
- 被at的次数
- 最常at的人
- 最常被某人at
- 被禁言的次数&时间
- 消息总字数
- 更改群名片次数
- 上传文件总数量&大小
- 发送图片数量
- 撤回消息的数量
- 戳一戳次数
- 最常戳&被戳的人
- 最常发送的表情包
拓展 (可能需要依赖高级拓展或需要更多性能, 不一定会开发)
- 使用最多的emoji
- 年度热词 (通过分词统计周期内出现最多的词语)
- 个人词云 (同上)
群聊
对群聊内所有事件进行统计
- 最常被at的人
- 最常at别人的人
- 最常戳&被戳的人
- 发送最多的表情包
- 被禁言次数&时间最多的人
- 发言次数&字符最多的人
- 发图片最多的人
- 发链接最多的人
- 上传文件最多&最大的人
- 被发送最多的链接域名
- 每天聊天到最晚的人 (以
05:00
为界限) - 每天发送第一条消息最多的人 (同上)
- 被下载最多&最大的文件
- 发言天数最多的人
拓展
- 被使用最多的emoji
- 年度热词&词云 (同上)
- 被回复最多的图片&消息
有更好的想法,欢迎补充😍
-
RE: [教程] 使用 cloud flare worker 实现免费接口代理
@xiatianYa workers域名在国内某些地区无法访问,可以使用我的域名进行测试,或者访问cloudflare时使用代理
-
RE: [教程] 使用 cloud flare worker 实现免费接口代理
已向插件提交PR
https://github.com/cssxsh/mirai-openai-plugin/pull/51插件站内地址
https://mirai.mamoe.net/topic/1849编译好的修改版本
https://drive.google.com/file/d/1jaP1AOtwKfISPXVrDM-MZiBSYIkhkVRT/view修改 cloudflare worker.js
const api = 'https://api.openai.com' export default { async fetch(request, env, ctx) { const url = api + new URL(request.url).pathname const response = await fetch(url, { method: request.method, headers: request.headers, body: request.body, }); return new Response(response.body, { status: response.status, statusText: response.statusText, headers: response.headers, }); }, };
修改插件默认配置项
api
至 您的worker域名, 例如:https://api.openai.com/v1
至https://您的域名/v1