Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- "X.COM-q-p": {
- "link": "^(?:m(?:obile)?\\.)?(?:x|((?:api\\.)?[fv]x)?twitter)\\.com/(?:[^/]+/)*status/(\\d+)(?:\\?img_id/(.+))?.*",
- "url": ": (()=>{const use_on_timestamp = true , use_account_token = true , n=this.node;if(/^https:\\/\\/platform\\.twitter/.test(n.baseURI)||/^(?:x|twitter)\\.com$/.test(location.hostname)&&!n.href?.endsWith('analytics')&&!RegExp(`^(?:svg|path${use_on_timestamp?'|time':''})$`).test(n.localName)&&!n.IMGS_TRG)throw '';return use_account_token&&!$[1]&&location.hostname==='x.com'&&/\\bct0=/.test(document.cookie)?'data:,'+$[2]+$[3]:$[1]||!$[2]?$[0].replace(/^[vf]x/,'api.$&'):'https://cdn.syndication.twimg.com/tweet-result?id='+$[2]+'&token='+((Number($[2])/1e15)*Math.PI).toString(6**2).replace(/(0+|\\.)/g,'')+($[3]?'&'+$[3]:'')})()",
- "res": ":\n// To have the sieve work on media from private accounts, change 'use_account_token' in the above text box to true. When logged in, the sieve will use the token when requesting the media data file.\n\nconst config = {\n // Edit these variables to change how the sieve shows media\n\n show_480p_video_first: false, // Show 480p video, switch to higher with TAB\n\n show_thumbs_as_album: true, // Multi-image posts show images as an album\n\n show_pfp_if_no_media: false, // Show profile image instead of 'No Media' message\n \n show_only_images: false, // Shows video cover instead of video in album on image hover\n\n use_vxtwitter_api_fallback: true, // Use third party API VXTwitter as backup\n\n use_fxtwitter_api_fallback: true, // Use third party API FXTwitter as backup\n\n // If both VXTwitter and FXTwitter are set to true, one is randomly chosen\n\n hide_third_party_api_message: false // Remove third party API caption message\n}\n\nconst upgradeImage = img => ['#'+img.replace(/\\.([a-z0-9]{3,4}):?\\w*$|\\?format=(\\w+)&.+/,'.$1$2?name=orig').replace('webp','jpg'), '#'+img.replace(/\\.([a-z0-9]{3,4}):?\\w*$|\\?format=(\\w+)&.+/,'.$1$2?name=orig').replace('webp','png'), img.replace(/\\.([a-z0-9]{3,4}):?\\w*$|\\?format=(\\w+)&.+/,'.$1$2?name=large').replace('webp','jpg'), img.replace(/\\.([a-z0-9]{3,4}):?\\w*$|\\?format=(\\w+)&.+/,'.$1$2?name=large').replace('webp','png')];\n\nif(config.show_only_images&&$[3]){\n let idx, m = [...this.node.closest('article,section')?.querySelectorAll('img[src][draggable=\"true\"]:not([src*=\"/profile_images/\"]),[poster]')||[]].map(i=>i.src||i.poster);\n idx = m.findIndex(i=>i.includes($[3]));\n return m.length&&config.show_thumbs_as_album ? {\"\":m.map(i=>[upgradeImage(i)]),idx:idx} : [[upgradeImage(this.node?.src)||'']]\n}\n\nif($[3]==='_video_object_')$[3]=null;\n\nif($.base[0]==='d'&&!this['_x'+$[2]+'data_']){\nconst token = document.cookie.match(/\\bct0=([^;]+)/)?.[1], lang = document.cookie.match(/\\blang=([^;]+)/)?.[1], x = new XMLHttpRequest();\nif(!token)return '';\nx.open('GET',`https://x.com/i/api/graphql/nBS-WpgA6ZG0CyNHD517JQ/TweetDetail?variables=%7B%22focalTweetId%22:%22${$[2]}%22,%22with_rux_injections%22:false,%22rankingMode%22:%22Relevance%22,%22includePromotedContent%22:false,%22withCommunity%22:false,%22withQuickPromoteEligibilityTweetFields%22:false,%22withBirdwatchNotes%22:false,%22withVoice%22:false%7D&features=%7B%22rweb_tipjar_consumption_enabled%22:false,%22responsive_web_graphql_exclude_directive_enabled%22:false,%22verified_phone_label_enabled%22:false,%22creator_subscriptions_tweet_preview_api_enabled%22:false,%22responsive_web_graphql_timeline_navigation_enabled%22:false,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22:false,%22communities_web_enable_tweet_community_results_fetch%22:false,%22c9s_tweet_anatomy_moderator_badge_enabled%22:false,%22articles_preview_enabled%22:false,%22responsive_web_edit_tweet_api_enabled%22:false,%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22:false,%22view_counts_everywhere_api_enabled%22:false,%22longform_notetweets_consumption_enabled%22:false,%22responsive_web_twitter_article_tweet_consumption_enabled%22:false,%22tweet_awards_web_tipping_enabled%22:false,%22creator_subscriptions_quote_tweet_preview_enabled%22:false,%22freedom_of_speech_not_reach_fetch_enabled%22:false,%22standardized_nudges_misinfo%22:false,%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22:false,%22rweb_video_timestamps_enabled%22:false,%22longform_notetweets_rich_text_read_enabled%22:false,%22longform_notetweets_inline_media_enabled%22:false,%22responsive_web_enhance_cards_enabled%22:false%7D`,false);\nx.setRequestHeader('authorization','Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA');\nx.setRequestHeader('content-type','application/json');\nx.setRequestHeader('x-twitter-client-language',lang);\nx.setRequestHeader('x-csrf-token',token);\nx.send();\nif(x.status!==200)return '';\nthis['_x'+$[2]+'data_']=x.responseText;\n}\nif(this['_x'+$[2]+'data_'])$._=this['_x'+$[2]+'data_'];\nlet data = $._[0]==='{'&&JSON.parse($._);\nif(!$[1]&&!data)return null;\nlet qtData = data.data?.threaded_conversation_with_injections_v2?.instructions?.find(i=>i.entries)?.entries?.find(i=>i.entryId==='tweet-'+$[2])?.content?.itemContent?.tweet_results?.result?.quoted_status_result?.result || data.quoted_tweet;\ndata = data.data?.threaded_conversation_with_injections_v2?.instructions?.find(i=>i.entries)?.entries?.find(i=>i.entryId==='tweet-'+$[2])?.content?.itemContent?.tweet_results?.result || data;\ndata = data.tweet || data;\nqtData = qtData?.tweet || qtData;\nlet idx, media = [], l = cfg.hz.hiRes&&config.show_480p_video_first;\nconst imgIdRegex = new RegExp(`${$[3]}`), pfp = (data.user||data.core?.user_results?.result?.legacy)?.profile_image_url_https?.replace(/_[a-z0-9]+\\./, '.'), backupURL = config.use_fxtwitter_api_fallback&&config.use_vxtwitter_api_fallback ? ['v', 'f'][Math.floor(Math.random()*2)] : config.use_vxtwitter_api_fallback ? 'v' : config.use_fxtwitter_api_fallback ? 'f' : '';\nif(!$[1]){\nconst getDate = d => d ? new Date(d)?.toLocaleDateString()?.replace(/\\d\\d(\\d)/,'$1') : null;\nconst userName = data.core?.user_results?.result?.legacy?.name||data.user?.name;\nconst date = getDate(data.created_at||data.legacy?.created_at);\nconst text = [date, userName, (data.text||data.legacy?.full_text)].filter(Boolean).join(' | '), qtText = qtData?.text?.replace(/.+/,getDate(qtData?.legacy?.created_at)+' | $&')||qtData?.legacy?.full_text?.replace(/.+/,getDate(qtData?.legacy?.created_at)+' | $&')||'';\nlet mediaDetails = data.mediaDetails||data.legacy?.entities?.media||[], qtMediaDetails = qtData?.mediaDetails||qtData?.legacy?.entities?.media||[], card = data.card?.legacy?.binding_values||data.card?.binding_values?.unified_card?.string_value||data.card?.binding_values;\nconst filename = $[0].match(/^https:\\/\\/[^\\/]+\\/([^\\/]+)\\/status\\/(\\d+).*/);\nif (filename) this.CNT.filename = filename[1] + '_' + filename[2];\nif(!$[3]){\nif(mediaDetails)mediaDetails.forEach(i => {\n\tconst isVideo = i.video_info ? true : false;\n\ti = isVideo ? i?.video_info?.variants.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate).map(i=>i.url) : i.media_url_https;\n\tmedia.push(isVideo ? [[(l?'':'#')+i[0],(l?'#':'')+i.find(i=>/x[234]\\d{2}\\//.test(i))||''],(qtMediaDetails?.length?'Main tweet media: ':'')+text+(!qtMediaDetails?.length&&qtText?' | Quote tweet text: '+qtText:'')] : [upgradeImage(i),(qtMediaDetails?.length?'Main tweet media: ':'')+text+(!qtMediaDetails?.length&&qtText?' | Quote tweet text: '+qtText:'')]);\n\t})\nif(qtMediaDetails)qtMediaDetails.forEach(i => {\n\tconst isVideo = i.video_info ? true : false;\n\ti = isVideo ? i?.video_info?.variants.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate).map(i=>i.url) : i.media_url_https;\n\tmedia.push(isVideo ? [[(l?'':'#')+i[0],(l?'#':'')+i.find(i=>/x[234]\\d{2}\\//.test(i))||''],'Quote tweet media: '+qtText+(!mediaDetails?.length&&text?' | Main tweet text: '+text:'')] : [upgradeImage(i),'Quote tweet media: '+qtText+(!mediaDetails?.length&&text?' | Main tweet text: '+text:'')]);\n\t})\n if(card){\n const embed = card.player_url?.string_value||Array.isArray(card)&&card.find(i=>i.key==='player_url')?.value?.string_value;\n if(embed){\n const loop = this.find({href:embed});\n if(loop !== false && loop !== '')return {loop:embed};\n }\n if(Array.isArray(card)){\nmedia.push([card.find(i=>i.value?.type==='IMAGE').value.image_value.url.replace(/(&name=).+/,'$1orig'),text]);\n }else{\n media.push([typeof card==='string' ? [Object.values(JSON.parse(card)?.media_entities)?.[0]?.media_url_https,text] : ['#'+(card.photo_image_full_size_original||card.player_image_original||card.thumbnail_image_x_large)?.image_value?.url, (card.photo_image_full_size_large||card.player_image_x_large)?.image_value?.url],text]);\n }\n }\n}else{\n const videoId = mediaDetails.concat(qtMediaDetails).find(i=>imgIdRegex.test(i.media_url_https))?.video_info?.variants?.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate)?.[0].url?.match(/\\/([^\\/.]+)\\.mp4/)?.[1]||'', videoIdRegex = videoId ? new RegExp(videoId) : null;\nif(mediaDetails?.video_info?.variants?.some(i=>imgIdRegex.test(i.poster))||mediaDetails?.some(i=>imgIdRegex.test(i.media_url_https)))mediaDetails.forEach(i => {\n\tconst isVideo = i.video_info ? true : false;\n\ti = isVideo ? i.video_info.variants.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate).map(i=>i.url) : i.media_url_https;\n\tmedia.push(isVideo ? [[(l?'':'#')+i[0],(l?'#':'')+i.find(i=>/x[234]\\d{2}\\//.test(i))||''],text] : [upgradeImage(i),text]);\n\t})\n\tif(qtMediaDetails?.video_info?.variants?.some(i=>imgIdRegex.test(i.poster))||qtMediaDetails?.some(i=>imgIdRegex.test(i.media_url_https)))qtMediaDetails.forEach(i => {\n\tconst isVideo = i.video_info ? true : false;\n\ti = isVideo ? i.video_info.variants.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate).map(i=>i.url) : i.media_url_https;\n\tmedia.push(isVideo ? [[(l?'':'#')+i[0],(l?'#':'')+i.find(i=>/x[234]\\d{2}\\//.test(i))||''],qtText] : [upgradeImage(i),qtText]);\n\t})\n if(card){\n const embed = card.player_url?.string_value||Array.isArray(card)&&card.find(i=>i.key==='player_url')?.value?.string_value;\n if(embed){\n const loop = this.find({href:embed});\n if(loop !== false && loop !== '')return {loop:embed};\n }\n if(Array.isArray(card)){\n media.push([card.find(i=>i.value?.type==='IMAGE').value.image_value.url.replace(/(&name=).+/,'$1orig'),text]);\n }else{\n media.push([typeof card==='string' ? [Object.values(JSON.parse(card)?.media_entities)?.[0]?.media_url_https,text] : ['#'+(card.photo_image_full_size_original||card.player_image_original||card.thumbnail_image_x_large)?.image_value?.url, (card.photo_image_full_size_large||card.player_image_x_large)?.image_value?.url],text]);\n }\n }\nidx = $[3]&&media.findIndex(i=>imgIdRegex.test(i[0][0])||videoIdRegex?.test(i[0][0]));\n\t}\nreturn media?.length ? (!$[3] ? media : !config.show_thumbs_as_album ? [media[idx]] : {\"\":media,idx:idx}) : !text&&!qtText&&backupURL ? {loop:'https://api.'+backupURL+'xtwitter.com/status/'+$[2]+($[3]?'?img_id/'+$[3]:'')} : no_media(text)\n} else {\n if(!data){\n const x=new XMLHttpRequest();\n x.open('GET',$[0].replace(/\\/\\/([vf]x)/,'//api.$1'),false);\n x.send();\n data=x.responseText[0]==='{'&&JSON.parse(x.responseText);\n }\n if(!data)return null;\n const backupMessage = !config.hide_third_party_api_message?'A third party API, '+$[1].slice(4).toUpperCase()+'Twitter, was used to get this media. For faster loading, the sieve can be set to use the account token when logged in. For more information, see the notes section of the X.COM-h-p sieve. | ':'';\n let videoId, videoIdRegex;\n if($[1].endsWith('vx')){\n this.loopStop = this.loopStop||0;\n const text = data.text;\n let mediaURLs = data.media_extended;\n if($[3]){\n if(!mediaURLs.some(i=>imgIdRegex.test(i.thumbnail_url))&&this.loopStop===0&&data.qrtURL){\n this.loopStop=1;\n return {loop:data.qrtURL.replace(/^.+(\\.com\\/).*(status\\/\\d+).*/,(t,g1,g2)=>'https://api.vxtwitter'+g1+g2+($[3]?'?img_id'+$[3]:''))};\n }\n videoId = mediaURLs.find(i=>imgIdRegex.test(i.thumbnail_url))?.url?.match(/\\/([^\\/.]+)\\.mp4/)?.[1]||'', videoIdRegex = videoId ? new RegExp(videoId) : null;\n }\n media = mediaURLs.map(i=>[(i.type==='video'||/\\.mp4/.test(i.url)?i.url:upgradeImage(i.url)),backupMessage+text]);\n idx = $[3]&&media.findIndex(i=>imgIdRegex.test(i[0])||videoIdRegex?.test(i[0]));\n delete this.loopStop;\n} else {\n const text = data.tweet?.text||'',qtText = data.quote?.text||'';\n let mediaURLs = data.media?.all||[],qtMediaURLs = data.quote?.media?.all||[];\n if(!$[3]){\n mediaURLs.forEach(i => {\n\tconst isVideo = /\\.mp4/.test(i.url) ? true : false;\n\ti = isVideo ? i?.variants.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate).map(i=>i.url) : i.url;\n\tmedia.push(isVideo ? [[(l?'':'#')+i[0],(l?'#':'')+i.find(i=>/x[234]\\d{2}\\//.test(i))||''],backupMessage+text] : [upgradeImage(i),backupMessage+text]);\n\t})\n }else{\n videoId = mediaURLs.concat(qtMediaURLs).find(i=>imgIdRegex.test(i.thumbnail_url))?.variants?.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate)?.[0].url?.match(/\\/([^\\/.]+)\\.mp4/)?.[1]||'', videoIdRegex = videoId ? new RegExp(videoId) : null;\n if(mediaURLs?.some(i=>imgIdRegex.test(i.thumbnail_url))||mediaURLs?.some(i=>imgIdRegex.test(i.url)))mediaURLs.forEach(i => {\n\tconst isVideo = /\\.mp4/.test(i.url) ? true : false;\n\ti = isVideo ? i.variants.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate).map(i=>i.url) : i.url;\n\tmedia.push(isVideo ? [[(l?'':'#')+i[0],(l?'#':'')+i.find(i=>/x[234]\\d{2}\\//.test(i))||''],backupMessage+text] : [upgradeImage(i),backupMessage+text]);\n\t})\n\tif(qtMediaURLs?.some(i=>imgIdRegex.test(i.thumbnail_url))||qtMediaURLs?.some(i=>imgIdRegex.test(i.url)))qtMediaURLs.forEach(i => {\n\tconst isVideo = i.format?.startsWith('video') ? true : false;\n\ti = isVideo ? i.variants.filter(i=>i.content_type==='video/mp4').sort((a,b)=>b.bitrate-a.bitrate).map(i=>i.url) : i.url;\n\tmedia.push(isVideo ? [[(l?'':'#')+i[0],(l?'#':'')+i.find(i=>/x[234]\\d{2}\\//.test(i))||''],qtText] : [upgradeImage(i),backupMessage+qtText]);\n\t})\n idx = media.findIndex(i=>imgIdRegex.test(i[0][0])||videoIdRegex?.test(i[0][0]));\n\t}\n\t}\nreturn media?.length ? (!$[3] ? media : !config.show_thumbs_as_album ? [media[idx]] : {\"\":media,idx:idx}) : ''\n}\nfunction no_media(t){\nreturn config.show_pfp_if_no_media&&pfp ? [pfp,'No media. Tweet text: '+t] : [ 'data:image/svg+xml,' + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"100\" width=\"540\" style=\"background-color: #2a2a2a;\">\n <foreignObject height=\"100%\" width=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table; height: 100%; width: 100%;\">\n <span style=\"color: tomato; display: table-cell; font: 36px sans-serif; vertical-align: middle; text-align: center; white-space: pre-wrap;\">\n No media\n </span>\n </div>\n </foreignObject>\n </svg>`.replace(/\\n\\s+/g, '')), 'Tweet text: '+t ]\n}",
- "useimg": 1,
- "img": "^(?:((?:pb|video-)s\\.twimg\\.com/(?:(profile_banners/\\d+/\\d+/)|(?:[^?]+\\?format=[^&]+&name=)|(?!profile_images/)[^.]+\\.)).*|((?:x|twitter)\\.com/\\w+(?:/photo|\\?|$).*)|(blob:https://x\\.com/[a-f\\d-]{36})$)",
- "loop": 2,
- "to": ":\n// User variable\nconst images_only = false // On image hover, true shows single image without album or video\n\nif($[4]&&!images_only&&location.pathname?.startsWith('/i/chat/'))return $[4]+'#mp4'\n\nconst n=this.node, id=$[4] ? '_video_object_' : $[0].match(/\\/([^\\/?.]+)(?:[?.]|$)/)?.[1]||'';\n\nconst upgrade = img => '#'+img.replace(/\\.([a-z0-9]{3,4}):?\\w*$|\\?format=(\\w+)&.+/,'.$1$2?name=orig').replace('webp','#jpg png#')+'\\n'+img.replace(/\\.([a-z0-9]{3,4}):?\\w*$|\\?format=(\\w+)&.+/,'.$1$2?name=large').replace('webp','#jpg png#');\n\nif(location.hostname.endsWith('sotwe.com')&&/^(?:img-content$|video-player)/.test(n.className))return '//sotwe_album/'+$[0]\n\nif($[2])return $[1]+'1500x500';\n\nif($[3])return n.closest('a')?.querySelector('img[src][draggable=\"true\"]')?.src?.replace(/_[a-z0-9]+\\./, '.')||'';\n\nif(!/\\b(?:x|twitter)\\.com$/.test(location.hostname)||images_only)return upgrade($[4] ? n.closest('[data-testid=\"videoComponent\"]').querySelector('video[poster]').poster : $[0]);\n\nreturn (n.closest('article')?.querySelector('a[href*=\"/status/\"][aria-label]')||n.closest('a[href*=\"/status/\"][role=\"link\"]')||n.closest('article,div[class=\"css-1dbjc4n r-1iusvr4 r-16y2uox r-a5pmau r-bnwqim\"],div[class=\"css-1dbjc4n r-1iusvr4 r-16y2uox r-bnwqim\"]')?.querySelector('a[href*=\"/status/\"]')||n.closest('[class=\"css-175oi2r r-184en5c\"]')?.nextSibling?.querySelector('a[href*=\"/status/\"]'))?.href?.replace(/^(https:\\/\\/[^\\/]+\\/[^\\/]+\\/status\\/\\d+).*/, '$1?img_id/'+id)||upgrade($[0]);",
- "note": "Imagus_fan\nhttps://www.reddit.com/r/imagus/comments/1wg29ml/comment/paqsecv\nOLD\nhttps://www.reddit.com/r/imagus/comments/1wg29ml/comment/p9wmajx\nhttps://www.reddit.com/r/imagus/comments/z0zyox/comment/p5dxvqj\n\n\n\n!!!\nВся информация о возможностях и правильной настройке фильтра - см. ЧаВо, стр. 19.\n==\nAll information about the sieves's features and proper configuration: see FAQ, p.19.\n\n\nEXAMPLES\nhttps://www.reddit.com/domain/x.com/new\nhttps://www.reddit.com/domain/twitter.com/new\nhttps://www.reddit.com/r/imagus/comments/159jk73/comment/jti74is\nhttps://x.com/home\nhttps://x.com/ChtoKovo/status/2046701369256521808\nhttps://x.com/search?q=example&src=typed_query&f=media"
- }
- }
Add Comment
Please, Sign In to add comment