1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
facebook.php
См. документацию.
1<?
2
7
9
11{
12 const ID = "Facebook";
13 const CONTROLLER_URL = "https://www.bitrix24.ru/controller";
14 const LOGIN_PREFIX = "FB_";
15
16 protected $entityOAuth = null;
17
22 public function getEntityOAuth($code = false)
23 {
24 if(!$this->entityOAuth)
25 {
26 $this->entityOAuth = new CFacebookInterface();
27 }
28
29 if($code !== false)
30 {
31 $this->entityOAuth->setCode($code);
32 }
33
34 return $this->entityOAuth;
35 }
36
40 public function GetSettings(): array
41 {
42 $urlPreviewEnable = Option::get('main', 'url_preview_enable', 'Y');
43 $result = [
44 ['facebook_appid', Loc::getMessage('socserv_fb_id'), '', ['text', 40]],
45 ['facebook_appsecret', Loc::getMessage('socserv_fb_secret'), '', ['text', 40]],
46 ['note' => Loc::getMessage('socserv_fb_sett_note1', ['#URL#'=>$this->getEntityOAuth()->GetRedirectURI()])],
47 ];
48
49 if($urlPreviewEnable === 'Y')
50 {
51 $result[] = ['facebook_instagram_url_preview_enable', Loc::getMessage('socserv_fb_instagram_url_preview'), '', ['checkbox']];
52 $result[] = ['note' => Loc::getMessage('socserv_fb_sett_note_oembed_2')];
53 }
54
55 return $result;
56 }
57
58 public function GetFormHtml($arParams)
59 {
60 $url = $this->getUrl($arParams);
61
62 $phrase = ($arParams["FOR_INTRANET"])
63 ? GetMessage("socserv_fb_note_intranet")
64 : GetMessage("socserv_fb_note");
65
66 return $arParams["FOR_INTRANET"]
67 ? array("ON_CLICK" => 'onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 580, 400)"')
68 : '<a href="javascript:void(0)" onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 580, 400)" class="bx-ss-button facebook-button"></a><span class="bx-spacer"></span><span>'.$phrase.'</span>';
69 }
70
71 public function GetOnClickJs($arParams)
72 {
73 $url = $this->getUrl($arParams);
74 return "BX.util.popup('".CUtil::JSEscape($url)."', 680, 600)";
75 }
76
77 public function getUrl($arParams)
78 {
79 global $APPLICATION;
80
81 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
82 {
83 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
84 $state = $this->getEntityOAuth()->GetRedirectURI()."?check_key=".\CSocServAuthManager::getUniqueKey()."&state=";
85 $backurl = $APPLICATION->GetCurPageParam('', array("logout", "auth_service_error", "auth_service_id", "backurl"));
86 $state .= urlencode("state=".urlencode("backurl=".urlencode($backurl).(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '')));
87 }
88 else
89 {
90 $state = 'site_id='.SITE_ID.'&backurl='.urlencode($APPLICATION->GetCurPageParam('check_key='.\CSocServAuthManager::getUniqueKey(), array("logout", "auth_service_error", "auth_service_id", "backurl"))).(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '');
91 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
92 }
93
94 return $this->getEntityOAuth()->GetAuthUrl($redirect_uri, $state);
95 }
96
97 public function addScope($scope)
98 {
99 return $this->getEntityOAuth()->addScope($scope);
100 }
101
102 public function prepareUser($arFBUser, $short = false)
103 {
104 $arFields = array(
105 'EXTERNAL_AUTH_ID' => self::ID,
106 'XML_ID' => $arFBUser["id"],
107 'LOGIN' => static::LOGIN_PREFIX.$arFBUser["id"],
108 'EMAIL' => ($arFBUser["email"] != '') ? $arFBUser["email"] : '',
109 'NAME'=> $arFBUser["first_name"],
110 'LAST_NAME'=> $arFBUser["last_name"],
111 'OATOKEN' => $this->entityOAuth->getToken(),
112 'OATOKEN_EXPIRES' => $this->entityOAuth->getAccessTokenExpires(),
113 );
114
115 if(!$short && isset($arFBUser['picture']['data']['url']) && !$arFBUser['picture']['data']['is_silhouette'])
116 {
117 $picture_url = CFacebookInterface::GRAPH_URL.'/'.$arFBUser['id'].'/picture?type=large';
118 $temp_path = CFile::GetTempName('', 'picture.jpg');
119
120 $ob = new HttpClient(array(
121 "redirect" => true
122 ));
123 $ob->download($picture_url, $temp_path);
124
125 $arPic = CFile::MakeFileArray($temp_path);
126 if($arPic)
127 {
128 $arFields["PERSONAL_PHOTO"] = $arPic;
129 }
130 }
131
132 if(isset($arFBUser['birthday']))
133 {
134 if($date = MakeTimeStamp($arFBUser['birthday'], "MM/DD/YYYY"))
135 {
136 $arFields["PERSONAL_BIRTHDAY"] = ConvertTimeStamp($date);
137 }
138 }
139
140 if(isset($arFBUser['gender']) && $arFBUser['gender'] != '')
141 {
142 if($arFBUser['gender'] == 'male')
143 {
144 $arFields["PERSONAL_GENDER"] = 'M';
145 }
146 elseif($arFBUser['gender'] == 'female')
147 {
148 $arFields["PERSONAL_GENDER"] = 'F';
149 }
150 }
151
152 $arFields["PERSONAL_WWW"] = $this->getProfileUrl($arFBUser['id']);
153
154 if(SITE_ID <> '')
155 {
156 $arFields["SITE_ID"] = SITE_ID;
157 }
158
159 return $arFields;
160 }
161
162 public function Authorize()
163 {
164 global $APPLICATION;
165 $APPLICATION->RestartBuffer();
166
167 $authError = SOCSERV_AUTHORISATION_ERROR;
168
169 if(
170 isset($_REQUEST["code"]) && $_REQUEST["code"] <> ''
171 && CSocServAuthManager::CheckUniqueKey()
172 )
173 {
174 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
175 {
176 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
177 }
178 else
179 {
180 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
181 }
182
183 $this->entityOAuth = $this->getEntityOAuth($_REQUEST['code']);
184 if($this->entityOAuth->GetAccessToken($redirect_uri) !== false)
185 {
186 $arFBUser = $this->entityOAuth->GetCurrentUser();
187 if(is_array($arFBUser) && isset($arFBUser["id"]))
188 {
189 $arFields = self::prepareUser($arFBUser);
190 $authError = $this->AuthorizeUser($arFields);
191 }
192 }
193 }
194
195 $bSuccess = $authError === true;
196
197 $url = ($APPLICATION->GetCurDir() == "/login/") ? "" : $APPLICATION->GetCurDir();
198 $aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
199
200 if(isset($_REQUEST["state"]) && $bSuccess)
201 {
202 $arState = array();
203 parse_str($_REQUEST["state"], $arState);
204
205 if(isset($arState['backurl']) || isset($arState['redirect_url']))
206 {
207 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
208 if(mb_substr($url, 0, 1) !== "#")
209 {
210 $parseUrl = parse_url($url);
211
212 $urlPath = $parseUrl["path"];
213 $arUrlQuery = explode('&', $parseUrl["query"]);
214
215 foreach($arUrlQuery as $key => $value)
216 {
217 foreach($aRemove as $param)
218 {
219 if(mb_strpos($value, $param."=") === 0)
220 {
221 unset($arUrlQuery[$key]);
222 break;
223 }
224 }
225 }
226
227 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
228 }
229 }
230 }
231
232 if($authError === SOCSERV_REGISTRATION_DENY)
233 {
234 $url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
235 $url .= 'auth_service_id='.self::ID.'&auth_service_error='.$authError;
236 }
237 elseif($bSuccess !== true)
238 {
239 $url = (isset($urlPath)) ? $urlPath.'?auth_service_id='.self::ID.'&auth_service_error='.$authError : $GLOBALS['APPLICATION']->GetCurPageParam(('auth_service_id='.self::ID.'&auth_service_error='.$authError), $aRemove);
240 }
241
242 if(CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
243 {
244 $url .= ((mb_strpos($url, "?") === false) ? '?' : '&')."current_fieldset=SOCSERV";
245 }
246?>
247<script>
248if(window.opener)
249 window.opener.location = '<?=CUtil::JSEscape($url)?>';
250window.close();
251</script>
252<?
253 CMain::FinalActions();
254 }
255
256 public function setUser($userId)
257 {
258 $this->getEntityOAuth()->setUser($userId);
259 }
260
261 public function getFriendsList($limit, &$next)
262 {
263 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
264 {
265 $redirect_uri = self::CONTROLLER_URL."/redirect.php?redirect_to=".urlencode(CSocServUtil::GetCurUrl('auth_service_id='.self::ID, array("code")));
266 }
267 else
268 {
269 $redirect_uri = CSocServUtil::GetCurUrl('auth_service_id='.self::ID, array("code"));
270 }
271
272 $fb = $this->getEntityOAuth();
273 if($fb->GetAccessToken($redirect_uri) !== false)
274 {
275 $res = $fb->GetCurrentUserFriends($limit, $next);
276 if(is_array($res))
277 {
278 foreach($res['data'] as $key => $value)
279 {
280 $res['data'][$key]['uid'] = $value['id'];
281 $res['data'][$key]['url'] = $this->getProfileUrl($value['id']);
282
283 if(is_array($value['picture']))
284 {
285 if(!$value['picture']['data']['is_silhouette'])
286 {
287 $res['data'][$key]['picture'] = CFacebookInterface::GRAPH_URL.'/'.$value['id'].'/picture?type=large';
288 }
289 else
290 {
291 $res['data'][$key]['picture'] = '';
292 }
293 //$res['data'][$key]['picture'] = $value['picture']['data']['url'];
294 }
295 }
296
297 return $res['data'];
298 }
299 }
300
301 return false;
302 }
303
304 public function sendMessage($uid, $message)
305 {
306 $fb = new CFacebookInterface();
307
308 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
309 {
310 $redirect_uri = self::CONTROLLER_URL."/redirect.php?redirect_to=".urlencode(CSocServUtil::GetCurUrl('auth_service_id='.self::ID, array("code")));
311 }
312 else
313 {
314 $redirect_uri = CSocServUtil::GetCurUrl('auth_service_id='.self::ID, array("code"));
315 }
316
317 if($fb->GetAccessToken($redirect_uri) !== false)
318 {
319 $res = $fb->sendMessage($uid, $message);
320 }
321
322
323 return $res;
324 }
325
326 public function getMessages($uid)
327 {
328 $fb = new CFacebookInterface();
329
330 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
331 {
332 $redirect_uri = self::CONTROLLER_URL."/redirect.php?redirect_to=".urlencode(CSocServUtil::GetCurUrl('auth_service_id='.self::ID, array("code")));
333 }
334 else
335 {
336 $redirect_uri = CSocServUtil::GetCurUrl('auth_service_id='.self::ID, array("code"));
337 }
338
339 if($fb->GetAccessToken($redirect_uri) !== false)
340 {
341 $res = $fb->getMessages($uid);
342 }
343
344 return $res;
345 }
346 public function getProfileUrl($uid)
347 {
348 return "http://www.facebook.com/".$uid;
349 }
350
351 public static function SendUserFeed($userId, $message, $messageId)
352 {
353 $fb = new CFacebookInterface();
354 return $fb->SendFeed($userId, $message, $messageId);
355 }
356
357}
358
360{
361 const SERVICE_ID = "Facebook";
362
363 const AUTH_URL = "https://www.facebook.com/dialog/oauth";
364 const GRAPH_URL = "https://graph.facebook.com";
365
366 protected $userId = false;
367 protected $responseData = array();
368
369 protected $scope = array(
370 "email",
371 );
372
373 public function __construct($appID = false, $appSecret = false, $code=false)
374 {
375 if($appID === false)
376 {
377 $appID = trim(CSocServFacebook::GetOption("facebook_appid"));
378 }
379
380 if($appSecret === false)
381 {
382 $appSecret = trim(CSocServFacebook::GetOption("facebook_appsecret"));
383 }
384
385 parent::__construct($appID, $appSecret, $code);
386 }
387
388 public function GetRedirectURI()
389 {
390 return \CHTTP::URN2URI("/bitrix/tools/oauth/facebook.php");
391 }
392
393 public function GetAuthUrl($redirect_uri, $state = '')
394 {
395/* if(IsModuleInstalled('oauth'))
396 {
397 $_SESSION["FACEBOOK_OAUTH_LAST_REDIRECT_URI"] = $redirect_uri;
398 }*/
399
400 return self::AUTH_URL .
401 "?client_id=" . $this->appID .
402 "&redirect_uri=" . urlencode($redirect_uri) .
403 "&scope=".$this->getScopeEncode()."&display=popup" .
404 ($state <> '' ? '&state=' . urlencode($state) : '');
405 }
406
407 public function getResult()
408 {
409 return $this->responseData;
410 }
411
412 public function GetAccessToken($redirect_uri)
413 {
414 $token = $this->getStorageTokens();
415 if(is_array($token))
416 {
417 $this->access_token = $token["OATOKEN"];
418 $this->accessTokenExpires = $token["OATOKEN_EXPIRES"];
419
420 if($this->checkAccessToken())
421 {
422 return true;
423 }
424 }
425
426 if($this->code === false)
427 {
428 return false;
429 }
430
431 $result = CHTTP::sGetHeader(self::GRAPH_URL.'/oauth/access_token?client_id='.$this->appID.'&client_secret='.$this->appSecret.'&redirect_uri='.urlencode($redirect_uri).'&code='.urlencode($this->code), array(), $this->httpTimeout);
432
433 $arResult = Json::decode($result);
434 $this->responseData = $arResult;
435
436 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
437 {
438 $result = CHTTP::sGetHeader(self::GRAPH_URL."/oauth/access_token?grant_type=fb_exchange_token&client_id=".$this->appID."&client_secret=".$this->appSecret."&fb_exchange_token=".$arResult["access_token"], array(), $this->httpTimeout);
439
440 $arResultLongLive = Json::decode($result);
441
442 if(isset($arResultLongLive["access_token"]) && $arResultLongLive["access_token"] <> '')
443 {
444 $arResult["access_token"] = $arResultLongLive["access_token"];
445 $arResult["expires"] = isset($arResultLongLive["expires_in"]) ? $arResultLongLive["expires_in"] : 86400 * 60;
446 $_SESSION["OAUTH_DATA"] = array(
447 "OATOKEN" => $arResultLongLive["access_token"],
448 "OATOKEN_EXPIRES" => time() + $arResultLongLive['expires'],
449 );
450 }
451
452 $this->access_token = $arResult["access_token"];
453 $this->accessTokenExpires = time() + $arResult["expires"];
454
455 return true;
456 }
457
458 if (isset($this->responseData['error']))
459 {
460 $this->responseData = array(
461 'error' => $this->responseData['error']['type'],
462 'error_description' => $this->responseData['error']['message'],
463 );
464 }
465
466 return false;
467 }
468
469 public function GetCurrentUser()
470 {
471 if($this->access_token === false)
472 return false;
473
474 $http = new HttpClient();
475 $http->setTimeout($this->httpTimeout);
476
477 $result = $http->get(self::GRAPH_URL.'/me?access_token='.$this->access_token."&fields=picture,id,name,first_name,last_name,gender,email");
478
479 return Json::decode($result);
480 }
481
482 public function GetAppInfo()
483 {
484 if($this->access_token === false)
485 return false;
486
487 $http = new HttpClient();
488 $http->setTimeout($this->httpTimeout);
489
490 $result = $http->get(self::GRAPH_URL.'/debug_token?input_token='.$this->access_token.'&access_token='.$this->appID."|".$this->appSecret);
491 $result = Json::decode($result);
492
493 if($result["data"]["app_id"])
494 {
495 $result["id"] = $result["data"]["app_id"];
496 }
497
498 return $result;
499 }
500
501 public function GetCurrentUserFriends($limit, &$next)
502 {
503 if($this->access_token === false)
504 return false;
505
506 if(empty($next))
507 {
508 $url = self::GRAPH_URL.'/me/friends?access_token='.$this->access_token."&fields=picture,id,name,first_name,last_name,gender,email";
509
510 if($limit > 0)
511 {
512 $url .= "&limit=".intval($limit)."&offset=".intval($next);
513 }
514 }
515 else
516 {
517 $url = $next;
518 }
519
520 $http = new HttpClient();
521 $http->setTimeout($this->httpTimeout);
522
523 $result = $http->get($url);
524
525 $result = Json::decode($result);
526
527 if(is_array($result['paging']) && !empty($result['paging']['next']))
528 {
529 $next = $result['paging']['next'];
530 }
531 else
532 {
533 $next = '';
534 }
535
536 return $result;
537 }
538
539 public function SendFeed($socServUserId, $message, $messageId)
540 {
541 $isSetOauthKeys = true;
542 if(!$this->access_token || !$this->userId)
543 $isSetOauthKeys = self::SetOauthKeys($socServUserId);
544
545 if($isSetOauthKeys === false)
546 {
548 return false;
549 }
550
551 $arPost = array("access_token" => $this->access_token, "message"=> $message);
552 $result = @CHTTP::sPostHeader($this::GRAPH_URL."/".$this->userId."/feed", $arPost, array(), $this->httpTimeout);
553 if($result !== false)
554 {
555 return CUtil::JsObjectToPhp($result);
556 }
557 else
558 return false;
559 }
560
561 public function sendMessage($uid, $message)
562 {
563 if($this->access_token === false)
564 return false;
565
566 $url = self::GRAPH_URL.'/'.$uid.'/apprequests';
567
568 $arPost = array("access_token" => $this->access_token, "message"=> $message);
569
570 $ob = new HttpClient();
571 return $ob->post($url, $arPost);
572 }
573
574 public function getMessages($uid)
575 {
576 if($this->access_token === false)
577 return false;
578
579 $url = self::GRAPH_URL.'/'.$uid.'/apprequests?access_token='.$this->access_token;
580
581 $ob = new HttpClient();
582 return $ob->get($url);
583 }
584
585 private function SetOauthKeys($socServUserId)
586 {
587 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
588 'filter' => ['=ID' => $socServUserId],
589 'select' => ["OATOKEN", "XML_ID"]
590 ]);
591 while($arOauth = $dbSocservUser->fetch())
592 {
593 $this->access_token = $arOauth["OATOKEN"];
594 $this->userId = $arOauth["XML_ID"];
595 }
596 if(!$this->access_token || !$this->userId)
597 return false;
598 return true;
599 }
600}
601?>
$arParams
Определения access_dialog.php:21
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
$arResult
Определения generate_coupon.php:16
change_password_forgot_link login popup forget pas AUTH_GOTO_FORGOT_FORM login btn wrap change_password_button login popup link login popup return auth javascript
Определения change_password.php:57
Определения json.php:9
Определения facebook.php:360
__construct($appID=false, $appSecret=false, $code=false)
Определения facebook.php:373
SendFeed($socServUserId, $message, $messageId)
Определения facebook.php:539
$scope
Определения facebook.php:369
GetAccessToken($redirect_uri)
Определения facebook.php:412
getMessages($uid)
Определения facebook.php:574
GetCurrentUser()
Определения facebook.php:469
const AUTH_URL
Определения facebook.php:363
GetCurrentUserFriends($limit, &$next)
Определения facebook.php:501
sendMessage($uid, $message)
Определения facebook.php:561
GetRedirectURI()
Определения facebook.php:388
GetAuthUrl($redirect_uri, $state='')
Определения facebook.php:393
const SERVICE_ID
Определения facebook.php:361
$userId
Определения facebook.php:366
GetAppInfo()
Определения facebook.php:482
$responseData
Определения facebook.php:367
getResult()
Определения facebook.php:407
const GRAPH_URL
Определения facebook.php:364
static sGetHeader($url, $arHeader=array(), $httpTimeout=0)
Определения http.php:444
static sPostHeader($url, $arPostData, $arHeader=array(), $http_timeout=0)
Определения http.php:465
static Delete($id)
Определения authmanager.php:1853
Определения authmanager.php:985
static GetOption($opt)
Определения authmanager.php:1339
$userId
Определения authmanager.php:991
Определения facebook.php:11
const ID
Определения facebook.php:12
GetSettings()
Определения facebook.php:40
$entityOAuth
Определения facebook.php:16
getEntityOAuth($code=false)
Определения facebook.php:22
getUrl($arParams)
Определения facebook.php:77
const CONTROLLER_URL
Определения facebook.php:13
const LOGIN_PREFIX
Определения facebook.php:14
static SendUserFeed($userId, $message, $messageId)
Определения facebook.php:351
GetFormHtml($arParams)
Определения facebook.php:58
getStorageTokens()
Определения oauthtransport.php:116
checkAccessToken()
Определения oauthtransport.php:153
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
<? if( $useEditor3):?>< tr class="heading">< td colspan="2"><? echo GetMessage("FILEMAN_OPTION_SPELL_SET");?></td ></tr ><? if(function_exists( 'pspell_config_create')):$use_pspell_checked=(COption::GetOptionString( $module_id, "use_pspell", "Y")=="Y") ? "checked" :"";?>< tr >< td valign="top">< label for="use_pspell"><?echo GetMessage("FILEMAN_OPTION_USE_PSPELL");?></label >< br >< a title="<?echo GetMessage("FILEMAN_OPTION_ADDISH_DICS_TITLE");?> http
Определения options.php:1473
$result
Определения get_property_values.php:14
$uid
Определения hot_keys_act.php:8
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$message
Определения payment.php:8
const SITE_ID
Определения sonet_set_content_view.php:12
path
Определения template_copy.php:201
$url
Определения iframe.php:7