Документация
Используйте наш API для создания скриншотов веб-сайтов.
Создание запроса к API
Чтобы создать скриншот, отправьте запрос GET
или POST
на этот URL.
https://api.pikwy.com
Аутентификация
Для авторизации необходимо к запросу добавить параметр token
с вашим token API
https://api.pikwy.com/?token=YOUR_API_TOKEN&url=https://wikipedia.org
Параметры
Список всех параметров, которые вы можете добавить в запрос. Вы можете использовать длинные или короткие имена параметров.
Параметр | Тип | По умолчанию | Диапазон значений | Описание |
---|---|---|---|---|
token/tkn |
string |
'' |
'' |
Ваш API-токен. |
url/u |
string |
'' |
'' |
URL сайта. Необходимо кодировать в URL encoded. |
width/w |
int |
1280 |
100 - 10000 |
Ширина браузера в пикселях. |
height/h |
int |
1024 |
100 - 50000 |
Высота браузера в пикселях. |
full_page/fs |
int |
0 |
0, 1 |
Если 1, скриншот будет сделан по всей высоте веб-страницы. |
format/f |
string |
jpg |
png, jpg, html, pdf |
Формат миниатюры или скриншота |
response_type/rt |
string |
raw |
raw, json |
Если вы выберете json , API вернет изображение, закодированное в base64, и дополнительную информацию: код ответа, заголовки ответа. По умолчанию API возвращает raw изображение или необработанный файл. В случае неудачного ответа, текст ошибки. |
timeout/t |
int |
0 |
0 - 120000 |
Ограничивает максимальное время в миллисекундах для создания снимков экрана. Если скриншот не создан вовремя, API вернет ошибку тайм-аута. |
delay/d |
int |
0 |
0 - 60000 |
Сколько миллисекунд ждать, прежде чем сделать скриншот. |
refresh/r |
int |
0 |
0, 1 |
После полной загрузки страницы, Pikwy ждет 1 секунду и обновляет страницу. |
user_agent/ua |
string |
'' |
'' |
Пользовательская переменная для установки вашего user-agent. Значение должно быть закодировано по URL. |
headers/hdrs |
string |
'' |
'' |
Пользовательская переменная для установки Headers. Допускается несколько параметров заголовков. &headers[Referer]=https://wikipedia.org/&headers[Cache-Control]=max-age=0 &headers[Cookie]=SSID=WX84BVOEA3WEDSHJHG;SEARCH_SAMESITE=CgQI5o4B В некоторых случаях файлы cookie, отправленные с использованием &headers[Cookie], не принимаются. В этом случае вы должны использовать cookie ниже.
|
cookie/c |
string |
'' |
'' |
Чтобы отправить cookie с одним параметром: &cookie[0][name]=is_mobile_app&cookie[0][value]=true Чтобы отправить файл cookie с несколькими параметрами:
&cookie[0][name]=is_mobile_app&cookie[0][value]=true&cookie[1][name]=city_id&cookie[1][value]=710000000&cookie[1][domain]=wikipedia.org, etc.optional keys - “path”, “domain”, “secure”, “expiry” |
area/a |
string |
'' |
'' |
Если вам нужно получить скриншот не целой страницы, а, определенной области на странице (картинку, таблицу, блок или диаграмму), вы можете указать в параметре Пример: area XPath запрос для получения нужного элемента (DOM).Сделать скриншот только центральной части веб-сайта wikipedia.org &area=//div[@class="central-featured"] |
hide |
string |
'' |
'' |
Используя опцию hide, вы можете скрыть/удалить любой HTML элемент перед тем, как сделать скриншот веб-страницы. Вы можете скрыть различные баннеры GDPR/cookie или любые другие элементы на веб-странице.
Любые допустимые селекторы CSS, разделенные запятой. Подробнее об Справочнике по селекторам CSS.Примеры (www.wikipedia.org): hide=.central-featured-lang скроет все элементы с class="central-featured-lang" перед созданием скрина веб-страницы
hide=#js-link-box-en (правильно закодировано как hide=#js-link-box-en) скроет элемент с id="js-link-box-en" перед тем, как сделать скриншот веб-сайта
Мы рекомендуем использовать Percent-encoding для символа # или любых других зарезервированных символов.
|
geo/g |
float |
0 |
latitude range -90 to 90 longitude range -180 to 180 |
Изменить геолокацию браузера. geo=51.507351,-0.127758 (London) |
jscode/js |
string |
'' |
'' |
Произвольный JS код, который будет выполнен на странице перед созданием скриншота. jscode=window.scrollBy(0,document.body.scrollHeight); |
auth_type/auty |
string |
'' |
basic, form |
Если необходимо сделать скриншот закрытой части сайта с использованием авторизацией по логину и паролю.
BASIC mode (HTTP Basic authentication):
Если доступ к веб-странице закрыт с использованием HTTP Basic authentication. (apache, nginx)
auth={https|http}://{user}:{password}@{URL path}
Пример:
auty=basic&auth=https://user:password@pikwy.com/login
FORM mode: Если вам необходимо ввести свой логин и пароль в форму авторизации для доступа к веб-странице.
Доступные параметры:
auxi - XPATH запрос, если на веб-странице авторизации используется iframe
auxu - XPATH запрос поля с логином или электронной почтой
auxp - XPATH запрос для поля с паролем
auxb - XPATH запрос для кнопки «Войти»
auwt - XPATH запрос, если вам нужно дождаться какого-либо элемента, прежде чем нажимать кнопку «Войти»
auth - {https|http}://{user}:{password}@{URL path}
Пример для сайта pikwy.com с POST-запросом на PHP:
$tkn = 'YOUR TOKEN';
$url = 'https://api.pikwy.com/';
$data = [
'u' => 'https://pikwy.com/billing',
#
'auty' => 'form',
'auxu' => '//input[@id="la"]',
'auxp' => '//input[@id="lb"]',
'auxb' => '//button[@type="submit"]',
'auth' => 'https://email:password@pikwy.com/login',
'tkn' => $tkn,
];
#
$opts = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($opts);
#
$result = file_get_contents($url, false, $context); if ($result === FALSE)
{
# Handle error
}
|
export_ftp/ftp |
string |
'' |
'' |
Сохранить скриншот на FTP сервере. Схема: {ftp|sftp}://{user}:{password}@{ip|host}:{port}/{Remote Path}/ Пример 1: ftp://{user}:{password}@{ip|host}:{port}/ - сохранить скрин в корень директории Пример 2: ftp://{user}:{password}@{ip|host}:{port}/folder2/ - сохранить скрин в папку /folder2/ После успешной загрузки, возвращается json объект с датой и названием файла{ "date":"1665396936", "name":"1695796934_6343f0c0b381e6645446c668.jpg" } |
export_as3/as3 |
string |
'' |
'' |
Сохранить скриншот в AWS S3 Bucket. Схема: as3://{access_key}:{secret_ket}@{region}/{bucket}/{Remote Path}/ Пример 1: as3://{access_key}:{secret_ket}@{region}/{bucket}/ - сохранить скрин в корень директории Пример 2: as3://{access_key}:{secret_ket}@{region}/{bucket}/folder/folder2/ - сохранить скрин в папку /folder2/ После успешной загрузки, возвращается json объект с датой и названием файла{ "date":"1665396934", "name":"1665396934_6343f0c0b381e6645546c668.jpg" } |
export_azu/azu |
string |
'' |
'' |
Сохранить скриншот в Azure Blob Storage.
Схема: {https}://{StorageAccountName}:{containerKey}@blob.core.windows.net/{containerName}/{remote path}/
{containerKey} необходимо кодировать через URL encoded
Пример 1:
{https}://{StorageAccountName}:{containerKey}@blob.core.windows.net/{containerName}/ - сохранить скрин в корень директории
Пример 2:
{https}://{StorageAccountName}:{containerKey}@blob.core.windows.net/{containerName}/folder/folder2/ - сохранить скрин в папку /folder2/
AПосле успешной загрузки, возвращается json объект с датой и названием файла
{ "date":"1665396934", "name":"1665396934_6343f0c0b381e6645546c668.jpg" } |
export_dbx/dbx |
string |
'' |
'' |
Сохранить скриншот в Dropbox. Схема: dbx://{token}/{remote path}/
Как получить {token}, вы можете прочитать в нашей статье.
Пример 1:
dbx://{token}/{remote path}/ - сохранить скрин в корень директории
Пример 2:
dbx://{token}/{remote path}/folder/folder2/ - сохранить скрин в папку /folder2/
После успешной загрузки, возвращается json объект с датой и названием файла { "date":"1665396934", "name":"1665396934_6343f0c0b381e6645546c668.jpg" } |
proxy/p |
string |
'' |
'' |
Использовать прокси-сервер. Схема прокси: {http|https|socks4|socks5|socks5h}://{user}:{password}@{ip|host}:{port} Только для платной подписки: Вы можете использовать прокси от pikwy. proxy=ys - будет выбран случайный прокси из списка proxy=es - будет выбран прокси из указанной страны. Доступные страны: it, es, nl |
Примеры кода
Эти примеры кода показывают, как сохранить скриншот веб-сайта в файл.
GET запрос
curl --request GET --url https://api.pikwy.com/
--header 'Content-Type: application/json'
--data '{"u":"https://wikipedia.org","fs":0,"rt":"json","tkn":"{YOUR_API_TOKEN}"}'
How to use this function, you can read in our article. https://pikwy.com/blog/how-create-screenshot-with-google-apps-script
function captueScreenshot() {
// Main parameters
var websiteURL = "https://wikipedia.org";
var apiUrl = "https://api.pikwy.com";
var token = "YOUR TOKEN";
var driveFolderId = "1iVbOERt6jhzPelIqGwqaVIDdfWFa16fWtdSYn"; // Google Drive Folder ID
var spreadSheetId = "1MkAe4owv5MFvicHNfDdggRj4FeYcbXY9KD1jGwEsY"; // Google Spreadsheet ID
var dateAndTime = new Date().toLocaleString('en-US'); ///You can change the date format by replacing en-US
var additionalParameter = "width=1500&height=2000&delay=2000";
///Create a random filename
var namelength = 30;
var file_name = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for ( var i = 0; i < namelength; i++ ) {
file_name += characters.charAt(Math.floor(Math.random() * charactersLength));
}
///Send request
var image = UrlFetchApp.fetch(apiUrl, {
"method": "GET",
"muteHttpExceptions": true,
"followRedirects": true,
"validateHttpsCertificates": true,
"contentType": "application/x-www-form-urlencoded",
"payload": "u="+ encodeURIComponent(websiteURL) +"&tkn="+token+additionalParameter
}).getBlob().getAs('image/jpeg').setName(file_name);
///Save screenshot to Google Drive
var folder = DriveApp.getFolderById(driveFolderId);
var file = DriveApp.createFile(image);
Drive.Files.update({"parents": [{"id": folder.getId()}]}, file.getId());
var driveImageUrl = 'https://drive.google.com/file/d/' + file.getId() + '/view';
/// Insert data into Google Spreadsheet
var lastRow = SpreadsheetApp.openById(spreadSheetId).getActiveSheet().getLastRow();
var insertData = [dateAndTime,screenshotUrl,driveImageUrl]
SpreadsheetApp.openById(spreadSheetId).getActiveSheet().getRange("A"+ (lastRow+1)+":C"+(lastRow+1)).setValues([insertData]);
}
fetch("https://api.pikwy.com?u=https%3A%2F%2Fwikipedia.org&tkn=%7BYOUR_API_TOKEN%7D&fs=0", {
"method": "GET",
})
.then(function (response) {
console.log(response.status);
return response.text();
}).then(function (data) {
console.log(data);
})
.catch(function (error) {
console.log(error.message);
});
var fs = require('fs')
var request = require('request');
// The parameters.
var token = 'YOUR_API_TOKEN';
var url = encodeURIComponent('https://www.wikipedia.org/');
var width = 1280;
var height = 1024;
var response_type = 'image';
// Create the query URL.
var query = "https://api.pikwy.com";
query += `?token=${token}&url=${url}&width=${width}&height=${height}&response_type=${response_type}`;
// Call the API and save the screenshot.
request.get({url: query, encoding: 'binary'}, (err, response, body) => {
fs.writeFile("screenshot.png", body, 'binary', err => {
if (err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
});
function SiteScreenshot($token, $url, $width, $height, $response_type = 'image') {
// Parameters.
$token = $token; ///YOUR_API_TOKEN
$url = urlencode($url);
$width = $width;
$height = $height;
$response_type = $response_type; ///Response type: json, image
// Create the query URL.
$query = "https://api.pikwy.com/";
$query .= "?token=$token&url=$url&width=$width&height=$height&response_type=$response_type";
// Call the API.
$image = file_get_contents($query);
// Store the screenshot image.
file_put_contents('./screenshot.png', $image);
}
#!/usr/bin/python3
import urllib.request
import urllib.parse
def generate_screenshot_api_url(token, options):
api_url = 'https://api.pikwy.com/?token=' + token
if token:
api_url = api_url + '&url=' + options.get('url')
api_url = api_url + '&width=' + options.get('width')
api_url = api_url + '&height=' + options.get('height')
api_url = api_url + '&response_type=' + options.get('response_type')
return api_url;
token = 'YOUR_API_TOKEN'
options = {
'url': 'https://www.wikipedia.org/',
'width': '1280',
'height': '2000',
'response_type': 'image'
}
api_url = generate_screenshot_api_url(token, options)
#
opener = urllib.request.build_opener()
urllib.request.install_opener(opener)
output = 'output.png'
urllib.request.urlretrieve(api_url, output)
require 'net/http'
require 'json'
uri = URI('https://api.pikwy.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
req = Net::HTTP::Get.new(uri.path, {
'Content-Type' => 'application/json'
})
req.body = {
"u" => "https://wikipedia.org",
"tkn" => "{YOUR_API_TOKEN}",
"f" => "jpg",
"rt" => "json"
}.to_json
res = http.request(req)
data = JSON.parse(res.body)
Imports System
Imports System.net
Public Module PikwyClient
Public Sub Main()
Dim token As String
Dim ApiUrl As String
Dim UrlOpt As Url_Options
token = "YOUR_API_TOKEN"
UrlOpt.url = "https://www.wikipedia.org/"
UrlOpt.width = 1280
UrlOpt.height = 1024
UrlOpt.response_type = "image"
REM Parameters.
ApiUrl = "https://api.pikwy.com/?token=" & token
If token <> "" Then
ApiUrl = ApiUrl & "&url=" & UrlOpt.url
ApiUrl = ApiUrl & "&width=" & UrlOpt.width
ApiUrl = ApiUrl & "&height=" & UrlOpt.height
ApiUrl = ApiUrl & "&response_type=" & UrlOpt.response_type
End If
REM Save screenshot as an image.
Dim Client As New WebClient
Dim output As String = "\output.png"
Console.WriteLine(ApiUrl)
Client.DownloadFile(ApiUrl, output)
Console.WriteLine("The file was saved!")
End Sub
End Module
Module PikwyOptions
Public Structure Url_Options
Public url As String
Public width As Integer
Public height As Integer
Public response_type As String
End Structure
End Module
POST запрос
curl --request POST --url https://api.pikwy.com/
--header 'Content-Type: application/json'
--data '{"u":"https://wikipedia.org","fs":0,"rt":"json","tkn":"{YOUR_API_TOKEN}"}'
How to use this function, you can read in our article. https://pikwy.com/blog/how-create-screenshot-with-google-apps-script
function captueScreenshot() {
// Main parameters
var apiUrl = "https://api.pikwy.com";
var token = "YOUR TOKEN";
var driveFolderId = "DRIVE FOLDER ID"; // Google Drive Folder ID
var spreadSheetId = "SPREADSHEET ID"; // Google Spreadsheet ID
var dateAndTime = new Date().toLocaleString('en-US'); ///You can change the date format by replacing en-US
var parsingUrlSpreadSheetId = "PARSING SPREADSHEET ID"; Spreadsheet ID with links
var numberThreads = 10; ///The number of concurrent requests to take a screenshot. Depends on your chosen plan.
/// Read data from Google Spreadsheet, A1 colomn
var parsingUrlLastRow = SpreadsheetApp.openById(parsingUrlSpreadSheetId).getActiveSheet().getLastRow();
var parsingUrls = SpreadsheetApp.openById(parsingUrlSpreadSheetId).getActiveSheet()
.getRange("A1:A"+ parsingUrlLastRow).getValues();
/// Preparing data for a query
var urlsArr = [];
for(i in parsingUrls){
if (parsingUrls[i] != false) {
let formData = {
///Additional options for taking a screenshot
'u': encodeURIComponent(parsingUrls[i]),
'tkn': token,
'f':'jpg',
'width':'1500',
'height':'2000'
};
let headersParam = {
"url": apiUrl,
"method": "post",
"muteHttpExceptions": true,
"followRedirects": true,
"validateHttpsCertificates": false,
"contentType": "application/x-www-form-urlencoded",
"payload": formData};
urlsArr.push(headersParam);
}
}
var splitUrlsArr = [];
for (let i = 0; i < urlsArr.length; i += numberThreads) {
const chunk = urlsArr.slice(i, i + numberThreads);
splitUrlsArr.push(chunk);
}
for(i in splitUrlsArr){
var responses = UrlFetchApp.fetchAll(splitUrlsArr[i]);
for(b in responses){
if(responses[b].getContentText().length > 1000){
///Create a random filename
var namelength = 30;
var file_name = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for ( var c = 0; c < namelength; c++ ) {
file_name += characters.charAt(Math.floor(Math.random() * charactersLength));
}
var image = responses[b].getAs('image/jpeg').setName(file_name);
///Save screenshot to Google Drive
var folder = DriveApp.getFolderById(driveFolderId);
var file = DriveApp.createFile(image);
Drive.Files.update({"parents": [{"id": folder.getId()}]}, file.getId());
var driveImageUrl = 'https://drive.google.com/file/d/' + file.getId() + '/view';
/// Insert data into Google Spreadsheet
var lastRow = SpreadsheetApp.openById(spreadSheetId).getActiveSheet().getLastRow();
var insertData = [dateAndTime,decodeURIComponent(splitUrlsArr[i][b]['payload']['u']),driveImageUrl]
SpreadsheetApp.openById(spreadSheetId).getActiveSheet().getRange("A"+ (lastRow+1)+":C"+(lastRow+1)).setValues([insertData]);
}
}
}
}
fetch("https://api.pikwy.com", {
"method": "POST",
"headers": {
"Content-Type": "application/x-www-form-urlencoded"
},
"data": JSON.stringify({"u":"https://wikipedia.org","fs":0,"rt":"json","tkn":"{YOUR_API_TOKEN}"})
})
.then(function (response) {
console.log(response.status);
return response.text();
}).then(function (data) {
console.log(data);
})
.catch(function (error) {
console.log(error.message);
});
const axios = require('axios');
const options = {
"method": "POST",
"url": "https://api.pikwy.com"
"headers": {
"Content-Type": "application/x-www-form-urlencoded"
},
"data": JSON.stringify({"u":"https://wikipedia.org","fs":0,"tkn":"{YOUR_API_TOKEN}"})
};
axios
.request(options)
.then(function (response) {
console.log(response.data);
})
.catch(function (error) {
console.error(error);
});
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.pikwy.com/",
CURLOPT_HTTPHEADER =>
array(
"Content-Type: application/x-www-form-urlencoded"
),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => http_build_query(
array(
"u" => urlencode("https://www.wikipedia.org/"),
"tkn" => "{YOUR_API_TOKEN}",
"f" => "jpg"
)
),
));
$result = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if($err) {
echo "cURL Error #:" . $err;
}else {
$json_response = json_decode($result);
}
require 'net/http'
require 'json'
uri = URI('https://api.pikwy.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
req = Net::HTTP::Post.new(uri.path, {
'Content-Type' => 'application/json'
})
req.body = {
"u" => "https://wikipedia.org",
"tkn" => "{YOUR_API_TOKEN}",
"rt" => "json"
}.to_json
res = http.request(req)
data = JSON.parse(res.body)