Skip to content
হোস্টিং · সার্ভার সেটআপ

বটের জন্য সার্ভার 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())
Minecraft হোস্টিংআপনি অফলাইনে থাকলেও আপনার সার্ভার চলেসার্ভার তৈরি করুন