Public
HTTP (deprecated)
Val Town is a social website to write and deploy JavaScript.
Build APIs and schedule functions from your browser.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
interface WikipediaImage {
source: string;
width: number;
height: number;
}
interface WikipediaPageData {
title: string;
pageId: number;
extract: string;
image?: WikipediaImage;
url: string;
}
export const fetchWikipediaImage = async (request: Request): Promise<Response> => {
const url = new URL(request.url);
const pageName = url.searchParams.get("title");
const format = url.searchParams.get("format")?.toLowerCase() ?? "text";
if (!pageName) {
return new Response("Page name is required", { status: 400 });
}
try {
const pageData = await getWikipediaPageData(pageName);
if (!pageData) {
return new Response("Page not found", { status: 404 });
}
return formatResponse(pageData, format);
} catch (error) {
console.error("Error fetching Wikipedia image:", error);
return new Response("An error occurred while fetching the image", { status: 500 });
}
};
async function enhancedWikipediaSearch(pageName: string): Promise<any | null> {
const apiUrl = new URL("https://en.wikipedia.org/w/api.php");
apiUrl.searchParams.append("action", "query");
apiUrl.searchParams.append("list", "search");
apiUrl.searchParams.append("srsearch", pageName);
apiUrl.searchParams.append("srnamespace", "0");
apiUrl.searchParams.append("srlimit", "1");
apiUrl.searchParams.append("format", "json");
const response = await fetch(apiUrl.toString());
const data = await response.json();
if (!data.query || !data.query.search || data.query.search.length === 0) {
return null;
}
return data.query.search[0];
}
async function getWikipediaPageData(pageName: string): Promise<WikipediaPageData | null> {
const searchResult = await enhancedWikipediaSearch(pageName);
if (!searchResult) {
return null;
}
const apiUrl = new URL("https://en.wikipedia.org/w/api.php");
apiUrl.searchParams.append("action", "query");
apiUrl.searchParams.append("titles", searchResult.title);
apiUrl.searchParams.append("prop", "pageimages|extracts|info|images|pageprops");
apiUrl.searchParams.append("piprop", "original|name");
apiUrl.searchParams.append("pithumbsize", "1000");
apiUrl.searchParams.append("pilimit", "1");
apiUrl.searchParams.append("exintro", "1");
apiUrl.searchParams.append("explaintext", "1");
apiUrl.searchParams.append("redirects", "1");
apiUrl.searchParams.append("inprop", "url");
apiUrl.searchParams.append("format", "json");
const response = await fetch(apiUrl.toString());
const data = await response.json();
console.log("API Response:", JSON.stringify(data, null, 2));
if (!data.query || !data.query.pages) {
return null;
}
const pages = Object.values(data.query.pages);
if (pages.length === 0) {
return null;
}
const page = pages[0] as any;
const image = await getImageFromPage(page);
return {
title: page.title,
pageId: page.pageid,
extract: page.extract || "No description available.",
image: image,
url: page.fullurl,
};
}
ampp-wikiimage.web.val.run
August 20, 2024