Документация

Используйте наш 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)