{"id":278431,"date":"2016-04-16T19:15:03","date_gmt":"2016-04-16T15:15:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=278431"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=278431","title":{"rendered":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f Facebook Messenger"},"content":{"rendered":"<p>       \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0431\u0443\u043c \u0447\u0430\u0442-\u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432. \u041e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442 \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u043e\u0432.<br \/>  \u041d\u0435 \u0441\u0442\u0430\u043b \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c Facebook. 12 \u0430\u043f\u0440\u0435\u043b\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 F8 Facebook \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430.<br \/>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f Facebook \u043d\u0430 PHP.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u0427\u0430\u0442-\u0431\u043e\u0442\u044b \u0432 Facebook \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a API, \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438.<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/h2>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435.<br \/>  \u041f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u0445\u043e\u0442\u0438\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430, \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443.<\/p>\n<h2>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<br \/>  \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 <a href=\"https:\/\/developers.facebook.com\/apps\/\">developers.facebook.com\/apps<\/a><br \/>  \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/5db\/3de\/a51\/5db3dea51da6489995ff6b882bad9fa0.png\"\/><\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3f3\/0ce\/390\/3f30ce3903ca4b92a9a0ac9ec9029bba.png\"\/><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u043b\u0435\u0432\u043e\u043c \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 Messenger \u0438 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0435.<br \/>  \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u00ab\u041d\u0430\u0447\u0430\u0442\u044c\u00bb.<br \/>  \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0431\u043e\u0442\u0430, \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c token. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c, \u043e\u043d \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/942\/a1e\/c52\/942a1ec52336462c89b701f690b0f240.png\"\/><\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c webhook \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<br \/>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d \u0431\u043e\u0442:<\/p>\n<pre><code class=\"php\">&lt;?php $verify_token = &quot;&quot;; \/\/ Verify token  if (!empty($_REQUEST['hub_mode']) && $_REQUEST['hub_mode'] == 'subscribe' && $_REQUEST['hub_verify_token'] == $verify_token) {  echo $_REQUEST['hub_challenge'];  } <\/code><\/pre>\n<p>  \u0412 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e $verify_token \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0435\u043a\u0441\u0442.<br \/>  \u0421\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: <a href=\"https:\/\/domain.com\/fbbot\/\">domain.com\/fbbot<\/a><\/p>\n<p>  \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 Messenger \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f FB.<br \/>  \u0418\u0449\u0435\u043c \u0431\u043b\u043e\u043a \u00abWebhooks\u00bb \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u00abSetup Webhooks\u00bb. \u041a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0435.<\/p>\n<p>  \u0412 \u043f\u043e\u043b\u0435 \u00ab\u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441\u00bb \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u2014 <a href=\"https:\/\/domain.com\/fbbot\/\">domain.com\/fbbot<\/a><br \/>  SSL \u2014 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0421\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442.<\/p>\n<p>  \u0412 \u043f\u043e\u043b\u0435 \u00ab\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u00bb \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 $verify_token \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435.<br \/>  \u0412 \u043f\u043e\u043b\u0435 \u00ab\u041f\u043e\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438\u00bb \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0448 webhook:  <\/p>\n<ul>\n<li>message_deliveries \u2014 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/li>\n<li>messages \u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0431\u043e\u0442\u0443<\/li>\n<li>messaging_optins \u2014 callback \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 (Send-to-Messenger Plugin)<\/li>\n<li>messaging_postbacks \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0430\u043c \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u043e\u0442\u0430 (\u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0434\u0430\u043b\u0435\u0435)<\/li>\n<\/ul>\n<p>  \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u00bb.<\/p>\n<h2>\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443<\/h2>\n<p>  \u041d\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<pre><code class=\"bash\">curl -ik -X POST &quot;https:\/\/graph.facebook.com\/v2.6\/me\/subscribed_apps?access_token=-token-&quot; <\/code><\/pre>\n<p>  -token- \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 \u0442\u043e\u043a\u0435\u043d \u0432\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<h2>\u0422\u0438\u043f\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 FB Messenger<\/h2>\n<p>  \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435, \u043b\u0438\u0431\u043e Structured Text, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c:  <\/p>\n<ul>\n<li>button \u2014 \u043a\u043d\u043e\u043f\u043a\u0438<\/li>\n<li>generic \u2014 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b<\/li>\n<li>receipt \u2014 \u0441\u0447\u0435\u0442 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041a\u043d\u043e\u043f\u043a\u0438 (button)<\/h3>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<br \/>  \u0412\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043e\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/4d2\/9dd\/b18\/4d29ddb18d7342a6b25dd14a9939ed8e.png\"\/><\/p>\n<p>  \u041a\u043d\u043e\u043f\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432:  <\/p>\n<ol>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u0442\u0432\u0435\u0442 \u0431\u043e\u0442\u0443<\/li>\n<li>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435<\/li>\n<\/ol>\n<p>  <b>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0432 \u043e\u0434\u043d\u043e\u043c \u0442\u0430\u043a\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 3 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0431\u041e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043d\u043e\u043f\u043e\u043a \u2014 \u043e\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f.<\/b><\/p>\n<h3>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b (generic)<\/h3>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<br \/>  \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043f\u043e\u0434\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/a78\/197\/993\/a78197993592432cb1f236a267d0f3f3.png\"\/><\/p>\n<p>  \u0412 \u043e\u0434\u043d\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0434\u043e 10 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430.<br \/>  <b>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0432 \u043e\u0434\u043d\u043e\u043c \u0442\u0430\u043a\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 3 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0431\u041e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043d\u043e\u043f\u043e\u043a \u2014 \u043e\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f.<\/b><\/p>\n<h3>\u0421\u0447\u0435\u0442 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443 (receipt)<\/h3>\n<p>  \u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f.<br \/>  Facebook \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0433\u0430\u0437\u0438\u043d.<br \/>  \u0421\u0447\u0435\u0442 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445, \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438, \u043e\u043f\u043b\u0430\u0442\u0435, \u0430\u0434\u0440\u0435\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438, \u0441\u043a\u0438\u0434\u043a\u0430\u0445.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/e46\/745\/52c\/e4674552cb534d87993e84766fe3bb1f.png\"\/><\/p>\n<p>  <b>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043d\u043e\u043c\u0435\u0440 \u0441\u0447\u0435\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c.<\/b><\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434<\/h2>\n<p>  \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u0430, \u043d\u0430 GitHub \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 API \u043d\u0430 PHP, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c PHP SDK \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c PHP SDK \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 FB Messenger API \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 composer:  <\/p>\n<pre><code class=\"bash\">composer require &quot;pimax\/fb-messenger-php&quot; &quot;dev-master&quot; <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b index.php:  <\/p>\n<pre><code class=\"php\">&lt;?php  $verify_token = &quot;&quot;; \/\/ Verify token $token = &quot;&quot;; \/\/ Page token  if (file_exists(__DIR__.'\/config.php')) {     $config = include __DIR__.'\/config.php';     $verify_token = $config['verify_token'];     $token = $config['token']; }  require_once(dirname(__FILE__) . '\/vendor\/autoload.php');  use pimax\\FbBotApp; use pimax\\Messages\\Message; use pimax\\Messages\\MessageButton; use pimax\\Messages\\StructuredMessage; use pimax\\Messages\\MessageElement; use pimax\\Messages\\MessageReceiptElement; use pimax\\Messages\\Address; use pimax\\Messages\\Summary; use pimax\\Messages\\Adjustment;  $bot = new FbBotApp($token);  if (!empty($_REQUEST['hub_mode']) && $_REQUEST['hub_mode'] == 'subscribe' && $_REQUEST['hub_verify_token'] == $verify_token) {      \/\/ Webhook setup request     echo $_REQUEST['hub_challenge']; } else {       $data = json_decode(file_get_contents(&quot;php:\/\/input&quot;), true);      if (!empty($data['entry'][0]['messaging']))      {             foreach ($data['entry'][0]['messaging'] as $message)             { \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \/\/ ...             }    } } <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u043d\u0435\u0433\u043e.<br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0431\u043b\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:  <\/p>\n<pre><code class=\"php\">$bot-&gt;send(new Message($message['sender']['id'], \u2018Hi there!')); <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u043b\u044e\u0431\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<br \/>  \u0412 \u043e\u0442\u0432\u0435\u0442 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442 \u043d\u0435\u0433\u043e \u00abHi there!\u00bb.<br \/>  <b>\u0412\u0430\u0436\u043d\u043e: \u041f\u043e\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044e \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/b><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0434\u043e, \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u0412 \u0431\u043b\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:  <\/p>\n<pre><code class=\"php\">\/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0442\u043c\u0435\u0442\u043e\u043a \u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f if (!empty($message['delivery'])) {     continue; }  $command = &quot;&quot;; \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0443 if (!empty($message['message'])) {     $command = $message['message']['text'];     \/\/ \u0418\u041b\u0418 \u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0443 } else if (!empty($message['postback'])) {     $command = $message['postback']['payload']; }  \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 switch ($command) {      \/\/ When bot receive &quot;text&quot;     case 'text':         $bot-&gt;send(new Message($message['sender']['id'], 'This is a simple text message.'));         break;      \/\/ When bot receive &quot;button&quot;     case 'button':       $bot-&gt;send(new StructuredMessage($message['sender']['id'],           StructuredMessage::TYPE_BUTTON,           [               'text' =&gt; 'Choose category',               'buttons' =&gt; [                   new MessageButton(MessageButton::TYPE_POSTBACK, 'First button'),                   new MessageButton(MessageButton::TYPE_POSTBACK, 'Second button'),                   new MessageButton(MessageButton::TYPE_POSTBACK, 'Third button')               ]           ]       ));     break;      \/\/ When bot receive &quot;generic&quot;     case 'generic':          $bot-&gt;send(new StructuredMessage($message['sender']['id'],             StructuredMessage::TYPE_GENERIC,             [                 'elements' =&gt; [                     new MessageElement(&quot;First item&quot;, &quot;Item description&quot;, &quot;&quot;, [                         new MessageButton(MessageButton::TYPE_POSTBACK, 'First button'),                         new MessageButton(MessageButton::TYPE_WEB, 'Web link', 'http:\/\/facebook.com')                     ]),                      new MessageElement(&quot;Second item&quot;, &quot;Item description&quot;, &quot;&quot;, [                         new MessageButton(MessageButton::TYPE_POSTBACK, 'First button'),                         new MessageButton(MessageButton::TYPE_POSTBACK, 'Second button')                     ]),                      new MessageElement(&quot;Third item&quot;, &quot;Item description&quot;, &quot;&quot;, [                         new MessageButton(MessageButton::TYPE_POSTBACK, 'First button'),                         new MessageButton(MessageButton::TYPE_POSTBACK, 'Second button')                     ])                 ]             ]         ));      break;      \/\/ When bot receive &quot;receipt&quot;     case 'receipt':          $bot-&gt;send(new StructuredMessage($message['sender']['id'],             StructuredMessage::TYPE_RECEIPT,             [                 'recipient_name' =&gt; 'Fox Brown',                 'order_number' =&gt; rand(10000, 99999),                 'currency' =&gt; 'USD',                 'payment_method' =&gt; 'VISA',                 'order_url' =&gt; 'http:\/\/facebook.com',                 'timestamp' =&gt; time(),                 'elements' =&gt; [                     new MessageReceiptElement(&quot;First item&quot;, &quot;Item description&quot;, &quot;&quot;, 1, 300, &quot;USD&quot;),                     new MessageReceiptElement(&quot;Second item&quot;, &quot;Item description&quot;, &quot;&quot;, 2, 200, &quot;USD&quot;),                     new MessageReceiptElement(&quot;Third item&quot;, &quot;Item description&quot;, &quot;&quot;, 3, 1800, &quot;USD&quot;),                 ],                 'address' =&gt; new Address([                     'country' =&gt; 'US',                     'state' =&gt; 'CA',                     'postal_code' =&gt; 94025,                     'city' =&gt; 'Menlo Park',                     'street_1' =&gt; '1 Hacker Way',                     'street_2' =&gt; ''                 ]),                 'summary' =&gt; new Summary([                     'subtotal' =&gt; 2300,                     'shipping_cost' =&gt; 150,                     'total_tax' =&gt; 50,                     'total_cost' =&gt; 2500,                 ]),                 'adjustments' =&gt; [                     new Adjustment([                         'name' =&gt; 'New Customer Discount',                         'amount' =&gt; 20                     ]),                      new Adjustment([                         'name' =&gt; '$10 Off Coupon',                         'amount' =&gt; 10                     ])                 ]             ]         ));      break;      \/\/ Other message received     default:         $bot-&gt;send(new Message($message['sender']['id'], 'Sorry. I don\u2019t understand you.')); } <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0431\u043e\u0442\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:  <\/p>\n<ul>\n<li>text<\/li>\n<li>button<\/li>\n<li>generic<\/li>\n<li>receipt<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0411\u043e\u0442\u0430 \u0434\u043b\u044f \u0444\u0440\u0438\u043b\u0430\u043d\u0441-\u0431\u0438\u0440\u0436\u0438 Job4Joy<\/h2>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438.<br \/>  \u0414\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u043e RSS, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f picoFeed \u2014 <a href=\"https:\/\/github.com\/fguillot\/picoFeed\">github.com\/fguillot\/picoFeed<\/a><\/p>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c:  <\/p>\n<pre><code class=\"bash\">composer require fguillot\/picofeed @stable composer require &quot;pimax\/fb-messenger-php&quot; &quot;dev-master&quot; <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b index.php \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f (\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u043a\u043e\u0434\u0435):  <\/p>\n<pre><code class=\"php\">&lt;?php  $verify_token = &quot;&quot;; \/\/ Verify token $token = &quot;&quot;; \/\/ Page token $config = []; \/\/ config  if (file_exists(__DIR__.'\/config.php')) {     $config = include __DIR__.'\/config.php';     $verify_token = $config['verify_token'];     $token = $config['token']; }  require_once(dirname(__FILE__) . '\/vendor\/autoload.php');  use PicoFeed\\Reader\\Reader; use pimax\\FbBotApp; use pimax\\Messages\\Message; use pimax\\Messages\\MessageButton; use pimax\\Messages\\StructuredMessage; use pimax\\Messages\\MessageElement;  $bot = new FbBotApp($token);  if (!empty($_REQUEST['hub_mode']) && $_REQUEST['hub_mode'] == 'subscribe' && $_REQUEST['hub_verify_token'] == $verify_token) {     \/\/ Webhook setup request     echo $_REQUEST['hub_challenge']; } else {      $data = json_decode(file_get_contents(&quot;php:\/\/input&quot;), true);     if (!empty($data['entry'][0]['messaging']))     {         foreach ($data['entry'][0]['messaging'] as $message)         {             if (!empty($data['entry'][0])) {                  if (!empty($data['entry'][0]['messaging']))                 {                     foreach ($data['entry'][0]['messaging'] as $message)                     {                         if (!empty($message['delivery'])) {                             continue;                         }                          $command = &quot;&quot;;                          if (!empty($message['message'])) {                             $command = $message['message']['text'];                         } else if (!empty($message['postback'])) {                             $command = $message['postback']['payload'];                         }                          if (!empty($config['feeds'][$command]))                         {                             getFeed($config['feeds'][$command], $bot, $message);                         } else {                             sendHelpMessage($bot, $message);                         }                     }                 }             }         }     } }  \/**  * Send Help Message  *  * @param $bot Bot instance  * @param array $message Received message  * @return bool  *\/ function sendHelpMessage($bot, $message) {     $bot-&gt;send(new StructuredMessage($message['sender']['id'],         StructuredMessage::TYPE_BUTTON,         [             'text' =&gt; 'Choose category',             'buttons' =&gt; [                 new MessageButton(MessageButton::TYPE_POSTBACK, 'All jobs'),                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Web Development'),                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Software Development & IT')             ]         ]     ));      $bot-&gt;send(new StructuredMessage($message['sender']['id'],         StructuredMessage::TYPE_BUTTON,         [             'text' =&gt; ' ',             'buttons' =&gt; [                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Design & Multimedia'),                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Mobile Application'),                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Host & Server Management')             ]         ]     ));       $bot-&gt;send(new StructuredMessage($message['sender']['id'],         StructuredMessage::TYPE_BUTTON,         [             'text' =&gt; ' ',             'buttons' =&gt; [                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Writing'),                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Mobile Application'),                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Marketing')             ]         ]     ));      $bot-&gt;send(new StructuredMessage($message['sender']['id'],         StructuredMessage::TYPE_BUTTON,         [             'text' =&gt; ' ',             'buttons' =&gt; [                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Business Services'),                 new MessageButton(MessageButton::TYPE_POSTBACK, 'Translation & Languages')             ]         ]     ));       return true; }  \/**  * Get Feed Data  *  * @param $url Feed url  * @param $bot Bot instance  * @param $message Received message  * @return bool  *\/ function getFeed($url, $bot, $message) {     try {         $reader = new Reader;         $resource = $reader-&gt;download($url);          $parser = $reader-&gt;getParser(             $resource-&gt;getUrl(),             $resource-&gt;getContent(),             $resource-&gt;getEncoding()         );          $feed = $parser-&gt;execute();         $items = array_reverse($feed-&gt;getItems());          if (count($items)) {             foreach ($items as $itm)             {                 $url = $itm-&gt;getUrl();                 $message_text = substr(strip_tags($itm-&gt;getContent()), 0, 80);                  $bot-&gt;send(new StructuredMessage($message['sender']['id'],                     StructuredMessage::TYPE_GENERIC,                     [                         'elements' =&gt; [                             new MessageElement($itm-&gt;getTitle(), $message_text, '', [                                 new MessageButton(MessageButton::TYPE_WEB, 'Read more', $url)                             ]),                          ]                     ]                 ));             }          } else {             $bot-&gt;send(new Message($message['sender']['id'], 'Not found a new projects in this section.'));         }     }     catch (Exception $e) {         writeToLog($e-&gt;getMessage(), 'Exception');     }      return true; }  \/**  * Log  *  * @param mixed $data Data  * @param string $title Title  * @return bool  *\/ function writeToLog($data, $title = '') {     $log = &quot;\\n------------------------\\n&quot;;     $log .= date(&quot;Y.m.d G:i:s&quot;) . &quot;\\n&quot;;     $log .= (strlen($title) &gt; 0 ? $title : 'DEBUG') . &quot;\\n&quot;;     $log .= print_r($data, 1);     $log .= &quot;\\n------------------------\\n&quot;;      file_put_contents(__DIR__ . '\/imbot.log', $log, FILE_APPEND);      return true; } <\/code><\/pre>\n<p>  \u0418 \u0444\u0430\u0439\u043b config.php \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f:  <\/p>\n<pre><code class=\"php\">&lt;?php  return [     'token' =&gt; '',   \/\/ \u0422\u043e\u043a\u0435\u043d \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b     'verify_token' =&gt; '',  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d     'feeds' =&gt; [         'All jobs' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/',         'Web Development' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=3',         'Software Development & IT' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=5',         'Design & Multimedia' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=2',         'Mobile Application' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=7',         'Host & Server Management' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=6',         'Writing' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=8',         'Customer Service' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=10',         'Marketing' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=11',         'Business Services' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=12',         'Translation & Languages' =&gt; 'https:\/\/job4joy.com\/marketplace\/rss\/?id=14',     ] ]; <\/code><\/pre>\n<h2>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445<\/h2>\n<p>  \u041f\u043e\u043a\u0430 \u0431\u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u0431\u043e\u0442 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445, \u043d\u0443\u0436\u043d\u043e \u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 App Review \u2014 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f9c\/f0a\/c25\/f9cf0ac2538a43a0b9ddfd227f6c859a.png\"\/><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u2014 Messenger.<br \/>  \u0412 \u0431\u043b\u043e\u043a\u0435 \u00abApp Review for Messenger\u00bb \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u00abRequest Permissions\u00bb.<br \/>  \u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u00abpages_messaging\u00bb \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u00abAdd items\u00bb.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0445\u043e\u0442\u044f \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0434\u043d\u0435\u0439 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0430\u0447\u0438 \u0437\u0430\u044f\u0432\u043a\u0438.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f Facebook.<br \/>  \u0415\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439, \u0442\u043e \u0433\u043e\u0442\u043e\u0432 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u043e\u043f\u044b\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u043e\u0432 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b.<\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p>  <\/p>\n<ol>\n<li>Getting Started with FB Chatbots \u2014 <a href=\"https:\/\/developers.facebook.com\/docs\/messenger-platform\/quickstart\">developers.facebook.com\/docs\/messenger-platform\/quickstart<\/a><\/li>\n<li>Web hook Reference \u2014 <a href=\"https:\/\/developers.facebook.com\/docs\/messenger-platform\/webhook-reference\">developers.facebook.com\/docs\/messenger-platform\/webhook-reference<\/a><\/li>\n<li>FB Messenger PHP API \u2014 <a href=\"https:\/\/github.com\/pimax\/fb-messenger-php\">github.com\/pimax\/fb-messenger-php<\/a><\/li>\n<li>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f PHP API \u2014 <a href=\"https:\/\/github.com\/pimax\/fb-messenger-php-example\">github.com\/pimax\/fb-messenger-php-example<\/a><\/li>\n<li>Job4Joy FB Bot \u2014 <a href=\"https:\/\/github.com\/pimax\/job4joy_fb\">github.com\/pimax\/job4joy_fb<\/a><\/li>\n<\/ol>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/281559\/\"> https:\/\/habrahabr.ru\/post\/281559\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0431\u0443\u043c \u0447\u0430\u0442-\u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432. \u041e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442 \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u043e\u0432.<br \/>  \u041d\u0435 \u0441\u0442\u0430\u043b \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c Facebook. 12 \u0430\u043f\u0440\u0435\u043b\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 F8 Facebook \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430.<br \/>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0434\u043b\u044f Facebook \u043d\u0430 PHP.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-278431","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/278431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=278431"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/278431\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=278431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=278431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=278431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}