| const axios = require('axios'); | |
| const cheerio = require('cheerio'); | |
| const crypto = require('crypto'); | |
| async function twitterDownloader(url) { | |
| try { | |
| const urlParams = new URLSearchParams(url.split('?')[1]); | |
| const tweetUrl = urlParams.get('url') || url; | |
| const decodedUrl = decodeURIComponent(tweetUrl); | |
| const timestamp = Math.floor(Date.now() / 1000); | |
| const hash = crypto.createHash('md5'); | |
| hash.update(timestamp.toString() + 'ssstwitter'); | |
| const tt = hash.digest('hex'); | |
| const postData = new URLSearchParams({ | |
| 'id': decodedUrl, | |
| 'locale': 'en', | |
| 'tt': tt, | |
| 'ts': timestamp.toString(), | |
| 'source': 'form' | |
| }); | |
| const { data: html } = await axios.post('https://ssstwitter.com/', postData, { | |
| headers: { | |
| 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', | |
| 'HX-Request': 'true', | |
| 'HX-Target': 'target', | |
| 'HX-Current-URL': 'https://ssstwitter.com/en-2', | |
| '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', | |
| 'Origin': 'https://ssstwitter.com', | |
| 'Referer': 'https://ssstwitter.com/en-2' | |
| } | |
| }); | |
| const $ = cheerio.load(html); | |
| const title = $('h2').first().text().trim(); | |
| const downloads = []; | |
| $('.download-btn').each((i, elem) => { | |
| const $elem = $(elem); | |
| const downloadUrl = $elem.attr('href'); | |
| const qualityText = $elem.find('span').text().trim(); | |
| const quality = qualityText.replace('Download', '').trim(); | |
| if (downloadUrl && downloadUrl.startsWith('http')) { | |
| downloads.push({ | |
| quality: quality, | |
| url: downloadUrl | |
| }); | |
| } | |
| }); | |
| const mediaType = downloads.length > 0 ? 'video' : 'unknown'; | |
| const hdDownload = downloads.find(d => d.quality.includes('HD')) || downloads[0]; | |
| return { | |
| title: title || 'Twitter Media', | |
| mediaType: mediaType, | |
| downloads: downloads, | |
| hdUrl: hdDownload ? hdDownload.url : null, | |
| hdQuality: hdDownload ? hdDownload.quality : null | |
| }; | |
| } catch (error) { | |
| throw new Error(error.message); | |
| } | |
| } | |
| const handler = async (req, res) => { | |
| try { | |
| const { url } = req.query; | |
| if (!url) { | |
| return res.status(400).json({ | |
| success: false, | |
| error: 'Missing required parameter: url' | |
| }); | |
| } | |
| const result = await twitterDownloader(url); | |
| res.json({ | |
| author: "Herza", | |
| success: true, | |
| msg: result | |
| }); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| error: error.message | |
| }); | |
| } | |
| }; | |
| module.exports = { | |
| name: 'Twitter DL', | |
| description: 'Download Twitter/X Video and Images', | |
| type: 'GET', | |
| routes: ['api/download/twitter'], | |
| tags: ['downloader', 'tools', 'misc'], | |
| parameters: ['url', 'key'], | |
| enabled: true, | |
| main: ['Downloader'], | |
| handler | |
| }; |