EOP - 上帝之眼,又名 A-SOUL

功能齐全的社交媒体监视器,可从各种社交媒体中爬取数据并将更新推送到Telegram或其他平台

功能

  • 同时监测多个服务
  • 支持对失败的连接进行重试
  • 支持使用代理以避免 API 的请求速率限制
  • 内存占用量低(在多服务条件下,单个帐户约 50 MB,20 个帐户约 120 MB)
  • 默认情况下,具有最小依赖的 ESM

支持的社交媒体平台(以及计划中的)

  • [x] 哔哩哔哩
  • [x] 哔哩哔哩直播
  • [x] 抖音(需要cookies)
  • [x] 抖音直播(需要cookies)
  • [x] Twitch(需要cookies)
  • [ ] Instagram
  • [x] TikTok(需要cookies,不稳定)
  • [ ] TikTok直播
  • [x] Twitter(使用 rsshub-json)
  • [x] 微博(仅关注者活动需要cookies)
  • [x] YouTube(使用 rsshub-json)
  • [ ] YouTube直播
  • [x] RSS(支持 RSSHubrsshub-json
  • [x] GitHub(使用 rsshub-json)
  • [x] DDStats
  • [x] Tape小纸条
  • [x] 爱发电
  • [x] QQ音乐(需要cookies,需要手动转换)
  • [ ] 网易云音乐(使用 NeteaseCloudMusicApi

支持的发送方式

  • [x] Telegram
  • [x] go-cqhttp(QQ频道和QQ群组)

需要的系统环境依赖

  • Node.js >= 16

使用方法

使用 npx 运行:

# 显示帮助
npx @sparanoid/eop -h

# 使用特定的配置文件启动
npx @sparanoid/eop run -c config.js

使用 Docker 运行:

docker run --init \
  -v $(pwd)/config.js:/app/config.js:ro \
  -v $(pwd)/db:/app/db \
  sparanoid/eop -c config.js --color
  # ...or use ghcr.io registry
  ghcr.io/sparanoid/eop -c config.js --color

配置文件

最小config.js

export default {
  accounts: [
    {
      enabled: true,
      slug: '嘉然',
      biliId: '672328094',
    },
  ]
}

完整配置可能如下所示: config.js

export default {
  // 监测间隔(毫秒)
  loopInterval: 60 * 1000,

  // 在每个帐户运行监测之前等待一小段时间
  loopPauseTimeBase: 1000,

  // 使用 Math.random() 函数生成随机数作为“loopPauseTimeBase”的时间因素
  loopPauseTimeRandomFactor: 2000,

  // 24小时内,如果新发布的消息超过此数值,则不再发送通知
  douyinBotThrottle: 36 * 3600 * 1000,
  douyinLiveBotThrottle: 1200 * 1000, // 20 mins

  // 65分钟,bilibili有时会达到60分钟的限速
  bilibiliBotThrottle: 65 * 60 * 1000,
  bilibiliLiveBotThrottle: 65 * 60 * 1000,
  bilibiliFollowingBotThrottle: 3600 * 1000,

  rssBotThrottle: 12 * 3600 * 1000,
  weiboBotThrottle: 3600 * 1000,
  ddstatsBotThrottle: 3600 * 1000,
  tapechatBotThrottle: 3600 * 1000,
  afdianBotThrottle: 3600 * 1000,
  qqMusicBotThrottle: 3600 * 1000,
  twitchBotThrottle: 65 * 60 * 1000,

  // 使用代理绕过bilibili API速率限制
  // 默认值: ''
  rateLimitProxy: 'http://10.2.1.2:7890',

  // 请求配置选项
  // 默认值:
  // {
  //   requestOptions: {
  //     timeout: {
  //       request: 4000
  //     }
  //   }
  // }
  pluginOptions: {
    requestOptions: {
      timeout: {
        request: 3000
      },
    },
    customCookies: {
      // 2021年11月11日
      // 抖音主站目前需要 `__ac_nonce` and `__ac_signature` 使得脚本正常运行
      douyin: `__ac_nonce=XXX; __ac_signature=XXX;`,

      // 从 https://www.bilibili.com/ 获取 `SESSDATA` cookie
      bilibili: `SESSDATA=XXX`,

      // 从 https://m.weibo.cn/ 获取 `SUB` cookie
      weibo: `SUB=XXX`,
    }
  },

  // Twitch API 凭证
  // 创建你的 twitch app: https://dev.twitch.tv/console
  twitch: {
    clientId: `xxx`,
    clientSecret: `yyy`,
  },

  // Telegram 全局配置
  telegram: {
    enabled: true,
    apiBase: 'https://api.telegram.org/bot',
    token: '',

    // 如果bot属于premium用户,机器人的照片和视频大小限制为2048MB(普通账户为1024MB)
    // 默认值: false
    premium: true,

    // 设置一个特殊的频道/聊天来发送调试信息。如果没有填写,将不会发送任何调试信息
    // 默认值: undefined
    debuggingChannelId: -10012345,
  },

  // QQ 推送全局配置
  qGuild: {
    enabled: true,
    // go-cqhttp api地址
    // 在 https://github.com/Mrs4s/go-cqhttp 中了解如何使用 go-cqhttp 并向 QQ 发送更新推送
    apiBase: 'http://10.2.1.2:5700',
  },

  // Sentry 全局配置
  sentry: {
    enabled: true,
    dsn: `https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@ingest.sentry.io/9`,
    environment: `production`,
    tracesSampleRate: 1.0,
  },

  // 使用代理获取图像
  // 了解更多: https://github.com/willnorris/imageproxy
  // 默认值: ''
  imageProxy: `https://experiments.sparanoid.net/imageprox/`,

  accounts: [
    {
      // 使用 `false` 禁用此配置文件
      // 默认值: true
      enabled: true,

      // 设置日志文件中的 `slug` 用户名
      slug: '嘉然',

      // 当配置为 `true` 时,向推送通知的开头添加 `slug` 用户名
      // 例如: #嘉然. 便于在一个频道中推送多个账户的更新推送
      // 默认值: false
      showSlug: true,

      // 当 `showSlug` 为 `true` 且定义了此选项时。将使用 `slugNotification` 代替 `slug`. 当你有多个账户,但仍然想要显示相同的通知slug用户名时,这将很有用。例如账户A和账户B必须是不同的slug用户名,但当你启用 `slugNotification` 时,他们在推送通知中可以是相同的。
      slugNotification: '嘉然',

      // 哔哩哔哩账号 UID
      biliId: '672328094',

      // 监测哔哩哔哩活动评论。此功能会触发另一个API来监测评论和回复。如果您有很多帐户要监测,那么不建议启用此功能,否则很快就会触发API请求速率限制。
      // 默认值: false
      bilibiliFetchComments: true,

      // 除了 `bilibiliFetchComments` 之外,它还在粘性定位动态中获取评论和回复
      // 默认值: false
      bilibiliFetchCommentsSticky: true,

      // 获取评论的页数。必须大于等于0。0表示只获取第1页(对应index 0)评论。
      // 默认值: 5
      bilibiliFetchCommentsLimit: 5,

      // 除了 `bilibiliFetchComments` ,它还禁用获取每个评论的回复。
      // 默认值: false
      bilibiliFetchCommentsDisableReplies: true,

      // 获取特定的用户评论和回复
      // 默认值: undefined
      bilibiliFetchCommentsWatchUsers: [
        '2763',
      ],

      // 从关注列表中监测评论和回复。它只在用户公开关注列表时工作。
      // 默认值: false
      bilibiliFetchCommentsFromFollowing: true,

      // 监测来自公共VUP数据库的评论和回复
      bilibiliFetchCommentsFromVupList: true,

      // 查看哔哩哔哩账号关注。此功能会触发另一个API来监测评论和回复。如果您有很多帐户要监测,那么不建议启用此功能,否则很快就会触发API请求速率限制。
      // 默认值: false
      bilibiliFetchFollowing: true,

      // 启用这个来获取隐藏关注列表的用户的关注列表
      // 默认值: false
      bilibiliFetchFollowingDeprecatedApi: true,

      // 监测是否佩戴粉丝牌。由于此API不稳定,可能会获取到很多错误结果,所以默认是禁用的。
      // 默认值: false
      bilibiliFansMedalOnOff: true,

      // 抖音账号 ID
      douyinId: 'MS4wLjABAAAA5ZrIrbgva_HMeHuNn64goOD2XYnk4ItSypgRHlbSh1c',

      // 抖音直播 ID 不同于抖音账号 ID ,需要从 `douyinId` 计算获得
      douyinLiveId: '',

      // 微博 account ID
      weiboId: '7595006312',

      // 监测微博活动评论。此功能会触发另一个API来监测评论和回复。如果您有很多帐户要监测,那么不建议启用此功能,否则很快就会触发API请求速率限制。
      // 默认值: false
      weiboFetchComments: true,

      // 除了 `weiboFetchComments` 之外,它还在粘性定位状态中获取评论和回复
      // 默认值: false
      weiboFetchCommentsSticky: true,

      // 获取特定的用户评论和回复
      // 默认值: undefined
      weiboFetchCommentsWatchUsers: [
        '12345'
      ],

      // QQ音乐 ID
      qqMusicId: 'oKCPNKnPoinAoz**',

      // QQ音乐频道 ID。只能从URL中获取。
      // Share the single post from the app to get it.
      qqMusicChannelId: '10036163',

      // RSS 服务。一个帐户可以有多个RSS服务。它们将被逐个监测。
      rss: [
        {
          // Name 将在通知输出中用作标记
          name: 'Twitter',

          // 储存的Slug用户名。必须唯一(不能是 `bilibili`,`weibo` 或其他预设服务名称)
          slug: 'rss_twitter',
          type: 'twitter',

          // 时间戳使用的语言标记
          lang: 'ja',

          // 可以是 `rsshub-json` 或 `rsshub`
          // 了解更多: https://github.com/sparanoid/rsshub-json
          provider: 'rsshub-json',

          // 使用 `imageProxy` 获取图像
          useImageProxy: true,

          // 使用正则表达式来匹配标题。只有匹配正则表达式的项目才会被发送
          titleRegex: /posted a comment/,

          // 和 `titleRegex` 一样,但用于内容。请注意,当同时启用两个选项时,只有当它们都匹配时才会发送通知。
          contentRegex: /^7-Zip ([v0-9.]*) was released/,

          url: 'http://rsshub-json-instance/twitter/user/minatoaqua/showAuthorInDesc=1&showEmojiForRetweetAndReply=1&showRetweetTextInTitle=0&showQuotedInTitle=1&heightOfPics=150',
        },
        {
          name: 'YouTube動画',
          slug: 'rss_youtube',
          type: 'youtube',
          lang: 'ja',
          provider: 'rsshub',
          url: 'https://rsshub.app/youtube/channel/UC1opHUrw8rvnsadT-iGp7Cg',
        },
      ],

      // Tape纸条账号ID。通常是URL的最后一部分。例如: https://www.tapechat.net/uu/TDL6BG/EVWKIS0F `tapechatId` 应该是 `EVWKIS0F`
      tapechatId: 'RQOPYMJQ',

      // 爱发电用户 ID, 可以从任意API请求中获取,比如: https://afdian.net/api/badge/first_show?creator_id=xxx
      afdianId: 'beaf1482bc2511ea896452540025c377',

      // 用于发送通知的 Telegram 聊天/频道 ID
      tgChannelId: 41205411,

      // 用于发送通知的QQ群组 ID
      qGuildId: '12345678901234567',

      // 用于发送通知的QQ频道 ID, `qGuildId` 也需要确定在哪个频道发送
      qGuildChannelId: 1234567,

      // 当用户头像在包含源中更新时,更新 Telegram 聊天/频道 的头像。
      // 默认值: []
      tgChannelAvatarSource: ['weibo', 'bilibili'],

      // 在控制台显示自定义颜色输出。没什么用
      // 默认值: '#fff'
      color: '#e799b0',

      // 禁用哔哩哔哩直播检测。有些账号可能没有直播功能
      // 默认值: false
      disableBilibiliLive: false,

      // 禁用抖音直播检测
      // 默认值: false
      disableDouyinLive: false,

      // 禁用DDStats检测。一些哔哩哔哩帐户可能没有启用DDStats
      // 默认值: false
      disableDdstats: false,
    },
    {
      enabled: true,
      slug: '贝拉',
      showSlug: true,
      biliId: '672353429',
      douyinId: 'MS4wLjABAAAAlpnJ0bXVDV6BNgbHUYVWnnIagRqeeZyNyXB84JXTqAS5tgGjAtw0ZZkv0KSHYyhP',
      douyinLiveId: '820648166099',
      weiboId: '7594710405',
      tgChannelId: '41205411',
      color: '#bd7d74',
    },
  ]
}

开发

您需要先安装Yarn:

# 安装依赖
yarn install

# 创建配置文件
vi config.js

# 在本地运行
yarn run start --once --verbose

本地Docker环境:

docker run --init -it \
  -v (pwd)/config.js:/app/config.js:ro \
  -v (pwd)/packages/core/src:/app/src \
  -v (pwd)/db:/app/db sparanoid/eop:local \
  -c config.js --color --verbose

FAQ

为什么取这个名字?

该项目的初衷是监测A-SOUL的更新。现在,此项目已重命名为EOP用于更常规的用途。

为什么不并行执行检查?

大多数服务都有 API 限制或速率限制。并行执行检查仅在少量帐户时有意义。

License 许可证

AGPL-3.0

最后修改:2023 年 01 月 26 日
如果觉得我的文章对你有用,请随意赞赏