การสร้างบอท Discord บน .NET Core ด้วยการปรับใช้กับเซิร์ฟเวอร์ VPS

การสร้างบอท Discord บน .NET Core ด้วยการปรับใช้กับเซิร์ฟเวอร์ VPS

สวัสดี Khabrovites!

วันนี้คุณจะเห็นบทความที่จะแสดงวิธีสร้างบอทโดยใช้ C# บน .NET Core และวิธีเรียกใช้บนเซิร์ฟเวอร์ระยะไกล

บทความจะประกอบด้วยพื้นหลัง ขั้นเตรียมการ การเขียนตรรกะ และการถ่ายโอนบอทไปยังเซิร์ฟเวอร์ระยะไกล

ฉันหวังว่าบทความนี้จะช่วยผู้เริ่มต้นหลายคน

ประวัติศาสตร์

ทุกอย่างเริ่มต้นในคืนฤดูใบไม้ร่วงที่นอนไม่หลับคืนหนึ่งที่ฉันใช้ไปกับเซิร์ฟเวอร์ Discord ตั้งแต่ฉันเพิ่งเข้าร่วมกับเขา ฉันเริ่มศึกษาเขาขึ้นๆ ลงๆ เมื่อพบช่องข้อความ "ตำแหน่งงานว่าง" ฉันเริ่มสนใจ เปิดดูและพบข้อเสนอที่ฉันไม่สนใจ ได้แก่:

"โปรแกรมเมอร์ (ผู้พัฒนาบอท)
คุณสมบัติผู้สมัคร:

  • ความรู้เกี่ยวกับภาษาโปรแกรม
  • ความสามารถในการเรียนรู้ด้วยตนเอง

Wishes:

  • ความสามารถในการเข้าใจรหัสของผู้อื่น
  • ความรู้เกี่ยวกับฟังก์ชัน DISCORD

วัตถุประสงค์:

  • การพัฒนาบอท
  • การสนับสนุนและการบำรุงรักษาบอท

ผลประโยชน์ของคุณ:

  • โอกาสในการสนับสนุนและมีอิทธิพลต่อโครงการที่คุณชอบ
  • เก็บเกี่ยวประสบการณ์การทำงานเป็นทีม
  • โอกาสในการแสดงและพัฒนาทักษะที่มีอยู่


สิ่งนี้ทำให้ฉันสนใจทันที ใช่ พวกเขาไม่ได้จ่ายเงินสำหรับงานนี้ แต่พวกเขาไม่ได้เรียกร้องภาระผูกพันใดๆ จากคุณ และจะไม่ฟุ่มเฟือยในพอร์ตโฟลิโอ ดังนั้นฉันจึงเขียนถึงผู้ดูแลเซิร์ฟเวอร์ และเขาขอให้ฉันเขียนบอทที่จะแสดงสถิติของผู้เล่นใน World of Tanks

ขั้นตอนการเตรียมการ

การสร้างบอท Discord บน .NET Core ด้วยการปรับใช้กับเซิร์ฟเวอร์ VPS
ดิสครอด
ก่อนที่เราจะเริ่มเขียนบอท เราต้องสร้างมันสำหรับ Discord ก่อน คุณต้องการ:

  1. เข้าสู่ระบบบัญชี Discord ลิงค์
  2. ในแท็บ "แอปพลิเคชัน" คลิกที่ปุ่ม "แอปพลิเคชันใหม่" และตั้งชื่อบอท
  3. รับโทเค็นบอทโดยลงชื่อเข้าใช้บอทและค้นหาแท็บ "บอท" ในรายการ "การตั้งค่า"
  4. บันทึกโทเค็นไว้ที่ใดที่หนึ่ง

wargaming

นอกจากนี้ คุณต้องสร้างแอปพลิเคชันใน Wargaming เพื่อเข้าถึง Wargaming API ทุกอย่างก็ง่ายเช่นกัน:

  1. เข้าสู่ระบบบัญชี Wargaming ของคุณ ที่ลิงค์นี้
  2. ไปที่ "แอปพลิเคชันของฉัน" และคลิกที่ปุ่ม "เพิ่มแอปพลิเคชันใหม่" ระบุชื่อแอปพลิเคชันและเลือกประเภทของแอปพลิเคชัน
  3. การบันทึก ID แอปพลิเคชัน

ซอฟต์แวร์

มีอิสระในการเลือกอยู่แล้ว บางคนใช้ Visual Studio บางคนใช้ Rider บางคนมีพลังมาก และเขียนโค้ดใน Vim (ท้ายที่สุดแล้ว โปรแกรมเมอร์จริงๆ ใช้แต่คีย์บอร์ดใช่ไหม) อย่างไรก็ตาม เพื่อไม่ให้ใช้ Discord API คุณสามารถใช้ไลบรารี C# อย่างไม่เป็นทางการ “DSharpPlus” ได้ คุณสามารถติดตั้งได้จาก NuGet หรือสร้างซอร์สด้วยตัวคุณเองจากที่เก็บ

สำหรับใครที่ไม่รู้หรือลืมวิธีติดตั้งแอพพลิเคชั่นจาก NuGetคำแนะนำสำหรับ Visual Studio

  1. ไปที่แท็บ โครงการ - จัดการแพ็คเกจ NuGet;
  2. คลิกที่บทวิจารณ์และป้อน "DSharpPlus" ในช่องค้นหา
  3. เลือกและติดตั้งเฟรมเวิร์ก
  4. กำไร!

ขั้นตอนการเตรียมการสิ้นสุดลงแล้ว คุณสามารถดำเนินการเขียนบอตต่อได้

ตรรกะการเขียน

การสร้างบอท Discord บน .NET Core ด้วยการปรับใช้กับเซิร์ฟเวอร์ VPS

เราจะไม่พิจารณาตรรกะทั้งหมดของแอปพลิเคชัน ฉันจะแสดงเฉพาะวิธีทำงานกับการสกัดกั้นข้อความโดยบอท และวิธีการทำงานกับ Wargaming API

การทำงานกับบอท Discord นั้นเกิดขึ้นผ่านงาน async แบบคงที่ MainTask(string[] args);
ในการเรียกใช้ฟังก์ชันนี้ คุณต้องลงทะเบียนใน Main

MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();

ถัดไป คุณต้องเริ่มต้นบอทของคุณ:

discord = new DiscordClient(new DiscordConfiguration
{
    Token = token,
    TokenType = TokenType.Bot,
    UseInternalLogHandler = true,
    LogLevel = LogLevel.Debug
});

โดยที่โทเค็นคือโทเค็นของบอทของคุณ
จากนั้น ผ่านแลมบ์ดา เราเขียนคำสั่งที่จำเป็นซึ่งบอตควรดำเนินการ:

discord.MessageCreated += async e =>
{
    string message = e.Message.Content;
    if (message.StartsWith("&"))
    {
        await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
    }
};

โดยที่ e.Author.Username ได้รับชื่อเล่นของผู้ใช้

ด้วยวิธีนี้ เมื่อคุณส่งข้อความใดๆ ที่ขึ้นต้นด้วย & บอทจะทักทายคุณ

ในตอนท้ายของฟังก์ชันนี้ คุณต้องเขียน wait discord.ConnectAsync(); และรอ Task.Delay(-1);

สิ่งนี้จะช่วยให้คุณสามารถดำเนินการคำสั่งในพื้นหลังโดยไม่ต้องใช้เธรดหลัก

ตอนนี้เราต้องจัดการกับ Wargaming API ทุกอย่างง่ายที่นี่ - เขียนคำขอ CURL รับการตอบกลับในรูปแบบของสตริง JSON ดึงข้อมูลที่จำเป็นออกจากที่นั่นและดำเนินการแก้ไข

ตัวอย่างการทำงานกับ WargamingAPI

public Player FindPlayer(string searchNickname)
        {
            //https://api.worldoftanks.ru/wot/account/list/?application_id=y0ur_a@@_id_h3r3search=nickname
            urlRequest = resourceMan.GetString("url_find_player") + appID + "&search=" + searchNickname;
            Player player = null;
            string resultResponse = GetResponse(urlRequest);
            dynamic parsed = JsonConvert.DeserializeObject(resultResponse);

            string status = parsed.status;
            if (status == "ok")
            {
                int count = parsed.meta.count;
                if (count > 0)
                {
                    player = new Player
                    {
                        Nickname = parsed.data[0].nickname,
                        Id = parsed.data[0].account_id
                    };
                }
                else
                {
                    throw new PlayerNotFound("Игрок не найден");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("Минимум три символа требуется");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Неверный поиск");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Пустой никнейм");
                }
                else
                {
                    throw new Exception("Something went wrong.");
                }
            }

            return player;
        }

ความสนใจ! ไม่แนะนำให้จัดเก็บโทเค็นและ ID แอปพลิเคชันทั้งหมดเป็นข้อความที่ชัดเจนโดยเด็ดขาด! อย่างน้อยที่สุด Discord จะแบนโทเค็นดังกล่าวเมื่อพวกเขาเข้าสู่เครือข่ายทั่วโลก และอย่างสูงสุด บอทจะเริ่มถูกใช้โดยผู้โจมตี

ปรับใช้กับ VPS - เซิร์ฟเวอร์

การสร้างบอท Discord บน .NET Core ด้วยการปรับใช้กับเซิร์ฟเวอร์ VPS

เมื่อคุณใช้บอทเสร็จแล้ว บอทจะต้องโฮสต์บนเซิร์ฟเวอร์ที่ทำงานตลอด 24 ชั่วโมงทุกวัน นี่เป็นเพราะความจริงที่ว่าเมื่อแอปพลิเคชันของคุณกำลังทำงาน บอทก็ทำงานอยู่เช่นกัน ทันทีที่คุณปิดแอปพลิเคชัน บอทของคุณก็จะเข้าสู่โหมดสลีปเช่นกัน

เซิร์ฟเวอร์ VPS จำนวนมากมีอยู่ในโลกนี้ ทั้งบน Windows และบน Linux อย่างไรก็ตาม ในกรณีส่วนใหญ่ การโฮสต์บน Linux นั้นถูกกว่ามาก

บนเซิร์ฟเวอร์ Discord ฉันได้รับคำแนะนำให้ vscale.io และฉันสร้างเซิร์ฟเวอร์เสมือนบน Ubuntu ทันทีและอัปโหลดบอท ฉันจะไม่อธิบายวิธีการทำงานของไซต์นี้ แต่จะไปที่การตั้งค่าบอทโดยตรง

ก่อนอื่น คุณต้องติดตั้งซอฟต์แวร์ที่จำเป็นซึ่งจะรันบอทของเราที่เขียนด้วย .NET Core วิธีการทำอธิบายไว้ที่นี่.

ถัดไป คุณต้องอัปโหลดบอทไปยังบริการ Git เช่น GitHub และอื่น ๆ และโคลนมันไปยังเซิร์ฟเวอร์ VPS หรือดาวน์โหลดบอทของคุณด้วยวิธีอื่น โปรดทราบว่าคุณจะมีเพียงคอนโซลเท่านั้น ไม่มี GUI เลย.

หลังจากที่คุณดาวน์โหลดบอทของคุณแล้ว คุณต้องเรียกใช้มัน สำหรับสิ่งนี้ คุณต้อง:

  • กู้คืนการพึ่งพาทั้งหมด: การคืนค่า dotnet
  • สร้างแอปพลิเคชัน: dotnet build name_project.sln -c Release
  • ไปที่ DLL ที่สร้างขึ้น
  • ดอทเน็ต name_of_file.dll

ยินดีด้วย! บอทของคุณกำลังทำงานอยู่ อย่างไรก็ตาม โชคไม่ดีที่บอทเข้าใช้คอนโซล และมันไม่ง่ายเลยที่จะออกจากเซิร์ฟเวอร์ VPS นอกจากนี้ ในกรณีที่เซิร์ฟเวอร์รีสตาร์ท คุณจะต้องเริ่มบอทด้วยวิธีใหม่ มีสองวิธีในการออกจากสถานการณ์ ทั้งหมดเกี่ยวข้องกับการเปิดตัวเมื่อเริ่มต้นเซิร์ฟเวอร์:

  • เพิ่ม run script ใน /etc/init.d
  • สร้างบริการที่จะทำงานเมื่อเริ่มต้น

ฉันไม่เห็นประเด็นที่จะต้องพูดถึงรายละเอียดทุกอย่างมีการอธิบายอย่างละเอียดเพียงพอบนอินเทอร์เน็ต

ผลการวิจัย

ฉันดีใจที่ได้ทำงานนี้ นี่เป็นประสบการณ์การพัฒนาบอทครั้งแรกของฉัน และฉันดีใจที่ได้รับความรู้ใหม่เกี่ยวกับ C# และการทำงานร่วมกับ Linux

ลิงก์ไปยังเซิร์ฟเวอร์ Discord สำหรับผู้ที่เล่นเกม Wargaming
ลิงก์ไปยังที่เก็บที่มีบอท Discord อยู่
ลิงก์ไปยังที่เก็บ DSharpPlus
ขอบคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น