Skip to content

Instantly share code, notes, and snippets.

@DiyRex
Created August 5, 2024 06:07
Show Gist options
  • Save DiyRex/1f1145d250a4f1ad825edb1ef1c91345 to your computer and use it in GitHub Desktop.
Save DiyRex/1f1145d250a4f1ad825edb1ef1c91345 to your computer and use it in GitHub Desktop.
Cloudflare Webhook to Trigger Github Workflow using Telegram Bot
// Add the following variables:
// ENV_BOT_TOKEN: Your bot token from BotFather.
// ENV_BOT_SECRET: A random secret for webhook verification.
// ENV_GITHUB_TOKEN: Your GitHub personal access token.
// ENV_WORKFLOW_NAME: Workflow file name inside main branch (deploy.yml)
// ENV_GITHUB_REPO: Your GitHub repository in the format owner/repo.
// After deploy run https://<yout-url>/registerWebhook
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
const TELEGRAM_API = 'https://api.telegram.org/bot' + ENV_BOT_TOKEN;
const WEBHOOK = '/my-webhook';
const GITHUB_API = 'https://api.github.com/repos/'+ ENV_GITHUB_REPO +'/actions/workflows/'+ENV_WORKFLOW_NAME+'/dispatches';
const GROUP_CHAT_ID = ENV_GROUP_CHAT_ID; // Your group chat ID
async function handleRequest(request) {
const { pathname } = new URL(request.url);
if (pathname === '/registerWebhook') {
const webhookUrl = new URL(request.url);
webhookUrl.pathname = WEBHOOK;
const response = await fetch(TELEGRAM_API + '/setWebhook', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: webhookUrl.toString() })
});
return new Response(await response.text(), { status: response.status });
}
if (pathname === WEBHOOK) {
const update = await request.json();
return handleUpdate(update);
}
return new Response('Not Found', { status: 404 });
}
async function handleUpdate(update) {
if (update.message) {
return handleMessage(update.message);
}
if (update.callback_query) {
return handleCallbackQuery(update.callback_query);
}
return new Response('OK');
}
async function handleMessage(message) {
const chatId = message.chat.id;
const text = message.text;
if (chatId.toString() !== GROUP_CHAT_ID) {
console.log(`Unauthorized chat ID: ${chatId}`);
return new Response('Not authorized to respond in this chat', { status: 403 });
}
if (text === '/sap') {
const keyboard = {
inline_keyboard: [
[
{ text: 'Run SAP Disk Management', callback_data: 'run_workflow' }
]
]
};
await sendResponse(chatId, 'Choose an option:', { reply_markup: keyboard });
} else {
// await sendResponse(chatId, 'Echo:\n' + text);
}
return new Response('OK');
}
async function handleCallbackQuery(callbackQuery) {
const chatId = callbackQuery.message.chat.id;
const data = callbackQuery.data;
if (chatId.toString() !== GROUP_CHAT_ID) {
console.log(`Unauthorized chat ID: ${chatId}`);
return new Response('Not authorized to respond in this chat', { status: 403 });
}
if (data === 'run_workflow') {
const result = await triggerGitHubWorkflow();
await sendResponse(chatId, `SAP Disk Management: Running`);
} else {
await sendResponse(chatId, `You clicked: ${data}`);
}
return new Response('OK');
}
async function sendResponse(chatId, text, options = {}) {
await fetch(TELEGRAM_API + '/sendMessage', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
chat_id: chatId,
text: text,
...options
})
});
}
async function triggerGitHubWorkflow() {
console.log('Triggering GitHub workflow...');
const response = await fetch(GITHUB_API, {
method: 'POST',
headers: {
'Accept': 'application/vnd.github+json',
'Authorization': 'Bearer ' + ENV_GITHUB_TOKEN,
'User-Agent': 'Cloudflare-Worker'
},
body: JSON.stringify({ ref: 'main' })
});
const responseText = await response.text();
if (response.ok) {
console.log('Workflow triggered successfully.');
return 'Success';
} else {
console.log(`Error triggering workflow: ${responseText}`);
return `Error: ${responseText}`;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment