Last Updated or created 2025-06-15
I’ve got my own chat server, because WhatsApp sucks.
With this I can play around.
Below is a script to capture an image from a (Reolink) webcam, and show this in a Mattermost channel.
You need to configure your /slash command in Mattermost and a webserver with PHP
When entering
/labcam
in a channel, an image will be shown.



Code:
<?php
// See token from screenshots above
$expected_token = 'YOUR_MATTERMOST_TOKEN';
$token = $_POST['token'] ?? '';
if ($token !== $expected_token) {
http_response_code(403);
echo 'Invalid token, go away';
exit;
}
// Reolink camera settings
$ip = '192.168.1.2'; // Replace with your camera IP
$user = 'admin'; // Camera username
$pass = 'admin';// Camera password
$rs = uniqid(); // Unique request string
$url = "http://$ip/cgi-bin/api.cgi?cmd=Snap&channel=0&rs=$rs&user=$user&password=$pass";
// Temporary image save path (ensure this directory is public and writable)
$image_filename = 'snapshot_' . time() . '.jpg';
$image_path = __DIR__ . '/snapshots/' . $image_filename; // e.g., public_html/snapshots/
$image_url = 'https://labcam.henriaanstoot.nl/snapshots/' . $image_filename; // Public URL
// Fetch image from Reolink using cURL
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
$image_data = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code !== 200 || !$image_data) {
echo json_encode([
'response_type' => 'ephemeral',
'text' => 'Failed to get snapshot from Reolink camera.',
]);
exit;
}
// Save image
file_put_contents($image_path, $image_data);
// Respond to Mattermost
$response = [
'response_type' => 'in_channel',
'text' => 'Live snapshot from camera:',
'attachments' => [[
'image_url' => $image_url,
'fallback' => 'Reolink snapshot'
]]
];
header('Content-Type: application/json');
echo json_encode($response);