MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接
    1. 主页
    2. Dituon
    3. 帖子
    • 资料
    • 关注 0
    • 粉丝 7
    • 主题 12
    • 帖子 293
    • 最佳 51
    • 有争议的 0
    • 群组 1

    Dituon 发布的帖子

    • RE: 如何用用户账户在频道发原生markdown

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

      发布在 开发交流
      Dituon
      Dituon
    • RE: 如何用用户账户在频道发原生markdown

      @starryeye-0001 官方权限是主动消息,一个月只能发四条

      发布在 开发交流
      Dituon
      Dituon
    • RE: 如何用用户账户在频道发原生markdown

      @starryeye-0001 群聊markdown需要向腾讯申请,要求是每天用户量>10000

      发布在 开发交流
      Dituon
      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' }
      
      发布在 开发交流
      Dituon
      Dituon
    • 樱&花动漫接口逆向

      想实现番剧下载的爬虫,花了两天时间逆向某知名动画网站的接口

      yhmgo.com

      https://github.com/Dituon/yhmgo-parser

      注意:悄悄滴使用,声张滴不要

      发布在 开发交流
      Dituon
      Dituon
    • RE: QQ群bot官方接口,与使用体验

      402b6c2a3967f3a906087366509bfcd0.png

      0b9bf9ff-4149-473a-bd9e-b62a55f9f437-image.png

      今天更新:新创建的bot需要公网IP

      发布在 开发交流
      Dituon
      Dituon
    • RE: [教程] 使用 cloud flare worker 实现免费接口代理

      @Yan502 更新了 「常见问题」 小节,可以参考一下

      发布在 开发交流
      Dituon
      Dituon
    • RE: [教程] 使用 cloud flare worker 实现免费接口代理

      翻译: 使用 izhtai.net 而不是 www.admin.izhtai.net

      发布在 开发交流
      Dituon
      Dituon
    • RE: [教程] 使用 cloud flare worker 实现免费接口代理

      cloud flare worker 的域名 workers.dev 可能在中国某些地区被污染,挂梯子后重试,之后挂载到自己的域名上

      发布在 开发交流
      Dituon
      Dituon
    • RE: 想知道下现在Mirai是否还有继续开发的计划……

      顶

      发布在 技术交流板块
      Dituon
      Dituon
    • RE: 忽然想起以前的一个插件

      @LiangChan
      你是否在找:

      https://mirai.mamoe.net/topic/1412/mutegams-一个满足群友抖m需求的禁言游戏合集-banme-轮盘赌-决斗-21点/2

      发布在 摸鱼区
      Dituon
      Dituon
    • RE: 为啥我创建不了
      1. 请直接在原帖下回复,否则我无法收到任何提示
      2. 请提供更详细的信息或截图
      发布在 开发交流
      Dituon
      Dituon
    • RE: [教程] 使用 cloud flare worker 实现免费接口代理

      @xiatianYa 是的

      发布在 开发交流
      Dituon
      Dituon
    • RE: Petpet - 生成各种奇怪的图片

      @盐酸哌甲酯 改用java11后重试,提供onebot实现信息

      发布在 插件发布
      Dituon
      Dituon
    • RE: Petpet - 生成各种奇怪的图片

      @盐酸哌甲酯 不太清楚,可能是兼容性问题

      1. 删除overflow插件进行测试

      提供更详细的信息,例如onebot实现和具体的java版本

      发布在 插件发布
      Dituon
      Dituon
    • RE: miral配置过程中mcl.cmd打开但是下载文件出现问题且有几个报错,我是在国内环境进行配置的,不知道是不是没有挂vpn导致的希望有大佬能帮我看看。

      网络问题,检查下载源/网络环境

      发布在 技术交流板块
      Dituon
      Dituon
    • 年度总结插件开发计划

      刚刚看到了腾讯官方的年度总结界面,感觉数据统计项不尽人意,打算开发一个统计群内聊天数据,在 年底/月底 进行总结的插件。

      本人文化造纸堪忧,想不到有趣的统计项,希望坛友集思广益提出建议。

      一些有趣的统计项:

      群员

      对每个群员分别统计

      • 被回复的次数
      • 被at的次数
      • 最常at的人
      • 最常被某人at
      • 被禁言的次数&时间
      • 消息总字数
      • 更改群名片次数
      • 上传文件总数量&大小
      • 发送图片数量
      • 撤回消息的数量
      • 戳一戳次数
      • 最常戳&被戳的人
      • 最常发送的表情包

      拓展 (可能需要依赖高级拓展或需要更多性能, 不一定会开发)

      • 使用最多的emoji
      • 年度热词 (通过分词统计周期内出现最多的词语)
      • 个人词云 (同上)

      群聊

      对群聊内所有事件进行统计

      • 最常被at的人
      • 最常at别人的人
      • 最常戳&被戳的人
      • 发送最多的表情包
      • 被禁言次数&时间最多的人
      • 发言次数&字符最多的人
      • 发图片最多的人
      • 发链接最多的人
      • 上传文件最多&最大的人
      • 被发送最多的链接域名
      • 每天聊天到最晚的人 (以 05:00 为界限)
      • 每天发送第一条消息最多的人 (同上)
      • 被下载最多&最大的文件
      • 发言天数最多的人

      拓展

      • 被使用最多的emoji
      • 年度热词&词云 (同上)
      • 被回复最多的图片&消息

      有更好的想法,欢迎补充😍

      发布在 开发交流
      Dituon
      Dituon
    • RE: [教程] 使用 cloud flare worker 实现免费接口代理

      @xiatianYa workers域名在国内某些地区无法访问,可以使用我的域名进行测试,或者访问cloudflare时使用代理

      发布在 开发交流
      Dituon
      Dituon
    • RE: OpenAI ChatBot 插件,已添加预设功能(为啥你们都想整猫娘)

      @fufuzhou @MikogoIT @KevinXu02 接口代理与修改API相关问题可参考

      https://mirai.mamoe.net/topic/2584/教程-使用-cloud-flare-worker-实现免费接口代理/11

      发布在 插件发布
      Dituon
      Dituon
    • RE: [教程] 使用 cloud flare worker 实现免费接口代理

      @PandragonXIII

      已向插件提交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

      Dituon created this issue in cssxsh/mirai-openai-plugin

      open feat: 支持修改API地址 #51

      发布在 开发交流
      Dituon
      Dituon
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 14
    • 15
    • 4 / 15