Recent Questions - Stack Appsmost recent 30 from stackapps.com2024-03-19T09:43:39Zhttps://stackapps.com/feedshttps://creativecommons.org/licenses/by-sa/4.0/rdfhttps://stackapps.com/q/10530-1Meta SO Link-only Discussion Parser: Parse Meta Stack Overflow for Discussions About Link-only AnswersTrenton McKinneyhttps://stackapps.com/users/1242162024-03-14T22:57:10Z2024-03-15T14:11:30Z
<p>The inspiration for this project arose from my observations and personal challenges with the Stack Overflow moderation system, particularly when my "Not An Answer" flags for link-only answers were declined, revealing an ambiguity in the application of Stack Overflow's guidelines. This experience sparked a curiosity about the broader community's encounters with similar issues, as reflected in discussions and questions on Meta Stack Overflow. It led to the desire to systematically explore these concerns, motivating the creation of a project that leverages the Stack Exchange API to automate the analysis of "link only" content discussions and guidelines interpretations.</p>
<p>The project is designed to automate the retrieval and processing of "link only" questions from Meta Stack Overflow and download the referenced answer from Stack Overflow by interacting with the Stack Exchange API. It incorporates functionalities initially spread across three separate scripts into a single, structured Python script. This overview reflects how the project components align with the functionalities of the initially described scripts.</p>
<h3>Overview of the Project (<code>meta_so_parser.py</code>)</h3>
<ul>
<li><p><strong>Class Structure</strong>: The project is organized within a class, <code>MetaSOParser</code>, which organizes the functionalities related to fetching, parsing, and downloading "link only" content.</p>
</li>
<li><p><strong>Configuration and Logging</strong>:</p>
<ul>
<li>Logging is set up to track operations related to "link only" content.</li>
<li>API configuration is loaded from an <code>ini</code> file, mirroring the initial setup and loading process described.</li>
</ul>
</li>
<li><p><strong>Fetching and Downloading Content</strong>:</p>
<ul>
<li>The <code>meta_so_link_only</code> method matches the functionalities of <code>metaso_linkonly.py</code>, fetching questions with "link only" phrases from Meta Stack Overflow, handling pagination, backoff from the API, and saving questions to a JSON file.</li>
<li>The <code>parse_questions_json</code> method extracts data from the <code>questions.json</code> file, similar to <code>parse_questions_json.py</code>. It writes question titles, URLs, question bodies, and answers to separate files, utilizing regular expressions to extract URLs.</li>
<li>The <code>download_flagged_link_only_answers</code> method performs operations akin to <code>download_flagged_linkonly_answers.py</code>, extracting answer IDs from URLs, fetching details from the Stack Exchange API, and saving answers to a JSON file.</li>
</ul>
</li>
<li><p><strong>Implementation Details</strong>:</p>
<ul>
<li>Utilizes the Stack Exchange API for data fetching, with error handling and backoff strategies implemented.</li>
<li>Regular expressions are employed to extract URLs from question bodies, emphasizing the focus on "link only" content analysis.</li>
<li>Python's file handling and JSON manipulation capabilities are leveraged to store and process data.</li>
<li>Pagination handling ensures comprehensive data retrieval during the fetching process.</li>
</ul>
</li>
<li><p><strong>Execution Flow</strong>:</p>
<ul>
<li>The script's main execution flow illustrates the sequence of operations: fetching "link only" questions from Meta Stack Overflow, parsing the downloaded JSON to extract and save relevant data, and downloading details of answers flagged as "link only".</li>
</ul>
</li>
</ul>
<p>This approach efficiently combines data retrieval, processing, and storage functionalities into a unified script, making the project easier to manage, execute, and scale. It focuses on "link only" content analysis on Stack Exchange platforms.</p>
<p><a href="https://github.com/trenton3983/stack_overflow/tree/master/Tools" rel="nofollow noreferrer">Stack Overflow Tools on GitHub</a></p>
<pre class="lang-python prettyprint-override"><code>import requests
import json
import configparser
import time
import logging
import re
from pathlib import Path
# Define a class for parsing Meta StackOverflow
class MetaSOParser:
# Define constants for the class
PAGE_SIZE = 100
LOG_LEVEL = logging.INFO
TAGS = "discussion"
# Initialize the parser
def __init__(self):
# Set up paths and configuration
self.current_dir = Path(__file__).parent
self.config_file_path = self.current_dir / ".." / ".." / "config_api.ini"
self.config = configparser.ConfigParser()
self.config.read(self.config_file_path)
self.api_key = self.config.get("stackapps", "key")
self.answers = []
self.links = []
# Set up logging
logging.basicConfig(filename=f"./logs/link_only.log", level=self.LOG_LEVEL)
# Define a method for making API requests
def api_request(self, url, params):
# Try to make the request and handle exceptions
try:
response = requests.get(url, params=params)
data = json.loads(response.text)
if "backoff" in data:
time.sleep(data["backoff"])
return data
except requests.exceptions.RequestException as e:
logging.error(f"Request failed: {e}")
time.sleep(5)
return None
# Define a method for getting link-only posts from Meta SO
def meta_so_link_only(self):
# Set up the API endpoint and parameters
questions_url = "https://api.stackexchange.com/2.3/search/advanced"
questions = []
page = 1
while True:
params = {
"order": "desc",
"sort": "creation",
"tagged": self.TAGS,
"site": "meta.stackoverflow.com",
"filter": "!-*jbN-o8P3E5",
"key": self.api_key,
"page": page,
"pagesize": self.PAGE_SIZE,
"q": "link only",
}
# Make the API request
data = self.api_request(questions_url, params)
if not data or not data["items"]:
break
# Filter the questions and add them to the list
questions.extend(
[
question
for question in data["items"]
if any(
x in question["title"].lower()
for x in ["link only", "link-only"]
)
]
)
page += 1
# Write the questions to a file
with open("output/questions.json", "w") as f:
json.dump(questions, f)
print(f"Number of questions: {len(questions)}")
# Define a method for parsing the questions JSON
@staticmethod
def parse_questions_json():
# Open the questions file and read the data
with open("output/questions.json", "r") as f:
data = json.load(f)
# Open output files for writing
with open(
"output/question_titles.txt", "w", encoding="utf-8"
) as titles_file, open(
"output/question_urls.txt", "w", encoding="utf-8"
) as urls_file, open(
"output/question_body.txt", "w", encoding="utf-8"
) as body_file, open(
"output/answers.txt", "w", encoding="utf-8"
) as answers_file:
# Loop through the questions and write data to the files
for question in data:
titles_file.write(question.get("title", "") + "\n")
urls = re.findall(
r"https?://stackoverflow.com/a/\d+", question.get("body", "")
)
for url in urls:
urls_file.write(url + "\n")
body_file.write(question.get("body", "") + "\n")
for answer in question.get("answers", []):
answers_file.write(
f"Score: {answer.get('score', '')} - {answer.get('body', '')}\n"
)
# Define a method for downloading flagged link-only answers
def download_flagged_link_only_answers(self):
# Open the URLs file and read the data
with open("output/question_urls.txt", "r") as f:
urls = f.readlines()
# Extract the answer IDs from the URLs
answer_ids = [url.strip().split("/")[-1] for url in urls]
# Set up the API endpoint
answers_url = "https://api.stackexchange.com/2.3/answers/{ids}"
# Loop through the answer IDs and make API requests
for answer_id in answer_ids:
params = {
"order": "desc",
"sort": "activity",
"site": "stackoverflow",
"key": self.api_key,
"filter": "!-*jbN-o8P3E5",
}
# Set up a dictionary for the answer details
answer_details = {
"answer_id": int(answer_id),
"is_deleted": True,
"body": "",
"link": f"https://stackoverflow.com/a/{answer_id}",
}
# Make the API request
data = self.api_request(answers_url.format(ids=answer_id), params)
if data and "items" in data and data["items"]:
answer = data["items"][0]
answer_details["is_deleted"] = answer.get("is_deleted", False)
answer_details["body"] = answer.get("body", "")
# Add the answer details to the list
self.answers.append(answer_details)
# Write the answers to a file
with open("output/flagged_link_only_answers.json", "w") as f:
json.dump(self.answers, f)
# Main execution
if __name__ == "__main__":
# Create a parser and run the methods
parser = MetaSOParser()
parser.meta_so_link_only()
parser.parse_questions_json()
parser.download_flagged_link_only_answers()
</code></pre>
https://stackapps.com/q/10528-1System to facilitate the indexing and archiving of Web3 Discord QuestionsEquioushttps://stackapps.com/users/1242412024-03-13T22:37:31Z2024-03-13T22:37:31Z
<p>LUNA_Discord is the Discord module of the LUNA system which facilitates the integration of Cyfrin's Discord Bot with various AI models and systems.</p>
<p>Access to the Stack Exchange API will be used to consolidate high quality questions posed in Discord into an avenue through which they may be indexed by Search Engines and future AI foundation models.</p>
https://stackapps.com/q/105271SO Link-only Parser: Parse Stack Overflow for potentially link-only answersTrenton McKinneyhttps://stackapps.com/users/1242162024-03-13T01:49:45Z2024-03-15T06:02:25Z
<p>The provided Python script is designed to identify potentially "link-only" answers on Stack Overflow for a specified time period and set of tags. It does this by leveraging the Stack Exchange API to fetch questions and their associated answers, applying certain criteria to determine if an answer is primarily composed of links. Here's a breakdown of its functionality:</p>
<ol>
<li><p><strong>Configuration and Constants</strong>: The script starts by importing necessary libraries and setting up constants such as the number of days in a month, body length limit for an answer to be considered link-only, page size for API requests, and log level. It also specifies tags to filter the questions by and the date range for the search.</p>
</li>
<li><p><strong>Logging Setup</strong>: It configures logging to record the process, including found link-only answers, to a log file named according to the specified start and end dates.</p>
</li>
<li><p><strong>Date Range Processing</strong>: A generator function <code>month_range</code> is defined to iterate over each month within the specified date range, facilitating the handling of the Stack Exchange API's time window limitations.</p>
</li>
<li><p><strong>Configuration File Loading</strong>: The script loads an external configuration file that contains the API key needed to authenticate requests to the Stack Exchange API.</p>
</li>
<li><p><strong>API Requests</strong>: Using a loop, the script sends requests to the Stack Exchange API to retrieve questions within the specified date range, filtered by the provided tags. For each month in the range, it processes questions page by page until all questions have been fetched.</p>
</li>
<li><p><strong>Link-only Answer Identification</strong>: For each question, it checks if there are answers and then filters these answers based on criteria for being considered potentially link-only. This includes the presence of "http" in the body (excluding links from <code>https://i.stack.imgur.com</code>), absence of <code><code></code> tags, and a body length below a certain limit. Each identified link-only answer's URL is constructed and logged, and the link is added to a list for further processing.</p>
</li>
<li><p><strong>Error Handling and Rate Limiting</strong>: The script includes error handling for request failures and respects the API's rate limiting by sleeping for the amount of time specified in the <code>backoff</code> field of the API response, if present.</p>
</li>
<li><p><strong>Output</strong>: Finally, the script prints the number of identified link-only answers. Although there's commented-out code that suggests an intention to open these links in a web browser, this functionality is not enabled in the provided version of the script.</p>
</li>
</ol>
<p>This tool aims to assist in moderating content by identifying answers that might not meet the community's standards for quality and completeness, specifically targeting answers that may rely too heavily on links without providing sufficient context or explanation.</p>
<p><a href="https://github.com/trenton3983/stack_overflow/tree/master/Tools" rel="nofollow noreferrer">Stack Overflow Tools on GitHub</a></p>
<pre class="lang-python prettyprint-override"><code>import requests
import json
from datetime import datetime, timedelta
import configparser
import time
import webbrowser
import logging
from pathlib import Path
# Define constants
DAYS_IN_MONTH = 32
BODY_LENGTH_LIMIT = 500
PAGE_SIZE = 100
LOG_LEVEL = logging.INFO
tags = "python;matplotlib"
start_date = "2012-01-01"
end_date = "2012-12-31"
# Set up logging
logging.basicConfig(filename = f"00_log_{start_date}_{end_date}.log", level=LOG_LEVEL)
def month_range(start_date, end_date):
"""Generate start and end dates for each month in the range."""
start_date = start_date.replace(day=1)
while start_date < end_date:
end_date_month = (start_date + timedelta(days=DAYS_IN_MONTH)).replace(day=1)
yield start_date, min(end_date, end_date_month)
start_date = end_date_month
# Get the current script's directory
current_dir = Path(__file__).parent
# Define the relative path to the config file
config_file_path = current_dir / ".." / ".." / "config_api.ini"
# Load the configuration file
config = configparser.ConfigParser()
# Read the config file
config.read(config_file_path)
# Get the API key from the configuration file
api_key = config.get('stackapps', 'key')
# Define the API endpoint for questions
questions_url = "https://api.stackexchange.com/2.3/questions"
# Define the start and end dates
start_date = datetime.strptime(start_date, "%Y-%m-%d")
end_date = datetime.strptime(end_date, "%Y-%m-%d")
# Create a list to store the links
links = []
for start_date_month, end_date_month in month_range(start_date, end_date):
# Convert the dates to Unix timestamp
start_date_unix = int(start_date_month.timestamp())
end_date_unix = int(end_date_month.timestamp())
# Log start_date_str
logging.info(f"Start Date: {start_date_month.strftime('%Y-%m-%d')}, End Date: {end_date_month.strftime('%Y-%m-%d')}")
page = 1
while True:
# Define the parameters for the API request
params = {
"order": "desc",
"sort": "creation",
"tagged": tags, # Search for posts with these tags
"fromdate": start_date_unix,
"todate": end_date_unix,
"site": "stackoverflow",
"filter": "!-*jbN-o8P3E5",
"key": api_key,
"page": page,
"pagesize": PAGE_SIZE
}
try:
# Send the API request
response = requests.get(questions_url, params=params)
data = json.loads(response.text)
# If no items are returned, we've reached the end of the results
if not data["items"]:
break
# For each question, parse the 'answers' key directly
for question in data["items"]:
# Check if the question has answers
if "answers" in question:
# Filter for answers that may primarily be link-only and exclude links from https://i.stack.imgur.com
link_only_answers = [item for item in question["answers"] if "http" in item["body"]
and "https://i.stack.imgur.com" not in item["body"]
and "<code>" not in item["body"]
and len(item["body"]) < BODY_LENGTH_LIMIT]
if link_only_answers:
logging.info(f"Question ID: {question['question_id']}")
# Log the link-only answers
for answer in link_only_answers:
link = f"https://stackoverflow.com/a/{answer['answer_id']}"
logging.info(f"Answer ID: {answer['answer_id']}, Link: {link}")
# Add the link to the list
links.append(link)
logging.info(f'Remaining Quota: {data["quota_remaining"]}')
if "backoff" in data:
time.sleep(data["backoff"])
# Increment the page number for the next request
page += 1
except requests.exceptions.RequestException as e:
logging.error(f"Request failed: {e}")
time.sleep(5)
# print the number of links
print(f"Number of link-only answers: {len(links)}")
# Open the links in a browser
# for link in links:
# webbrowser.open(link)
</code></pre>
https://stackapps.com/q/105174Fix for the network search paginationVLAZhttps://stackapps.com/users/621992024-02-25T20:47:48Z2024-03-12T12:14:21Z
<h2>Description</h2>
<h3>Problem</h3>
<p>See the report <a href="https://meta.stackexchange.com/questions/359216/pagination-on-stackexchange-com-search-is-broken">Pagination on stackexchange.com search is broken</a></p>
<p>The pagination in the global search is broken. It only shows 15 results even when the page size is set to something different. Moreover, it loses the page size. Yet, the page count at the bottom seems to use a different page size than 15, so with many results, you would not see the last page(s) unless you navigate to them manually.</p>
<h3>Fix</h3>
<p>The page size should be hard set in the query parameters in the URL. That forces the pagination to work correctly.</p>
<p>Thus:</p>
<p>If there is no page size in the URL, you are redirected to the same page but with the page size set. This will be set to 15 as that is what the default is. This works on going to the stackexchange.com/search page or visiting any search query.</p>
<p>The page navigation buttons will also now "remember" the correct page size (rather than losing it).</p>
<h2>Installation</h2>
<p><a href="https://github.com/PurpleMagick/se_network-search-pagination-fix/raw/main/dist/se-network-search-pagination-fixed.user.js" rel="nofollow noreferrer">Direct install (GitHub)</a></p>
<p><a href="https://github.com/PurpleMagick/se_network-search-pagination-fix" rel="nofollow noreferrer">See the code on GitHub</a></p>
<p>Code:</p>
<pre class="lang-javascript prettyprint-override"><code>// ==UserScript==
// @name Stack Exchange - fix network search pagination
// @namespace https://github.com/PurpleMagick/
// @description Network search pagination is broken and does not count pages correctly. This is a fix
// @author VLAZ
// @version 1.0.0
//
// @match https://stackexchange.com/search*
//
// @grant none
// ==/UserScript==
let __webpack_exports__ = {};
// CONCATENATED MODULE: ./src/paginationParametersHelpers.ts
function retrievePagesize() {
const searchParams = new URLSearchParams(window.location.search);
return Number(searchParams.get("pagesize") ?? 15);
}
function createCorrecURL(href, pagesize) {
const url = new URL(href);
url.searchParams.set("pagesize", String(pagesize));
return url;
}
// CONCATENATED MODULE: ./src/index.ts
function main() {
const perPage = retrievePagesize();
const searchParams = new URLSearchParams(window.location.search);
if (searchParams.has("pagesize") === false) {
window.location.href = createCorrecURL(window.location.href, perPage).href;
return;
}
document.querySelectorAll(".pager a")
.forEach(el => {
el.href = createCorrecURL(el.href, perPage).href;
});
}
main();
</code></pre>
https://stackapps.com/q/105135Stackexchange oauth2.0 is suddenly failingLeart Beqirajhttps://stackapps.com/users/1177782024-02-16T01:14:47Z2024-02-19T14:01:51Z
<p>No changes in stack apps or my code, it was working fine for a while, suddenly it stopped working now.</p>
<p>I get "<strong>InternalOAuthError: Failed to obtain access token</strong>"</p>
<p>After more details inspection, I came to conclusion that CloudFlare is blocking my requests due to security measures. Why is CloudFlare perceiving my requests as harmful/not trusted?</p>
<p>I have my application deployed in Azure Virtual Machine. So it's Azure External IP and it is under a .com domain name.</p>
<p>Additional information I get this:</p>
<pre class="lang-html prettyprint-override"><code><!DOCTYPE html>
<html lang=\"en-US\">
<head>
<title>Just a moment...</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\">
<meta name=\"robots\" content=\"noindex,nofollow\">
<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">
</code></pre>
<pre class="lang-javascript prettyprint-override"><code>window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;
window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, location.href.length - window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;
if (window.history && window.history.replaceState) {
var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;
history.replaceState(null, null, \"\\/oauth\\/access_token?__cf_chl_rt_tk=-1708042411-0.0-4071\" + window._cf_chl_opt.cOgUHash)
</code></pre>
<p>[Edit]: After more tests, I found out that I can't even do a HTTP GET request to Stack Overflow Website from my Azure Virtual Machine due to the same message.</p>
<p>So even "curl https://stackoverflow.com" fails with the "Just a moment..."</p>
https://stackapps.com/q/105122Expand Code to Fullscreen on StackExchange Site138 Aspenhttps://stackapps.com/users/1177772024-02-15T12:45:24Z2024-02-15T13:02:32Z
<h1>Description</h1>
<p>Script practice.</p>
<ul>
<li><p><strong>Toggle Fullscreen on Hover</strong>: When users hover over a code block, a 'Fullscreen' button appears. Clicking this button will expand the code block to fill the entire screen, facilitating easier reading and analysis of the code without distractions from other page content.</p>
</li>
<li><p><strong>Clean Exit from Fullscreen</strong>: When the user exits fullscreen mode, the code block returns to its original state without any leftover styling or class changes, ensuring the page remains as it was before the script's interaction.</p>
</li>
</ul>
<h1>Code</h1>
<pre><code>// ==UserScript==
// @name Expand Code to Fullscreen on StackExchange Site
// @namespace http://tampermonkey.net/
// @author aspen138
// @version 0.1
// @description Toggle fullscreen for code blocks on hover
// @match *://*.stackexchange.com/*
// @match *://stackapps.com/questions/*
// @match *://stackapps.com/review/*
// @match *://stackapps.com/search*
// ...
// ...
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// Function to inject styles
function addStyles() {
const style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = `
.code-wrapper {
position: relative;
}
.fullscreen-btn {
position: absolute;
top: 0;
right: 0;
z-index: 10;
padding: 4px 8px;
background-color: #eee;
border: none;
cursor: pointer;
border-radius: 4px;
font-size: 12px;
display: none;
}
.fullscreen-btn:hover {
background-color: #ddd;
}
.code-wrapper:hover .fullscreen-btn {
display: block;
}
/* Fullscreen specific styles */
.code-wrapper.fullscreen {
background: white; /* Change this to the desired background color */
color: black; /* And this to the desired text color */
width: 100%;
height: 100%;
overflow: auto; /* This allows scrolling */
margin: 0;
padding: 20px; /* Or however much padding you want */
}
/* Ensure syntax highlighting styles have enough specificity */
.code-wrapper.fullscreen .hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: inherit;
background: inherit;
}
`;
document.head.appendChild(style);
}
// Function to toggle fullscreen for the specific code block
function toggleFullScreen(codeWrapper) {
if (!document.fullscreenElement && codeWrapper.requestFullscreen) {
codeWrapper.requestFullscreen().then(() => {
codeWrapper.classList.add('fullscreen');
// Copy all classes from <code> to the wrapper
codeWrapper.querySelector('code').classList.forEach(cls => {
codeWrapper.classList.add(cls);
});
});
} else if (document.fullscreenElement && document.exitFullscreen) {
document.exitFullscreen().then(() => {
codeWrapper.classList.remove('fullscreen');
// Remove the copied classes from the wrapper
codeWrapper.querySelector('code').classList.forEach(cls => {
codeWrapper.classList.remove(cls);
});
});
}
}
// Function to create a fullscreen button for each code block
function addFullscreenButtons() {
document.querySelectorAll('pre code').forEach((code) => {
// Check if the code block is already wrapped with the code-wrapper
let wrapper = code.closest('.code-wrapper');
if (!wrapper) {
wrapper = document.createElement('div');
wrapper.classList.add('code-wrapper');
// Move the classes from <code> to the wrapper
code.classList.forEach(cls => {
if (cls !== 'hljs') { // Avoid moving the 'hljs' class
wrapper.classList.add(cls);
}
});
code.parentNode.insertBefore(wrapper, code);
wrapper.appendChild(code);
}
// Create and append the fullscreen button if not already there
if (!wrapper.querySelector('.fullscreen-btn')) {
const btn = document.createElement('button');
btn.textContent = 'Fullscreen';
btn.classList.add('fullscreen-btn');
btn.addEventListener('click', () => toggleFullScreen(wrapper));
wrapper.appendChild(btn);
}
});
}
// Wait for the DOM to be fully loaded
window.addEventListener('load', function() {
addStyles();
// Call addFullscreenButtons with a delay to allow syntax highlighting to process
setTimeout(addFullscreenButtons, 0);
});
})();
</code></pre>
<h1>Installation</h1>
<p><a href="https://update.greasyfork.org/scripts/487378/Expand%20Code%20to%20Fullscreen%20on%20StackExchange%20Site.user.js" rel="nofollow noreferrer">GreasyFork backup, Click to install</a></p>
<h1>Bugs, requests</h1>
<p><strong>Now(2024-02-15 UTC+8) the script can not deal with syntax highlight well, any help would be appreciated.</strong></p>
<p>You can post bugs or requests in <a href="https://greasyfork.org/scripts/487378-expand-code-to-fullscreen-on-stackexchange-site/feedback" rel="nofollow noreferrer">the greasyfork script feedback</a> or answer <a href="https://stackapps.com/questions/10512/expand-code-to-fullscreen-on-stackexchange-site">this question itself</a>.</p>
https://stackapps.com/q/105114Show Deleted Answers at head for Stack Exchange138 Aspenhttps://stackapps.com/users/1177772024-02-12T11:34:54Z2024-02-27T12:48:24Z
<h1>Description</h1>
<p>Script practice.</p>
<p>To view your own deleted answers/questions on a Stack Exchange account, you always need to scroll all the way down to see the "Deleted answers" tag. I've written a script to address this issue. <del>If you, like me, don't want to press the Home/End keys</del></p>
<h1>How it works</h1>
<p><a href="https://i.stack.imgur.com/J3AjR.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/J3AjR.png" alt="enter image description here" /></a></p>
<p><a href="https://i.stack.imgur.com/39hr6.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/39hr6.png" alt="enter image description here" /></a></p>
<h1>Installation</h1>
<p><a href="https://update.greasyfork.org/scripts/475785/Show%20Deleted%20Answers%20at%20head%20for%20StackExchange.user.js" rel="nofollow noreferrer">GreasyFork backup, Click to install</a></p>
<h1>Bugs, requests</h1>
<p>You can post bugs or requests in <a href="https://greasyfork.org/scripts/475785-show-deleted-answers-at-head-for-stackexchange/feedback" rel="nofollow noreferrer">the GreasyFork script feedback</a> or answer <a href="https://stackapps.com/questions/10511/show-deleted-answers-at-head-for-stackexchange">this question itself</a>.</p>
https://stackapps.com/q/1050713AI generated content should NOT be allowed on Stack Appsrenehttps://stackapps.com/users/187222024-02-08T21:00:21Z2024-02-14T14:39:00Z
<p>On February 14th, 2024 a new <a href="https://meta.stackexchange.com/questions/396626">network-wide policy on AI-generated content</a> goes into effect.</p>
<p>The de-facto default is that AI-generated content should follow the citation rules that already exist. In the announcement of this policy it is stated:</p>
<blockquote>
<p>Sites that have — before February 14th — made the Community Management Team aware of their superseding site policy on the matter that disallows this content instead of requiring it to be cited will have a different template that instead reflects that policy.</p>
</blockquote>
<p>Since Stack Apps is its own <a href="/questions/tagged/meta" class="post-tag" title="show questions tagged 'meta'" aria-label="show questions tagged 'meta'" rel="tag" aria-labelledby="tag-meta-tooltip-container">meta</a> site, this question is a poll (upvote = I agree, downvote = I disagree - hence the <a href="/questions/tagged/feature-request" class="post-tag required-tag" title="show questions tagged 'feature-request'" aria-label="show questions tagged 'feature-request'" rel="tag" aria-labelledby="tag-feature-request-tooltip-container">feature-request</a> tag).</p>
<blockquote>
<p><strong>Do not allow AI generated content on Stack Apps</strong></p>
</blockquote>
<p>Additional considerations can be discussed in comments / answers.</p>
https://stackapps.com/q/105032Backpack: Download all of your questions and answers across all SE sites as Markdown filesmhdadkhttps://stackapps.com/users/1206812024-01-28T12:26:18Z2024-01-28T12:26:18Z
<!-- thumbnail: https://example.com/some-image.png -->
<!-- version: 1.0 -->
<!-- tag: app -->
<!-- excerpt: Download all of your questions and answers across all SE sites as Markdown files. -->
<h2>Screenshot / Code Snippet</h2>
<img src="https://i.stack.imgur.com/A8a7p.png" width="350" />
<img src="https://i.stack.imgur.com/Jtejw.png" width="350" />
<img src="https://i.stack.imgur.com/jnGMl.png" width="350" />
<h2>About</h2>
<p>This app is used download a user's questions and answers across all Stack Exchange (SE) sites that they are registered for. The questions and answers are downloaded in the form of Markdown files, as shown in the screenshots above. The purpose of this app is to obtain a backup of all questions and answers for a user.</p>
<p>This app consists of a Python script that makes use of the <a href="https://api.stackexchange.com/">SE API</a>. To start using this app, follow the instructions <a href="https://github.com/mhdadk/stack-exchange-backup/blob/main/README.md" rel="nofollow noreferrer">here</a>.</p>
<h3>License</h3>
<p>MIT License</p>
<h3>Download</h3>
<p>Follow the instructions at the GitHub repository <a href="https://github.com/mhdadk/stack-exchange-backup" rel="nofollow noreferrer">here</a>.</p>
<h3>Platform</h3>
<p>PC, Mac, and Linux</p>
<h2>Contact</h2>
<p><a href="https://github.com/mhdadk" rel="nofollow noreferrer">Mahmoud Abdelkhalek</a></p>
<h2>Code</h2>
<p>Code can be found <a href="https://github.com/mhdadk/stack-exchange-backup" rel="nofollow noreferrer">here</a></p>
https://stackapps.com/q/105020PLACEHOLDER - stack apps developmentMuhammad Naeemhttps://stackapps.com/users/1218862024-01-27T22:38:55Z2024-02-07T20:24:12Z
<p>Working on A Stack Overflow client development website.</p>
https://stackapps.com/q/1049962023: a year in moderationJNathttps://stackapps.com/users/327342024-01-24T16:43:55Z2024-01-24T18:59:23Z
<p>It’s that time of the year again! As we wave goodbye to last year and welcome the new one, we have <a href="https://stackapps.com/search?q=%22year+in+moderation%22+is%3Aquestion">a tradition of sharing moderation stats for the preceding calendar year</a>.</p>
<p>As most of you here might be aware, sites on the Stack Exchange network are moderated somewhat differently to other sites on the web:</p>
<blockquote>
<p>We designed the Stack Exchange network engine to be mostly self-regulating, in that we amortize the overall moderation cost of the system across thousands of teeny-tiny slices of effort contributed by regular, everyday users.<br />
-- <a href="http://blog.stackoverflow.com/2009/05/a-theory-of-moderation/">A Theory of Moderation</a></p>
</blockquote>
<p>That doesn't eliminate the need for having <a href="https://stackoverflow.blog/2018/11/21/our-theory-of-moderation-re-visited/">moderators</a> altogether, but it does mean that the bulk of moderation work is carried out by regular folks — folks like you. Every bit of time and effort y'all contribute to the site gives you access to more privileges you can use to help in this effort, all of which produce a cumulative effect that makes a big difference in ensuring Stack Exchange sites remain a valuable source of high-quality content on the web.</p>
<p>So as we say goodbye to 2023 (and January 2024… ahem) and move into 2024, let us look back at what we accomplished as a community... by looking at some <a href="https://i.stack.imgur.com/pmN7M.gif" rel="noreferrer"><em>exciting</em> stats</a>. Below is a breakdown of moderation actions performed on Stack Apps over the past 12 months:</p>
<div class="s-table-container">
<table class="s-table">
<thead>
<tr>
<th style="text-align: left;">Action</th>
<th style="text-align: right;">Moderators</th>
<th style="text-align: right;">Community User¹</th>
<th style="text-align: right;">Community²</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">All comments on a post moved to chat</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Answer flags handled</td>
<td style="text-align: right;">129</td>
<td style="text-align: right;">731</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Answers flagged</td>
<td style="text-align: right;">12</td>
<td style="text-align: right;">84</td>
<td style="text-align: right;">763</td>
</tr>
<tr>
<td style="text-align: left;">Bounties canceled</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Comment flags handled</td>
<td style="text-align: right;">222</td>
<td style="text-align: right;">255</td>
<td style="text-align: right;">7</td>
</tr>
<tr>
<td style="text-align: left;">Comments deleted⁸</td>
<td style="text-align: right;">256</td>
<td style="text-align: right;">1,200</td>
<td style="text-align: right;">31</td>
</tr>
<tr>
<td style="text-align: left;">Comments flagged</td>
<td style="text-align: right;">48</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">436</td>
</tr>
<tr>
<td style="text-align: left;">Comments undeleted</td>
<td style="text-align: right;">14</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Escalations to the Community Manager team</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Posts bumped</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">26</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Posts deleted⁷</td>
<td style="text-align: right;">50</td>
<td style="text-align: right;">579</td>
<td style="text-align: right;">26</td>
</tr>
<tr>
<td style="text-align: left;">Posts locked</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">449</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Posts undeleted</td>
<td style="text-align: right;">4</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">2</td>
</tr>
<tr>
<td style="text-align: left;">Posts unlocked</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Question flags handled⁶</td>
<td style="text-align: right;">261</td>
<td style="text-align: right;">1,077</td>
<td style="text-align: right;">7</td>
</tr>
<tr>
<td style="text-align: left;">Questions closed</td>
<td style="text-align: right;">63</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Questions flagged⁶</td>
<td style="text-align: right;">80</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">1,261</td>
</tr>
<tr>
<td style="text-align: left;">Questions merged</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Questions migrated</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Questions protected</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">33</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Questions reopened</td>
<td style="text-align: right;">2</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Questions unprotected</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Revisions redacted</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tag highlight language set</td>
<td style="text-align: right;">2</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tag synonyms created</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tag synonyms proposed</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tags merged</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "Close votes" queue</td>
<td style="text-align: right;">9</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "First answers" queue</td>
<td style="text-align: right;">22</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">8</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "First questions" queue</td>
<td style="text-align: right;">77</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "Late answers" queue</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "Low quality posts" queue</td>
<td style="text-align: right;">15</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "Reopen votes" queue</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "Suggested edits" queue</td>
<td style="text-align: right;">56</td>
<td style="text-align: right;">13</td>
<td style="text-align: right;">10</td>
</tr>
<tr>
<td style="text-align: left;">Tasks reviewed⁵: "Triage" queue</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">User banned from review</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">User review-bans lifted early</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">User suspensions lifted early</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Users contacted</td>
<td style="text-align: right;">8</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Users deleted</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Users destroyed⁴</td>
<td style="text-align: right;">3,655</td>
<td style="text-align: right;">0</td>
<td style="text-align: right;">0</td>
</tr>
<tr>
<td style="text-align: left;">Users suspended³</td>
<td style="text-align: right;">6</td>
<td style="text-align: right;">86</td>
<td style="text-align: right;">0</td>
</tr>
</tbody>
</table>
</div><h3>Footnotes</h3>
<p>¹ This refers to the automated systems otherwise known as <a href="https://stackapps.com/users/-1">user #-1</a>.</p>
<p>² This refers to <a href="https://stackapps.com/users">the membership of Stack Apps</a> <em>without</em> <a href="https://stackapps.com/users?tab=moderators">diamonds next to their names</a>.</p>
<p>³ The system will suspend users under three circumstances: when a user is recreated after being previously suspended, when a user is recreated after being destroyed for spam or abuse, and when a network-wide suspension is in effect on an account.</p>
<p>⁴ A "destroyed" user is deleted along with all that they had posted: questions, answers, comments. <a href="https://meta.stackexchange.com/questions/88994/what-is-the-difference-between-a-deleted-user-and-a-destroyed-user">Generally used as an expedient way of getting rid of spam.</a></p>
<p>⁵ This counts every review that was submitted (not skipped) - so the 2 suggested edits reviews needed to approve an edit would count as 2, the goal being to indicate the frequency of moderation actions. This also applies to flags, etc.</p>
<p>⁶ Includes close flags (but <em>not</em> close or reopen votes). The community² can handle these flags by at least one person voting to close a question that has a close flag.</p>
<p>⁷ This ignores numerous deletions that happen automatically in response to some other action.</p>
<p>⁸ This includes comments deleted by their own authors (which also account for some number of handled comment flags).</p>
<h3>Further reading:</h3>
<ul>
<li><p>Wanna see how these numbers have changed over time? We posted a similar report here last year: <a href="https://stackapps.com/questions/9653/2022-a-year-in-moderation">2022: a year in moderation</a></p>
</li>
<li><p>You can also check out <a href="https://stackexchange.com/search?q=title%3A%222023%3A+a+year+in+moderation%22">this report on other sites</a></p>
</li>
<li><p>Or peruse <a href="https://meta.stackexchange.com/q/396299/208518">detailed information on the number of questions closed and reopened across all sites</a></p>
</li>
</ul>
<p>Wishing everyone a happy 2024! ^_^</p>
https://stackapps.com/q/104973Suddenly getting "Couldn't parse `client_id`"Ryanhttps://stackapps.com/users/552482024-01-19T19:35:39Z2024-01-23T16:42:28Z
<p>For years, I've run a local PHP app using GuzzleHttp\Client to download my StackExchange posts.</p>
<p>Today, I'm suddenly getting this problem when posting my client_id, client_secret, code, redirect_uri.</p>
<pre class="lang-json prettyprint-override"><code>{
"error_message": "Couldn't parse `client_id`"
}
</code></pre>
<p>I've tried posting from <a href="https://reqbin.com/post-online" rel="nofollow noreferrer">https://reqbin.com/post-online</a> too and get the same error.</p>
<p>Where can I find more about this error message and why I might be experiencing this suddenly?</p>
<hr />
<p>Update:</p>
<p>At <a href="https://stackapps.com/apps/oauth/view/13067">https://stackapps.com/apps/oauth/view/13067</a> I see that my OAuth Domain and Application Website are way outdated, but I doubt it's a problem, both because I don't think those values get used anywhere and also because the values I see here are so old that my app ought to have broken much earlier if these mattered.</p>
<p>I wonder if <a href="https://stackoverflow.com/q/77446750/470749">this</a> relates to my problem. I get the <code>Just a moment...</code> response:</p>
<pre><code>[2024-01-23 16:39:14] local.DEBUG: error response headers: {"Date":["Tue, 23 Jan 2024 16:39:13 GMT"],"Content-Type":["text\/html; charset=UTF-8"],"Content-Length":["12469"],"Connection":["close"],"Accept-CH":["Sec-CH-UA-Bitness, Sec-CH-UA-Arch, Sec-CH-UA-Full-Version, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Platform, Sec-CH-UA, UA-Bitness, UA-Arch, UA-Full-Version, UA-Mobile, UA-Model, UA-Platform-Version, UA-Platform, UA"],"Cross-Origin-Embedder-Policy":["require-corp"],"Cross-Origin-Opener-Policy":["same-origin"],"Cross-Origin-Resource-Policy":["same-origin"],"Origin-Agent-Cluster":["?1"],"Permissions-Policy":["accelerometer=(),autoplay=(),browsing-topics=(),camera=(),clipboard-read=(),clipboard-write=(),geolocation=(),gyroscope=(),hid=(),interest-cohort=(),magnetometer=(),microphone=(),payment=(),publickey-credentials-get=(),screen-wake-lock=(),serial=(),sync-xhr=(),usb=()"],"Referrer-Policy":["same-origin"],"X-Frame-Options":["SAMEORIGIN"],"cf-mitigated":["challenge"],"Cache-Control":["private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0"],"Expires":["Thu, 01 Jan 1970 00:00:01 GMT"],"Set-Cookie":["__cf_bm=M4sphbT4igreiS2G4RwBnOpMN0Zfghmlk2O5xMLjxXk-1706027953-1-AdpY5d+6yWc9J7XPZmwRDG4Tv1X8g+Uxy3OrfERWdBdyI8yPlob9FKynrWo6PVTcZjBnXtwU\/qXCFuAo+fKfepk=; path=\/; expires=Tue, 23-Jan-24 17:09:13 GMT; domain=.stackoverflow.com; HttpOnly; Secure; SameSite=None"],"X-DNS-Prefetch-Control":["off"],"Server":["cloudflare"],"CF-RAY":["84a178b55a391d76-ATL"]}
[2024-01-23 16:39:14] local.DEBUG: error response body: "<!DOCTYPE html><html lang=\"en-US\"><head><title>Just a moment...<\/title><meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"><meta name=\"robots\" content=\"noindex,nofollow\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><style>@keyframes lds-ring{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}*{box-sizing:border-box;margin:0;padding:0}html{line-height:1.15;-webkit-text-size-adjust:100%;color:#313131}button,html{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"}@media (prefers-color-scheme:dark){body{background-color:#222;color:#d9d9d9}body a{color:#fff}body a:hover{text-decoration:underline;color:#ee730a}body .lds-ring div{border-color:#999 transparent transparent}body .font-red{color:#b20f03}body .big-button,body .pow-button{background-color:#4693ff;color:#1d1d1d}body #challenge-success-text{background-image:url(data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4)}}body{display:flex;flex-direction:column;min-height:100vh}body.no-js .loading-spinner{visibility:hidden}body.no-js .challenge-running{display:none}body.dark{background-color:#222;color:#d9d9d9}body.dark a{color:#fff}a:hover,body.dark a:hover,body.light a:hover{text-decoration:underline;color:#ee730a}body.dark .lds-ring div{border-color:#999 transparent transparent}body.dark .font-red{color:#b20f03}body.dark .big-button,body.dark .pow-button{background-color:#4693ff;color:#1d1d1d}body.dark #challenge-success-text{background-image:url(data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjZDlkOWQ5IiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4)}body.light{color:#313131}a,body.light a{color:#0051c3}body.light .lds-ring div{border-color:#595959 transparent transparent}body.light .font-red{color:#fc574a}body.light .big-button,body.light .pow-button{border-color:#003681;background-color:#003681;color:#fff}body.light #challenge-success-text{background-image:url(data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4=)}a,body.light{background-color:transparent}a{transition:color 150ms ease;text-decoration:none}.main-content{margin:8rem auto;width:100%;max-width:60rem}.heading-favicon{margin-right:.5rem;width:2rem;height:2rem}.footer,.main-content{padding-right:1.5rem;padding-left:1.5rem}.main-wrapper{display:flex;flex:1;flex-direction:column;align-items:center}.font-red{color:#b20f03}.spacer{margin:2rem 0}.h1{line-height:3.75rem;font-size:2.5rem;font-weight:500}.core-msg,.h2{line-height:2.25rem;font-size:1.5rem}.h2{font-weight:500}.body-text,.core-msg{font-weight:400}.body-text{line-height:1.25rem;font-size:1rem}#challenge-error-text,#challenge-success-text{background-image:url(data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI0IyMEYwMyIgZD0iTTE2IDNhMTMgMTMgMCAxIDAgMTMgMTNBMTMuMDE1IDEzLjAxNSAwIDAgMCAxNiAzbTAgMjRhMTEgMTEgMCAxIDEgMTEtMTEgMTEuMDEgMTEuMDEgMCAwIDEtMTEgMTEiLz48cGF0aCBmaWxsPSIjQjIwRjAzIiBkPSJNMTcuMDM4IDE4LjYxNUgxNC44N0wxNC41NjMgOS41aDIuNzgzem0tMS4wODQgMS40MjdxLjY2IDAgMS4wNTcuMzg4LjQwNy4zODkuNDA3Ljk5NCAwIC41OTYtLjQwNy45ODQtLjM5Ny4zOS0xLjA1Ny4zODktLjY1IDAtMS4wNTYtLjM4OS0uMzk4LS4zODktLjM5OC0uOTg0IDAtLjU5Ny4zOTgtLjk4NS40MDYtLjM5NyAxLjA1Ni0uMzk3Ii8+PC9zdmc+);background-repeat:no-repeat;background-size:contain;padding-left:34px}#challenge-success-text{background-image:url(data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSIgdmlld0JveD0iMCAwIDI2IDI2Ij48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJNMTMgMGExMyAxMyAwIDEgMCAwIDI2IDEzIDEzIDAgMCAwIDAtMjZtMCAyNGExMSAxMSAwIDEgMSAwLTIyIDExIDExIDAgMCAxIDAgMjIiLz48cGF0aCBmaWxsPSIjMzEzMTMxIiBkPSJtMTAuOTU1IDE2LjA1NS0zLjk1LTQuMTI1LTEuNDQ1IDEuMzg1IDUuMzcgNS42MSA5LjQ5NS05LjYtMS40Mi0xLjQwNXoiLz48L3N2Zz4=);padding-left:42px}.text-center{text-align:center}.big-button{transition-duration:200ms;transition-property:background-color,border-color,color;transition-timing-function:ease;border:.063rem solid #0051c3;border-radius:.313rem;padding:.375rem 1rem;line-height:1.313rem;font-size:.875rem}.big-button:hover{cursor:pointer}.captcha-prompt:not(.hidden){display:flex}.pow-button{margin:2rem 0;background-color:#0051c3;color:#fff}.pow-button:hover{border-color:#003681;background-color:#003681;color:#fff}.footer{margin:0 auto;width:100%;max-width:60rem;line-height:1.125rem;font-size:.75rem}.footer-inner{border-top:1px solid #d9d9d9;padding-top:1rem;padding-bottom:1rem}.clearfix::after{display:table;clear:both;content:\"\"}.clearfix .column{float:left;padding-right:1.5rem;width:50%}.diagnostic-wrapper{margin-bottom:.5rem}.footer .ray-id{text-align:center}.footer .ray-id code{font-family:monaco,courier,monospace}.core-msg,.zone-name-title{overflow-wrap:break-word}.loading-spinner{height:76.391px}.lds-ring,.lds-ring div{display:inline-block;position:relative;width:1.875rem;height:1.875rem}.lds-ring div{box-sizing:border-box;display:block;position:absolute;border:.3rem solid #595959;border-radius:50%;border-color:#313131 transparent transparent;animation:lds-ring 1.2s cubic-bezier(.5,0,.5,1) infinite}.lds-ring div:nth-child(1){animation-delay:-.45s}.lds-ring div:nth-child(2){animation-delay:-.3s}.lds-ring div:nth-child(3){animation-delay:-.15s}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){.main-wrapper,body{display:block}}<\/style><meta http-equiv=\"refresh\" content=\"375\"><\/head><body class=\"no-js\"><div class=\"main-wrapper\" role=\"main\"><div class=\"main-content\"><noscript><div id=\"challenge-error-title\"><div class=\"h2\"><span id=\"challenge-error-text\">Enable JavaScript and cookies to continue<\/span><\/div><\/div><\/noscript><\/div><\/div><script>(function(){window._cf_chl_opt={cvId: '3',cZone: \"stackoverflow.com\",cType: 'managed',cNounce: '2140',cRay: '84a178b55a391d76',cHash: '0a3b5d81d64aa93',cUPMDTk: \"\\\/oauth\\\/access_token\\\/json?__cf_chl_tk=QiOBIBGzbeGLitdez0nd.oFbkKwGn8SC318Y5XdmFkM-1706027953-0-gaNycGzNDCU\",cFPWv: 'g',cTTimeMs: '1000',cMTimeMs: '375000',cTplV: 5,cTplB: 'cf',cK: \"visitor-time\",fa: \"\\\/oauth\\\/access_token\\\/json?__cf_chl_f_tk=QiOBIBGzbeGLitdez0nd.oFbkKwGn8SC318Y5XdmFkM-1706027953-0-gaNycGzNDCU\",md: \"KQgMFJ9Md.BC.FulrOxwDMaTFgnAFmCn3fO7qX6NUVk-1706027953-1-ATs4kjJwH2__RLolvfSqcp8Pgix_VkaXH7nty04u1dpPZ1rsd5Tp-4Fmu_AnsetM519Lm4J39SeAEW8HgB4GpV_WLlr_kgIJ0SrnEIpJkNMOba25FXRSweTFbmrxm_sv01UR18Xz8Y1b6SHbT1AiRul2Ze778XNbtsMg96Fd1fBBH1U_57uQjGitT41c96G-pwvSZnVQXOX2R1ylMcUCBe-3E5yLB4SFNzq2aPm-772dYs4QG3pObrCcBjqMmJs_8Ly7E7XFRSVayYS4lYKZF1P0eBgSU54nkLdAH3ZQg3VWsrmyBPWtIC_45nsaTW6RlCumvKx3bFIf7iZ87pubFGF5sB3xTQiOlhLv0G2b8XUay7MISrKts2rlGLBISdvljpyVt_W5ZYYOGW3VX8dLPfE3vaBI97rdqw8RzRYK_mjeSHI0HgF0byGUGRjKxLgDPVpeBAEmwCxSoSkAxF6S4H8FJP1wMe-lLSQq_JYre2SG5dqWOLRfAre-cv1JP62Yp50qZAw5jIPe3LPy4QehR9LTpFFk0O5vnCuD7M43kWdu4bVihIJXdmLK-n6lMJ3TOaQV_75TfaO05H99JmyBmpJEkS32KZLvGajniuRRf4sU6qAApX6F4vOLCKWFtOfmvLFYRyu_U3t5OHlkGcchrya4zgxMtgoPFyOyiYiC56Nbpy-LuPbcEywGGekrEMFIRHLb9SJAs0Ze89ait76xnjAwhPq7UkKMnsNlcZFltZFl_2nh_lxnAlNj-7R339ZSG2w-Tb6a2vCKk8Y57-bvSrqjJaIZ2zELUaiWFZ6V5ifJRkV4OjdgzoF-LjIL2k09Bt2zD5hnxhTVWYJ7XDKi6JYtnrjB2-scyqiB1ODZ7TMCMTdWlHwfvzBYDImPchfInqcjWN3KZIfCJKTol72UhHQmCBs4c7Dy7sC3mTtsbcJxXn5uKVxamMH6c3kmL-dhdffmtiDqtwoM_AyGTmZN9M0vGx_D8osZDMccnaZpBCgW9WPfZrEeZYU-kf1KfRByGdOJZD7BNeqGxlnVFWFArjNQ1vKBrFVB2KQaADY_sjtR1zk_CkmbZ3M--mfU0IsbWzasdKqRR5ndv2saXjocmXBKBA4D41vneAhR7sk1d0mGSZrPRVXBr8XxoGw3KoR-qrsPqL1XfpVZZICx0ZuE6QvGQ3yVr776K1insCBYEcEqHchRAaNENn_bxmUovtBYYGR1uEdvNdF805MGuQiuMtxB4pZSOhu3QtTU8N0OcAuOgomrAiSStSM1lDGqAjrC11pFR3bnD6FO7FsLD6Dk0vVSJJZ0xMplfD9xYUjyAXVLRWQbANdEHzeUEUGpP9pWKFMxs917mQ6DhLf2OUggKTiQNJPPjeOJ8iMDs_FTnPXMr6A7nvneiGzsj4qa135ifoVionR4I8mmJ2MfYGylEjjXZRJfBRmmnOnPVT8i0AFBtsYAyoOT--BN8szrq-VkKT7S7y789ZkVrfgpZwFIxmbKCzywI93_7CiJC4am_S46L4q0_axgxtNVkbOaNWzmVArHSJKvKPq2v14ZtOQ1Xb-8DwUs9xoO2oxaXdipCtgZb6HYQXrupx1WEZWp77X6PkMpnnSyd6NaYmtM6qK1nwYarks-hfOW26RzzwFwyJ7QTF94K6C2k6K7O90yziMiys3ZhWLNqS5knRJYxHlQDPLSr4O76H-4JKoGwAYLNACeiV4UgpviNugh7OH3E5tLZ55otO_yVJzoZn-yokJhlMkAvaUSYoRlHbQPJJUFpumJUbMiQTOJssrJ2-KWdYhwOVni6VVieDY8iCOJ3ixOvdwbMEpps8elTBtSxY4FYqUi5Uo4NdlDVeZWZpFLGrVAqoJ9fkEcEBz_TymeTt0o4QhhEUVzxRc3wFR3EtXBVcS_gYw1uBDqtssuWoPxEv5L2sw88gU6NpPBItoIQeNn6UaQ4ajpjQlvMM0C81o1slIOAA1anfqNxI2YJo7ecSskxDSCTulE9pX7NuVhbzABSaI9vVLdI-51jqaUjPCsuRUCz_v1iQjIpqvAc29_W1jp-wiFZSxYBRMk_6_Ru8Je5zVzc9Y7hxMmWQLCvRFG-Pj85QETHKQXcvp4G-09VJ3lHts_MS_HcNdrv8lO0jP7PGdOvTzOzaQqd3I9cjMZj7R64EsJdvXrSArF8mBS4byBUMO13txbSsnGWxPirNKANTdH4PJoGtHWqIhEeNvUMQ9JeqB8dViVrsWCvrPlwYbSXrlfGCqMy_cG5URyXPYBKkqpfqY6tqPOb5zLm890r7I74CdW5TstZJC2hbxvcgOW0qC-BxrFZJqcHqNs-U2uaMoWaX5m6t9Cd51CGkwlDAwwt_LmDxdUozTjFTZRmuRja8_7PKluvONdScqIB9pVHmDyDfP5YFndOwl6xq4bS5c0PStLsTYadYpLZ9GGRL8_a1ffEoyYsQwGm1siDj39zLUtEBuWFj2GpStuRMC-vj9mBLvkkqvOVcRsOTvXH5Vmj8opNnCwYIESkA_hP3076NQk1IBGAIZdwJjEdZqAfj_1Y00d3llnKEL45G4zs513i-tTU8KObAZxSry5nElDZurSlciZ-i6Aacyeo8liARBZ66a_r8CVvfKtekLyUxbP0OAIO2xKjBY39wC63iouqrTLYepc0-7tnDldLD-JySVdiPR-oU-MC8rmpYKNRT0pCpbsSlVL5CJ2qAhwR6i0RiSEDarLJ29nyfzvFng1Vu6yMTcKQG1tss_NSk8lN8wq714vUS-DqELKFnAXsvYmJQGlpZuGrrw7jxMxmnrWCKz91l35823O9oGDcp4SjaQM78YgVfn6T4CP5V1zL1IGU-0bIYMrj7wm-U2lzdfu9SE8NY-Rcn6ZEaPz5wKOkniCo9AaTfuD6zQB6Aa4nca7LT60kMVpxMrR3QRgQl7t41gOhTlfUouTI1ei1TiFW_HSYqC1sU8suzOrvA6YIgzCntqxGVI2CA5tdKkDzNkc8pXCzfME2EZCIG7YgS6O_WSx86mVvJt3RNAd-9lcSBbft2ETPyRXWfTqRtpAfnYVKaQl\",cRq: {ru: 'aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9vYXV0aC9hY2Nlc3NfdG9rZW4vanNvbg==',ra: 'R3V6emxlSHR0cC83',rm: 'UE9TVA==',d: 'uVQx77g\/O2NAe7v3yVhUpp5uuvN\/i4mGg6yWC9q6jFwI8jxKKVutUhokeIOgTypZ5TSF+tLRgAuBm76o2BI7QYeXopjW0xE9cuNo62pLT0lIXCfGpEdAurrlHXEMBHjGfgpItL7iSlizC5mhnsX5og\/gv+gVuUFg82qYLs9fBZaqXSLU\/gjfZLVzVpJ2PzmTwwjuGZvR3UlEYqXortJQt2+VhpVlO0U\/1Y28Kypo8lBhzLYVDXTUBRx8dz+RJlA8MjENw7i0hRgPPBslFkQ9AHoMveTHFg3wwXk13u4eK\/KVqFEY7GXB+OoctIoLhlCkZ0NISfvBVzfm8mWDwHhVGc+Q55IivuMCYuBuB8F5SEjuU94IOdhygRkoCHVZAWhjrp5zSz2Cjv8k2h7yK3Ogsc6MEgeVUiUyEEVrN5mBgdDfLvWZpNywQopdo2\/D1Oj3YmVW+VjeTQmxVNGg6YVzVFZ\/1TrHvGALw+Supz7\/E+pAclfhVxF7HFIbxl+lbsRBCO\/SyY5xdXMQvRr7ga0WvYaOGnrPxhH7SkiPvulNH1qShnPJBE4P2jtb0S51AzD0WRiD2w2MXqbAYJm2gtKWEQ8QozEEDWJkcu8T4MbKJi4=',t: 'MTcwNjAyNzk1My41MjQwMDA=',cT: Math.floor(Date.now() \/ 1000),m: '3g5ItVXucieXipAU3N9eVv+D8\/bUn\/Qdqp1RgJQiWlg=',i1: 'J5cZ2dkRdP03SMYmvvXMbQ==',i2: 'FNj8mNR1CUvFdBo2kkZ4xA==',zh: 'qZdVWT6Z9Deue7trOoFeIlRkJLjtvxnEfzC3GTwNVhI=',uh: 'ymmJQbck0hqyRMriiC\/yAd1aQMNFP4RloXqn1EtTLaU=',hh: 'ECNCiHdYYYxqofbBsqa9fYr8WYRYj05Gt6W8lzwsMKQ=',}};var cpo = document.createElement('script');cpo.src = '\/cdn-cgi\/challenge-platform\/h\/g\/orchestrate\/chl_page\/v1?ray=84a178b55a391d76';window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, location.href.length - window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;if (window.history && window.history.replaceState) {var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;history.replaceState(null, null, \"\\\/oauth\\\/access_token\\\/json?__cf_chl_rt_tk=QiOBIBGzbeGLitdez0nd.oFbkKwGn8SC318Y5XdmFkM-1706027953-0-gaNycGzNDCU\" + window._cf_chl_opt.cOgUHash);cpo.onload = function() {history.replaceState(null, null, ogU);}}document.getElementsByTagName('head')[0].appendChild(cpo);}());<\/script><\/body><\/html>"
</code></pre>
https://stackapps.com/q/104941Does there exist an app that allows me to download all of my questions and answers on all SE sites?mhdadkhttps://stackapps.com/users/1206812024-01-14T08:41:13Z2024-02-27T15:06:00Z
<p>I'm interested in downloading a backup of all my questions and answers on all Stack Exchange sites in the form of markdown files. I'm already aware of <a href="https://data.stackexchange.com/stackoverflow/query/1529864/all-my-posts-on-the-se-network-with-markdown-and-html-content-plus-editors-and-s" rel="nofollow noreferrer">this SE data explorer query</a>, but this downloads all of my questions and answers into a CSV file. I'm also aware of <a href="https://stackapps.com/q/1890/120681">this question</a> that was asked over 10 years ago, but I did not see any recent answers. Does there exist an app that does this? Or would I need to make one?</p>
https://stackapps.com/q/104932Easily apply "bookend" deletion of AI-generated contentblackgreenhttps://stackapps.com/users/859982024-01-11T14:14:46Z2024-01-11T14:14:46Z
<h2>Description</h2>
<p>This is a fork of <a href="https://github.com/samliew/SO-mod-userscripts/blob/master/DeletedUsersHelper.user.js" rel="nofollow noreferrer">Samuel Liew's DeletedUsersHelper</a> userscript. It's a script for moderators only.</p>
<p>The purpose of this userscript is to simplify bulk-deletion of AI-generated posts as per the <a href="https://stackoverflowteams.com/c/gen-ai-heuristics/questions/310">bookend policy</a>.</p>
<h2>How it works</h2>
<p>The script adds a button at the top of the user's Answers tab:</p>
<p><a href="https://i.stack.imgur.com/S8Yc6.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/S8Yc6.png" alt="enter image description here" /></a></p>
<p>By clicking the button, a checkbox is appended to each entry in the answers list, as well as a Delete button.</p>
<p><a href="https://i.stack.imgur.com/ATAfB.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ATAfB.png" alt="enter image description here" /></a></p>
<p>The moderator can tick any number of checkboxes and then click "Delete selected". This will prompt for a final confirmation indicating the total number of answers that will be deleted, then it will automatically cast delete votes on each of the selected posts.</p>
<h2>Known limitations</h2>
<ul>
<li>The script doesn't currently allow to bulk-undelete.</li>
<li>The script doesn't check if a post is locked.</li>
</ul>
<h2>Installation</h2>
<ul>
<li><strong><a href="https://raw.githubusercontent.com/blackgreen100/SO-bookend-helper/master/script.user.js" rel="nofollow noreferrer">Click to install</a></strong></li>
<li><a href="https://github.com/blackgreen100/SO-bookend-helper/blob/master/script.user.js" rel="nofollow noreferrer">source</a></li>
</ul>
<h2>Bugs, requests</h2>
<p>You can post bugs or requests <a href="https://github.com/blackgreen100/SO-bookend-helper/issues" rel="nofollow noreferrer">in the script repo</a>.</p>
https://stackapps.com/q/104710PLACEHOLDER - YaSupportYaSupporthttps://stackapps.com/users/858212023-11-23T04:28:43Z2024-02-13T16:48:40Z
<p>The App is for providing support for Yandex Map apps and libs.</p>
<p>Our company provides an API for working with our maps: <a href="https://yandex.com/maps-api/docs" rel="nofollow noreferrer">https://yandex.com/maps-api/docs</a>. We want to help users find answers to questions they ask on the Stack Overflow platform.
We have our own app for the support team and would like to publish their comments and responses on your sites directly from this app via the Stack Overflow API.</p>
https://stackapps.com/q/104225Toasty: A better chat antifreeze botGingerhttps://stackapps.com/users/910912023-09-24T18:09:46Z2024-02-09T10:01:39Z
<!-- thumbnail: https://files.ginger.rto.community/toasty-thumb.png -->
<!-- version: 1.0 -->
<!-- tag: antifreeze -->
<h3>About</h3>
<p>Toasty is an antifreeze bot for the Stack Exchange chat system. It automatically sends messages in low-activity rooms to keep the system from freezing them for inactivity. Toasty is usable by any user with at least 200 network-wide reputation through its intuitive web interface.</p>
<p>Caveats:</p>
<ul>
<li>Toasty currently only supports <a href="https://chat.stackexchange.com">https://chat.stackexchange.com</a>, not <a href="https://chat.meta.stackexchange.com">https://chat.meta.stackexchange.com</a> or <a href="https://chat.stackoverflow.com">https://chat.stackoverflow.com</a>. Support for the other two sites is planned to be added soon.</li>
<li>Toasty cannot antifreeze rooms that its bot user cannot access; this realistically means that the following cannot be antifrozen:
<ul>
<li>Private rooms</li>
<li>Rooms that are already frozen</li>
<li>Gallery rooms that Toasty is not allowed to access</li>
</ul>
</li>
<li>For Gallery rooms, Toasty's <a href="https://codegolf.stackexchange.com/users/119710/toasty">bot user</a> must be allowed to send messages. If Toasty is unable to antifreeze a room, an error will be logged under the Runs tab on the room info page.</li>
<li><s>Due to an oversight with how rooms are stored, owners of a room that is being antifreezed by Toasty will not see the room in their room list unless they added it themself. (They will still be able to access and edit the room by going to its page directly.) This is planned to be fixed soon.</s> <br> <strong>This issue is now fixed.</strong> However, newly added ROs will need to wait for up to 24 hours for the bot to update its stored room list.</li>
<li>Moderators may not be automatically granted the mod role upon creating an account due to an issue with how modship is checked. This is planned to be fixed soon. If you are a moderator and have not been automatically granted the mod role, ping Ginger in <a href="https://chat.stackexchange.com/rooms/148706/i-cant-believe-its-not-botter">the Toasty chatroom</a>. This <em>may</em> also cause users with 200+ reputation on only a few sites to be erroneously denied from creating an account, although this has not happened yet.</li>
</ul>
<p>The antifreeze jobs run daily, at a randomly selected time within a 3-hour window centered on UTC midnight.</p>
<h3>Screenshot:</h3>
<p><a href="https://i.stack.imgur.com/unHNA.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/unHNA.jpg" alt="A screenshot of Toasty's index page" /></a></p>
<h3>Website</h3>
<p>Find Toasty at <a href="https://toasty.ginger.rto.community" rel="nofollow noreferrer">https://toasty.ginger.rto.community</a></p>
<h3>Contact:</h3>
<p>Toasty was written entirely by me, Ginger. You can discuss it in its <a href="https://chat.stackexchange.com/rooms/148706/i-cant-believe-its-not-botter">dedicated chatroom</a>, which is also linked to in the footer.</p>
<h3>License</h3>
<p>Toasty is licensed under the Mozilla Public License 2.0.</p>
<h3>Code</h3>
<p>Toasty is written in Python (backend) and TypeScript (frontend), and uses <a href="https://github.com/GingerIndustries/sechat/tree/v2" rel="nofollow noreferrer">sechat</a> to communicate with chat. You can find the source at <a href="https://github.com/GingerIndustries/toasty" rel="nofollow noreferrer">https://github.com/GingerIndustries/toasty</a>.</p>
https://stackapps.com/q/104084PyStackAPI - wrapper for the StackExchange API, written in Pythonwchistowhttps://stackapps.com/users/1167012023-09-15T11:13:40Z2024-01-09T09:16:52Z
<h1>PyStackAPI</h1>
<p>The latest version - 0.2.0</p>
<h2>What is PyStackAPI?</h2>
<p>PyStackAPI is a modern, 100% typed wrapper for the StackExchange API, written in Python.</p>
<h2>Documentation</h2>
<p>You can find documentation here: <a href="https://pystackapi.gitbook.io/docs" rel="nofollow noreferrer">https://pystackapi.gitbook.io/docs</a>.</p>
<h2>Installing</h2>
<p>Enter in terminal:</p>
<pre class="lang-sh prettyprint-override"><code>pip install git+https://github.com/wchistow/pystackapi.git@0.2.0
</code></pre>
<p>and that's all.</p>
<h2>Simple example</h2>
<p>Code for getting general information about StackOverflow:</p>
<pre class="lang-python prettyprint-override"><code>from pystackapi import Site
from pystackapi.sites import StackOverflow
site = Site(StackOverflow) # Creating a Site class for the StackOverflow site
info = site.get_info() # Calling the necessary method
print(info.total_questions) # Getting the necessary key
</code></pre>
<p>Output:</p>
<pre><code>23908838
</code></pre>
<h2>Changelog</h2>
<p>You can find the changelog for the PyStackAPI library in file <a href="https://github.com/wchistow/pystackapi/blob/master/CHANGELOG.md" rel="nofollow noreferrer">CHANGELOG.md</a>.</p>
<h2>License</h2>
<p>MIT</p>
<h2>Links</h2>
<ul>
<li>GitHub repository: <a href="https://github.com/wchistow/pystackapi.git" rel="nofollow noreferrer">https://github.com/wchistow/pystackapi.git</a></li>
<li>Bug tracker: <a href="https://github.com/wchistow/pystackapi/issues" rel="nofollow noreferrer">https://github.com/wchistow/pystackapi/issues</a></li>
<li>Documentation: <a href="https://pystackapi.gitbook.io/docs" rel="nofollow noreferrer">https://pystackapi.gitbook.io/docs</a></li>
</ul>
https://stackapps.com/q/101805Calling SE APIs with Nushell (basic overview)NotTheDr01dshttps://stackapps.com/users/834842023-07-25T23:32:54Z2024-02-28T07:04:25Z
<p>While I still prefer a more "traditional" shell for day-to-day use, I'm finding <a href="https://www.nushell.sh" rel="nofollow noreferrer">Nushell</a>'s structured data capabilities to be a fantastic companion to the SE API (among others). It's been months since I've used <code>jq</code> for processing JSON REST results.</p>
<p>Starting with a simple example:</p>
<pre class="lang-bash prettyprint-override"><code># Get the last 100 questions posted on Stack Overflow
> let res = (http get "https://api.stackexchange.com/questions?pagesize=100&site=stackoverflow")
# Will error if you are out of quota - Append a key param if needed
> $res.items.title | first 5
╭───┬───────────────────────────────────────────────────────────────────────────────╮
│ 0 │ Same Framework for multiple target and different destinations │
│ 1 │ Unable to control full screen menu bar visibility on MacOS using CLI defaults │
│ 2 │ How should MqttClient lifecycle be managed? │
│ 3 │ Auth0 External Provider │
│ 4 │ Passing a function to a react-router action in TypeScript? │
╰───┴───────────────────────────────────────────────────────────────────────────────╯
> $res.quota_remaining
167
> $res
# Will print the data (truncate based on screen width) in a table format
> $res | explore
# Will enter a data explorer view where you can scroll and drill down into data
# For example, select the "items" column and hit <Enter> to drill down to the questions themselves
# What key/value pairs (columns) are available in the result?
> $res | columns
╭───┬─────────────────╮
│ 0 │ items │
│ 1 │ has_more │
│ 2 │ quota_max │
│ 3 │ quota_remaining │
╰───┴─────────────────╯
# What key/value pairs (columns) are available for items?
> $res.items | columns
╭────┬───────────────────────╮
│ 0 │ tags │
│ 1 │ owner │
│ 2 │ post_state │
│ 3 │ is_answered │
│ 4 │ view_count │
│ 5 │ answer_count │
│ 6 │ score │
│ 7 │ last_activity_date │
│ 8 │ creation_date │
│ 9 │ question_id │
│ 10 │ content_license │
│ 11 │ link │
│ 12 │ title │
│ 13 │ posted_by_collectives │
│ 14 │ closed_date │
│ 15 │ closed_reason │
│ 16 │ last_edit_date │
│ 17 │ accepted_answer_id │
╰────┴───────────────────────╯
# Which questions were about Python?
> $res.items | filter {|question| "python" in $question.tags} | select title link
╭───┬──────────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ # │ title │ link │
├───┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 0 │ Python Mypy fails on Decorator │ https://stackoverflow.com/questions/76766815/python-mypy-fails-on-decorator │
│ 1 │ How do I find the key with the highest value in a python dictionary? │ https://stackoverflow.com/questions/76766810/how-do-i-find-the-key-with-the-highest-value-in-a-python-dictionary │
│ 2 │ How to insert a Python script into a website with DJango? │ https://stackoverflow.com/questions/76766795/how-to-insert-a-python-script-into-a-website-with-django │
│ 3 │ Beautifulsoup append ignores namespace (xml) │ https://stackoverflow.com/questions/76766794/beautifulsoup-append-ignores-namespace-xml │
│ 4 │ Http api not giving updated response │ https://stackoverflow.com/questions/76766744/http-api-not-giving-updated-response │
│ 5 │ What type hint should I use to specify a set of functions │ https://stackoverflow.com/questions/76766740/what-type-hint-should-i-use-to-specify-a-set-of-functions │
│ 6 │ can someone explain this append() part of a for loop? │ https://stackoverflow.com/questions/76766707/can-someone-explain-this-append-part-of-a-for-loop │
│ 7 │ How to make it faster? │ https://stackoverflow.com/questions/76766684/how-to-make-it-faster │
│ 8 │ Changing Pandas Period to another frequency │ https://stackoverflow.com/questions/76766650/changing-pandas-period-to-another-frequency │
│ 9 │ PFX certificate with Selenium with python │ https://stackoverflow.com/questions/76766634/pfx-certificate-with-selenium-with-python │
╰───┴──────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
</code></pre>
<p>For comparison, some Bash/curl/jq equivalents:</p>
<pre class="lang-bash prettyprint-override"><code>> res=`curl -o - "https://api.stackexchange.com/questions?pagesize=100&site=stackoverflow&sort=creation" | gunzip`
> echo $res | jq '.items[0:5][].title'
"Strange data prepending incoming WebSocket data. What is the cause?"
"Why does nothing happen when i try to multiple two variables?"
"How can I test functions that node-redis using vitest?"
"Create a Piece-Wise Regression in ggplot2 (R) with multiple &#39;knots&#39;"
"feeding continuous stdin using bash script"
> echo $res | jq '.quota_remaining'
143
> echo $res | jq 'keys'
[
"has_more",
"items",
"quota_max",
"quota_remaining"
]
# Note that this is slightly different from Nushell, in that Nushell will show *all*
# columns from all results, whereas this will only show the keys from the first result
> echo $res | jq '.items[0] | keys'
[
"answer_count",
"content_license",
"creation_date",
"is_answered",
"last_activity_date",
"link",
"owner",
"post_state",
"question_id",
"score",
"tags",
"title",
"view_count"
]
# Which questions were about Python?
> echo $res | jq -r '.items[] | select(.tags[] | contains ("python")) | .title, .link'
feeding continuous stdin using bash script
https://stackoverflow.com/questions/76766988/feeding-continuous-stdin-using-bash-script
Dijkstra&#39;s algorithm while moving through a maze
https://stackoverflow.com/questions/76766972/dijkstras-algorithm-while-moving-through-a-maze
numba: parallelize a nested for loop with a cartopy function in it
https://stackoverflow.com/questions/76766960/numba-parallelize-a-nested-for-loop-with-a-cartopy-function-in-it
How to avoid lack of convergence while using PassiveAggressiveClassifier for online learning?
https://stackoverflow.com/questions/76766958/how-to-avoid-lack-of-convergence-while-using-passiveaggressiveclassifier-for-onl
Opencv camera is available ret returns true, but frame is still empty, is there any fix?
https://stackoverflow.com/questions/76766956/opencv-camera-is-available-ret-returns-true-but-frame-is-still-empty-is-there
Remove pushpin on Bing Maps API using Python requests
https://stackoverflow.com/questions/76766949/remove-pushpin-on-bing-maps-api-using-python-requests
Why key parameters in Python has to be &quot;so complicated&quot;?
https://stackoverflow.com/questions/76766948/why-key-parameters-in-python-has-to-be-so-complicated
Plotting points on a HSV color wheel
https://stackoverflow.com/questions/76766947/plotting-points-on-a-hsv-color-wheel
Solving Sudoku with Gurobipy for Inequality
https://stackoverflow.com/questions/76766946/solving-sudoku-with-gurobipy-for-inequality
Solving Sudoku with Gurobipy for Inequality
https://stackoverflow.com/questions/76766946/solving-sudoku-with-gurobipy-for-inequality
How to open files outside of the django project?
https://stackoverflow.com/questions/76766934/how-to-open-files-outside-of-the-django-project
how to create kedro catalog entry + custom DataSet init method with values from credentials.yml
https://stackoverflow.com/questions/76766933/how-to-create-kedro-catalog-entry-custom-dataset-init-method-with-values-from
Adding a tkinter scrollbar to a treeview without any space
https://stackoverflow.com/questions/76766918/adding-a-tkinter-scrollbar-to-a-treeview-without-any-space
Pandas Ethnicity Count/Percentage
https://stackoverflow.com/questions/76766907/pandas-ethnicity-count-percentage
SQLite3 can&#39;t open database in Flask server
https://stackoverflow.com/questions/76766884/sqlite3-cant-open-database-in-flask-server
How to display a variable from a different file to the screen with PyQt5
https://stackoverflow.com/questions/76766870/how-to-display-a-variable-from-a-different-file-to-the-screen-with-pyqt5
compare two file and get only diffe name
https://stackoverflow.com/questions/76766869/compare-two-file-and-get-only-diffe-name
Why does my pygbag pygame application have laggy sound?
https://stackoverflow.com/questions/76766845/why-does-my-pygbag-pygame-application-have-laggy-sound
</code></pre>
https://stackapps.com/q/97230Error calling Stack Overflow Teams API using Python requests libraryShadaehttps://stackapps.com/users/1059222023-05-07T04:15:21Z2024-02-01T07:09:26Z
<p>I'm trying to call a PUT/DELETE request using the Stack Overflow Teams API in Python, but I'm encountering errors. <em>As an FYI, I have a working PAT that allows me to make get requests for articles and questions.</em> Specifically, I'm trying to create an article, update an article, and delete an article using the API, but the PUT/DELETE requests don't seem to be working. When I try to run the code, I get an error message that says <em><strong>"no method found with this name</strong></em>" or <em><strong>{"error_id":400,"error_message":"title","error_name":"bad_parameter"}</strong></em>. The title might be the issue, but I don't think it goes against the requirements (string, 5 character+ length)</p>
<p>I have tried running the API calls using Python's requests module, and I have checked that my authentication token is correct. I have also tried adjusting the order of the payload and double-checking that the headers are correct. However, I'm still getting errors.</p>
<p>Here's my code (sanitized for privacy):</p>
<pre><code>import json
import os
import requests
from markdown_it import MarkdownIt
def create_article(title, access_token):
headers = {
"X-API-Access-Token": access_token,
"Content-Type": "application/json"
}
data = {
"title": title,
"body": "TEST",
"tags": "REDACTED",
"article_type": "knowledge-article",
"filter": "default"
}
json_data = json.dumps(data)
api_url = "https://api.stackoverflowteams.com/2.3/articles/add?team=[TEAM_NAME]"
response = requests.post(api_url, headers=headers, data=json_data)
print(f"API response status: {response.status_code}")
print(f"API response text: {response.text}")
return response.json()
def delete_article(access_token, artId):
headers = {
"X-API-Access-Token": access_token,
"Content-Type": "application/json"
}
data = {
"id": artId
}
json_data = json.dumps(data)
api_url = f"https://api.stackoverflowteams.com/2.3/articles/{artId}/delete?team=[TEAM_NAME]"
response = requests.delete(api_url, headers=headers, data=json_data)
print(f"API response status: {response.status_code}")
print(f"API response text: {response.text}")
return response.json()
def import_single_wiki_to_teams(input_directory, access_token, test_file):
input_file = os.path.join(input_directory, test_file)
if os.path.isfile(input_file):
with open(input_file, "r", encoding="utf-8") as f:
content = f.read()
html_content = convert_md_to_html(content)
# title = os.path.splitext(test_file)[0]
title = "TeArticle"
print(f"Title from OS is: {title!r}")
response = create_article('Test Article', access_token) # Use the title and html_content variables
print(response)
else:
print(f"File not found: {input_file}")
input_directory = PATH
access_token = [REDACTED]
test_file = "FILE_NAME"
import_single_wiki_to_teams(input_directory, access_token, test_file)
</code></pre>
https://stackapps.com/q/94204Padding missing between thumbnails and other app/script informationGlorfindelhttps://stackapps.com/users/340612022-05-30T17:01:19Z2024-02-09T09:49:55Z
<p>On the <a href="https://stackapps.com/?tab=apps">Apps</a> and <a href="https://stackapps.com/?tab=scripts">Scripts</a> tabs, the thumbnails and the rest of the information touch each other:</p>
<p><img src="https://i.stack.imgur.com/z8VON.png" alt="" /></p>
<p>This <a href="https://web.archive.org/web/20170301031410/http://stackapps.com/" rel="nofollow noreferrer">didn't use to be the case</a>, could you please re-add some padding?</p>
https://stackapps.com/q/90586Save the waffles! Bringing back custom 404 pages to Stack ExchangeOleg Valter is with Ukrainehttps://stackapps.com/users/788732021-07-29T23:03:41Z2024-02-06T10:28:20Z
<!-- thumbnail: https://i.stack.imgur.com/mklYl.png -->
<!-- version: 2.0.0 -->
<!-- tag: images -->
<!-- excerpt: The userscript brings back custom 404 page images to sites of the Stack Exchange network -->
<blockquote>
<p>As per Aaron's <a href="https://meta.stackexchange.com/a/368048/786798">answer</a>, the change is <strong>temporarily</strong> reverted due to the backlash, so the userscript is not necessary for now. To compensate for the loss in usefulness, I decided to add per-site user overrides (since 0.3.0) and allow it to work on the current 404 pages (since 0.4.0).</p>
</blockquote>
<h2>Screenshot / Code Snippet</h2>
<p><a href="https://i.stack.imgur.com/WdT8u.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/WdT8u.png" alt="Meta Stack Overflow 404 page" /></a></p>
<p>Custom user overrides:</p>
<p><a href="https://i.stack.imgur.com/Xqupd.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Xqupd.png" alt="Meta Stack Overflow 404 page with user override" /></a></p>
<p><sub>The image is "The Black Beast of Aaaaaargghh" from the <a href="https://en.wikipedia.org/wiki/Monty_Python_and_the_Holy_Grail" rel="nofollow noreferrer">"Monty Python and the Holy Grail"</a> film, 1975</sub></p>
<h2>About</h2>
<p>The userscript brings back custom 404 pages to the Stack Exchange network replacing the lifeless corporate warning icon with community-specific images while preserving the updated layout. Currently supported communities (some 404 pages were never indexed by archive.org, so if you know of the missing 404 images, please let me know):</p>
<div class="s-table-container">
<table class="s-table">
<thead>
<tr>
<th>Community</th>
<th>Image</th>
</tr>
</thead>
<tbody>
<tr>
<td>Stack Overflow</td>
<td><a href="https://i.stack.imgur.com/okzBE.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/okzBE.png" width="80" alt="Stack Overflow 404" /></a></td>
</tr>
<tr>
<td>Meta Stack Overflow</td>
<td><a href="https://i.stack.imgur.com/0i2to.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/0i2to.png" width="80" alt="Meta Stack Overflow 404" /></a></td>
</tr>
<tr>
<td>Ask Ubuntu</td>
<td><a href="https://i.stack.imgur.com/KopoQ.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/KopoQ.png" width="80" alt="Ask Ubuntu 404" /></a></td>
</tr>
<tr>
<td>Super User</td>
<td><a href="https://i.stack.imgur.com/hMfYx.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/hMfYx.png" width="80" alt="Super User 404" /></a></td>
</tr>
<tr>
<td>English Language Learners</td>
<td><a href="https://i.stack.imgur.com/cQLRt.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/cQLRt.png" width="80" alt="English Language Learners 404" /></a></td>
</tr>
<tr>
<td>Code Review</td>
<td><a href="https://i.stack.imgur.com/R4Tgd.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/R4Tgd.png" width="80" alt="Code Review 404" /></a></td>
</tr>
<tr>
<td>Unix & Linux</td>
<td><a href="https://i.stack.imgur.com/XQRh5.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/XQRh5.png" width="80" alt="UNIX 404" /></a></td>
</tr>
<tr>
<td>Sci-Fi</td>
<td><a href="https://i.stack.imgur.com/UR35t.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/UR35t.png" width="80" alt="Sci-Fi 404" /></a></td>
</tr>
<tr>
<td>Math</td>
<td><a href="https://i.stack.imgur.com/bHpU1.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/bHpU1.png" width="80" alt="Math 404" /></a></td>
</tr>
<tr>
<td>Server Fault</td>
<td><a href="https://i.stack.imgur.com/W7VMk.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/W7VMk.png" width="80" alt="Server Fault 404" /></a></td>
</tr>
<tr>
<td>Ask Different</td>
<td><a href="https://i.stack.imgur.com/fCIaP.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/fCIaP.png" width="80" alt="Apple 404" /></a></td>
</tr>
<tr>
<td>Cross Validated</td>
<td><a href="https://i.stack.imgur.com/BqaS0.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/BqaS0.png" width="80" alt="Cross Validated 404" /></a></td>
</tr>
<tr>
<td>Arqade</td>
<td><a href="https://i.stack.imgur.com/C4jC1.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/C4jC1.png" width="80" alt="Arqade 404" /></a></td>
</tr>
<tr>
<td>Mi Yodeya</td>
<td><a href="https://i.stack.imgur.com/048MA.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/048MA.png" width="80" alt="Mi Yodeya 404" /></a></td>
</tr>
<tr>
<td>Home Improvement</td>
<td><a href="https://i.stack.imgur.com/C4P5L.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/C4P5L.png" width="80" alt="Home Improvement 404" /></a></td>
</tr>
<tr>
<td>Cooking</td>
<td><a href="https://i.stack.imgur.com/kSX5n.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/kSX5n.png" width="80" alt="Cooking 404" /></a></td>
</tr>
<tr>
<td>Crypto</td>
<td><a href="https://i.stack.imgur.com/2hyIe.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2hyIe.png" width="80" alt="Crypto 404" /></a></td>
</tr>
<tr>
<td>Webmasters</td>
<td><a href="https://i.stack.imgur.com/Z8Y2o.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Z8Y2o.png" width="80" alt="Webmasters 404" /></a></td>
</tr>
<tr>
<td>Chemistry</td>
<td><a href="https://i.stack.imgur.com/SwIib.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/SwIib.png" width="80" alt="Chemistry 404" /></a></td>
</tr>
<tr>
<td>Raspberry Pi</td>
<td><a href="https://i.stack.imgur.com/A02um.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/A02um.png" width="80" alt="Raspberry Pi 404" /></a></td>
</tr>
<tr>
<td>Emacs</td>
<td><a href="https://i.stack.imgur.com/KUafD.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/KUafD.png" width="80" alt="Emacs 404" /></a></td>
</tr>
<tr>
<td>Database Administrators</td>
<td><a href="https://i.stack.imgur.com/ly6am.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ly6am.png" width="80" alt="404" /></a></td>
</tr>
<tr>
<td>Graphic Design</td>
<td><a href="https://i.stack.imgur.com/FwQQL.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/FwQQL.png" width="80" alt="404" /></a></td>
</tr>
<tr>
<td>Android Enthusiasts</td>
<td><a href="https://i.stack.imgur.com/kgFiY.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/kgFiY.png" width="80" alt="404" /></a></td>
</tr>
<tr>
<td>Movies & TV</td>
<td><a href="https://i.stack.imgur.com/wCrM9.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wCrM9.png" width="80" alt="404" /></a></td>
</tr>
<tr>
<td>Software Recommendations</td>
<td><a href="https://i.stack.imgur.com/BqikQ.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/BqikQ.png" width="80" alt="404" /></a></td>
</tr>
<tr>
<td>Academia</td>
<td><a href="https://i.stack.imgur.com/l10yz.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/l10yz.png" width="80" alt="404" /></a></td>
</tr>
</tbody>
</table>
</div><h3>Change Log</h3>
<p>v0.3.0 introduces per-site user overrides and a configuration modal accessed by clicking on a "404" button added to the main site menu:</p>
<p><a href="https://i.stack.imgur.com/1mgi5.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1mgi5.png" alt="site menu with config button added" /></a></p>
<p>The modal allows you to change the image source for each of the sites with custom 404 pages (ability to add sites to the list coming soon) - it will be loaded instead of the default image:</p>
<img src="https://i.stack.imgur.com/HyhVs.gif" width="800" alt="configuration modal feature" />
<p>Since v0.8.0, there is a small icon next to each of the configuration labels - clicking on one takes you to the corresponding 404 page:</p>
<p><a href="https://i.stack.imgur.com/uQnqW.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/uQnqW.png" alt="config item with icon link" /></a></p>
<p>Since v1.1.1, there the configuration modal supports custom header text as well:</p>
<p><a href="https://i.stack.imgur.com/VCpf1.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/VCpf1.png" alt="config item with custom header input" /></a></p>
<p>Day-to-day changes:</p>
<div class="s-table-container">
<table class="s-table">
<thead>
<tr>
<th>Version</th>
<th>Updates</th>
</tr>
</thead>
<tbody>
<tr>
<td>0.6.0</td>
<td>options menu item is added for logged out users (or those without an account on a community) too</td>
</tr>
<tr>
<td>0.6.1</td>
<td>Added explicit support for the <a href="https://www.greasespot.net/" rel="nofollow noreferrer">Greasemonkey</a> userscript manager</td>
</tr>
<tr>
<td>0.7.0</td>
<td>Made modal draggable and made configuration modal load even on unsupported sites</td>
</tr>
<tr>
<td>0.8.0</td>
<td>Added quick links to 404 pages of each of the supported site</td>
</tr>
<tr>
<td>0.9.0</td>
<td>Added true cross-site configuration for Tampermonkey users</td>
</tr>
<tr>
<td>0.10.0</td>
<td>Added DBA, Android Enthusiasts and Graphic Design defaults</td>
</tr>
<tr>
<td>1.0.0</td>
<td>Deferred image replacement till "load" event; first major version</td>
</tr>
<tr>
<td>1.1.1</td>
<td>Added "Page not found" user overrides</td>
</tr>
<tr>
<td>1.2.0</td>
<td>Added Software Recs, Academia, and Movies & TV defaults</td>
</tr>
<tr>
<td>2.0.0</td>
<td>Switched to userscript manager-agnostic <a href="https://www.npmjs.com/package/@userscripters/storage" rel="nofollow noreferrer">storage</a>; fixed config item broken by recent UI updates</td>
</tr>
</tbody>
</table>
</div><h3>License</h3>
<p>The script is licensed under the <a href="https://spdx.org/licenses/GPL-3.0-or-later" rel="nofollow noreferrer">GPL-3.0-or-later</a> license.</p>
<h3>Download</h3>
<p><a href="https://github.com/userscripters/bring-back-404/raw/master/dist/modern/index.user.js" rel="nofollow noreferrer">Install</a> | <a href="https://github.com/userscripters/bring-back-404/raw/master/dist/modern/index.min.user.js" rel="nofollow noreferrer">Minified</a></p>
<p>The script <em>doesn't need</em> a userscript manager to work (but includes necessary headers).</p>
<p>Note that overrides are available <strong>cross-site</strong> only in userscript managers due to the nature of the <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy" rel="nofollow noreferrer">same-origin policy</a>.</p>
<h3>Platform</h3>
<p>Version number means "last tested on":</p>
<div class="s-table-container">
<table class="s-table">
<thead>
<tr>
<th>Chrome</th>
<th>Opera</th>
<th>Firefox</th>
<th>Edge</th>
<th>IE</th>
</tr>
</thead>
<tbody>
<tr>
<td>✔ 92.0.4515.107</td>
<td>✔ 77.0.4054.203</td>
<td>✔ 89.0</td>
<td>✔ 92.0.902.55</td>
<td>no</td>
</tr>
</tbody>
</table>
</div>
<p>Userscript managers:</p>
<div class="s-table-container">
<table class="s-table">
<thead>
<tr>
<th>Greasemonkey</th>
<th>Tampermonkey</th>
<th>Violentmonkey</th>
</tr>
</thead>
<tbody>
<tr>
<td>✔ 4.11</td>
<td>✔ 31</td>
<td>?</td>
</tr>
</tbody>
</table>
</div><h2>Contact</h2>
<p>Author: <a href="https://stackoverflow.com/users/11407695/oleg-valter">Oleg Valter</a>
<br>Organization: <a href="https://github.com/userscripters" rel="nofollow noreferrer">UserScripters</a></p>
<p>Please, submit bug reports <a href="https://github.com/userscripters/bring-back-404/issues" rel="nofollow noreferrer">on the source repository</a>.
<br>Before adding a new one, please check if it hasn't been raised before.</p>
<p>You can also <a href="https://chat.stackoverflow.com/rooms/214345/userscript-newbies-and-friends">drop by to chat</a>, we are a friendly bunch.</p>
<h2>Code</h2>
<p><a href="https://github.com/userscripters/bring-back-404/blob/master/src/index.ts" rel="nofollow noreferrer">Source code</a> written in TypeScript.</p>
<p>Contributions are welcome, you can always <a href="https://github.com/userscripters/bring-back-404/pulls" rel="nofollow noreferrer">submit a PR here</a>.</p>
https://stackapps.com/q/88929Stack Exchange One-Click Reviewsgparyanihttps://stackapps.com/users/276742021-03-22T06:21:52Z2024-02-26T20:07:40Z
<!-- version: 1.1 -->
<!-- tag: review -->
<!-- excerpt: Review items on Stack Exchange by simply clicking on the review action, rather than having to select and choose Submit -->
<h2>About</h2>
<p>The new UI for reviews introduced in early 2021 requires two clicks to submit reviews for an item: once to select the action, and a second time to submit the review. By contrast, the previous UI simply required a single click on an action button to submit a review.</p>
<p>Some users prefer the old behavior of simply having one click to submit a review. This script removes the requirement for a second click on the Submit button, and makes it so that clicking on a review action will immediately submit the review, restoring the former behavior of the old queue layout.</p>
<h3>Notes</h3>
<ul>
<li>To discourage robo-reviewing, there is a slight delay baked into the script: if you click on a review action too early, it will simply select the button without submitting the review.</li>
</ul>
<h3>Download</h3>
<p><a href="https://gitcdn.xyz/repo/gparyani/2bcc29740ab0da5fe38eff84e2a45efd/raw/d548b0b9a7a9480471d7888fa1ce64ea9462be14/oneclickreview.user.js" rel="nofollow noreferrer">Link to install the user script</a>. You will need to have a user script manager extension installed in your browser, such as Tampermonkey or Violentmonkey.</p>
<h3>Platform</h3>
<p>Tested with Tampermonkey on Microsoft Edge (new Chromium-based version) on Windows. Haven't tested with other browsers or user script managers, but should work with other platforms too.</p>
<h2>Code</h2>
<p><a href="https://gist.github.com/gparyani/2bcc29740ab0da5fe38eff84e2a45efd" rel="nofollow noreferrer">Source code</a></p>
https://stackapps.com/q/83697StackedOff - an offline StackExchange indexer and search engineBenhttps://stackapps.com/users/615752019-07-08T16:20:36Z2024-03-06T20:42:29Z
<p><a href="https://i.stack.imgur.com/hwsmp.png" rel="noreferrer"><img src="https://i.stack.imgur.com/hwsmp.png" alt="enter image description here"></a></p>
<p>StackedOff is an offline Stack Exchange site indexer and search engine. It's intended use is for people who wish to access Stack Exchange Network site(s), e.g. stackoverflow.com, but do not have a reliable internet service.
StackedOff uses the 'stack dump' data files made public by the Stack Exchange Network.</p>
<p>StackedOff is available for free under MIT license here: <a href="https://github.com/tools4j/stacked-off" rel="noreferrer">https://github.com/tools4j/stacked-off</a></p>
<p>Some screenshots:</p>
<p><strong>Search:</strong></p>
<p><a href="https://i.stack.imgur.com/OoLTH.png" rel="noreferrer"><img src="https://i.stack.imgur.com/OoLTH.png" alt="enter image description here"></a></p>
<p><strong>Question view</strong></p>
<p><a href="https://i.stack.imgur.com/g1684.png" rel="noreferrer"><img src="https://i.stack.imgur.com/g1684.png" alt="enter image description here"></a></p>
<p><strong>Selecting a site to index:</strong></p>
<p><a href="https://i.stack.imgur.com/4pCBn.png" rel="noreferrer"><img src="https://i.stack.imgur.com/4pCBn.png" alt="enter image description here"></a></p>
https://stackapps.com/q/66527Hide the Stack Exchange sidebarXZShttps://stackapps.com/users/365842015-10-30T00:38:37Z2024-03-19T09:34:22Z
<p>I would like to gain some screen estate when viewing Stack Exchange sites. The sidebar seldom shows information I need.</p>
<ul>
<li>I know most help content displayed when composing questions.</li>
<li>Most related answers are found by the same search that already brought me to the question I am currently viewing, so I already have them open in other browser tabs anyways.</li>
<li>Hot Network Questions always distracts me to <a href="http://scifi.stackexchange.com">scifi</a>.</li>
</ul>
<p>I know there is a <a href="https://userstyles.org/" rel="noreferrer">userstyle</a> to <a href="https://userstyles.org/styles/111692/stackexchange-remove-hot-network-questions-widget" rel="noreferrer">hide the <em>Hot Network Questions</em></a> and one that <a href="https://userstyles.org/styles/111859/hide-the-sidebar-on-unix-stackexchange-com" rel="noreferrer">completely removes the sidebar</a> leaving an ugly hole where it once was. Is it possible to hide it and have the question, list, or whatever content takes the main part of the page expand to claim its place?</p>
https://stackapps.com/q/46634Is it possible to access data in real-time using the Stack Exchange API?Rakesh Adhikesavanhttps://stackapps.com/users/260382014-04-30T20:26:24Z2024-01-19T01:11:57Z
<p>I want to show an animation of:</p>
<ul>
<li>Questions being asked and answered in the most popular tag</li>
<li>Comments being posted</li>
<li>New users joining</li>
</ul>
<p>All in real time.<br>
Is there access to real-time data?</p>
https://stackapps.com/q/32113StackScraper - export questions as JSON or HTMLJeremyhttps://stackapps.com/users/41122012-03-05T22:57:16Z2024-01-27T14:05:20Z
<p><!-- excerpt: Adds download options to Stack Exchange questions. -->
<!-- tag: script -->
<!-- version: 0.2.6 -->
<!-- thumbnail: https://i.stack.imgur.com/zFJeI.png -->
</p>
<h2>About</h2>
<p>StackScraper is a user script that adds HTML and JSON export options to each question. The JSON loosely resembles the API format and includes the HTML and markdown bodies of all posts, as well as their comments and vote counts (if you have permission to view them). The HTML displays the content similarly to Stack Exchange and includes the necessary attribution. Comments are included, but initially hidden.</p>
<p><img src="https://i.stack.imgur.com/DTRmi.png" width="300"></p>
<p>As an example, here are the <a href="https://s3.amazonaws.com/23e9f5/87d65ee1-05e9-44aa-bdca-7aed385d27f3%23question-3126096.json" rel="nofollow noreferrer">JSON</a> and <a href="https://s3.amazonaws.com/23e9f5/2d615e2a-f8e2-45df-9263-67d5cd17c35b%23question-3126096.html" rel="nofollow noreferrer">HTML</a> dumps of <a href="//stackoverflow.com/q/3126096">a deleted question</a>.</p>
<p><a href="https://s3.amazonaws.com/23e9f5/2d615e2a-f8e2-45df-9263-67d5cd17c35b%23question-3126096.html" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/V24Lt.png" width="300"></a></p>
<h3>License</h3>
<p>Released under the <a href="http://www.opensource.org/licenses/mit-license.php" rel="nofollow noreferrer">MIT Open Source License</a>.</p>
<h3>Installation</h3>
<p><a href="https://github.com/extensions/stackscraper/raw/gh-pages/stackscraper.user.js" rel="nofollow noreferrer"><strong>Click here</strong></a> to install or update StackScraper.</p>
<h3>Platforms</h3>
<ul>
<li>Google Chrome, probably</li>
<li>Mozilla Firefox + <a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/" rel="nofollow noreferrer">Greasemonkey</a>, possibly</li>
</ul>
<p>(Not well-tested yet.)</p>
<h2>Contact</h2>
<p>StackScraper was written by me, Jeremy Banks. Feedback and bug reports can be posted as comments or answers below.</p>
<h2>Code</h2>
<p>StackScraper was written in <a href="http://coffeescript.org/" rel="nofollow noreferrer">CoffeeScript</a>. You can view or contribute to the source <a href="https://github.com/extensions/stackscraper" rel="nofollow noreferrer">here on GitHub</a>.</p>
https://stackapps.com/q/28916API InconsistenciesDave DeLonghttps://stackapps.com/users/4482012-01-04T23:26:50Z2024-01-25T10:06:35Z
<p>In my opinion, one of the hallmarks of a good API is that it is self-consistent. It establishes easy-to-remember conventions and then follows them. </p>
<p>As I'm trying to adopt the 2.0 API, I'm finding a whole bunch of inconsistencies in the API that are making it <em>really</em> frustrating to work with. Here are some of the things that are really bothering me:</p>
<ul>
<li><p>The value for the <code>sort</code> query parameter should <em>always</em> correspond to a field in the object of the returned JSON. It usually doesn't. For example, if I want to sort badges by their <code>badge_type</code>, I have to pass in <code>sort=type</code>. It <em>should</em> be <code>sort=badge_type</code>. (another example, for tags I do <code>sort=popular</code> even though it really should be <code>sort=count</code>)</p></li>
<li><p>I should not be able to sort by something that does not correspond to a field in the object returned. For example, I can sort Tags by "activity" (<code>sort=activity</code>), but there's nothing in the returned Tag objects that indicates what that activity is. If we really want to be able to sort Tags by the time they were last used, then Tags should have a <code>last_used_date</code> field that contains the timestamp of the last time the tag was added to a Question, and then I should do <code>sort=last_used_date</code>)</p></li>
<li><p>I find it really annoying that some object fields don't make sense in all contexts. For example, the Badge <code>user</code> field is only relevant if I'm requesting awarded badges (i.e. via <code>/badges/recipients</code> or <code>/badges/{ids}/recipients</code>). If the field is not always relevant, it <em>should not</em> be there. Instead, the <code>*/recipients</code> endpoints should return "Awarded Badge" objects that have <code>award_count</code>, <code>user</code>, and <code>badge</code> fields.</p></li>
<li><p>Tags, Badges, and Users all have <code>name</code> (or <code>display_name</code>) fields. So why can't I do <code>inname=foo</code> when requesting Badges? If you're going to offer searching by name on some things, you should offer searching by name on <em>all</em> things.</p></li>
</ul>
<p>There are more, but these are ones that I remember right now. As I come across more I'll also post those.</p>
https://stackapps.com/q/16727Application marketing ideasAdam Wrighthttps://stackapps.com/users/52010-10-06T20:01:15Z2024-01-26T12:35:02Z
<p>As I prepare to ship v1.1 of <a href="http://sixtoeightapp.com" rel="noreferrer">Six to Eight</a>, I'm curious as to what ideas other people might have for Stack Exchange app marketing. How do we reach Stack Exchange users without either annoying them with spammy messages or spending a fortune (or, indeed, anything beyond time).</p>
<p>Six to Eight has been about as successful as I'd hoped so far. I've shipped around 1000 copies: around 450 on the day it first hit the App Store and Jeff tweeted it, 150 when it came 3rd in the SE API competition, then a steady trickle at about 50 new downloads a week. I'm happy, but I think there're more users out there who might like it.</p>
<p>My only real ideas so far are posting on the meta sites, which I've rejected as being too spam like. I guess I could buy Stack Exchange ad space, but I've got no marketing budget for a free app. I like to encourage users to spread the word, especially to the audience on the new Stack Exchanges, but I don't know how.</p>
<p>How are other developers promoting their work, and what can I do to encourage more adoption?</p>
https://stackapps.com/q/156765StackFlair - **Defunct** Generate flair for your Stack Exchange associated accountsRebecca Chernoffhttps://stackapps.com/users/22862010-09-13T17:09:44Z2024-01-09T07:58:38Z
<p>Note: This app, and the associated website have been offline since 2012.<br>
The GitHub project may still be useful to you.</p>
<hr>
<!-- Thumbnail: https://i.stack.imgur.com/SZAxy.png -->
<h2>Sample flair styles:</h2>
<p><img src="https://i.stack.imgur.com/1W4ig.png" alt="rchern A"><br>
<img src="https://i.stack.imgur.com/6Vbjt.png" alt="rchern B"><br>
<img src="https://i.stack.imgur.com/OmXDh.png" alt="rchern C"></p>
<h2>About</h2>
<p>There have been several requests on Meta Stack Overflow for a way to get a combined flair similar to what is shown on Area 51. I took a "I want it, I'll make it" approach. Thus became <em>StackFlair</em>.</p>
<p>StackFlair generates a combined flair representing all of your associated Stack Exchange accounts. StackFlair includes:</p>
<ul>
<li>Your gravatar from your top site (by reputation points)</li>
<li>Your display name from your top site</li>
<li>Your total reputation points</li>
<li>The number of sites you are a moderator on</li>
<li>The total number of gold badges</li>
<li>The total number of silver badges</li>
<li>The total number of bronze badges</li>
<li>Favicons for your top six sites</li>
</ul>
<p><sub>Area 51 is currently excluded as the site is not included in the API.</sub></p>
<p>The default output is HTML to support linking and titles for the elements contained in the flair. <strong>You can also get image output.</strong></p>
<p>I provide a very simplistic UI for selecting a Stack Exchange site and inputting a user id. The generated content can also be linked to directly so that you can use the URL anywhere you can embed an image or pull dynamic HTML.</p>
<p>Several options are available: themes, excluding beta sites, using a single site or combined flair, HTML or image output. I am very open to more feature requests regarding customization options, theme, and layout.</p>
<p>Your StackFlair data is stored for 12 hours.</p>
<h3>Website Usage</h3>
<p>StackFlair homepage (Now dead): <strike><a href="http://stackflair.com" rel="nofollow noreferrer">http://stackflair.com</a></strike></p>
<p>Direct flair link (Now dead): <strike><a href="http://stackflair.com/generate/" rel="nofollow noreferrer">http://stackflair.com/generate/</a>{associationId}</strike></p>
<p>When you visit the StackFlair homepage and enter in the details, you will be redirected to a direct flair link which you can use from then on.</p>
<h3>Compatibility</h3>
<p>StackFlair has been tested in Internet Explorer 8, Firefox 3.6, Chrome 7, and the mobile version of <a href="http://en.wikipedia.org/wiki/Safari_%28web_browser%29" rel="nofollow noreferrer">Safari</a> (iPhone).</p>
<h2>Issue Reporting and Tracking</h2>
<p>Please report any bugs, feature requests, and issues at <a href="http://github.com/rchern/StackFlair" rel="nofollow noreferrer">the <em>StackFlair</em> GitHub project</a>.</p>
<p>I am happy to do even the smallest of requests, such as <em>My blog colors are <x>, can you use that in a theme for me?</em></p>
<p>StackFlair is also listed on <a href="http://stacklist.quickmediasolutions.com/view_app.php?id=53" rel="nofollow noreferrer">StackList</a></p>
<h3>License and Code</h3>
<p>StackFlair is an ASP.NET website written in C#. The <a href="https://stackapps.com/questions/6/stacky-a-net-client-library">Stacky</a> library is used for API access.</p>
<p>The project is hosted at <a href="http://github.com/rchern/StackFlair" rel="nofollow noreferrer">github.com/rchern/StackFlair</a>.</p>
https://stackapps.com/q/3592Retrieving a post with a specific IDDave DeLonghttps://stackapps.com/users/4482010-05-29T19:38:01Z2024-03-08T07:59:54Z
<p>According to <a href="https://stackapps.com/questions/299">this question (and its answer)</a>, questions and answers are using the same index to determine their ID. In other words:</p>
<ul>
<li>Question with ID #1
<ul>
<li>Answer with ID #2</li>
<li>Answer with ID #3</li>
<li>Answer with ID #4</li>
</ul></li>
<li>Question with ID #5</li>
</ul>
<p>Because the 3 answers consumed 3 ids, it is impossible for a question to have ID #2, #3, or #4. This is the behavior as defined in the question linked to above.</p>
<p>However, this is not reflected in the API. In some cases, you must know the type of a post in order to request information about it. For example, if you want to request the comments of a particular post, you must use either <code>/questions/{id}/comments</code> or <code>/answers/{id}/comments</code>. It would be really wonderful if I could just use <code>/posts/{id}/comments</code> and not have to rely on knowing the post type in order to retrieve its comments.</p>
<p>Pretty please?</p>