') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - T0aD/azel: Azel is a python library equivalent to the Elza Perl macro-language (HTTP scripting) · GitHub
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Azel

Or how to have fun with the internet

Azel is a python library equivalent to the Elza Perl macro-language (HTTP scripting)

It basically allows you to automatize sequences of HTTP requests and to script around it (without having to care about sessions / redirections / randomly generated input fields)...

Usage

Initialization

importazela=azel.Azel()

Query a website

a.get('http://www.lescigales.org') # promo never hurts !

Specify a proxy to use

a.proxyHost='10.7.0.1'a.proxyPort=8118

Collect links from a web page:

getLink(re.pattern) will return the href of the first link match getLinks(re.pattern) will return a list of links

a.get('http://sk.php.net/')
dl=a.getLink('downloads')
a.get(dl)
links=a.getLinks('PHP 5.')
forlinkinlinks:
printlink.href, link.value, link.title# Download the first link a.get(link.href)
l=a.getLink('sk.php.net')
a.get(l)
tarball=a.read() # thats right babe, we just got php's tarball break

Pre-fill a form

a.get('https://gist.github.com/')
a.fillForm()
printa.data# this will return the prefilled form data

Post a form (and publish cool stuff on gist)

a.get('http://gist.github.com/')
a.fillForm()
a.data['file_ext[gistfile1]'] ='.py'a.data['file_name[gistfile1]'] =__file__.strip('./')
a.data['description'] ='This was published by awesome azel!'a.data['file_contents[gistfile1]'] =contenta.post('') # will post the first form

will produce the following output:

-> GET http://gist.github.com/
<- 301 Moved Permanently
-> GET https://gist.github.com/
<- 200 OK
-> POST https://gist.github.com/gists
<- 302 Found
-> GET https://gist.github.com/2491246
<- 200 OK

Annoy the hell of an asshole by trashing his blog:

blog=azel.Azel()
final= []
blog.get('http://strepoetlo.legtux.org/')
links=blog.getLinks('/#respond')
forlinlinks: final.append(l.href)
links=blog.getLinks('/#comments')
forlinlinks: final.append(l.href)
previous=blog.getLink('Previous')
blog.get(previous)
links=blog.getLinks('/#respond')
forlinlinks: final.append(l.href)
links=blog.getLinks('/#comments')
forlinlinks: final.append(l.href)
forlinkinfinal:
printlinkblog.get(link)
blog.fillForm()
post='http://strepoetlo.legtux.org/wp-comments-post.php's='http://forum.lescigales.org/topic1638-site-de-phishing-httpstrepoetlolescigalesorg-par-strepoetlo.html'blog.data['author'] ='Paul Gonsolin'blog.data['url'] ='http://strepoetlo.lescigales.org/'blog.data['email'] ='no-reply@lescigales.org'blog.data['comment'] ='Createur de sites de phishing Facebook, priere de ne plus venir sur lesCigales.ORG. -> <a href="'+s+'">'+s+'</a>'blog.post(post)

About

Azel is a python library equivalent to the Elza Perl macro-language (HTTP scripting)

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages