aternos / curseforge-api
CurseForge API的PHP客户端。
Requires
- php: ^8.1
- ext-curl: *
- ext-json: *
- ext-mbstring: *
- guzzlehttp/guzzle: ^7.3
- guzzlehttp/psr7: ^1.7 || ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- phpunit/phpunit: ^10.2
README
一个用PHP编写的CurseForge API客户端。此客户端是使用OpenAPI Generator生成的代码与一些包装代码的组合,以提高可用性。
生成的代码位于lib/Api
和lib/Model
中。建议使用lib/Client
中的包装代码,而不是生成的代码。
安装
使用composer安装包
composer require aternos/curseforge-api
用法
API的主要入口点是CurseForgeAPIClient
类。
<?php use Aternos\CurseForgeApi\Client\CurseForgeAPIClient; $client = new CurseForgeAPIClient("api-key"); // set a user agent (recommended) $client->setUserAgent('aternos/php-curseforge-api-example');
您需要API密钥才能使用此客户端。如果您是第三方,您可以在此处了解更多如何获取API密钥:[链接](https://support.curseforge.com/en/support/solutions/articles/9000208346)。
分页列表
大多数方法返回一个包含当前页面上结果列表以及导航到下一页和上一页的方法的分页列表。分页列表实现了Iterator
、ArrayAccess
和Countable
,因此您可以使用它就像使用数组一样。它还有一个getResults()
方法,该方法返回结果的基础数组。
游戏
例如,getGames
方法返回一个分页的游戏列表。
$games = $client->getGames(); foreach ($games as $game) { // like most other methods, this method returns a wrapper // you can use the getData() method to get the game data echo $game->getData()->getName() . PHP_EOL; } $games = $games->getNextPage(); foreach ($games as $game) { echo $game->getData()->getName() . PHP_EOL; }
您也可以通过游戏的ID调用getGame
来获取特定的游戏。例如,432是Minecraft的ID。
$game = $client->getGame(432); echo $game->getData()->getSlug() . PHP_EOL;
游戏版本
一个游戏包含各种不同的版本类型,您可以这样获取它们
$versionTypes = $client->getGameVersionTypes(432); // or $versionTypes = $game->getVersionTypes();
由于此端点未分页,它返回一个数组而不是分页列表。
您也可以获取特定版本类型的版本
$versions = $client->getGameVersionTypeVersions(432, 68441); // or $versionType = $versionTypes[0]; $versions = $versionType->getVersions();
例如:68441是Minecraft的模组加载器选择。
您还可以获取游戏所有版本类型的所有版本
$versions = $client->getGameVersions(432); // or $versions = $game->getVersions();
游戏分类
CurseForge上的一个游戏有类别类和类别。类别类类似于“模组包”或“插件”,而类别类似于“世界生成”或“聊天”。您可以这样获取它们
$categoryClasses = $client->getCategories(432); // or $categoryClasses = $game->getCategories();
请注意,这将返回类别类和类别。
如果您只想获取类别类,可以将参数onlyClasses
设置为true
。
$categoryClasses = $client->getCategories(432, null, true); // or $categoryClasses = $game->getCategories(null, true);
您可以使用参数classId
通过类别获取类别
$categories = $client->getCategories(432, 6); // or $categories = $game->getCategories(6);
模组
您可以这样搜索模组
$options = new ModSearchOptions(432); // the game ID is required $mods = $this->apiClient->searchMods($options); // or $mods = $game->searchMods(); // options are optional here
您还可以获取一个游戏的特色模组列表
$mods = $client->getFeaturedMods(432); // or $mods = $game->getFeaturedMods(); $featured = $mods->getFeatured(); $popular = $mods->getPopular(); $recentlyUpdated = $mods->getRecentlyUpdated();
您可以通过ID获取单个模组,例如这样
$mod = $client->getMod(420561);
或批量获取多个模组
$mods = $client->getMods([420561, 278568, 715033]);
您还可以获取模组描述的HTML
$description = $mod->getDescription();
模组文件
要获取模组文件,请使用getFiles()
方法
$files = $mod->getFiles();
它可以选择性地接受一个ModFilesOptions对象作为参数
$options = new ModFilesOptions($mod->getData()->getId()); $options->setGameVersion("1.19.2"); use \Aternos\CurseForgeApi\Client\Options\ModSearch\ModLoaderType; $options->setModLoaderType(ModLoaderType::FORGE);
客户端中也有这个方法,因此您不必首先获取模组
$options = new ModFilesOptions(420561); $options->setGameVersion("1.19.2"); $options->setModLoaderType(ModLoaderType::FORGE); $files = $client->getModFiles($options);
在这种情况下,选项不是可选的,因为需要模组ID。
就像模组一样,您可以单独获取文件或批量获取文件
$file = $client->getModFile(420561, 3787455); // or $files = $client->getModFiles([3787455, 3787456]);
请注意,批量端点不需要模组ID。
文件下载URL
您可以通过这种方式获取文件的下载URL
$url = $file->getData()->getDownloadUrl(); // or if you don't already have the file object $url = $client->getModFileDownloadUrl(420561, 3787455);
然而,如果模组不允许项目分发,这将返回null(在第一个例子中)或403错误(在第二个例子中)。
指纹
您可以在CurseForge中通过文件的指纹来搜索文件。例如,这可以用来找到服务器上安装的模组的下载源。CurseForge使用带有种子1的Murmur2哈希算法的变体来处理这些指纹。
获取指纹
通过API
$file = $client->getModFile(420561, 3787455); $fingerprint = $file->getFileFingerprint();
使用我们的CursedFingerprintHelper类从原始字符串中获取
$fingerprint = CursedFingerprintHelper::getFingerprint("foo");
使用我们的辅助类从本地文件中获取
$fingerprint = CursedFingerprintHelper::getFingerprintFromFile("/path/to/file.jar");
这将分块读取文件并从其中计算指纹。
使用我们的辅助类从任何来源获取
$helper = new CursedFingerprintHelper($length); while ($source->hasNextChunk()) { $helper->nextChunk($source->getNextChunk()); } $fingerprint = $helper->finalize();
请注意,长度字段必须排除空白字符(\x09, \x0a, \x0d, \x20)。您可以使用stripWhiteSpaces
或isWhiteSpaceCharacter
方法来完成此操作。
获取匹配项
$files = $client->getFilesByFingerPrintMatches([1949504940, 1177254054]); foreach ($files as $file) { echo $file->getFile()->getDisplayName() . PHP_EOL; }
Minecraft
还有一些针对Minecraft的特定API端点。
// Get Minecraft versions $versions = $client->getMinecraftVersions(); // Get a specific version $version = $client->getMinecraftVersion("1.19.2"); // Get mod loader versions $modLoaders = $client->getMinecraftModLoaders(); $modLoaders = $client->getMinecraftModLoaders("1.19.2"); // optionally provide a Minecraft version $modLoaders = $client->getMinecraftModLoaders(null, true); // show all loaders, including fabric // get more information about a mod loader version $version = $client->getMinecraftModLoader("forge-43.2.8");
更新生成的代码
可以通过安装openapi generator并运行以下命令来更新生成的代码
openapi-generator-cli generate -c config.yaml