好吧,這個大陸不適用。 不過可能有台灣人。
因為mudlib裡面無法處理HTTPS request,所以做法是把訊息先轉載到Python Script再轉發出去。
先在BOT FATHER上申請Bot, 拿到API Token, 開啟頻道,抓到頻道ID (chat_id).
在channeld上:
if(verb == "chat" || verb == "rumor" ) {
if(me->query("id") != "Telegram Daemon") "/adm/daemons/notify_d"->do_send(msg);
}
// Telegram Daemon是處理Telegram->ES2的回信。 就不再轉發到TG出了。
泥巴外的Pyhton:
import time
import socket
import requests
import json
import re
import sys
import datetime
localIP = "0.0.0.0"
localPort = 4001
bufferSize = 1024
onesignal_api_token = "OneSignal的PUSH API token"
telegram_api = "Telegram BOT的API Token"
ansi_escape_8bit = re.compile(
br'(?:\x1B[@-Z\\-_]|[\x80-\x9A\x9C-\x9F]|(?:\x1B\[|\x9B)[0-?]*[ -/]*[@-~])'
)
msgs = {
#處理特定事件Onesignal Push.
}
#這邊處理OneSignal 的Push
def sendAlert(x):
header = {"Content-Type": "application/json; charset=utf-8",
"Authorization": "Basic " + onesignal_api_token}
payload = {"app_id": "2bf22c13-7d70-4b30-82ff-f6a43d5136bb",
"included_segments": ["Subscribed Users"],
"contents": {"en": x}}
req = requests.post("https://onesignal.com/api/v1/notifications", headers=header, data=json.dumps(payload))
print(req.status_code, req.reason)
UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPServerSocket.bind((localIP, localPort))
print("ES2 Chat -> Telegram Forwader Listening on port: " + str(localPort))
while True:
bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)
header = bytesAddressPair[0]
header = ansi_escape_8bit.sub(b'', header)
try:
header = header.decode(encoding="big5")
except:
header = "Chinese decode error."
if len(header) < 10:
break
msg = header[9:]
header = header[0:9]
msg = msg.replace("\n", "")
if header != "@@ES2US@@":
break
msgid = msg[0:4]
if msgid in msgs:
sendAlert(msgs[msgid])
else:
request_body = {
"chat_id" : 000000, #這邊要自己查看chat的ID
"text" : msg
}
http_headers = {'Content-Type': 'application/json'}
url = 'https://api.telegram.org/bot{1}/sendMessage'.format(telegram_api_token)
response = requests.post(url, headers=http_headers, data=json.dumps(request_body))
print(str(datetime.datetime.now()) +msg.strip())
sys.stdout.flush()
另外 /adm/daemons/notify_d:
#include <net/socket.h>
#include <ansi.h>
#define BLOCK_SIZE 1024
inherit F_DBASE;
mapping socket_info;
int our_socket;
mapping temp_map;
int number_of_users;
object wiz;
int connected;
string host = "0.0.0.0"; // 輸入python script server的IP
int port = 4001;
void TP(string arg) {
if (!arg) arg = "no arg";
if (!wiz) wiz = find_player("");
if (wiz) tell_object(wiz, GRN + arg + NOR);
}
void create()
{
if ( !socket_info ) {
socket_info = ([ ]);
temp_map = ([ ]);
number_of_users = 0;
seteuid( ROOT_UID );
}
set("name", "Notification Daemon");
}
void in_read_callback( int fd, string str ) {
if (!str) str = "";
TP("say " + str);
}
void do_send(string msg)
{
int sock;
sock = socket_create(DATAGRAM, "read_callback", "close_callback");
if (sock <= 0) {
TP("Failed to open socket to " + host + " " + port + "\n");
return;
}
msg = "@@ES2US@@" + msg;
socket_write(sock, msg, host + " " + port);
socket_close(sock);
}