|
1
|
|
|
<?php |
|
2
|
|
|
require_once(dirname(__FILE__).'/libs/simple_html_dom.php'); |
|
3
|
|
|
require_once(dirname(__FILE__).'/libs/uagent/uagent.php'); |
|
4
|
|
|
|
|
5
|
|
|
class Common { |
|
6
|
|
|
//protected $cookies = array(); |
|
7
|
|
|
|
|
8
|
|
|
/** |
|
9
|
|
|
* Get data from form result |
|
10
|
|
|
* @param String $url form URL |
|
11
|
|
|
* @param String $type type of submit form method (get or post) |
|
12
|
|
|
* @param String|Array $data values form post method |
|
13
|
|
|
* @param Array $headers header to submit with the form |
|
14
|
|
|
* @return String the result |
|
15
|
|
|
*/ |
|
16
|
|
|
public function getData($url, $type = 'get', $data = '', $headers = '',$cookie = '',$referer = '',$timeout = '',$useragent = '') { |
|
17
|
|
|
$ch = curl_init(); |
|
18
|
|
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
19
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
20
|
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
|
21
|
|
|
curl_setopt($ch, CURLINFO_HEADER_OUT, true); |
|
22
|
|
|
curl_setopt($ch,CURLOPT_ENCODING , "gzip"); |
|
23
|
|
|
//curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5'); |
|
24
|
|
|
// curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0'); |
|
25
|
|
|
if ($useragent == '') { |
|
26
|
|
|
curl_setopt($ch, CURLOPT_USERAGENT, UAgent::random()); |
|
27
|
|
|
} else { |
|
28
|
|
|
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); |
|
29
|
|
|
} |
|
30
|
|
|
if ($timeout == '') curl_setopt($ch, CURLOPT_TIMEOUT, 10); |
|
31
|
|
|
else curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); |
|
32
|
|
|
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array('Common',"curlResponseHeaderCallback")); |
|
33
|
|
|
if ($type == 'post') { |
|
34
|
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); |
|
35
|
|
|
if (is_array($data)) { |
|
36
|
|
|
curl_setopt($ch, CURLOPT_POST, count($data)); |
|
37
|
|
|
$data_string = ''; |
|
38
|
|
|
foreach($data as $key=>$value) { $data_string .= $key.'='.$value.'&'; } |
|
39
|
|
|
rtrim($data_string, '&'); |
|
40
|
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); |
|
41
|
|
|
} else { |
|
42
|
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); |
|
43
|
|
|
} |
|
44
|
|
|
} |
|
45
|
|
|
if ($headers != '') { |
|
46
|
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); |
|
47
|
|
|
} |
|
48
|
|
|
if ($cookie != '') { |
|
49
|
|
|
if (is_array($cookie)) { |
|
50
|
|
|
curl_setopt($ch, CURLOPT_COOKIE, implode($cookie,';')); |
|
51
|
|
|
} else { |
|
52
|
|
|
curl_setopt($ch, CURLOPT_COOKIE, $cookie); |
|
53
|
|
|
} |
|
54
|
|
|
} |
|
55
|
|
|
if ($referer != '') { |
|
56
|
|
|
curl_setopt($ch, CURLOPT_REFERER, $referer); |
|
57
|
|
|
} |
|
58
|
|
|
$result = curl_exec($ch); |
|
59
|
|
|
$info = curl_getinfo($ch); |
|
60
|
|
|
curl_close($ch); |
|
61
|
|
|
if ($info['http_code'] == '503' && strstr($result,'DDoS protection by CloudFlare')) { |
|
62
|
|
|
echo "Cloudflare Detected\n"; |
|
63
|
|
|
require_once(dirname(__FILE__).'/libs/cloudflare-bypass/libraries/cloudflareClass.php'); |
|
64
|
|
|
$useragent = UAgent::random(); |
|
65
|
|
|
cloudflare::useUserAgent($useragent); |
|
66
|
|
|
if ($clearanceCookie = cloudflare::bypass($url)) { |
|
67
|
|
|
return $this->getData($url,'get',$data,$headers,$clearanceCookie,$referer,$timeout,$useragent); |
|
68
|
|
|
} |
|
69
|
|
|
} else { |
|
70
|
|
|
return $result; |
|
71
|
|
|
} |
|
72
|
|
|
} |
|
73
|
|
|
|
|
74
|
|
|
private function curlResponseHeaderCallback($ch, $headerLine) { |
|
75
|
|
|
//global $cookies; |
|
76
|
|
|
$cookies = array(); |
|
77
|
|
|
if (preg_match('/^Set-Cookie:\s*([^;]*)/mi', $headerLine, $cookie) == 1) |
|
78
|
|
|
$cookies[] = $cookie; |
|
79
|
|
|
return strlen($headerLine); // Needed by curl |
|
80
|
|
|
} |
|
81
|
|
|
|
|
82
|
|
|
public static function download($url, $file, $referer = '') { |
|
83
|
|
|
global $globalDebug; |
|
84
|
|
|
$fp = fopen($file, 'w'); |
|
85
|
|
|
$ch = curl_init(); |
|
86
|
|
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
87
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|
88
|
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
|
89
|
|
|
if ($referer != '') curl_setopt($ch, CURLOPT_REFERER, $referer); |
|
90
|
|
|
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5'); |
|
91
|
|
|
curl_setopt($ch, CURLOPT_FILE, $fp); |
|
92
|
|
|
curl_exec($ch); |
|
93
|
|
|
if (curl_errno($ch) && $globalDebug) echo 'Download error: '.curl_error($ch); |
|
94
|
|
|
curl_close($ch); |
|
95
|
|
|
fclose($fp); |
|
96
|
|
|
} |
|
97
|
|
|
|
|
98
|
|
|
/** |
|
99
|
|
|
* Convert a HTML table to an array |
|
100
|
|
|
* @param String $data HTML page |
|
101
|
|
|
* @return Array array of the tables in HTML page |
|
102
|
|
|
*/ |
|
103
|
|
|
public function table2array($data) { |
|
104
|
|
|
if (!is_string($data)) return array(); |
|
105
|
|
|
if ($data == '') return array(); |
|
106
|
|
|
$html = str_get_html($data); |
|
107
|
|
|
if ($html === false) return array(); |
|
108
|
|
|
$tabledata=array(); |
|
109
|
|
|
foreach($html->find('tr') as $element) |
|
110
|
|
|
{ |
|
111
|
|
|
$td = array(); |
|
112
|
|
|
foreach( $element->find('th') as $row) |
|
113
|
|
|
{ |
|
114
|
|
|
$td [] = trim($row->plaintext); |
|
115
|
|
|
} |
|
116
|
|
|
$td=array_filter($td); |
|
117
|
|
|
$tabledata[] = $td; |
|
118
|
|
|
|
|
119
|
|
|
$td = array(); |
|
120
|
|
|
$tdi = array(); |
|
121
|
|
|
foreach( $element->find('td') as $row) |
|
122
|
|
|
{ |
|
123
|
|
|
$td [] = trim($row->plaintext); |
|
124
|
|
|
$tdi [] = trim($row->innertext); |
|
125
|
|
|
} |
|
126
|
|
|
$td=array_filter($td); |
|
127
|
|
|
$tdi=array_filter($tdi); |
|
128
|
|
|
$tabledata[]=array_merge($td,$tdi); |
|
129
|
|
|
} |
|
130
|
|
|
$html->clear(); |
|
131
|
|
|
unset($html); |
|
132
|
|
|
return(array_filter($tabledata)); |
|
133
|
|
|
} |
|
134
|
|
|
|
|
135
|
|
|
/** |
|
136
|
|
|
* Convert <p> part of a HTML page to an array |
|
137
|
|
|
* @param String $data HTML page |
|
138
|
|
|
* @return Array array of the <p> in HTML page |
|
139
|
|
|
*/ |
|
140
|
|
|
public function text2array($data) { |
|
141
|
|
|
$html = str_get_html($data); |
|
142
|
|
|
if ($html === false) return array(); |
|
143
|
|
|
$tabledata=array(); |
|
144
|
|
|
foreach($html->find('p') as $element) |
|
145
|
|
|
{ |
|
146
|
|
|
$tabledata [] = trim($element->plaintext); |
|
147
|
|
|
} |
|
148
|
|
|
$html->clear(); |
|
149
|
|
|
unset($html); |
|
150
|
|
|
return(array_filter($tabledata)); |
|
151
|
|
|
} |
|
152
|
|
|
|
|
153
|
|
|
/** |
|
154
|
|
|
* Give distance between 2 coordonnates |
|
155
|
|
|
* @param Float $lat latitude of first point |
|
156
|
|
|
* @param Float $lon longitude of first point |
|
157
|
|
|
* @param Float $latc latitude of second point |
|
158
|
|
|
* @param Float $lonc longitude of second point |
|
159
|
|
|
* @param String $unit km else no unit used |
|
160
|
|
|
* @return Float Distance in $unit |
|
161
|
|
|
*/ |
|
162
|
|
|
public function distance($lat, $lon, $latc, $lonc, $unit = 'km') { |
|
163
|
|
|
if ($lat == $latc && $lon == $lonc) return 0; |
|
164
|
|
|
$dist = rad2deg(acos(sin(deg2rad(floatval($lat)))*sin(deg2rad(floatval($latc)))+ cos(deg2rad(floatval($lat)))*cos(deg2rad(floatval($latc)))*cos(deg2rad(floatval($lon)-floatval($lonc)))))*60*1.1515; |
|
165
|
|
|
if ($unit == "km") { |
|
166
|
|
|
return round($dist * 1.609344); |
|
167
|
|
|
} elseif ($unit == "m") { |
|
168
|
|
|
return round($dist * 1.609344 * 1000); |
|
169
|
|
|
} elseif ($unit == "mile" || $unit == "mi") { |
|
170
|
|
|
return round($dist); |
|
171
|
|
|
} elseif ($unit == "nm") { |
|
172
|
|
|
return round($dist*0.868976); |
|
173
|
|
|
} else { |
|
174
|
|
|
return round($dist); |
|
175
|
|
|
} |
|
176
|
|
|
} |
|
177
|
|
|
|
|
178
|
|
|
/** |
|
179
|
|
|
* Check is distance realistic |
|
180
|
|
|
* @param int $timeDifference the time between the reception of both messages |
|
181
|
|
|
* @param float $distance distance covered |
|
182
|
|
|
* @return whether distance is realistic |
|
183
|
|
|
*/ |
|
184
|
|
|
public function withinThreshold ($timeDifference, $distance) { |
|
185
|
|
|
$x = abs($timeDifference); |
|
186
|
|
|
$d = abs($distance); |
|
187
|
|
|
if ($x == 0 || $d == 0) return true; |
|
188
|
|
|
// may be due to Internet jitter; distance is realistic |
|
189
|
|
|
if ($x < 0.7 && $d < 2000) return true; |
|
190
|
|
|
else return $d/$x < 1500*0.27778; // 1500 km/h max |
|
191
|
|
|
} |
|
192
|
|
|
|
|
193
|
|
|
|
|
194
|
|
|
// Check if an array is assoc |
|
195
|
|
|
public function isAssoc($array) |
|
196
|
|
|
{ |
|
197
|
|
|
return ($array !== array_values($array)); |
|
198
|
|
|
} |
|
199
|
|
|
|
|
200
|
|
|
public function isInteger($input){ |
|
201
|
|
|
return(ctype_digit(strval($input))); |
|
202
|
|
|
} |
|
203
|
|
|
|
|
204
|
|
|
|
|
205
|
|
|
public function convertDec($dms,$latlong) { |
|
206
|
|
|
if ($latlong == 'latitude') { |
|
207
|
|
|
$deg = substr($dms, 0, 2); |
|
208
|
|
|
$min = substr($dms, 2, 4); |
|
209
|
|
|
} else { |
|
210
|
|
|
$deg = substr($dms, 0, 3); |
|
211
|
|
|
$min = substr($dms, 3, 5); |
|
212
|
|
|
} |
|
213
|
|
|
return $deg+(($min*60)/3600); |
|
214
|
|
|
} |
|
215
|
|
|
|
|
216
|
|
|
/** |
|
217
|
|
|
* Copy folder contents |
|
218
|
|
|
* @param string $source Source path |
|
219
|
|
|
* @param string $dest Destination path |
|
220
|
|
|
* @return bool Returns true on success, false on failure |
|
221
|
|
|
*/ |
|
222
|
|
|
public function xcopy($source, $dest) |
|
223
|
|
|
{ |
|
224
|
|
|
$files = glob($source.'*.*'); |
|
225
|
|
|
foreach($files as $file){ |
|
226
|
|
|
$file_to_go = str_replace($source,$dest,$file); |
|
227
|
|
|
copy($file, $file_to_go); |
|
228
|
|
|
} |
|
229
|
|
|
return true; |
|
230
|
|
|
} |
|
231
|
|
|
|
|
232
|
|
|
/** |
|
233
|
|
|
* Check if an url exist |
|
234
|
|
|
* @param String $url url to check |
|
235
|
|
|
* @return bool Return true on succes false on failure |
|
236
|
|
|
*/ |
|
237
|
|
|
public function urlexist($url){ |
|
238
|
|
|
$headers=get_headers($url); |
|
239
|
|
|
return stripos($headers[0],"200 OK")?true:false; |
|
240
|
|
|
} |
|
241
|
|
|
|
|
242
|
|
|
/** |
|
243
|
|
|
* Convert hexa to string |
|
244
|
|
|
* @param String $hex data in hexa |
|
245
|
|
|
* @return String Return result |
|
246
|
|
|
*/ |
|
247
|
|
|
public function hex2str($hex) { |
|
248
|
|
|
$str = ''; |
|
249
|
|
|
$hexln = strlen($hex); |
|
250
|
|
|
for($i=0;$i<$hexln;$i+=2) $str .= chr(hexdec(substr($hex,$i,2))); |
|
251
|
|
|
return $str; |
|
252
|
|
|
} |
|
253
|
|
|
|
|
254
|
|
|
|
|
255
|
|
|
public function getHeading($lat1, $lon1, $lat2, $lon2) { |
|
256
|
|
|
//difference in longitudinal coordinates |
|
257
|
|
|
$dLon = deg2rad($lon2) - deg2rad($lon1); |
|
258
|
|
|
//difference in the phi of latitudinal coordinates |
|
259
|
|
|
$dPhi = log(tan(deg2rad($lat2) / 2 + pi() / 4) / tan(deg2rad($lat1) / 2 + pi() / 4)); |
|
260
|
|
|
//we need to recalculate $dLon if it is greater than pi |
|
261
|
|
|
if(abs($dLon) > pi()) { |
|
262
|
|
|
if($dLon > 0) { |
|
263
|
|
|
$dLon = (2 * pi() - $dLon) * -1; |
|
264
|
|
|
} else { |
|
265
|
|
|
$dLon = 2 * pi() + $dLon; |
|
266
|
|
|
} |
|
267
|
|
|
} |
|
268
|
|
|
//return the angle, normalized |
|
269
|
|
|
return (rad2deg(atan2($dLon, $dPhi)) + 360) % 360; |
|
270
|
|
|
} |
|
271
|
|
|
|
|
272
|
|
|
public function checkLine($lat1,$lon1,$lat2,$lon2,$lat3,$lon3,$approx = 0.1) { |
|
273
|
|
|
//$a = ($lon2-$lon1)*$lat3+($lat2-$lat1)*$lon3+($lat1*$lon2+$lat2*$lon1); |
|
274
|
|
|
$a = -($lon2-$lon1); |
|
275
|
|
|
$b = $lat2 - $lat1; |
|
276
|
|
|
$c = -($a*$lat1+$b*$lon1); |
|
277
|
|
|
$d = $a*$lat3+$b*$lon3+$c; |
|
278
|
|
|
if ($d > -$approx && $d < $approx) return true; |
|
279
|
|
|
else return false; |
|
280
|
|
|
} |
|
281
|
|
|
|
|
282
|
|
|
public function array_merge_noappend() { |
|
283
|
|
|
$output = array(); |
|
284
|
|
|
foreach(func_get_args() as $array) { |
|
285
|
|
|
foreach($array as $key => $value) { |
|
286
|
|
|
$output[$key] = isset($output[$key]) ? |
|
287
|
|
|
array_merge($output[$key], $value) : $value; |
|
288
|
|
|
} |
|
289
|
|
|
} |
|
290
|
|
|
return $output; |
|
291
|
|
|
} |
|
292
|
|
|
|
|
293
|
|
|
|
|
294
|
|
|
public function arr_diff($arraya, $arrayb) { |
|
295
|
|
|
foreach ($arraya as $keya => $valuea) { |
|
296
|
|
|
if (in_array($valuea, $arrayb)) { |
|
297
|
|
|
unset($arraya[$keya]); |
|
298
|
|
|
} |
|
299
|
|
|
} |
|
300
|
|
|
return $arraya; |
|
301
|
|
|
} |
|
302
|
|
|
|
|
303
|
|
|
/** |
|
304
|
|
|
* Returns list of available locales |
|
305
|
|
|
* |
|
306
|
|
|
* @return array |
|
307
|
|
|
*/ |
|
308
|
|
|
public function listLocaleDir() |
|
309
|
|
|
{ |
|
310
|
|
|
$result = array('en'); |
|
311
|
|
|
if (!is_dir('./locale')) { |
|
312
|
|
|
return $result; |
|
313
|
|
|
} |
|
314
|
|
|
$handle = @opendir('./locale'); |
|
315
|
|
|
if ($handle === false) return $result; |
|
316
|
|
|
while (false !== ($file = readdir($handle))) { |
|
317
|
|
|
$path = './locale'.'/'.$file.'/LC_MESSAGES/fam.mo'; |
|
318
|
|
|
if ($file != "." && $file != ".." && @file_exists($path)) { |
|
319
|
|
|
$result[] = $file; |
|
320
|
|
|
} |
|
321
|
|
|
} |
|
322
|
|
|
closedir($handle); |
|
323
|
|
|
return $result; |
|
324
|
|
|
} |
|
325
|
|
|
|
|
326
|
|
|
public function nextcoord($latitude, $longitude, $speed, $heading, $archivespeed = 1){ |
|
327
|
|
|
global $globalMapRefresh; |
|
328
|
|
|
$distance = ($speed*0.514444*$globalMapRefresh*$archivespeed)/1000; |
|
329
|
|
|
$r = 6378; |
|
330
|
|
|
$latitude = deg2rad($latitude); |
|
331
|
|
|
$longitude = deg2rad($longitude); |
|
332
|
|
|
$bearing = deg2rad($heading); |
|
333
|
|
|
$latitude2 = asin( (sin($latitude) * cos($distance/$r)) + (cos($latitude) * sin($distance/$r) * cos($bearing)) ); |
|
334
|
|
|
$longitude2 = $longitude + atan2( sin($bearing)*sin($distance/$r)*cos($latitude), cos($distance/$r)-(sin($latitude)*sin($latitude2)) ); |
|
335
|
|
|
return array('latitude' => number_format(rad2deg($latitude2),5,'.',''),'longitude' => number_format(rad2deg($longitude2),5,'.','')); |
|
336
|
|
|
} |
|
337
|
|
|
|
|
338
|
|
|
public function getCoordfromDistanceBearing($latitude,$longitude,$bearing,$distance) { |
|
339
|
|
|
// distance in meter |
|
340
|
|
|
$R = 6378.14; |
|
341
|
|
|
$latitude1 = $latitude * (M_PI/180); |
|
342
|
|
|
$longitude1 = $longitude * (M_PI/180); |
|
343
|
|
|
$brng = $bearing * (M_PI/180); |
|
344
|
|
|
$d = $distance; |
|
345
|
|
|
|
|
346
|
|
|
$latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng)); |
|
347
|
|
|
$longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2)); |
|
348
|
|
|
|
|
349
|
|
|
$latitude2 = $latitude2 * (180/M_PI); |
|
350
|
|
|
$longitude2 = $longitude2 * (180/M_PI); |
|
351
|
|
|
|
|
352
|
|
|
$flat = round ($latitude2,6); |
|
353
|
|
|
$flong = round ($longitude2,6); |
|
354
|
|
|
/* |
|
355
|
|
|
$dx = $distance*cos($bearing); |
|
356
|
|
|
$dy = $distance*sin($bearing); |
|
357
|
|
|
$dlong = $dx/(111320*cos($latitude)); |
|
358
|
|
|
$dlat = $dy/110540; |
|
359
|
|
|
$flong = $longitude + $dlong; |
|
360
|
|
|
$flat = $latitude + $dlat; |
|
361
|
|
|
*/ |
|
362
|
|
|
return array('latitude' => $flat,'longitude' => $flong); |
|
363
|
|
|
} |
|
364
|
|
|
|
|
365
|
|
|
/** |
|
366
|
|
|
* GZIPs a file on disk (appending .gz to the name) |
|
367
|
|
|
* |
|
368
|
|
|
* From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php |
|
369
|
|
|
* Based on function by Kioob at: |
|
370
|
|
|
* http://www.php.net/manual/en/function.gzwrite.php#34955 |
|
371
|
|
|
* |
|
372
|
|
|
* @param string $source Path to file that should be compressed |
|
373
|
|
|
* @param integer $level GZIP compression level (default: 9) |
|
374
|
|
|
* @return string New filename (with .gz appended) if success, or false if operation fails |
|
375
|
|
|
*/ |
|
376
|
|
|
function gzCompressFile($source, $level = 9){ |
|
|
|
|
|
|
377
|
|
|
$dest = $source . '.gz'; |
|
378
|
|
|
$mode = 'wb' . $level; |
|
379
|
|
|
$error = false; |
|
380
|
|
|
if ($fp_out = gzopen($dest, $mode)) { |
|
381
|
|
|
if ($fp_in = fopen($source,'rb')) { |
|
382
|
|
|
while (!feof($fp_in)) |
|
383
|
|
|
gzwrite($fp_out, fread($fp_in, 1024 * 512)); |
|
384
|
|
|
fclose($fp_in); |
|
385
|
|
|
} else { |
|
386
|
|
|
$error = true; |
|
387
|
|
|
} |
|
388
|
|
|
gzclose($fp_out); |
|
389
|
|
|
} else { |
|
390
|
|
|
$error = true; |
|
391
|
|
|
} |
|
392
|
|
|
if ($error) |
|
393
|
|
|
return false; |
|
394
|
|
|
else |
|
395
|
|
|
return $dest; |
|
396
|
|
|
} |
|
397
|
|
|
} |
|
398
|
|
|
?> |
Adding explicit visibility (
private,protected, orpublic) is generally recommend to communicate to other developers how, and from where this method is intended to be used.