สวัสดี Khabrovites!
วันนี้คุณจะเห็นบทความที่จะแสดงวิธีสร้างบอทโดยใช้ C# บน .NET Core และวิธีเรียกใช้บนเซิร์ฟเวอร์ระยะไกล
บทความจะประกอบด้วยพื้นหลัง ขั้นเตรียมการ การเขียนตรรกะ และการถ่ายโอนบอทไปยังเซิร์ฟเวอร์ระยะไกล
ฉันหวังว่าบทความนี้จะช่วยผู้เริ่มต้นหลายคน
ประวัติศาสตร์
ทุกอย่างเริ่มต้นในคืนฤดูใบไม้ร่วงที่นอนไม่หลับคืนหนึ่งที่ฉันใช้ไปกับเซิร์ฟเวอร์ Discord ตั้งแต่ฉันเพิ่งเข้าร่วมกับเขา ฉันเริ่มศึกษาเขาขึ้นๆ ลงๆ เมื่อพบช่องข้อความ "ตำแหน่งงานว่าง" ฉันเริ่มสนใจ เปิดดูและพบข้อเสนอที่ฉันไม่สนใจ ได้แก่:
"โปรแกรมเมอร์ (ผู้พัฒนาบอท)
คุณสมบัติผู้สมัคร:
- ความรู้เกี่ยวกับภาษาโปรแกรม
- ความสามารถในการเรียนรู้ด้วยตนเอง
Wishes:
- ความสามารถในการเข้าใจรหัสของผู้อื่น
- ความรู้เกี่ยวกับฟังก์ชัน DISCORD
วัตถุประสงค์:
- การพัฒนาบอท
- การสนับสนุนและการบำรุงรักษาบอท
ผลประโยชน์ของคุณ:
- โอกาสในการสนับสนุนและมีอิทธิพลต่อโครงการที่คุณชอบ
- เก็บเกี่ยวประสบการณ์การทำงานเป็นทีม
- โอกาสในการแสดงและพัฒนาทักษะที่มีอยู่
สิ่งนี้ทำให้ฉันสนใจทันที ใช่ พวกเขาไม่ได้จ่ายเงินสำหรับงานนี้ แต่พวกเขาไม่ได้เรียกร้องภาระผูกพันใดๆ จากคุณ และจะไม่ฟุ่มเฟือยในพอร์ตโฟลิโอ ดังนั้นฉันจึงเขียนถึงผู้ดูแลเซิร์ฟเวอร์ และเขาขอให้ฉันเขียนบอทที่จะแสดงสถิติของผู้เล่นใน World of Tanks
ขั้นตอนการเตรียมการ
ดิสครอด
ก่อนที่เราจะเริ่มเขียนบอท เราต้องสร้างมันสำหรับ Discord ก่อน คุณต้องการ:
- เข้าสู่ระบบบัญชี Discord
ลิงค์ - ในแท็บ "แอปพลิเคชัน" คลิกที่ปุ่ม "แอปพลิเคชันใหม่" และตั้งชื่อบอท
- รับโทเค็นบอทโดยลงชื่อเข้าใช้บอทและค้นหาแท็บ "บอท" ในรายการ "การตั้งค่า"
- บันทึกโทเค็นไว้ที่ใดที่หนึ่ง
wargaming
นอกจากนี้ คุณต้องสร้างแอปพลิเคชันใน Wargaming เพื่อเข้าถึง Wargaming API ทุกอย่างก็ง่ายเช่นกัน:
- เข้าสู่ระบบบัญชี Wargaming ของคุณ
ที่ลิงค์นี้ - ไปที่ "แอปพลิเคชันของฉัน" และคลิกที่ปุ่ม "เพิ่มแอปพลิเคชันใหม่" ระบุชื่อแอปพลิเคชันและเลือกประเภทของแอปพลิเคชัน
- การบันทึก ID แอปพลิเคชัน
ซอฟต์แวร์
มีอิสระในการเลือกอยู่แล้ว บางคนใช้ Visual Studio บางคนใช้ Rider บางคนมีพลังมาก และเขียนโค้ดใน Vim (ท้ายที่สุดแล้ว โปรแกรมเมอร์จริงๆ ใช้แต่คีย์บอร์ดใช่ไหม) อย่างไรก็ตาม เพื่อไม่ให้ใช้ Discord API คุณสามารถใช้ไลบรารี C# อย่างไม่เป็นทางการ “DSharpPlus” ได้ คุณสามารถติดตั้งได้จาก NuGet หรือสร้างซอร์สด้วยตัวคุณเองจากที่เก็บ
สำหรับใครที่ไม่รู้หรือลืมวิธีติดตั้งแอพพลิเคชั่นจาก NuGetคำแนะนำสำหรับ Visual Studio
- ไปที่แท็บ โครงการ - จัดการแพ็คเกจ NuGet;
- คลิกที่บทวิจารณ์และป้อน "DSharpPlus" ในช่องค้นหา
- เลือกและติดตั้งเฟรมเวิร์ก
- กำไร!
ขั้นตอนการเตรียมการสิ้นสุดลงแล้ว คุณสามารถดำเนินการเขียนบอตต่อได้
ตรรกะการเขียน
เราจะไม่พิจารณาตรรกะทั้งหมดของแอปพลิเคชัน ฉันจะแสดงเฉพาะวิธีทำงานกับการสกัดกั้นข้อความโดยบอท และวิธีการทำงานกับ 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 - เซิร์ฟเวอร์
เมื่อคุณใช้บอทเสร็จแล้ว บอทจะต้องโฮสต์บนเซิร์ฟเวอร์ที่ทำงานตลอด 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
ขอบคุณ!
ที่มา: will.com