osTicket API to create multiple tickets

1.9k Views Asked by At

I am using oSTicket API to create a ticket on one website, as our company has instances where the same ticket needs to be duplicated to another website which is also running osticket I am receiving errors. What I am attempting and not sure where the error is, is to duplicate the API code.

Below is the two codes placed into one. The information is drawn from a form on the previous page. If I do use the API for one ticket it works fine. I am using two different API keys

<?php
//eTrack case file create.

date_default_timezone_set('Africa/Johannesburg');
$today = date("Y-m-d");
$time = date("H:i:s");
if(!isset($_POST['submit']))
{
//This page should not be accessed directly. Need to submit the form.
    echo "Submitted";
}

$province = $_POST['province'];
$usergroup = $_POST['usergroup'];
$usermail = $_POST['usermail'];
$topicId = $_POST['topicId'];

// If 1, display things to debug.
$debug="0";

// You must configure the url and key in the array below.

$config = array(
        'url'=>'http://****.biz/incidents/api/tickets.json',  // URL to site.tld/api/tickets.json
        'key'=>'****D66F84'  // API Key goes here
);
# NOTE: some people have reported having to use "http://your.domain.tld/api/http.php/tickets.json" instead.

if($config['url'] === 'http://e-****.biz.tld/incidents/api/http.php/tickets.json') {
  echo "<p style=\"color:red;\"><b>Error: No URL</b><br>You have not configured this script with your URL!</p>";
  echo "Please edit this file ".__FILE__." and add your URL at line 18.</p>";
  die();  
}       
if(IsNullOrEmptyString($config['key']) || ($config['key'] === '*******'))  {
  echo "<p style=\"color:red;\"><b>Error: No API Key</b><br>You have not configured this script with an API Key!</p>";
  echo "<p>Please log into System as an admin and navigate to: Admin panel -> Manage -> Api Keys then add a new API Key.<br>";
  echo "Once you have your key edit this file ".__FILE__." and add the key at line 19.</p>";
  die();
}

# Fill in the data for the new ticket, this will likely come from $_POST.
# NOTE: your variable names in osT are case sensiTive. 
# So when adding custom lists or fields make sure you use the same case
# For examples on how to do that see Agency and Site below.
$data = array(
    'name'      =>      'Control',  // Client or Company Name
    'email'     =>      "$usermail",  // Person opening the case file email
    'phone'     =>      '**',  // Contact number of the person opening the case file. In this instance our Office Number
    'subject'   =>      "$casetype - $client - $reg", // Case type description, Testing multiple POST replies to string
    'date2'     =>      "$date",
    'time'      =>      "$time",
    'message'   =>      "
    Case Type:                  $casetype 
    Vehicle Registration:       $reg
    Vehicle Make:               $make
    Client:                     $name
    Where was it Taken:         $taken
    Reported by:                $name2 of $client
    Case Notes:
    $notes",  // test ticket body, aka Issue Details.
    'ip'        =>      $_SERVER['REMOTE_ADDR'], // Should be IP address of the machine thats trying to open the ticket.
    'topicId'   =>      "$topicId", // the help Topic that you want to use for the ticket Help topic ID is linked to dropdown list
    'date'      =>      "$date", //Reported date to Control room 
    'timerec'   =>      "$time", // Reported time to control room

    'email'     =>      "$usermail",

);

# more fields are available and are documented at:
# https://github.com/osTicket/osTicket-1.8/blob/develop/setup/doc/api/tickets.md

if($debug=='1') {
  print_r($data);
  die();
}

# Add in attachments here if necessary
# Note: there is something with this wrong with the file attachment here it does not work.
//$data['attachments'][] =
//array('file.txt' =>
  //      'data:text/plain;base64;'
    //        .base64_encode(file_get_contents('/file.txt')));  // replace ./file.txt with /path/to/your/test/filename.txt


#pre-checks
function_exists('curl_version') or die('CURL support required');
function_exists('json_encode') or die('JSON support required');

#set timeout
set_time_limit(30);

#curl post
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $config['url']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_USERAGENT, 'osTicket API Client v1.8');
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Expect:', 'X-API-Key: '.$config['key']));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result=curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($code != 201)
    die('Unable to create ticket: '.$result);

$ticket_id = (int) $result;

# Continue onward here if necessary. $ticket_id has the ID number of the
# newly-created ticket

function IsNullOrEmptyString($question){
    return (!isset($question) || trim($question)==='');
}
?>

<?php
//Recovery Assist case file create.

date_default_timezone_set('Africa/Johannesburg');
$today = date("Y-m-d");
$time = date("H:i:s");
#
# Configuration: Enter the url and key. That is it.
#  url => URL to api/task/cron e.g #  http://yourdomain.com/support/api/tickets.json
#  key => API's Key (see admin panel on how to generate a key)
#  $data add custom required fields to the array.
#
#  Originally authored by [email protected]
#  Modified by ntozier@osTicket / tmib.net
if(!isset($_POST['submit']))
{
//This page should not be accessed directly. Need to submit the form.
    echo "Submitted";
}
$name = $_POST['name'];

$topicId = $_POST['topicId'];

// If 1, display things to debug.
$debug="0";

// You must configure the url and key in the array below.

$config = array(
        'url'=>'http://***.co.za/report/api/tickets.json',  // URL to site.tld/api/tickets.json
        'key'=>'****DA3C6'  // API Key goes here
);
# NOTE: some people have reported having to use "http://your.domain.tld/api/http.php/tickets.json" instead.

if($config['url'] === 'http://***.co.za/report/api/http.php/tickets.json') {
  echo "<p style=\"color:red;\"><b>Error: No URL</b><br>You have not configured this script with your URL!</p>";
  echo "Please edit this file ".__FILE__." and add your URL at line 18.</p>";
  die();  
}       
if(IsNullOrEmptyString($config['key']) || ($config['key'] === '****'))  {
  echo "<p style=\"color:red;\"><b>Error: No API Key</b><br>You have not configured this script with an API Key!</p>";
  echo "<p>Please log into System as an admin and navigate to: Admin panel -> Manage -> Api Keys then add a new API Key.<br>";
  echo "Once you have your key edit this file ".__FILE__." and add the key at line 19.</p>";
  die();
}

# Fill in the data for the new ticket, this will likely come from $_POST.
# NOTE: your variable names in osT are case sensiTive. 
# So when adding custom lists or fields make sure you use the same case
# For examples on how to do that see Agency and Site below.
$data = array(
    'name'      =>      'Control',  // Client or Company Name
    'email'     =>      "$usermail",  // Person opening the case file email
    'phone'     =>      '****',  // Contact number of the person opening the case file. In this instance our Office Number
    'subject'   =>      "$casetype - $client - $reg", // Case type description, Testing multiple POST replies to string
    'date2'     =>      "$date",
    'time'      =>      "$time",
    'message'   =>      "
    Case Type:                  $casetype 
    Vehicle Registration:       $reg
    Vehicle Make:               $make
    Client:                     $name
    Where was it Taken:         $taken
    Reported by:                $name2 of $client
    Case Notes:
    $notes",  // test ticket body, aka Issue Details.
    'ip'        =>      $_SERVER['REMOTE_ADDR'], // Should be IP address of the machine thats trying to open the ticket.
    'topicId'   =>      "$topicId", // the help Topic that you want to use for the ticket Help topic ID is linked to dropdown list
    'date'      =>      "$date", //Reported date to Control room 
    'timerec'   =>      "$time", // Reported time to control room
    'name'      =>      "$name",
    'name2'     =>      "$name2",

    'email'     =>      "$usermail",

);

# more fields are available and are documented at:
# https://github.com/osTicket/osTicket-1.8/blob/develop/setup/doc/api/tickets.md

if($debug=='1') {
  print_r($data);
  die();
}

# Add in attachments here if necessary
# Note: there is something with this wrong with the file attachment here it does not work.
//$data['attachments'][] =
//array('file.txt' =>
  //      'data:text/plain;base64;'
    //        .base64_encode(file_get_contents('/file.txt')));  // replace ./file.txt with /path/to/your/test/filename.txt


#pre-checks
function_exists('curl_version') or die('CURL support required');
function_exists('json_encode') or die('JSON support required');

#set timeout
set_time_limit(30);

#curl post
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $config['url']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_USERAGENT, 'osTicket API Client v1.8');
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Expect:', 'X-API-Key: '.$config['key']));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result=curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($code != 201)
    die('Unable to create ticket: '.$result);

$ticket_id = (int) $result;

# Continue onward here if necessary. $ticket_id has the ID number of the
# newly-created ticket

function IsNullOrEmptyString($question){
    return (!isset($question) || trim($question)==='');
}
?>

The error I receive is:

Cannot redeclare IsNullOrEmptyString() (previously declared in /home/www/e-.biz/control/iframe/hollard/report_sub.php:350) in /home/www/e-.biz/control/iframe/hollard/report_sub.php on line 522

Only thing I can think of is that due to duplicating the code it has conflicts on the second code.

PS I have removed some of the POST code to make the code smaller

2

There are 2 best solutions below

0
On

The IsNullOrEmptyString function is already defined.

To avoid that error, use:

if (!function_exists('IsNullOrEmptyString')) {
    function IsNullOrEmptyString($question){
        return (!isset($question) || trim($question)==='');
    }
}

Although you should pay some attention on why you're getting this error. It usually indicates something wrong in the application logic.

It's never a good idea to just duplicate code. Try to see common/identical parts and extract them as separate functions.

0
On

I think you need to check the whole process again. please check the below link https://github.com/sharmaghanshyam/Osticket-Creation-API