PHP

индекс
206,80

Объединяем twitter.com и vkontakte.ru (php — версия)

Навеяно постом http://habrahabr.ru/blogs/python/59236/.
Почитав вышеуказанный пост, предположил, что не каждый сможет использовать домашний комп для таких целей (например потому, что он включен не постоянно). Но зато многие из нас имеют php-хостинг, который так же поддерживает cron. Для разминки написал данный скрипт.

При написании использовал:
twitter API, которое скачал тут
vkontakte API, которое написал сам. Код скрипта получился таким:

<?
include 'twitter.class.php';
include 'vkontakte.class.php';
include 'config.php';

$twitter = new twitter();

$twitter->username = $twitterUser;
$twitter->password = $twitterPassword;

$statusTwitter = $twitter->userTimeline()->status->text;

$vk = new VkontakteAPI($vkontakteEmail, $vkontaktePassword);
$vk->auth();

$statusVkontakte = $vk->getStatus();

if ($statusTwitter != $statusVkontakte)
{
$vk->setStatus($statusTwitter);
}
?>


Итого нужно залить это в папку на хостинг, прописать настройки аккаунтов в файле config.php, который имеет
следующий ввид:
<?
$twitterUser = 'pupkin';
$twitterPassword = 'temp';

$vkontakteEmail = 'pupkin@yandex.ru';
$vkontaktePassword = 'temp';
?>

. И в принципе скрипт готов к использованию.

Прошу прощения за «недокументированность» моего кода, думаю тут и так все понятно, но все таки будет чуть свободного времени задокументирую. Принимаю вопросы и предложения по развитию скрипта. А так же возможные баги, которые буду стараться править в кратчайшие сроки.

Полный архив вместе с API можно скачать тут: www.radmus.net/downloads/twitter2vkontakte.zip

Приятного использования! =)
+23
10 мая 2009, 05:14
61

комментарии (75)

0
WoZ #
Нужно бы еще добавить проверку возвращаемых результатов, например, $twitter->userTimeline() может и false возвращать. Как результат, при каких-то траблах со стороны твиттера (который в последнее время опять нестабилен), статус vkontakte будет удалятся.
+19
bogus92 #
Вы бы хоть пароли свои с конфига убрали, не все ведь такие честные, что ими не воспользуются.
+3
Radmus #
Спасибо. Это моя огромная ошибка, больше не буду такие вещи делать в 5 утра )
–3
Error_403_Forbidden #
а в 4 утра?
0
zmakc #
Понимаю что API, но все равно объем кода на PHP радует :)
+1
Awake #
я сначала думал, что там будет на 120Кб :) Оказалось курл положили :)
–3
ciudilo #
Пытюсь запустить ма Маке:

File «twitter_in_vkon.py», line 67
if timeout:
^
IndentationError: unindent does not match any outer indentation level
+1
Radmus #
Вы кажется ошиблись топиком. Вам сюда habrahabr.ru/blogs/python/59236/
0
k3NGuru #
Спасибо, будем пробовать
+2
Radmus #
Вы кажется ошиблись топиком. Вам сюда habrahabr.ru/blogs/python/59236/
0
kolpeex #
Спасибо, рассмешили :D
0
Radmus #
Извиняюсь, ошибся сообщением, не туда ответил )
+8
NULL_byte #
Вы кажется ошиблись топиком. Вам сюда http://habrahabr.ru/blogs/php/59254/#comment_1606375
НЛО прилетело и опубликовало эту надпись здесь
+1
kosenka #
0
SovGVD #
ээх, не качается www.radmus.net/downloads/twitter2vkontakte.zip — хабра эффект? чисто хотелось сравнить со своим классом авторизации в соц сети.
0
A1MaZ #
С домашней машины, которая работает 24*7 и постоянно подключена к инету будет работать? Потому что на денвере не запустилось.
Fatal error: Call to undefined function curl_init() in Z:\home\twitter\www\twitter.class.php on line 253
Или я что-то не так делаю?
0
Radmus #
У меня работает на денвере, но нужно поставить библиотеку cURL дополнительно к денверу. Я добавил ее к архиву. Для установки Вам нужно положить ее в папку Z:\usr\local\php5\ext\ и в файле Z:\usr\local\php5\php.ini заменить строчку
;extension=php_curl.dll
на
extension=php_curl.dll

Перезапускаем денвер и все работает.
0
Radmus #
Копировать в папку нужно только файл php_curl.dll
0
A1MaZ #
Понял, спасибо. Попробую.
0
A1MaZ #
Отлично. Все работает, спасибо.
0
egrik #
Поставил, попробовал — не работает. Причина: В контакте сообщает, что я выполняю действия слишком быстро. Добавил после каждого curl_exec немного «сна» (sleep(2)) — все работает, спасибо )
0
Radmus #
У меня работало наверное потому, что инет не оч быстрый. Добавил у себя, спасибо за замечание.
0
SovGVD #
вконтакте запрещает действие, если прошая активность была менее 1 секунды назад.
До сих пор не удалось скачать =( Поэтому спросшу тут — как автор обошел проблемы с тем, что после ввода логин/пароль сайт иногда авторизирует, а иногда кидает на страницу авторизации, но уже с картинкой (каптчей)?
0
Radmus #
Странно, но мне удается скачать и сейчас. Если есть желание, могу выслать вам на почту. По поводу как обходил, затрудняюсь ответить. Вроде бы ничего особого и не делал там. Все разы что я запускал у себя, всегда входило без проблем.
0
SovGVD #
вышлите пожалуйста sovgvd (цобак) gmail.com =)
я просто писал проектик связанный с вконтактом, периодически при авторизации сайт перекидывал на страницу авторизации с картинкой, приходилось сохранять куки и держать их в базе, надеясь что по ним всё еще получится лазить =)
+1
Radmus #
Выслал.
0
oRb #
Скрипт парсит vkontakte.ru напрямую. Зачем? Есть же User API -> userapi.com/?act=doc#activity
0
Radmus #
Спасибо. Когда писал не знал о нем. В гугле сразу не нашел его...)
0
SovGVD #
через UserAPI даже нет смысла пытаться такое сделать… щас попробовал хотя бы что нибудь — авторизация клиента, любые запросы и прочее только через JS, ответ в виде JSON… т.е. через php обращения не получиться.
0
mamantoha #
получится.
По крайней мере я это делал с помощью Ruby без проблем. Думаю с PHP аналогично.
UserAPI довольно неплохо документировано. Надо только авторизироваться и получить cookie. Затем посылать запросы к серверу и получать ответ в JSON.
0
SovGVD #
я пытался авторизироваться посылая GET запрос (через cURL):
$url="http://login.userapi.com/auth?​login=force&site=".$site_id."​&email=".$login."&pass=".$pass;

ответ такой (никакого намека на sid):
HTTP/1.1 200 OK
Server: nginx/0.6.31
Date: Sun, 10 May 2009 20:27:11 GMT
Content-Type: text/html; charset=windows-1251
Connection: keep-alive
X-Powered-By: PHP/5.2.0-8+etch13
Set-Cookie: remixlang=0; expires=Mon, 10-May-2010 20:27:11 GMT; path=/; domain=.vkontakte.ru
Pragma: no-cache
Cache-control: private, must-revalidate
Set-Cookie: remixchk=5; expires=Sat, 08-May-2010 01:48:56 GMT; path=/; domain=.vkontakte.ru
Content-Length: 0

утречком проснусь — еще подумаю

и еще, скрипт обязан находиться на домене к которму привязан site_id или можно авторизироваться и на durov.ru используя site_id=2?
0
SovGVD #
недождался утра, решил проверить какой заголовок уходит при авторизации на дуров.ру

login.userapi.com/auth?site=2&id=0&fccode=0&fcsid=0&login=force&email=ЛОГИН&pass=ПАРОЛЬ

вобщем id=0&fccode=0&fcsid=0 — сильно влияют на авторизацию =)
0
mamantoha #
cURL не пользуюсь
На Ruby + Mechanize виглядит так:

agent = WWW::Mechanize.new
url = «login.userapi.com/auth?login=force&site=2&email=#{email}&pass=#{pass}»
login_page = agent.get(url)
if !agent.cookies.nil?
login = true
id = /remixmid=(\d+)/.match(agent.cookies[0].to_s)[1]
sid = /.*;sid=(\w*)/.match(login_page.uri.to_s)[1]
return true
else
return false
end

sid потом используется при запросе данных.
Если кому интересно некоторые наброски здесь: github.com/mamantoha/vkontakte-api/tree/master
0
SovGVD #
однако странно что со строкой:
login.userapi.com/auth?site=2&id=0&fccode=0&fcsid=0&login=force&email=ЛОГИН&pass=ПАРОЛЬ
авторизируется на ура, а со строкой:
login.userapi.com/auth?​login=force&site=2&email=ЛОГИН&pass=ПАРОЛЬ
никак
0
SovGVD #
почитад документацию и не совсем понял — нужно ли регистрировать некий сайт или авторизироваться и смотреть контакты, сообщения и прочее можно без каких либо проблем?
+3
differentlocal #
А зачем транслировать твитты во вконтактик? Или я чего-то не понял?

0
Arseny_Info #
Реплаи не публикуются?
0
webster #
публикуются, но это легко исправить.
Можно например так:

if(!substr($statusTwitter,0,1) == "@") {

//

}
0
Radmus #
Не могу понять зачем в карму минусовать… (
0
NikitaG #
Народ я что то не понял — почему нельзя скажем зарегить приложение vkontakte и получать статусы через родное API?
0
Kogol #
залил на мастерхост, не работает, скрипт грузится и ничего не происходит…
0
Radmus #
Уверены что правильно прописали свои настройки?
0
Kogol #
Уверен.
0
SovGVD #
а уверены что IP вашего провадера не забанены для vkontakte.ru? (через toonel.net и прочие можно не пытаться — ситуация аналогина)
0
Kogol #
Нет, в этом конечно не уверен, но вряд ли вконтакте забанил бы айпишники мастерхоста?
0
SovGVD #
ну ипы инфобокса например забанены… причем все, включая выделенные сервера
0
Kogol #
омг, за что?
0
SovGVD #
просто так, чтобы не лазили и не плодили ботов… пинговаться — пингуется, но тупо 'wget vkontakte.ru/' не работает… некоторое время работало через toonel.net но потом и через него перестало работать… жалко
0
NikKurkov #
Radmus, молодцом!
0
zolotoy #
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/public_html/twitter2vkontakte/twitter.class.php
0
zolotoy #
как побороть это?
0
Sanchous #
Наверное, отключением безопасного режима PHP и грамотной настройкой open_basedir?
0
Radmus #
Я думаю что можете просто закомментировать (поставить // в начале) 267 строку в файле
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
0
zolotoy #
закомментировал, но не работает
0
zolotoy #
скрипт не выполняется (зависает)
0
Radmus #
Тогда скорее всего придется выключать safe mod.
0
zolotoy #
мой провайдер этого не позволит
0
zolotoy #
узнал у хостера, все таки safe mode выключен
0
leonard #
Чуть чуть офтоп, но может кто знает софтину под мак или win которая мониторит весь http (можно не только http=) трафик с компа? Просто httpfox и Tamper Data не всегда справляется (особенно при передачи бинарных файлов)
0
egrik #
0
leonard #
А он бинарные данные хорошо обрабатывает? И следит за трафиком идущим только из ie или от любого приложения? И он вроде shareware, не подскажите там триал версия или ограниченная по функциональности бесплатно дается?
0
egrik #
Не понимаю, что значит «хорошо обрабатывает» — попробуйте поставить. Следить за трафиком от любого приложения. Триал версия — 15 дней.
0
leonard #
Спасибо за помощь) Хорошо обрабатывает — для меня это значит, что можно простым нажатием мыши выцепить передаваемый бинарный файл.
0
leonard #
Поставил, но stand alone версия что-то вылетает через секунд 20-30 после запуска.
0
egrik #
+ еще такой момент: кодировка В контакте windows-1251, Твиттера — UTF-8. В таком виде строки при сравнении не будут равными и обновление статуса будет происходить постоянно, что будет раздражать ваших друзей.
+ еще момент: если статус в Твиттере заканчивается на точку ".", то В контакте он будет без точки, всегда (он ее обрезает, чтобы самостоятельно ее поставить). Отсюда, опять-таки, та же проблема — не соответствие строк.

Выложить свой index.php здесь почему то не получается :(
–2
zeromodule #
Кому-то ещё нужен вконтакте?
0
cron #
Народ, а у кого-нибудь получается с серверов хостинга рбк достучаться до 80 порта вконтакта?
0
neptune #
Похоже у меня до соединения на вконтакте даже не доходит :(

* About to connect() to twitter.com port 80 (#0)
* Trying 128.121.146.100… * connected
* Connected to twitter.com (128.121.146.100) port 80 (#0)
* Server auth using Basic with user 'neptunix'
> GET /statuses/user_timeline.xml?count=20 HTTP/1.1
>…

< HTTP/1.1 200 OK
< Date: Thu, 21 May 2009 09:31:15 GMT
< Server: hi
<…
* Closing connection #0
0
dima_smol #
подскажите, как проверить соединяется ли скрипт с вконтактиком?

Точнее как я понял он соединяется, вконтактовский статус получает, но вот новый не устанавливает. В чем беда может быть?
0
dima_smol #
разобрался, оказалось папке нужно было выставить права на запись
0
DsXack #
Вот такое у меня, скорее всего — после обновления API во вконтакте:

PHP Notice: Undefined offset: 0 in /home/dsxack/www/vkontakte.class.php on line 40
0
neochapay #
так же. Перестало работать.
0
MpaK999 #
Twitter закрыл старое API, теперь только OAuth

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.