Skip to content

Instantly share code, notes, and snippets.

@FloatSheep
Forked from ChenYFan/TGTalk-worker.js
Last active August 29, 2025 17:55
Show Gist options
  • Select an option

  • Save FloatSheep/55db67d9e8148149ebbcb0f9f6b0d901 to your computer and use it in GitHub Desktop.

Select an option

Save FloatSheep/55db67d9e8148149ebbcb0f9f6b0d901 to your computer and use it in GitHub Desktop.
Worker获取Telegram公开频道的信息,算是一个变相的说说系统
addEventListener('fetch', event => {
event.respondWith(TelgramChannelStarter(event.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 = 'Cyanwoof'
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": "*"
}
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment