У самизнаетекакогосайта есть акккаунт в Твиттере ([ссылка] – фоллоу, плиз). У Твиттера есть API, поэтому статьи и новости туда попадают автоматически. Как сделать автоматический постинг в Twitter я и расскажу в этом посте.
Т.к. в Twitter длина сообщения ограничена 140 символами, в которые надо вместить заголовок, частичку анонса и ссылку, то весь этот текст надо заранее подготовить.
Дальше я попытаюсь из кусоков кода своей CMS собрать надеюсь-что-работающий вариант кода. В общем главное – передать смысл, а не написать оптимизированный, готовый к употреблению код.
Подготовка
1. 2. 3. | function twitThis($caption, $text, $url) { // :) } |
И так. У нас есть: заголовок, анонс, ссылка.
С заголовком мы ничего поделать не можем. Он важный и его никак не обрежешь (лучше обрезать анонс). Поэтому просто пропускаем.
Анонс. Нам надо вырезать теги. Рекомендую использовать функцию strip_tags_smart от Рината Нассибулина.
1. | $text = strip_tags_smart($text); |
Ссылка. На бегиннере она выглядит как-то так: http://www.avtobeginner.ru/news/2009/08/21/356/porsche-obnovlyaet-legendarnuyu-model-911.html. Естественно такую простыню мы постить в Твиттер не будем. Ее надо укоротить.
Не мудрствуя лукаво, я написал по-простому:
1. 2. 3. 4. 5. 6. 7. 8. 9. | $context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlenpred' . PHP_EOL, 'content' => 'link[url]=' . urlencode($url), ), )); $url = trim(file_get_contents('http://tweetburner.com/links', false, $context)); |
И получим что-то типа http://twurl.nl/6mv7lm, что намного компактнее.
Дальше все просто: склеиваем заголовок, частичку анонса и ссылку:
1. 2. 3. | $maxTextLength = 160 - strlen($url) - 4; $twText = substr_plain($caption . ': ' . $text, $maxTextLength) . '... ' . $arItem['detail_url']; |
Функция substr_plain – это такая волшебная штука, которая обрезает строку не по крайнему символу, а по ближайшему пробелу в меньшую сторону. Для красоты :)
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. | function substr_plain($str, $length = null) { if (mb_strlen($str) <= $length) { return $str; } $strPos = mb_strpos($str, ' ', $length); if ($strPos > 0) { return mb_substr($str, 0, $strPos); } else { return mb_substr($str, 0, $length); } } |
Постинг
Задача простая – отправить подготовленный текст в Твиттер. Для этого я использую вот этот класс.
Примерно так:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. | // На самом деле константы определяются не тут, а в файле конфигурации define(CONFIG_TWITTER_USERNAME, 'имя в твиттере'); define(CONFIG_TWITTER_PASSWORD, 'пароль от твиттера'); $TwitterClient = new Twitter(CONFIG_TWITTER_USERNAME, CONFIG_TWITTER_PASSWORD); // Посылаем запрос if ($result = $TwitterClient->updateStatus($twText)) { /* помечаем запись как отправленную в твиттер */ return true; } else { return false; } |
Ну вот и все, ребята :) Чтобы не потерять код, сохраните его в каталоге исходников.


Не работает код.
Нет в классе такого метода
Call to undefined method twitter::updateStatus()
Возможно обновили класс. Читайте документацию, чтоб понять как сейчас статус обновить.
я прочитал и поменял название метода, но мне выдает
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in
safe_mode – выключен
open_url тоже
Значит хостер ограничил открытие файлов директивой open_basedir.