বটের জন্য সার্ভার API
Millida Hosting ক্লায়েন্ট API: কী ইস্যু করা, পারমিশন, সার্ভার ম্যানেজমেন্ট এবং নিজের বট বা স্ক্রিপ্ট থেকে কনসোল স্ট্রিমিং।
আপডেট: ১৩ অক্টোবর, ২০২৬
কন্ট্রোল প্যানেল যা করে, তার সবকিছুই আপনি নিজের কোড থেকে করতে পারেন: নির্দিষ্ট সময়সূচিতে সার্ভার চালু করুন, Discord-এ স্ট্যাটাস দেখান, বট থেকে কমান্ড পাঠান।
কী
API যেকোনো পেইড প্ল্যানে পাওয়া যায় — যেখানে ফাইল, SFTP এবং টিম অ্যাক্সেস আছে, ঠিক সেখানেই। ফ্রি প্ল্যানে কী ইস্যু হয় না: কী হলো একই শেয়ার্ড অ্যাক্সেস, শুধু বটের জন্য।
“Players and access” সেকশন → “API keys” → “Issue”। কীটি কী কী করতে পারবে তা দেখে নিন — পারমিশনগুলো শেয়ার্ড অ্যাক্সেসের মতোই।
কীটি একবারই দেখানো হয়: আমরা শুধু তার ফিঙ্গারপ্রিন্ট সংরক্ষণ করি। হারিয়ে ফেললে নতুন একটি ইস্যু করুন এবং পুরোটো রিভোক করুন।
কীটি Authorization: Bearer mhk_live_... হেডারে পাঠানো হয়।
মেথড
বেস URL — https://millida.net/v2/hosting/api।
| মেথড | কী করে | প্রয়োজনীয় পারমিশন |
|---|---|---|
GET /server | সার্ভার কার্ড | console |
GET /status | স্ট্যাটাস ও অনলাইন | console |
POST /start | চালু | start |
POST /stop | বন্ধ | start |
POST /restart | রিস্টার্ট | start |
POST /command | কনসোলে কমান্ড | console |
GET /console | লাইভ লগ (SSE) | console |
GET /files?path= | ফাইল তালিকা | files |
GET /files/configs | ফর্ম কোন কোন কনফিগ পড়ে | files |
GET /files/config?path= | টাইপসহ ফাইল সেটিংস | files |
POST /files/config | ফাইল সেটিংস পরিবর্তন | files |
GET /backups | ব্যাকআপ তালিকা | backups |
POST /backups | ব্যাকআপ তৈরি | backups |
GET /antibot | অ্যান্টি-বট সেটিংস, ব্যাকএন্ড এবং ফায়ারওয়াল রুল | protection |
PUT /antibot | প্রোটেকশন সেটিংস পরিবর্তন | protection |
GET /antibot/overview?range= | hour, day বা week-এর জন্য কানেকশন ও ডিনাইয়াল | protection |
POST /antibot/backends | ব্যাকএন্ড যোগ করুন {"address":"host:port","label":"..."} | protection |
DELETE /antibot/backends/{id} | ব্যাকএন্ড সরান | protection |
POST /antibot/rules | ফায়ারওয়াল রুল {"kind":"allow"|"deny","cidr":"1.2.3.0/24"} | protection |
DELETE /antibot/rules/{id} | রুল সরান | protection |
POST /antibot/verify-domain/check | আপনার ভেরিফিকেশন পেজ ডোমেইনের DNS চেক করুন | protection |
উদাহরণ: সার্ভার চালু করুন এবং অনলাইনে আসা পর্যন্ত অপেক্ষা করুন
KEY="mhk_live_xxx"
API="https://millida.net/v2/hosting/api"
curl -sX POST "$API/start" -H "Authorization: Bearer $KEY"
until curl -s "$API/status" -H "Authorization: Bearer $KEY" | grep -q RUNNING; do
sleep 5
done
echo "server online"
ব্যাকআপ ব্যাকগ্রাউন্ডে তৈরি হয়
POST /backups সঙ্গে সঙ্গে {"id":"..."} রিটার্ন করে, আর আর্কাইভটি নোডে তৈরি হয়: কয়েক গিগাবাইটের একটি ওয়ার্ল্ডে কয়েক মিনিট লাগে। GET /backups-এ status ফিল্ড দেখে প্রস্তুতি যাচাই করুন: pending — এখনো তৈরি হচ্ছে, ready — স্টোরেজে সংরক্ষিত (এখনই আসল sizeMb দেখা যায়), failed — তৈরি করা যায়নি।
ID=$(curl -sX POST "$API/backups" -H "Authorization: Bearer $KEY" | jq -r .id)
until curl -s "$API/backups" -H "Authorization: Bearer $KEY" \
| jq -e --arg id "$ID" '.[] | select(.id==$id) | select(.status=="ready")' >/dev/null; do
sleep 15
done
echo "backup ready"
একটি ব্যাকআপ চলাকালীন একই সার্ভারে দ্বিতীয়টি তৈরি করা যাবে না — নোড একবারে একটি করে করে।
লাইভ কনসোল
GET /console একটি Server-Sent Events স্ট্রিম রিটার্ন করে: প্রতিটি লাইন data: প্রিফিক্সসহ আসে। WebSocket লাগে না — SSE যেকোনো প্রক্সি দিয়ে চলে যায়।
যা জানা দরকার
- প্রতিটি কী অ্যাকশন লগে লেখা হয় সার্ভার লগে “API key N” লেখক হিসেবে। মানুষ এবং বট দুজনেই যখন সার্ভার চালায়, তখন ঠিক এটাই দরকার।
- রেট লিমিট প্রতি কী-তে হিসাব হয়, প্রতি অ্যাড্রেসে নয়: IP বদলালে লিমিট এড়ানো যায় না, আর অফিস নেটওয়ার্কের প্রতিবেশী তা খরচ করে না। সাধারণ অটোমেশনের জন্য এটি যথেষ্ট উদার, তবে সেকেন্ডে একবার স্ট্যাটাস পোল করলে লিমিটে ধাক্কা লাগবে — প্রতি ১০–১৫ সেকেন্ডে একবারই যথেষ্ট। কনসোল স্ট্রিম মিনিটে সর্বোচ্চ দশবার খোলা যায়: প্রতিটি মেসেজের জন্য নতুন কানেকশন না খুলে একটি কানেকশনই রাখুন।
- কী সঙ্গে সঙ্গে কাজ করা বন্ধ করে দেয় যদি সার্ভার সাসপেন্ড হয় বা প্ল্যান আর পেইড না থাকে। সেজন্য ম্যানুয়ালি রিভোক করার দরকার নেই।
- প্রতি সার্ভারে সর্বোচ্চ পাঁচটি কী। যেগুলো দরকার নেই সেগুলো রিভোক করুন।
অ্যান্টি-বট প্রোটেকশন
GET /antibot দুটি ফিল্ডে সেটিংস রিটার্ন করে। config — সার্ভারের নিজের সেটিংস; যতক্ষণ সেগুলো না থাকে, ততক্ষণ এটি null, আর সার্ভার ডিফল্টভাবে সুরক্ষিত থাকে (default ফিল্ড)। effective সবসময় থাকে: এগুলো হলো সেই সেটিংস যা এখন কার্যকর আছে বা প্রথম এডিটের পর সার্ভার যেগুলো নিয়ে কাজ শুরু করবে — মানগুলো এটি থেকেই পড়ুন।
PUT /antibot শুধু সেই ফিল্ডগুলোই গ্রহণ করে যেগুলো আপনি পরিবর্তন করতে চান:
curl -sX PUT "$API/antibot" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"preset":"balanced"}'
লেভেল (preset): off, under_attack, balanced, aggressive, custom। লেভেল নিজে থেকেই চেক ভ্যালুতে প্রসারিত হয়, তাই ম্যানুয়াল কনফিগারেশনের জন্য custom বেছে নিন এবং চেকগুলো পাঠান: checkCaptcha, checkPhysics, checkKeepAlive, checkTeleport, checkBrand, checkPing, checkTransfer, checkClientSettings — প্রতিটি off, under_attack বা always। অ্যাড্রেস লিস্ট (vpnMode, datacenterMode, torMode) — off, log বা block। জিও ফিল্টার — geoMode (off, allow, deny) এবং geoCountries (দেশের কোড, যেমন ["RU","BY"])।
ফরওয়ার্ডিং সিক্রেট API দিয়ে ইস্যু বা পরিবর্তন করা যায় না: এটি শুধু মালিককে প্যানেলে দেখানো হয়।
কনফিগ সেটিংস
GET /files/config?path=server.properties পার্স করা ফাইল রিটার্ন করে — প্রতিটি এন্ট্রির টাইপ, বর্তমান মান এবং “রিস্টার্ট প্রয়োজন” ফ্ল্যাগসহ:
{
"path": "server.properties",
"format": "properties",
"options": [
{ "key": "pvp", "type": "boolean", "value": "true", "owner": "sync", "requiresRestart": false },
{ "key": "difficulty", "type": "select", "value": "normal", "values": ["peaceful", "easy", "normal", "hard"], "owner": "sync", "requiresRestart": false },
{ "key": "server-port", "type": "integer", "value": "25565", "owner": "platform", "requiresRestart": true }
]
}
owner বলে দেয় এন্ট্রিটি নিয়ে কী করা যায়: platform — মানটি হোস্টিং সেট করে, এডিট প্রত্যাখ্যাত হয়; sync — এন্ট্রিটি প্যানেল এবং ফাইল দুটোতেই আছে; file — শুধু ফাইলই এটি সম্পর্কে জানে।
একটি রাইট শুধু আপনার পাঠানো কী-গুলোই পরিবর্তন করে; ফাইলের বাকি সবকিছু অপরিবর্তিত থাকে:
curl -sX POST "$API/files/config" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"path":"server.properties","values":{"pvp":"false","difficulty":"hard"}}'
ফর্মটি .properties, .yml/.yaml এবং .toml পড়ে — এমনকি সেই প্লাগইন কনফিগও যেগুলো সম্পর্কে প্যানেল কিছুই জানে না: ফিল্ডের টাইপ মান থেকে অনুমান করা হয়। নেস্টেড কী ডট দিয়ে অ্যাড্রেস করা হয়: settings.bungeecord, advanced.compression-threshold।
পুরো ফাইলটি এখনো GET/PUT /files/content?path= দিয়ে পাওয়া যায় — দুটি পথই একই জায়গায় লেখে।
Node.js এবং Python-এ রেডিমেড ক্লায়েন্ট
নিচে একটি মিনিমাল ক্লায়েন্ট দেওয়া হলো: এটি স্ট্যাটাস চেক করে, সার্ভার চালু করে এবং চ্যাটে লিখে। কী-টি MILLIDA_KEY এনভায়রনমেন্ট ভেরিয়েবল থেকে আসে — git-এ চলে যাওয়া কোডে এটি পেস্ট করবেন না। এরর রেসপন্স হলো message ফিল্ডসহ JSON; আপনার বটের উচিত সেটিই লগ করা।
Node.js 18+ (বিল্ট-ইন fetch):
const API = 'https://millida.net/v2/hosting/api';
const KEY = process.env.MILLIDA_KEY;
async function call(method, path, body) {
const res = await fetch(`${API}${path}`, {
method,
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: body ? JSON.stringify(body) : undefined,
});
if (!res.ok) throw new Error(`${method} ${path}: ${res.status} ${await res.text()}`);
return res.status === 204 ? null : res.json();
}
const status = await call('GET', '/status');
if (status.status !== 'RUNNING') await call('POST', '/start');
await call('POST', '/command', { command: 'say Hello from the bot' });
requests লাইব্রেরিসহ Python 3, সাথে লাইভ কনসোল পড়া:
import os
import requests
API = "https://millida.net/v2/hosting/api"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['MILLIDA_KEY']}"
def call(method, path, body=None):
res = session.request(method, API + path, json=body, timeout=15)
res.raise_for_status()
return res.json() if res.content else None
status = call("GET", "/status")
if status["status"] != "RUNNING":
call("POST", "/start")
call("POST", "/command", {"command": "say Hello from the bot"})
with session.get(API + "/console", stream=True, timeout=None) as stream:
for line in stream.iter_lines(decode_unicode=True):
if line and line.startswith("data:"):
print(line[5:].strip())
