Live test: [Html for live test of clewd without authentication after Fofa gets it]
x1<!DOCTYPE html>2<html lang="en">3<head>4<meta charset="UTF-8">5<meta name="viewport" content="width=device-width, initial-scale=1.0">6<title>OpenAI API Request Tester</title>7<style>8body {9font-family: Arial, sans-serif;10max-width: 800px;11margin: 0 auto;12padding: 20px;13background-color: #f0f0f0;14}15h1, h2 {16color: #333;17text-align: center;18}19.input-group {20margin-bottom: 15px;21}22label {23display: block;24margin-bottom: 5px;25font-weight: bold;26color: #555;27}28textarea, input[type="text"] {29width: 100%;30padding: 8px;31border: 1px solid #ddd;32border-radius: 4px;33box-sizing: border-box;34}35textarea {36height: 100px;37resize: vertical;38}39button {40display: block;41width: 100%;42padding: 10px;43background-color: #4CAF50;44color: white;45border: none;46border-radius: 4px;47cursor: pointer;48font-size: 16px;49}50button:hover {51background-color: #45a049;52}53#results, #progress, #successfulUrls {54margin-top: 20px;55padding: 10px;56background-color: white;57border-radius: 4px;58box-shadow: 0 2px 4px rgba(0,0,0,0.1);59}60.success {61color: green;62}63.error {64color: red;65}66.copyable {67cursor: pointer;68color: blue;69text-decoration: underline;70}71</style>72</head>73<body>74<h1>OpenAI API Request Tester</h1>75<div class="input-group">76<label for="baseUrls">Base URLs:</label>77<textarea id="baseUrls" placeholder="Enter base URLs, one per line">http://45.159.211.109:777778http://45.159.208.90:844479http://118.25.198.103:844480http://45.159.208.220:555581http://194.36.209.120:844482http://198.144.180.166:8444</textarea>83</div>84<div class="input-group">85<label for="apiKey">API Key:</label>86<input type="text" id="apiKey" placeholder="Enter API Key" value="aaa">87</div>88<div class="input-group">89<label for="model">Model:</label>90<input type="text" id="model" value="claude-3-haiku-20240307">91</div>92<div class="input-group">93<label for="prompt">Prompt:</label>94<input type="text" id="prompt" value="hi">95</div>96<button onclick="testUrls()">Test URLs</button>97<div id="progress"></div>98<div id="results"></div>99<h2>Successful URLs (Status 200)</h2>100<div id="successfulUrls"></div>101102<script>103async function openaiRequest(prompt, baseUrl, apiKey, model) {104const headers = {105'Content-Type': 'application/json',106'Authorization': `Bearer ${apiKey}`107};108109const body = {110model: model,111messages: [112{113role: "user",114content: prompt115}116]117};118119const controller = new AbortController();120const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 seconds timeout121122try {123const response = await fetch(`${baseUrl}/v1/chat/completions`, {124method: 'POST',125headers: headers,126body: JSON.stringify(body),127signal: controller.signal128});129clearTimeout(timeoutId);130131if (response.status === 200) {132const data = await response.json();133return {134status: response.status,135ok: response.ok,136text: data.choices[0].message.content137};138}139140return {141status: response.status,142ok: response.ok143};144} catch (error) {145clearTimeout(timeoutId);146console.error('Error:', error);147return {148status: 'Error',149ok: false,150error: error.name === 'AbortError' ? 'Request timed out' : error.message151};152}153}154155async function testUrls() {156const baseUrls = document.getElementById('baseUrls').value.split('\n').filter(url => url.trim() !== '');157const apiKey = document.getElementById('apiKey').value;158const model = document.getElementById('model').value;159const prompt = document.getElementById('prompt').value;160const resultsDiv = document.getElementById('results');161const progressDiv = document.getElementById('progress');162const successfulUrlsDiv = document.getElementById('successfulUrls');163resultsDiv.innerHTML = '';164progressDiv.innerHTML = '';165successfulUrlsDiv.innerHTML = '';166167const successfulUrls = [];168169for (const baseUrl of baseUrls) {170progressDiv.innerHTML = `正在检测 ${baseUrl}...`;171const result = await openaiRequest(prompt, baseUrl.trim(), apiKey, model);172const statusClass = result.ok ? 'success' : 'error';173let statusText = result.status;174if (result.error) {175statusText += ` (${result.error})`;176}177if (result.text) {178statusText += `<br>回复: ${result.text}`;179}180resultsDiv.innerHTML += `<p>${baseUrl}: <span class="${statusClass}">${statusText}</span></p>`;181182if (result.status === 200) {183successfulUrls.push(baseUrl.trim());184}185}186progressDiv.innerHTML = '检测完成!';187188if (successfulUrls.length > 0) {189successfulUrlsDiv.innerHTML = successfulUrls.map(url =>190`<p><span class="copyable" onclick="copyToClipboard('${url}')">${url}</span></p>`191).join('');192} else {193successfulUrlsDiv.innerHTML = '<p>没有状态码为200的URL</p>';194}195}196197function copyToClipboard(text) {198navigator.clipboard.writeText(text).then(() => {199alert('URL已复制到剪贴板');200}).catch(err => {201console.error('无法复制URL: ', err);202});203}204</script>205</body>206</html>
CF-WORK (Open web UI) just request the worker address in openai format.
xxxxxxxxxx601const CUSTOM_API_URL = 'https://替换成Open Web UI的网址/api/chat/completions';2const CUSTOM_API_KEY = '替换成你的token 在Open Web UI设置里面可以获取'; // 替换为实际 API 密钥34addEventListener('fetch', event => {5event.respondWith(handleRequest(event.request))6})78async function handleRequest(request) {9if (request.method !== 'POST') {10return new Response('Method Not Allowed', { status: 405 });11}1213const contentType = request.headers.get('content-type');14if (!contentType || !contentType.includes('application/json')) {15return new Response('Content-Type must be application/json', { status: 400 });16}1718try {19const requestBody = await request.json();2021// 构建发送到自定义 API 的请求体,直接使用前端传递的所有参数22const customRequestBody = {23...requestBody,24stream: requestBody.stream || false25};2627const customResponse = await fetch(CUSTOM_API_URL, {28method: 'POST',29headers: {30'Content-Type': 'application/json',31'Authorization': `Bearer ${CUSTOM_API_KEY}`32},33body: JSON.stringify(customRequestBody)34});3536if (!customResponse.ok) {37throw new Error(`API request failed with status ${customResponse.status}`);38}3940if (customRequestBody.stream) {41return new Response(customResponse.body, {42headers: {43'Content-Type': 'text/event-stream',44'Cache-Control': 'no-cache',45'Connection': 'keep-alive'46}47});48} else {49const responseData = await customResponse.json();50return new Response(JSON.stringify(responseData), {51headers: { 'Content-Type': 'application/json' }52});53}54} catch (error) {55return new Response(JSON.stringify({ error: error.message }), {56status: 500,57headers: { 'Content-Type': 'application/json' }58});59}60}
<OVER.>