72. Send notifications to your preferred platform (Discord, Slack, email, etc.)
8
9Reddit does not have an API that allows users to scrape data, so we are doing this with the Google Search API, [Serp](https://serpapi.com/).
10
11---
29
30---
31### 3. Get a SerpApi Key
32This template requires a [SerpApi](https://serpapi.com/) key to search Reddit posts via Google search results.
33
341. **Get a SerpApi key**:
35 - Sign up at [SerpApi](https://serpapi.com/) to create an account.
36 - Generate an API key from your account dashboard.
37
382. **Add the SerpApi key to your environment variables**:
39 - Go to your [Val Town environment variables](https://www.val.town/settings/environment-variables).
40 - Add a new key:
41 - Key: `SERP_API_KEY`
42 - Value: Your SERP API key.
43
44Without this key, the val will not function correctly.
75
76### NOTE: Usage Limits
77- **SerpApi:** Free SerpApi accounts have monthly call limits.
1import { searchWithSerpApi } from "https://esm.town/v/charmaine/searchWithSerpApi";
2import { discordWebhook } from "https://esm.town/v/stevekrouse/discordWebhook";
3
4// Customize your search parameters
5const KEYWORDS = "\"node\" OR \"node.js\"";
6const DISCORD_API_KEY = Deno.env.get("mentionsDiscord");
7const SERP_API_KEY = Deno.env.get("SERP_API_KEY");
8
9// Set isProd = false for testing and = true for production
13
14export async function redditAlert({ lastRunAt }: Interval) {
15 if (!SERP_API_KEY || !DISCORD_API_KEY) {
16 console.error("Missing SERP_API_KEY or Discord webhook URL. Exiting.");
17 return;
18 }
19
20 // Determine the time frame for the search
21 // Details on as_qdr: https://serpapi.com/advanced-google-query-parameters#api-parameters-advanced-search-query-parameters-as-qdr
22 const timeFrame = isProd
23 ? lastRunAt
27
28 try {
29 const response = await searchWithSerpApi({
30 query: KEYWORDS,
31 site: "reddit.com",
32 apiKey: SERP_API_KEY,
33 as_qdr: timeFrame,
34 });
62 if (isProd) {
63 await discordWebhook({
64 url: DISCORD_API_KEY,
65 content,
66 });
13## Authentication
14
15Login to your SQLite Explorer with [password authentication](https://www.val.town/v/pomdtr/password_auth) with your [Val Town API Token](https://www.val.town/settings/api) as the password.
16
17## Todos / Plans
27 <head>
28 <title>SQLite Explorer</title>
29 <link rel="preconnect" href="https://fonts.googleapis.com" />
30
31 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
32 <link
33 href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@300..700&family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap"
34 rel="stylesheet"
35 />
16 const { prompt } = await c.req.json();
17
18 const replicate = new Replicate({ auth: Deno.env.get("REPLICATE_API_TOKEN") });
19 const model = "black-forest-labs/flux-schnell";
20 const output = await replicate.run(model, {
5export default async function handler() {
6 const result = {
7 apiKeyStatus: null,
8 evalStarted: false,
9 evalComplete: false,
13
14 try {
15 // Check API key
16 const apiKey = Deno.env.get("BRAINTRUST_API_KEY");
17 if (!apiKey) {
18 throw new Error("Add BRAINTRUST_API_KEY to your environment variables");
19 }
20 result.apiKeyStatus = "found";
21 console.log("API Key status:", result.apiKeyStatus);
22
23 // Start evaluation
12
13- Click `Fork` on this val
14- Get your Braintrust API key at https://www.braintrust.dev/app/settings?subroute=api-keys
15- Add it to your project `Environment Variables` (on the left side bar of this project) as `BRAINTRUST_API_KEY`
16- Click `Run` on the `tutorial` val
1const respNoAuth = await fetch(
2 "https://api.val.town/v1/projects/0e843a78-e4c6-11ef-9b31-e6cdfca9ef9f/branches?limit=100",
3);
4console.log(await respNoAuth.json());
5
6const respAuthed = await fetch(
7 "https://api.val.town/v1/projects/0e843a78-e4c6-11ef-9b31-e6cdfca9ef9f/branches?limit=100",
8 { headers: { "Authorization": `Bearer ${Deno.env.get("valtown")}` } },
9);
1import { OpenAPIHono } from "https://esm.sh/@hono/zod-openapi@0.18.4";
2import { createRoute } from "https://esm.sh/@hono/zod-openapi@0.18.4";
3import { z } from "https://esm.sh/@hono/zod-openapi@0.18.4";
4import { HTTPException } from "https://esm.sh/hono@4.7.0/http-exception";
5import { ErrorSchema } from "../schema.ts";
6import type { AppType } from "../types.ts";
7
8export const superProtectedApi = new OpenAPIHono<AppType>();
9
10// Define a mock route that is protected with bearer auth
34
35// Mock middleware that just returns 401 if there's no authorization header for the request
36superProtectedApi.use(async (c, next) => {
37 if (!c.req.header("authorization")) {
38 return c.json({ error: "Unauthorized" }, 401);
41});
42
43superProtectedApi.openapi(superSecretSecretsRoute, c => {
44 return c.json({ secrets: ["cold harbor", "other secret idk"] }, 200);
45});
46
47superProtectedApi.openAPIRegistry.registerComponent("securitySchemes", "Bearer", {
48 type: "http",
49 scheme: "bearer",
3 "https://orbiter.host",
4 "https://app.orbiter.host",
5 "https://api.orbiter.host/health"
6 ]
7}