baicai

白菜

一个勤奋的代码搬运工!

Telegram Bot Api リバースプロキシの構築

いくつかの理由により、epusdt を設定するには tg 逆プロキシアドレスを使用する必要があります!

#telegramプロキシurl(中国本土のサーバーは、1台の海外サーバーを使用してtgのurlを逆プロキシできます)、もし元々海外サーバーで実行している場合は記入する必要はありません
tg_proxy=

2 つの実装案があり、個人の好みに応じて選択または活用してください。

Nginx 逆プロキシ Telegram Api#

nginx のインストール#

sudo apt update && sudo apt install -y nginx

設定ファイルの作成#

nano tgapi.conf

以下の内容を入力して保存します。

server {
    listen 80;
    server_name tgapi.domain;
    location / {
       return 444;
    }
    location ~* ^/bot {
        resolver 8.8.8.8;
        proxy_buffering off;
        proxy_pass      https://api.telegram.org$request_uri;
    }
}

設定の読み込み#

sudo systemctl reload nginx
#または
sudo nginx -s reload

アクセスのテスト#

以下のコマンドを入力し、BOT_TOKEN を自分のボットトークンに置き換えます。

curl https://tgapi.domain/bot<BOT_TOKEN>/getMe

ボットの情報が表示されれば、使用可能です。

epusdt の telegram プロキシ url の設定#

epusdt の設定 (.env) の参考

#telegramプロキシurl(中国本土のサーバーは、1台の海外サーバーを使用してtgのurlを逆プロキシできます)、もし元々海外サーバーで実行している場合は記入する必要はありません
tg_proxy=https://tgapi.domain

docker の nginx 設定の参考 docker-compose.yam の内容#

version: "3"
services:
  nginx:
    container_name: "nginx"
    restart: always
    ports:
      - "80:80"
    image: nginx:bookworm
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./log:/var/log/nginx
    extra_hosts:
      - "host.docker.internal:host-gateway"

Cloudflare Worker を使用して Telegram Bot Api をプロキシする#

使用前提

  1. Cloudflare にホスティングされているドメイン
  2. Cloudflare の無料 worker サービスを有効にする

まず Cloudflare にログインし、左側の Workers と Pages をクリックします。#

アプリケーションを作成 - workerを作成をクリックします。

名前は自由に記入し、デプロイをクリックします。

作成が完了したら、作成した Worker をクリックし、次にクイック編集をクリックします。

左側の元のコードを削除し、以下のコードを入力します。

/**
 * リクエストが対応するメソッドを使用しているかどうかを確認するためのヘルパー関数。
 *
 */
const Method = (method) => (req) => req.method.toLowerCase() === method.toLowerCase();
const Get = Method('get');
const Post = Method('post');

const Path = (regExp) => (req) => {
	const url = new URL(req.url);
	const path = url.pathname;
	return path.match(regExp) && path.match(regExp)[0] === path;
};

/*
 * リクエストURLからbot_tokenとapi_methodを取得するための正規表現
 * それぞれ最初と2番目のバックリファレンスとして。
 */
const URL_PATH_REGEX = /^\/bot(?<bot_token>[^/]+)\/(?<api_method>[a-z]+)/i;

/**
 * ルーターは、各リクエストの条件に基づいてどのハンドラーが一致するかのロジックを処理します。
 */
class Router {
	constructor() {
		this.routes = [];
	}

	handle(conditions, handler) {
		this.routes.push({
			conditions,
			handler,
		});
		return this;
	}

	get(url, handler) {
		return this.handle([Get, Path(url)], handler);
	}

	post(url, handler) {
		return this.handle([Post, Path(url)], handler);
	}

	all(handler) {
		return this.handler([], handler);
	}

	route(req) {
		const route = this.resolve(req);

		if (route) {
			return route.handler(req);
		}

		const description = '一致するルートが見つかりません';
		const error_code = 404;

		return new Response(
			JSON.stringify({
				ok: false,
				error_code,
				description,
			}),
			{
				status: error_code,
				statusText: description,
				headers: {
					'content-type': 'application/json',
				},
			}
		);
	}

	/**
	 * 条件がすべてtrueを返す一致するルートを返します。
	 */
	resolve(req) {
		return this.routes.find((r) => {
			if (!r.conditions || (Array.isArray(r) && !r.conditions.length)) {
				return true;
			}

			if (typeof r.conditions === 'function') {
				return r.conditions(req);
			}

			return r.conditions.every((c) => c(req));
		});
	}
}

/**
 * Telegram Bot APIにJSONデータをPOSTリクエストで送信し、
 * レスポンスボディを読み取ります。
 * @param {Request} request 受信リクエスト
 */
async function handler(request) {
	// リクエストからURLメソッドを抽出します。
	const { url, ..._request } = request;

	const { pathname: path, search } = new URL(url);

	// 最初の一致を残します。バックリファレンスのみが興味があります。
	const { bot_token, api_method } = path.match(URL_PATH_REGEX).groups;

	// URLを構築します。
	const api_url = 'https://api.telegram.org/bot' + bot_token + '/' + api_method + search;

	// APIからのレスポンスを取得します。
	const response = await fetch(api_url, _request);

	const result = await response.text();

	const res = new Response(result, _request);

	res.headers.set('Content-Type', 'application/json');

	return res;
}

/**
 * 受信リクエストを処理します。
 * @param {Request} request 受信リクエスト。
 */
async function handleRequest(request) {
	const r = new Router();
	r.get(URL_PATH_REGEX, (req) => handler(req));
	r.post(URL_PATH_REGEX, (req) => handler(req));

	const resp = await r.route(request);
	return resp;
}

/**
 * fetchイベントにフックします。
 */
addEventListener('fetch', (event) => {
	event.respondWith(handleRequest(event.request));
});

保存してデプロイ

管理ダッシュボードのホームページに戻り、左側のウェブサイトをクリックし、右側でCloudflareにホスティングされているドメインをクリックします。

そのドメインの下のWorkersルートを選択します。

ルートを追加を選択します。

ルートには使用したいサブドメインを記入します。例えば:tgapi.domain/* 注意:最後は/*で終わる必要があります。Workerには先ほど作成したサービスを選択し、保存すれば完了です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。