Skip to content

Instantly share code, notes, and snippets.

View estevecastells's full-sized avatar
🎯

Esteve Castells estevecastells

🎯
View GitHub Profile
@estevecastells
estevecastells / script.js
Created August 17, 2024 16:06
Use Anthropic's Claude API via Google Spreadsheets with AppScript
// REMINDER: Replace YOUR_API_KEY with your actual Anthropic API key
const ANTHROPIC_API_KEY = 'YOUR_API_KEY';
const ANTHROPIC_API_URL = 'https://api.anthropic.com/v1/messages';
/**
* Generates a response using Claude via the Anthropic API.
*
* @param {string} prompt - The input prompt for Claude.
* @return {string} The generated response from Claude.
@estevecastells
estevecastells / script.js
Last active August 12, 2024 16:09
Use Google Gemini API in Spreadsheets
/**
* Generate content using the Gemini API with a hardcoded API key.
* @param {string} prompt - The text prompt to generate content.
* @return {string} The generated text from the API.
*/
function generateGeminiContent(prompt) {
const API_KEY = 'API_KEY'; // Replace with your actual API key
const API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-001:generateContent?key=' + API_KEY;
const requestBody = {
@estevecastells
estevecastells / script.js
Created July 31, 2024 21:30
Reverse proxy + Redirect GSC Live Test explorer
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url)
// Serve robots.txt file
if (url.pathname === '/robots.txt') {
return new Response('User-agent: *\nDisallow: ', {
@estevecastells
estevecastells / script.js
Last active July 8, 2024 13:58
Fetch URL to see if a link exists in given URL
function checkLink(url, domain) {
try {
var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
var content = response.getContentText();
// Create a regular expression to match links to the specified domain
var regex = new RegExp('href=["\']https?:\/\/(www\.)?' + domain.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
// Check if the content contains a link matching the regex
return regex.test(content);
@estevecastells
estevecastells / script.js
Last active August 13, 2024 11:46
Use OpenAI API in a Google Spreadsheets as an Apps Script function
function queryOpenAIChatCompletion(userMessage) {
var apiKey = 'API_KEY'; // Replace with your actual API key
var url = 'https://api.openai.com/v1/chat/completions';
var payload = {
model: "gpt-4o-mini",
messages: [
{"role": "user", "content": userMessage}
],
temperature: 0.4,
@estevecastells
estevecastells / news_schema_visualised.js
Last active January 19, 2024 22:18
News Schema Visualised
javascript:(function() {
var schemas = document.querySelectorAll('script[type="application/ld+json"]');
var newsSchema = null;
schemas.forEach(function(schema) {
var json = JSON.parse(schema.innerText);
if (json['@type'] === 'NewsArticle') {
newsSchema = json;
}
});
if (newsSchema) {
- Be highly organized.
- Suggest proactive solutions and anticipate my needs.
- Treat me as an expert in all subject matter.
- Be accurate and thorough; mistakes erode my trust.
- Provide detailed explanations; I appreciate lots of detail.
- Value good arguments over authorities; the source is irrelevant.
- Consider new technologies and contrarian ideas.
- High levels of speculation or prediction are fine; just flag it.
- Recommend only the highest-quality, meticulously designed products.
- Recommend products from all over the world; location is irrelevant.
@estevecastells
estevecastells / bookmarklet_nofollow_sponsored_ugc.js
Last active August 8, 2023 17:45
Highlight nofollow, sponsored, ugc (Not created by me)
javascript:void function(){var d,e,f,g,h,i,j,k,l,m,n;var o=document['getElementById']('supp-legends-5864');var p={};p['link']='#A7D189';p['nofollow']='#FDBD76';p['ugc']='#FAEBA6';p['sponsored']='#EB949D';var q={};q['link']='#86AF68';q['nofollow']='#DB913F';q['ugc']='#FCDCA9';q['sponsored']='#C9646E';d=document['getElementsByTagName']('a');for(e=0x0;e<d['length'];e++){f=d[e];g=f['attributes'];j=![];k=![];l=![];m=![];for(h=0x0;h<g['length'];h++){i=g[h];n=i['name']['toLowerCase']();if(n=='rel'&&i['value']['toLowerCase']()['indexOf']('nofollow')!=-0x1){j=!![];}if(n=='rel'&&i['value']['toLowerCase']()['indexOf']('ugc')!=-0x1){k=!![];}if(n=='rel'&&i['value']['toLowerCase']()['indexOf']('sponsored')!=-0x1){l=!![];}if(n=='href'){m=!![];}}if(m){if(j)f['style']['backgroundColor']=p['nofollow'];else if(k)f['style']['backgroundColor']=p['ugc'];else if(l)f['style']['backgroundColor']=p['sponsored'];else f['style']['backgroundColor']=p['link'];f['style']['border']='2px\x20solid\x20'+(j?q['nofollow']:q['link']);if(j)f['styl
@estevecastells
estevecastells / bookmarklet_robots_txt_minified.js
Last active October 14, 2023 13:57
Minified Bookmarklet - Visualize URLs blocked by Robots.txt in a page
javascript:!function(){let e=Array.from(document.querySelectorAll("a")).map(e=>new URL(e.href,window.location.origin).href).filter(e=>{try{return new URL(e).origin===window.location.origin&&!e.includes("#")}catch(t){return console.error(%60Error parsing URL: ${e}%60),!1}});e=Array.from(new Set(e));let t=window.location.origin+"/robots.txt";fetch("https://tools.estevecastells.com/api/bulk-robots-txt/v1",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({robots_txt_url:t,links:e})}).then(e=>e.json()).then(e=>{let o="box-"+Math.random().toString(36).substr(2,9),r=document.createElement("div");r.attachShadow({mode:"open"});let n=document.createElement("div");if(n.style="position:fixed;bottom:5px;right:5px;background-color:white;width:300px;padding:10px;border:1px solid grey;z-index:9999;",n.id=o,document.body.appendChild(r),r.shadowRoot.appendChild(n),e.error)n.innerHTML=%60<span style="position:absolute;right:5px;top:0px;cursor:pointer;padding:0 4px;background-color:white;" id="close
@estevecastells
estevecastells / bookmarklet_robots_txt.js
Last active August 4, 2023 07:44
Bookmarklet - Visualize URLs blocked by Robots.txt in a page
javascript:(function(){
let links = Array.from(document.querySelectorAll('a'))
.map(a => new URL(a.href, window.location.origin).href)
.filter(url => {
try {
let urlObj = new URL(url);
return urlObj.origin === window.location.origin && !url.includes('#');
} catch (err) {
console.error(`Error parsing URL: ${url}`);
return false;