Pixian.AI предлагает уникальный API стикеров для лица. API создает забавные и праздничные вырезки лиц и мордочек как для домашних животных, так и для людей.
Сделайте запрос POST на растровое изображение и получите стикер для лица:
$ curl https://api.pixian.ai/api/v2/face-sticker \ -u xyz123:[secret] \ -F image=@example.jpeg \ -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent
Request request = Request.post("https://api.pixian.ai/api/v2/face-sticker")
.addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd")
.body(
MultipartEntityBuilder.create()
.addBinaryBody("image", new File("example.jpeg")) // TODO: Replace with your image
// TODO: Add more upload parameters here
.build()
);
ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse();
if (response.getCode() == 200) {
// Write result to disk, TODO: or wherever you'd like
try (FileOutputStream out = new FileOutputStream("pixian_result.png")) {
response.getEntity().writeTo(out);
}
} else {
System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase());
}
using (var client = new HttpClient())
using (var form = new MultipartFormDataContent())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE");
form.Add(new ByteArrayContent(File.ReadAllBytes("example.jpeg")), "image", "example.jpeg"); // TODO: Replace with your image
// TODO: Add more upload parameters here
var response = client.PostAsync("https://api.pixian.ai/api/v2/face-sticker", form).Result;
if (response.IsSuccessStatusCode)
{
// Write result to disk, TODO: or wherever you'd like
FileStream outStream = new FileStream("pixian_result.png", FileMode.Create, FileAccess.Write, FileShare.None);
response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); });
}
else
{
Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase);
}
}
// Requires "request" to be installed (see https://www.npmjs.com/package/request)
var request = require('request');
var fs = require('fs');
request.post({
url: 'https://api.pixian.ai/api/v2/face-sticker',
formData: {
image: fs.createReadStream('example.jpeg'), // TODO: Replace with your image
// TODO: Add more upload options here
},
auth: {user: 'xyz123', pass: '[secret]'},
followAllRedirects: true,
encoding: null
}, function(error, response, body) {
if (error) {
console.error('Request failed:', error);
} else if (!response || response.statusCode != 200) {
console.error('Error:', response && response.statusCode, body.toString('utf8'));
} else {
// Save result
fs.writeFileSync("pixian_result.png", body);
}
});
$ch = curl_init('https://api.pixian.ai/api/v2/face-sticker');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd'));
curl_setopt($ch, CURLOPT_POSTFIELDS,
array(
'image' => curl_file_create('example.jpeg'),
// TODO: Add more upload options here
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) {
// Save result
file_put_contents("pixian_result.png", $data);
} else {
echo "Error: " . $data;
}
curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests
response = requests.post(
'https://api.pixian.ai/api/v2/face-sticker',
files={'image': open('example.jpeg', 'rb')},
data={
# TODO: Add more upload options here
},
auth=('xyz123', '[secret]')
)
if response.status_code == requests.codes.ok:
# Save result
with open('pixian_result.png', 'wb') as out:
out.write(response.content)
else:
print("Error:", response.status_code, response.text)
# Requires: gem install httpclient
require 'httpclient'
client = HTTPClient.new default_header: {
"Authorization" => "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd"
}
response = client.post("https://api.pixian.ai/api/v2/face-sticker", {
"image" => File.open("example.jpeg", "rb"), # TODO: Replace with your image
# TODO: Add more upload parameters here
})
if response.status == 200 then
# Write result to disk, TODO: or wherever you'd like
File.open("pixian_result.png", 'w') { |file| file.write(response.body) }
else
puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end
$ curl https://api.pixian.ai/api/v2/face-sticker \ -u xyz123:[secret] \ -F 'image.url=https://example.com/example.jpeg' \ -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent
Request request = Request.post("https://api.pixian.ai/api/v2/face-sticker")
.addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd")
.body(
MultipartEntityBuilder.create()
.addTextBody("image.url", "https://example.com/example.jpeg") // TODO: Replace with your image URL
// TODO: Add more upload parameters here
.build()
);
ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse();
if (response.getCode() == 200) {
// Write result to disk, TODO: or wherever you'd like
try (FileOutputStream out = new FileOutputStream("pixian_result.png")) {
response.getEntity().writeTo(out);
}
} else {
System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase());
}
using (var client = new HttpClient())
using (var form = new MultipartFormDataContent())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE");
form.Add(new StringContent("https://example.com/example.jpeg"), "image.url"); // TODO: Replace with your image URL
// TODO: Add more upload parameters here
var response = client.PostAsync("https://api.pixian.ai/api/v2/face-sticker", form).Result;
if (response.IsSuccessStatusCode)
{
// Write result to disk, TODO: or wherever you'd like
FileStream outStream = new FileStream("pixian_result.png", FileMode.Create, FileAccess.Write, FileShare.None);
response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); });
}
else
{
Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase);
}
}
// Requires "request" to be installed (see https://www.npmjs.com/package/request)
var request = require('request');
var fs = require('fs');
request.post({
url: 'https://api.pixian.ai/api/v2/face-sticker',
formData: {
'image.url': 'https://example.com/example.jpeg', // TODO: Replace with your image
// TODO: Add more upload options here
},
auth: {user: 'xyz123', pass: '[secret]'},
followAllRedirects: true,
encoding: null
}, function(error, response, body) {
if (error) {
console.error('Request failed:', error);
} else if (!response || response.statusCode != 200) {
console.error('Error:', response && response.statusCode, body.toString('utf8'));
} else {
// Save result
fs.writeFileSync("pixian_result.png", body);
}
});
$ch = curl_init('https://api.pixian.ai/api/v2/face-sticker');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd'));
curl_setopt($ch, CURLOPT_POSTFIELDS,
array(
'image.url' => 'https://example.com/example.jpeg',
// TODO: Add more upload options here
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) {
// Save result
file_put_contents("pixian_result.png", $data);
} else {
echo "Error: " . $data;
}
curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests
response = requests.post(
'https://api.pixian.ai/api/v2/face-sticker',
data={
'image.url': 'https://example.com/example.jpeg',
# TODO: Add more upload options here
},
auth=('xyz123', '[secret]')
)
if response.status_code == requests.codes.ok:
# Save result
with open('pixian_result.png', 'wb') as out:
out.write(response.content)
else:
print("Error:", response.status_code, response.text)
# Requires: gem install httpclient
require 'httpclient'
client = HTTPClient.new default_header: {
"Authorization" => "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd"
}
response = client.post("https://api.pixian.ai/api/v2/face-sticker", {
"image.url" => "https://example.com/example.jpeg", # TODO: Replace with your image URL
# TODO: Add more upload parameters here
})
if response.status == 200 then
# Write result to disk, TODO: or wherever you'd like
File.open("pixian_result.png", 'w') { |file| file.write(response.body) }
else
puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end
Интеграция и тестирование API бесплатны, оплата не требуется.
Просто используйте test=true для разработки. Оценить качество результата можно с помощью интерактивного веб-приложения на главной странице.
Производственные результаты требуют покупки пакета кредитов. Смотрите страницу расценок.
API использует стандартную аутентификацию основного доступа HTTP. Все запросы к API должны выполняться через HTTPS и включать ваши учетные данные API с вашим идентификатором пользователя API и секретом API в качестве пароля.
Для успешного выполнения запросов Ваша клиентская библиотека http должна поддерживать указание имени сервера (SNI). Если вы получаете странные ошибки подтверждения, скорее всего, проблема именно в этом.
Использование API ограничено по скорости с щедрыми надбавками и без жесткого верхнего предела.
Во время нормальной работы конечного пользователя вы вряд ли столкнетесь с каким-либо ограничением скорости, поскольку потребление в таком случае то возрастает, то снижается, с чем сервис хорошо справляется.
Однако для пакетных заданий мы рекомендуем начинать не более, чем с 5 потоков, добавляя по 1 новому потоку каждые 5 минут, пока вы не достигнете желаемого уровня параллелизма. Пожалуйста, свяжитесь с нами перед началом работы, если вам нужно более 100 одновременных потоков.
Самый простой способ обеспечить такое постепенное наращивание параллелизма — это сразу же запустить желаемое количество потоков, но при этом использовать счетный семафор, который изначально имеет 5 разрешений. После этого вы можете увеличивать количество разрешений на 1 каждые 5 минут для отдельного потока.
Если вы направите слишком много запросом, вы начнете получать отклики 429 Too Many Requests. Когда это произойдет, вы должны применить линейную выдержку: при первом таком отклике подождите 5 секунд перед отправлением следующего запроса. При втором последовательном отклике 429 подождите 2*5=10 секунд перед отправлением следующего запроса. При третьем подождите 3*4=15 секунд и т.д.
Счетчик выдержки можно сбросить после успешного запроса, а выдержку нужно применять отдельно для каждого потока (т.е. потоки должны работать независимо друг от друга).
Хотя запросы API обычно выполняются в течение нескольких секунд, во время временных пиковых нагрузок время обработки может увеличиться.
Чтобы ваша клиентская библиотека не прерывала преждевременно запросы API, ее следует настроить с тайм-аутом простоя не менее 180 секунд.
Мы используем обычные статусы HTTP для указания выполнения или невыполнения запроса API и включаем важную информацию об ошибке в направляемый JSON объект ошибки.
Мы стремимся всегда указывать JSON объект ошибки для любого невыполненного запроса. Однако теоретически всегда возможны внутренние сбои сервера, которые приводят к отклику об ошибке не в формате JSON.
|
Атрибуты |
|
|---|---|
| status | Статус HTTP отклика, повторяется для оказания помощи в отладке. |
| code | Внутренний код ошибки Pixian.AI. |
| message | Сообщение об ошибке в понятном для человека формате для помощи в отладке. |
Если статус HTTP для вашего запроса равен 200, вы не получите JSON объекта ошибки и можете с уверенностью предположить, что запрос в целом выполнен успешно.
Некоторые клиентские библиотеки HTTP вызывают исключения для статусов HTTP в диапазоне 400-599. Вам нужно будет перехватить эти исключения и обработать их соответствующим образом.
| HTTP Status | Значение |
|---|---|
200-299
|
Успешно выполнено |
400-499
|
Возникла проблема с информацией, предоставленной в запросе (например, отсутствует параметр). Пожалуйста, прочитайте сообщение об ошибке, чтобы узнать, как ее исправить. |
500-599
|
Произошла внутренняя ошибка Pixian.AI. Подождите немного, а затем попробуйте еще раз, и, если проблема не исчезнет, отправьте нам сообщение. |
Пример сообщения об ошибке
{
"error" : {
"status" : 400,
"code" : 1006,
"message" : "Failed to read the supplied image. "
}
}
POST
https://api.pixian.ai/api/v2/face-sticker
Чтобы сделать стикер для лица из изображения, вам нужно выполнить стандартную загрузку файла HTTP POST. Помните, что при загрузке двоичных файлов Content-Type должен быть multipart/form-data .
GET
https://api.pixian.ai/api/v2/account
Извлеките основную информацию о вашей учетной записи, такую как количество оставшихся у вас кредитов.
|
Параметры |
|
|---|---|
| Нет | |
|
Атрибуты отклика |
|||||
|---|---|---|---|---|---|
| creditPack |
Последний приобретенный пакет кредитов или «отсутствуют». |
||||
| state |
|
||||
| useBefore |
Указывает, когда ваш кредитный пакет станет неактивным. Чтобы продолжить использование API, вам необходимо будет приобрести еще один пакет кредитов до этой даты. В формате ISO 8601. |
||||
| credits |
Количество кредитов API на вашей учетной записи. Может быть дробным, поэтому обязательно анализируйте его как Double. |
||||
Попробуйте
Имя пользователя = идентификатор API, пароль = секрет API
cURL
$ curl "https://api.pixian.ai/api/v2/account" \ -u pxxbbzb96n2w8am:[secret]
Пример отклика
{
"creditPack" : "none",
"state" : "dormant",
"useBefore" : "1970-01-01T00:00:00Z",
"credits" : 0
}
| Дата | Изменить |
|---|---|
| 12 февр. 2025 г. | Добавлена конечная точка API состояния учетной записи. |
| 11 апр. 2024 г. | Изначальный выпуск. |