代码片段

cloudflare snippet版本的gtalk

javascript

基于cloudflare snippet的tg说说

snippet

114 lines
export default {
  async fetch(request, env, ctx) {
    return await TelgramChannelStarter(request)
  }
}

const ElementSpliter = (html, StartElement) => {
  const Elements = []
  const ElementSpliterOnce = (html, StartElement) => {
    let ElementName = [...StartElement.matchAll(/\<(?<ELENAME>[a-zA-Z0-9]+)\s/g)][0].groups.ELENAME
    let ElementContent = StartElement
    for (let Start = html.indexOf(StartElement) + StartElement.length; Start < html.length; Start++) {
      ElementContent += html[Start]
      if (ElementContent.endsWith('</' + ElementName + '>')) {
        const PrefixCount = Object.keys(ElementContent.match(new RegExp('\\<' + ElementName, 'g'))).length
        const SuffixCount = Object.keys(ElementContent.match(new RegExp('\\<\/' + ElementName + '(.*?)>', 'g')) || []).length
        if (
          PrefixCount === SuffixCount &&
          PrefixCount !== 0
        ) {
          return ElementContent
        }
      }

    }
  }
  while (1) {
    if (html.indexOf(StartElement) === -1) break
    const SplitOnce = ElementSpliterOnce(html, StartElement)
    Elements.push(SplitOnce)
    html = html.replace(SplitOnce, '')
  }
  return Elements
}

const ChannelName = 'taluohui815'
const version = "2.1.7"
let denined = true
const deninedRegion = ["CN"]
const TelgramChannelStarter = async (request) => {
  const url = new URL(request.url)
  const Region = request.headers.get('cf-ipcountry')
  if (!deninedRegion.includes(Region)) denined = false
  const proxyUrl = url.searchParams.get('proxy')
  if (!!proxyUrl) {
    if (!(proxyUrl.match(/\://(.*?)\.telegram\.org/g) || proxyUrl.match(/\://(.*)\.cdn\-telegram\.org/g))) return new Response('Proxy URL is not valid')
    return fetch(proxyUrl)
  }


  const startbefore = url.searchParams.get('startbefore')
  const ChannelUrl = new URL('https://t.me/s/' + ChannelName)
  if (!!startbefore) ChannelUrl.searchParams.set('before', startbefore)
  const getDataFromTelegram = await fetch(ChannelUrl, {
    "headers": {
      "x-requested-with": "XMLHttpRequest"
    },
    "method": "POST"
  })
    .then(res => res.text())
    .then(res => res
      .replace(/\\n/g, '')
      .replace(/\\(.)/g, '$1')
      .replace(/(^\"|\"$)/g, '')
    )
  if (url.searchParams.get('rawHtml') === 'true') return new Response(getDataFromTelegram, {
    headers: {
      "content-type": "text/html;charset=UTF-8",
      "Access-Control-Allow-Origin": "*"
    }
  })
  const nextBefore = Number((getDataFromTelegram.match(/data-before="([0-9]+)"/g) || ["0"])[0].match(/[0-9]+/g))
  const ChannelMessages = ElementSpliter(getDataFromTelegram, '<div class="tgme_widget_message_wrap')
  let ChannelMessageData = [];
  let newChannelMessageData = [];
  for (let ChannelMessage of ChannelMessages) {
    const MessageId = [...ChannelMessage.matchAll(/data-post\=\"(?<MID>.*?)\"/g)][0].groups.MID.split('/')[1];
    let MessageText = ElementSpliter(ChannelMessage, '<div class="tgme_widget_message_text js-message_text"')[0] || ''; 
    MessageText = MessageText.replace(/<tg-spoiler>(.*?)<\/tg-spoiler>/g, '<span class="shady"><s>$1</s></span>');
    
    if (!MessageText.match(/\#SFCN/g) && denined) continue;
    
    const MessagePhoto = [...ChannelMessage.matchAll(/background\-image\:url\(\'(?<URL>.*?)\'\)/g)].map(e => e.groups.URL) || [];
    const getViews = [...ChannelMessage.matchAll(/<span class="tgme_widget_message_views">(?<VIEWS>.*?)<\/span>/g)][0];
    
    const messageData = {
      id: MessageId,
      text: MessageText.replace(/\<div (.*?)\>/g, '').replace(/\<\/div\>/g, ''),
      image: MessagePhoto,
      time: new Date([...ChannelMessage.matchAll(/datetime\=\"(?<TIME>.*?)\"/g)][0].groups.TIME).getTime(),
      views: getViews ? getViews.groups.VIEWS : null
    };
    
    if (messageData.text.includes("Channel") && messageData.views === null) {
      continue;
    }
    
    newChannelMessageData.unshift(messageData);
  }
  
  ChannelMessageData = newChannelMessageData

  return new Response(JSON.stringify({
    nextBefore,
    Region,
    version,
    ChannelMessageData
  }), {
    headers: {
      "content-type": "application/json;charset=UTF-8",
      "Access-Control-Allow-Origin": "*"
    }
  })
}
共 1 条,第 1 / 1 页
-浏览