Евгений Корчмарек

Евгений Корчмарек

С нами с 17 июля 2018; Место в рейтинге пользователей: #1998
Евгений Корчмарек
24 сентября 2018, 00:59
0
Установил новую версию, после обновления при попытке зайти в меню пишет:

Could not find action file at: controllers/default/index.php

И пустое приложение,
Евгений Корчмарек
30 августа 2018, 22:05
0
А Вы готовы были бы поделиться доработанной версией?
Евгений Корчмарек
08 августа 2018, 01:27
0
У сервисом есть неприятная особенность — они рядом с постом добавляют ссылку на себя — и это гипер стремно: реакция у многих на такие посты — негативная;(
Евгений Корчмарек
07 августа 2018, 16:24
0
Я как раз хотел добить вк и купить модуль fb — нет смысла покупать? не работает?
Евгений Корчмарек
07 августа 2018, 16:22
0
Я попробовал так и сделать — запустить файл из консоли — но ему не хватает объектов мод х

Fatal error: Call to a member function get() on a non-object
Евгений Корчмарек
07 августа 2018, 05:24
0
Так как сейчас для соц. сетей важно — во сколько вы публикуете пост (и чтобы не ждать этого времени — есть идея реализовать автоматический постинг по расписанию.

Для этого создал отдельный TV, в который записывается время последнего поста данного ресурса.
Для автоматического постинга проверяется не превышено ли максимальное количество постов в сутки. И берется самый старый ресурс из дочерних опубликованных.

Осталось разобраться — как запустить его из cron — мб кто-то подскажет?

При запуске вручную — код работает:

<?php

/*Автоматический постинг в вконтакте. Общие параметры*/
$MaxPostsPerDay = 10;
$TopParentRes=2;
$ChildLevel=2;
$SortByFild= 'createdon';

/**/

$tv_vkPostDate_type = $modx->getObject('modTemplateVar',array('name' =>  'vkPostDate' ));
$tv_vkPostDate_id = $tv_vkPostDate_type->get('id');
$time_now = time();
$time_yesterday = $time_now - 24*60*60;
$output='';
$PostedId = Array();
$Sort_by = Array();


$tvs_where = array(
  'tmplvarid' =>  $tv_vkPostDate_id,
  'value:>' => $time_yesterday
);

$tvs_day = $modx->getCollection('modTemplateVarResource', $tvs_where);


if (count($tvs_day) < $MaxPostsPerDay) 
{
  $tvs_posted = $modx->getCollection('modTemplateVarResource', array('tmplvarid' =>  $tv_vkPostDate_id));
  foreach ($tvs_posted as $tv) {
	
    $PostedId[] = $tv->contentid;
}
  
  $allChildren = $modx->getChildIds($TopParentRes,$ChildLevel,array('context' => 'web'));
  
  if(count($allChildren))
  {
	
	$where = array(
	  'hidemenu' => false,
	  'published' => true,
	  'deleted' => false,
	  'id:IN' => $allChildren,
	  'id:NOT IN' => $PostedId
    );
  $resources = $modx->getCollection('modResource',$where);
  
  
  foreach ($resources as $k => $res) {
	$Sort_by[$k] = $res->get($SortByFild);
  }
  
  $min_value=min($Sort_by);
  $id = array_search($min_value, $Sort_by); 
  
  $resource = $modx->getObject('modResource',$id);
  
  if ($modx->loadClass('mSocial', MODX_CORE_PATH . 'components/msocial/model/msocial/', true, true))
  {
	
    //Получаем лексиконы
  $modx->lexicon->load('msocial:default');
  
  /* Список полей для постинга */
  $setting['allField'] = $resource->toArray();

	$setting['activeSoc'][] = 'vk';
	   
	    // Определяем метод действий
    $setting['method'] = 'posting';
  $mSocial = new mSocial($modx, $setting);
  
  
}else{
  $modx->log(modX::LOG_LEVEL_ERROR, "Не удалось подключить класс mSocial в ".MODX_CORE_PATH."/components/msocial/model/");
  return false;
}
  
}
  
  
} 

?>
Евгений Корчмарек
06 августа 2018, 11:13
0
Спасибо за комментарий, не разобрался сразу:

Можно тогда еще ссылку на публикацию в пост добавить,
Я сделал через ссылку в чанке:
<postlink href="[[~[[+id]]? &scheme=`full`]]"/>
Специально не брал стандартный Тег «a», так как ссылка должна быть одна — иначе ошибка.

Вконтакте пока из этой ссылки картинки не подгружают из og:image, но я в поддержку написал, мб поправят.

msocial.class.php
<?php
/**
* Класс mSocial для инициализации и подключение классов постинга в соцсети. Текущий набор соцсетей: Tw.
* @copyright  Copyright © 2016 devPastet (Pavel Karelin) devpastet@yandex.ru
*/

set_time_limit(0);

class mSocial 
{
	
	/**
     * @var mixed
    */
	public $setting;
	
	/**
     * @var mixed
    */
	public $modx;
	
	/**
     * @var string
    */
	public $soc;
	
	
	/*@var object $modx обьект modx */
	public function __construct(modX & $modx, $setting) 
	{
		require_once MODX_CORE_PATH . 'components/msocial/model/msocial/socials.class.php';
		$this->modx = $modx;
		$this->setting = $setting;
		
	    foreach($setting['activeSoc'] as $soc)
		{
			    $this->soc = $soc;
				$this->checkSocialAndDock();
	    }
	}
	
	/**
     * Определяем что есть класс соцсети и подключаем его
     */
	public function checkSocialAndDock()
	{ 
		if (file_exists(MODX_CORE_PATH . 'components/msocial/custom/network/'.$this->soc.'/'.$this->soc.'.class.php')) {
			$modx = $this->modx;
		    if($modx->loadClass($this->soc, MODX_CORE_PATH . 'components/msocial/custom/network/'.$this->soc.'/', true, true)){
		    	$this->getAndParseChunk($this->soc);
				$initSocial[$this->soc] = new $this->soc($modx, $this->setting);
				if($this->setting['method'] == 'posting'){
					$initSocial[$this->soc]->posting();
				}
			}
	    }
	}
	
	/**
     * Парсим шаблоны соцсетей
     */
	public function getAndParseChunk()
	{
		$chunkName = trim($this->modx->getOption('msocial_'.$this->soc.'_tp'));
		$this->setting['message'] = $this->modx->getChunk($chunkName, $this->setting['allField']);	
		$this->modx->getParser()->processElementTags('', $this->setting['message'], true, true, '[[', ']]', array(), 10);
		$this->setting['message'] = html_entity_decode($this->setting['message']);
		$this->parseAttach();
		$this->clearMess();
	}
	
	/**
     * Чистим сообщение от html
     */
	public function clearMess(){ // 
		$this->setting['message'] = strip_tags(trim($this->setting['message']));
	}
	
	/**
     * Ищем и дергаем файлы для отправки
     */
	public function parseAttach()
	{
		$this->setting['attach'] = array();
	    preg_match_all("/(<img )(.+?)( \/)?(>)/", $this->setting['message'],$images);
		foreach ($images[2] as $val)
		{
		    if (preg_match("/(src=)('|\")(.+?)('|\")/",$val,$matches) == 1)
			{

				if(file_exists(MODX_BASE_PATH.$matches[3]))
				{
					$this->setting['attach'][] = $matches[3];
				}
			}   
		}
		if (preg_match("/(<postlink )(.+?)( \/)?(>)/", $this->setting['message'],$link_src) == 1)
		{
		
			if (preg_match("/(href=)('|\")(.+?)('|\")/",$link_src[2],$link) == 1)
			{
				$this->setting['link']=$link[3];

			}
		
		}
		
	}
	
}

?>
И vk.class.php

<?php
/**
* Класс vk для постинга в соответствующую соцсеть.
* @copyright  Copyright © 2016 devPastet (Pavel Karelin) devpastet@yandex.ru
*/
class vk extends socials
{
	
	/**
     * @var array
    */
	public $vkKeys;
	
	public function __construct(modX & $modx, $setting) 
	{
		$this->modx = $modx;
		$this->setting = $setting;
		
		$this->vkKeys['owner_id'] = trim($this->modx->getOption('msocial_vk_id'));
		$this->vkKeys['access_token'] = trim($this->modx->getOption('msocial_vk_at'));	
		$this->vkKeys['from_group'] = trim($this->modx->getOption('msocial_im_fg'));
		$this->vkKeys['message'] = $this->setting['message'];	
		$this->vkKeys['v'] = '5.0';
		
	}
	
	/**
     * Метод для постинга
     */
	public function posting()
	{
		$param = $this->vkKeys;
		if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1)
		{
			$count = 1;
			foreach($this->setting['attach'] as $file)
			{
				if($count <= 4)
				{
					if (version_compare(phpversion(), '5.5.0', '<')) {
						$attrImg['file'.$count] = '@'.MODX_BASE_PATH.$file;
					}else{
						$attrImg['file'.$count] = new CURLFile(MODX_BASE_PATH.$file);
					}
				}
				$count++;
			}
			$imgList = $this->uploadImg($attrImg);
			if($imgList){
				foreach($this->uploadImg($attrImg) as $img){
					$attachments .= 'photo'.$img->owner_id.'_'.$img->id.',';
				}
				
			}
			
		}

		if(isset($this->setting['link']))
		{
			if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1)
			{

				$param['attachments'] = $attachments.$this->setting['link'];
			}
			else 
			{
				$param['attachments'] = $this->setting['link'];
			}
		
		} else
		
		{
			if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1)
			{
				$param['attachments'] = substr($attachments, 0, -1);
			}
		}

		
		$return =  $this->request('https://api.vk.com/method/wall.post',$param);
		
		/* Вызываем обработчик ошибок */
		if(isset($return->error)){
			$errorMsg = $return->error->error_code.' ('.$return->error->error_msg.')';
			$this->modx->log(modX::LOG_LEVEL_ERROR, $this->modx->lexicon('msocial_error_posting').' Vk '.$errorMsg);
		}
	}
	
	/**
     * Загрузка изображений
	 * $file array массив файлов
     */
	public function uploadImg($file)
	{
		$group_id = $this->vkKeys['owner_id'];
		$version = $this->vkKeys['v'];
		$album_id = '{ID альбома}';
		$access_token = $this->vkKeys['access_token'];
		if($group_id[0] == '-'){
			$group_id = substr($group_id, 1);
		}
		
		$server = $this->request('https://api.vk.com/method/photos.getWallUploadServer', array(
			'group_id' => $group_id,
			'access_token' => $this->vkKeys['access_token'],
			'v' => $version,
			'album_id' => $album_id

		));
		
		$vkPhoto = $this->request($server->response->upload_url, $file);
		
		$result = $this->request('https://api.vk.com/method/photos.saveWallPhoto', array(
			'group_id' => $group_id,
			'photo' => $vkPhoto->photo, 
			'server' => $vkPhoto->server, 
			'hash' => $vkPhoto->hash,
			'access_token' => $this->vkKeys['access_token'],
			'v' => $version
		));
		
		
		return $result->response;
		
	}
}
?>
Евгений Корчмарек
06 августа 2018, 05:51
0
Исправленный модуль с постингом картинок vk.class.php:
Необходимо в несколько мест добавить версию v=5.0 и album_id={id Альбома}

<?php
/**
* Класс vk для постинга в соответствующую соцсеть.
* @copyright Copyright © 2016 devPastet (Pavel Karelin) devpastet@yandex.ru
*/
class vk extends socials
{

/**
* @var array
*/
public $vkKeys;

public function __construct(modX & $modx, $setting)
{
$this->modx = $modx;
$this->setting = $setting;

$this->vkKeys['owner_id'] = trim($this->modx->getOption('msocial_vk_id'));
$this->vkKeys['access_token'] = trim($this->modx->getOption('msocial_vk_at'));
$this->vkKeys['from_group'] = trim($this->modx->getOption('msocial_im_fg'));
$this->vkKeys['message'] = $this->setting['message'];
$this->vkKeys['v'] = '5.0';

}

/**
* Метод для постинга
*/
public function posting()
{
$param = $this->vkKeys;
if(isset($this->setting['attach']) AND $this->modx->getOption('msocial_im_ps') == 1)
{
$count = 1;
foreach($this->setting['attach'] as $file)
{
if($count <= 4)
{
if (version_compare(phpversion(), '5.5.0', '<')) {
$attrImg['file'.$count] = '@'.MODX_BASE_PATH.$file;
}else{
$attrImg['file'.$count] = new CURLFile(MODX_BASE_PATH.$file);
}
}
$count++;
}
$imgList = $this->uploadImg($attrImg);
if($imgList){
foreach($this->uploadImg($attrImg) as $img){
$attachments .= 'photo'.$img->owner_id.'_'.$img->id.',';
}
$param['attachments'] = substr($attachments, 0, -1);
}

}

$return = $this->request('https://api.vk.com/method/wall.post',$param);

/* Вызываем обработчик ошибок */
if(isset($return->error)){
$errorMsg = $return->error->error_code.' ('.$return->error->error_msg.')';
$this->modx->log(modX::LOG_LEVEL_ERROR, $this->modx->lexicon('msocial_error_posting').' Vk '.$errorMsg);
}
}

/**
* Загрузка изображений
* $file array массив файлов
*/
public function uploadImg($file)
{
$group_id = $this->vkKeys['owner_id'];
$version = $this->vkKeys['v'];
$album_id = '{id Альбома}';
$access_token = $this->vkKeys['access_token'];
if($group_id[0] == '-'){
$group_id = substr($group_id, 1);
}

$server = $this->request('https://api.vk.com/method/photos.getWallUploadServer', array(
'group_id' => $group_id,
'access_token' => $this->vkKeys['access_token'],
'v' => $version,
'album_id' => $album_id

));

$vkPhoto = $this->request($server->response->upload_url, $file);

$result = $this->request('https://api.vk.com/method/photos.saveWallPhoto', array(
'group_id' => $group_id,
'photo' => $vkPhoto->photo,
'server' => $vkPhoto->server,
'hash' => $vkPhoto->hash,
'access_token' => $this->vkKeys['access_token'],
'v' => $version
));


return $result->response;

}
}
?>
Евгений Корчмарек
18 июля 2018, 10:05
0
На маке тоже есть Control — но Control-Enter — перехватывается системой. Хоткеи приняты с CMD — и лучше с буковой.
CMD — это как кнопка Windows — тот же код.
Евгений Корчмарек
17 июля 2018, 14:12
0
Добрый день, интересный функционал — а можно ли для Mac OS добавить другое сочетание клавиш, например CMD-Enter?

Спасибо.