51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

使用cf的Worker代理TelegramBotApi

前言 {#%E5%89%8D%E8%A8%80}

众所周知TelegramBotApi在国内无法使用。并且我们要在程序中使用TelegramBotApi时,代理程序不好写进去,一般都会使用系统代理或干脆直接tun模式来强制程序代理。这时不妨换个思路,使用cloudflare代理telegram bot api。(也可以在vps上使用nginx反代。但白嫖cloudflare更爽)

创建Workers反代项目 {#%E5%88%9B%E5%BB%BAworkers%E5%8F%8D%E4%BB%A3%E9%A1%B9%E7%9B%AE}

2023-03-31_09-35

名称随意填写,但是下面需要选择 HTTP路由器

2023-03-31_09-38

创建好之后进行编辑 选择快速编辑按钮
粘贴下面内容

/**
 * Helper functions to check if the request uses
 * corresponding method.
 *
 */
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;
};


/\*




* The regex to get the bot_token and api_method from request URL


* as the first and second backreference respectively.
  */
  const URL_PATH_REGEX = /^/bot(?<bot_token>[^/]+)/(?<api_method>[a-z]+)/i;




/\*\*




* 
  Router handles the logic of what handler is matched given conditions





* 
  for each request
  \*/
  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 = 'No matching route found';
       const error_code = 404;

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




  }


  /\*\*



  * 
    It returns the matching route that returns true





  * 
    for all the conditions if any.
    \*/
    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) =&gt; c(req));




    });
    }
    }









/\*\*




* 
  Sends a POST request with JSON data to Telegram Bot API





* 
  and reads in the response body.





* 
  @param {Request} request the incoming request
  \*/
  async function handler(request) {
  // Extract the URl method from the request.
  const { url, ..._request } = request;



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


  // Leave the first match as we are interested only in backreferences.
  const { bot_token, api_method } = path.match(URL_PATH_REGEX).groups;


  // Build the URL
  const api_url = 'https://api.telegram.org/bot' + bot_token + '/' + api_method + search;


  // Get the response from 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;
  }






/\*\*




* 
  Handles the incoming request.





* 
  @param {Request} request the incoming 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;
  }






/\*\*

`
`
* `Hook into the fetch event.
  */
  addEventListener('fetch', (event) => {
  event.respondWith(handleRequest(event.request));
  });
  `

2023-03-31_09-40

到此步,使用cf生成域名应该还是访问不了,需要绑定自己的域名.

2023-03-31_09-42

使用 {#%E4%BD%BF%E7%94%A8}

之后,只需要把telegram api地址替换成 https://yourdomain.xxx 即可

赞(0)
未经允许不得转载:工具盒子 » 使用cf的Worker代理TelegramBotApi