Last active
June 20, 2024 18:43
-
-
Save Achterstraat/bad3f41464819d8d67d231fee4cf83ae to your computer and use it in GitHub Desktop.
Heb je het óók he-le-maal gehad met Vimexx? Gebruik dan dit script om makkelijk én snel de overstap te realiseren, alle data binnen enkele seconden over naar je nieuwe hostingpartij!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
First, create API Projects at https://www.vimexx.nl/api | |
Second, replace all vars between [] with credentials from previous step! | |
Third, see below; | |
$vimexx = (new \Vimexx([account], 'wefact')); | |
var_export($vimexx->post('/domains')); | |
var_dump($vimexx->client('whmcs')->post('/domain/dns', ['sld' => 'achterstraat', 'tld' => 'com'])); | |
var_export($vimexx->client('wefact')->post('/domains')); | |
*/ | |
class Vimexx | |
{ | |
public $debug; | |
public $test = false; | |
public $token = false; | |
public $accounts = [ | |
[account] => [ | |
'user' => '[emailaddress]', | |
'pass' => '[password]', | |
'clients' => [ | |
'wefact' => [ | |
'id' => [api-id], | |
'secret' => '[api-hash]', | |
'version' => '5.1.2' | |
], | |
'whmcs' => [ | |
'id' => [api-id], | |
'secret' => '[api-hash]', | |
'version' => '7.7.1-release.1' | |
], | |
], | |
], | |
]; | |
public $account; | |
public $requests = [ | |
'wefact' => [ | |
'DELETE' => [ | |
'contact' => ['contact_id'], | |
], | |
'POST' => [ | |
'contact' => ['contact_id'], | |
'contacts' => [], | |
'dns' => ['sld', 'tld'], | |
'domain' => ['sld', 'tld'], | |
'domains' => [], | |
'domain/available' => ['sld', 'tld'], | |
'domain/extend' => ['sld', 'tld', 'years'], | |
'domain/register' => ['sld', 'tld', 'nameservers', 'whois'], | |
'domain/token' => ['sld', 'tld'], | |
'domain/transfer' => ['sld', 'tld', 'nameservers', 'whois', 'epp'], | |
], | |
'PUT' => [ | |
'contact' => ['contact'], | |
'contacts' => ['sld', 'tld', 'contacts'], | |
'dns' => ['sld', 'tld', 'dns_records'], | |
'domain' => ['sld', 'tld', 'auto_renew', 'lock'], | |
'nameservers' => ['sld', 'tld', 'nameservers', 'name'], | |
], | |
], | |
'whmcs' => [ | |
'DELETE' => [ | |
'domain' => ['sld', 'tld'], | |
], | |
'POST' => [ | |
'domain/dns' => ['sld', 'tld'], | |
'domain/extend' => ['sld', 'tld'], | |
'domain/nameservers' => ['sld', 'tld'], | |
'domain/sync' => ['sld', 'tld'], | |
'domain/sync/transfer' => ['sld', 'tld'], | |
'domain/register' => ['sld', 'tld'], | |
'domain/token' => ['sld', 'tld'], | |
'domain/transfer' => ['sld', 'tld', 'epp'], | |
], | |
'PUT' => [ | |
'domain/dns' => ['sld', 'tld', 'dns_records'], | |
'domain/nameservers' => ['sld', 'tld', 'nameservers', 'name'], | |
], | |
], | |
]; | |
public $request; | |
public $versions = [ | |
'wefact' => ['5.1.2', '5.0.0'], | |
'whmcs' => ['7.7.1-release.1', '7.6.1-release.1', '7.5.2-release.1'], | |
]; | |
public $version; | |
function __construct($account = 0, $client = 'whmcs', $debug = false) | |
{ | |
$this->debug = $debug; | |
if($this->account($account)) | |
{ | |
if($this->client($client)) | |
{ | |
return $this; | |
} | |
return ['error' => 'Unknown client!']; | |
} | |
return ['error' => 'Unknown account!']; | |
} | |
function __call($method, $args) | |
{ | |
if(in_array($method, ['delete', 'get', 'post', 'put'])) | |
{ | |
array_unshift($args, strtoupper($method)); | |
return call_user_func_array([$this, 'request'], $args); | |
} | |
} | |
public function account($id = 0) | |
{ | |
if(array_key_exists($id, $this->accounts)) | |
{ | |
$this->account = [ | |
'id' => $id, | |
'user' => $this->accounts[$id]['user'], | |
'pass' => $this->accounts[$id]['pass'] | |
]; | |
return $this; | |
} | |
return false; | |
} | |
public function client($client = 'whmcs') | |
{ | |
$id = $this->account['id']; | |
if(array_key_exists($client, $this->accounts[$id]['clients'])) | |
{ | |
$this->account = array_merge($this->account, [ | |
'client' => $client, | |
'credentials' => (empty($this->accounts[$id]['clients'][$client]) ? false : $this->accounts[$id]['clients'][$client]), | |
'version' => (in_array($this->accounts[$id]['clients'][$client]['version'], $this->versions) ? $this->accounts[$id]['clients'][$client]['version'] : $this->versions[$client][0]), | |
]); | |
return $this; | |
} | |
return false; | |
} | |
public function request($type = 'GET', $request = '/', $data = []) | |
{ | |
if(!in_array($request, [null, '', '/'])) | |
{ | |
$auth = $this->uri('/auth/token', 'login'); | |
$api = $this->uri('/'.$this->account['client'].$request); | |
list($scope, $request) = explode('/', substr($api, ($this->test ? 34 : 29)), 2); | |
if(array_key_exists($scope, $this->requests)) | |
{ | |
if(array_key_exists($type, $this->requests[$scope])) | |
{ | |
if(array_key_exists($request, $this->requests[$scope][$type])) | |
{ | |
$keys = array_keys($data); | |
$missing = array_diff($this->requests[$scope][$type][$request], $keys); | |
if(empty($missing)) | |
{ | |
$data = [ | |
'body' => $data, | |
'version' => $this->account['version'] | |
]; | |
$token = $this->token($auth); | |
if(empty($token)) | |
{ | |
return ['error' => 'Token failed!']; | |
} | |
$curl = curl_init(); | |
curl_setopt($curl, CURLOPT_HTTPHEADER, [ | |
'Accept: application/json', | |
'Authorization: Bearer '.$token, | |
]); | |
curl_setopt($curl, CURLOPT_URL, $api); | |
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $type); | |
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); | |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($curl, CURLOPT_VERBOSE, true); | |
$result = curl_exec($curl); | |
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); | |
curl_close($curl); | |
if($this->debug) | |
{ | |
var_dump([ | |
'requesttype' => $type, | |
'url' => $api, | |
'postdata' => $data, | |
'result' => $result, | |
'httpcode' => $code | |
]); | |
} | |
$result = json_decode($result, true); | |
$result['code'] = $code; | |
if(in_array($code, [200, 201, 202, 400, 401, 404])) | |
{ | |
return (!empty($result['result']) ? $result['data'] : false); | |
} | |
return null; | |
} | |
return ['error' => 'Missing '.implode(', ', $missing).' fields!']; | |
} | |
return ['error' => 'Undefined request!']; | |
} | |
return ['error' => 'Undefined method!']; | |
} | |
return ['error' => 'Undefined scope!']; | |
} | |
return (array_key_exists($this->account['client'], $this->requests) ? $this->requests[$this->account['client']] : array_keys($this->requests)); | |
} | |
public function token($url) | |
{ | |
if(empty($this->token)) | |
{ | |
$data = [ | |
'grant_type' => 'password', | |
'client_id' => $this->account['credentials']['id'], | |
'client_secret' => $this->account['credentials']['secret'], | |
'username' => $this->account['user'], | |
'password' => $this->account['pass'], | |
'scope' => 'whmcs-access', | |
]; | |
$curl = curl_init(); | |
curl_setopt($curl, CURLOPT_HTTPHEADER, [ | |
'Content-Type' => 'application/x-www-form-urlencoded', | |
'charset' => 'utf-8' | |
]); | |
curl_setopt($curl, CURLOPT_URL, $url); | |
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); | |
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); | |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | |
$result = curl_exec($curl); | |
curl_close($curl); | |
$json = json_decode($result, true); | |
if(empty($json['access_token'])) | |
{ | |
return false; | |
} | |
$this->token = $json['access_token']; | |
} | |
return $this->token; | |
} | |
public function uri($request = '', $type = 'api', $base = null) | |
{ | |
$base = rtrim(empty($base) || !stripos($base, '://') ? 'https://api.vimexx.nl' : $base, '/'); | |
switch($type) | |
{ | |
case 'login': { | |
return $base.'/auth/token'; | |
} | |
default: { | |
return $base.'/'.($this->test ? 'test' : '').'api/v1/'.(empty($request) ? '' : ltrim($request, '/')); | |
} | |
} | |
} | |
} |
Jazeker, alle details zijn inzichtelijk en indexeerbaar.. ..al kan ik je geen kant en klare oplossing aanleveren aangezien ik geen actief account meer heb bij de amateurs van Vimexx, ze maken meer kapot dan men ooit zou kunnen fixen!
Je hebt geen wefact óf whmc nodig, deze class combineert de krachten van beide.. ..gebruik voor jou vraag wefact i.c.m. /domains voor al je domeinnamen!
Dank voor je reactie. Ga kijken of het me lukt!
Hey Achterstraat
Mag ik je vragen bij welke provider je nu zit, waar het echt goed is prijs/kwaliteit voor resellers?
Hier ben ik namelijk ook naar op zoek :).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi,
Is het hiermee mogelijk om een uitdraai te maken van alle domeinen met de vervaldatum?