SearchEngines.bg

Това е примерно съобщение за гост. Регистрирайте безплатен акаунт днес, за да станете потребител на SearchEngines.bg! След като влезете, ще можете да участвате в този сайт, като добавите свои собствени теми и публикации, както и да се свържете с други членове чрез вашата лична входяща кутия! Благодарим ви!

Автоматично обновяване на Facebook статуса

mobilio

New member
От известно време ме тормози идеята за автоматично обновяване (autopost) на статуса във Facebook и други социални мрежи без други системи и приложения. Затова взех задачата присърце, седнах и преправих един прост скрипт който да свърши черната работа.

Виж файлът 1051

Код:
<?PHP
/*******************************
*	Facebook Status Updater version 0.1
*	Peter Nikolow
*	http://peter.nikolow.me
*	March 22, 2013
*******************************/

  function random_string( )
  {
    $character_set_array = array( );
    $character_set_array[ ] = array( 'count' => 7, 'characters' => 'abcdefghijklmnopqrstuvwxyz' );
    $character_set_array[ ] = array( 'count' => 1, 'characters' => '0123456789' );
    $temp_array = array( );
    foreach ( $character_set_array as $character_set )
    {
      for ( $i = 0; $i < $character_set[ 'count' ]; $i++ )
      {
        $temp_array[ ] = $character_set[ 'characters' ][ rand( 0, strlen( $character_set[ 'characters' ] ) - 1 ) ];
      }
    }
    shuffle( $temp_array );
    return implode( '', $temp_array );
  }

$status = random_string(10);
$login_email = 'type-here-your-mail';
$login_pass = 'type-here-your-pass';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://m.facebook.com/login.php?refsrc=http%3A%2F%2Fwww.facebook.com%2Flogin.php&refid=9');
curl_setopt($ch, CURLOPT_POSTFIELDS,'email='.urlencode($login_email).'&pass='.urlencode($login_pass).'&login=Login');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 600x800)");
$loginpage = curl_exec($ch);

curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com/home.php');
$page = curl_exec($ch);

curl_setopt($ch, CURLOPT_POST, 1);
preg_match("/input type=\"hidden\" name=\"fb_dtsg\" value=\"(.*?)\"/", $page, $form_id);
preg_match("/form method=\"post\" id=\"composer_form\" action=\"(.*?)\"/", $page, $form_num);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'fb_dtsg=' . $form_id[1] . '&privacy=&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84&target=&status=' . urlencode($status) . '&update=' . urlencode("Share"));

curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com' . $form_num[1]);
$page2 = curl_exec($ch);

curl_close($ch);
?>

Скрипта е сравнително глупав, но ще ви го обясня накратко:
  • Генерира се случаен стринг от 10 символа който ще бъде нашия нов статус. Това е много важно защото FB блокира показването на еднакви статуси и ми коства няколко часа докато го проумея. С това се избягва блокирането на статуса и е винаги уникален.
  • До първия curl_exec се изпълнява логване във Facebook с указаното потребителско име и парола. За да се избегне тежкия desktop ajax се представяме като много прост мобилен браузър. Така избягваме получаването на iOS/Android ajax версия която също е по-тежка за обработка. Кукитата се запазват във външен файл с цел последващо използване.
  • Със втория curl_exec се насочваме към основната страница на Facebook където ще обновим статуса на потребителя.
  • До третия curl_exec се изпълнява основната функция на обновяването. Проблема е че FB използва динамични форми и първо трябва да обработим втория резултат като вземем изключително важните параметри fb_dtsg - уникално id за формата и composer_form - сочещ към url-a който трябва да бъде извикан с третата заявка. Така композираме третата заявка която обновява статуса с няколко фиксирани параметъра.
  • Последния ред затваряме curl и задачата е приключена. Можем да изтрием файла с cookies защото вече не е необходим.

С което задачата е изпълнена с няколко особенности:
  1. Скрипта има проблеми с кирилицата! За момента не може да се публикува статус без да се счупи кирилицата. Тук проблема е по-тежък защото самия FB кара браузъра със специфично HTML поле "charset_test" да върне какво поддържа като езици и подозирам че нещо и оттам обърква кирилицата.
  2. Скрипта се представя за мобилен агент което води до показването на "from mobile" под поста.
  3. За момента показването на линкове не е много ефективно.
  4. Не могат да се качват снимки във timeline.
  5. Липсва проверка дали предходните операции са се случили безпроблемно. Например ако потребителското име/паролата са грешни не се спира изпълнението както и не се проверява дали обновяването на статуса минава безпроблемно.
  6. Не може да се контролира видимоста на поста (Public/Friends/Me). Мисля че се използва настройката на потребителя.
  7. Публикуването е фиксирано от името на човека и не може да се публикува от страница. Засега...
Надявам се със следващите версии да подобря част от недъзите на съществуващия скрипт. Системата е много гъвкава и на тази база може сравнително лесно да се направи подобен скрипт за публикуване във Twitter, Linkedin, Sharetronix, StatusNet и други подобни системи. Малко по-сложно ще е публикуването в Google+, но принципа е същия както в горните системи и не виждам причина да не бъде налична и тази социална мрежа.
С горния скрипт може да се направят много неща - примерно може да се настрои сървър да отчита параметрите си в интернет, може да се настрои автоматично постване през час от база данни, може да се извърши постване от името на потребител за вирална реклама и т.н. Общо взето възможностите са неограничени с тънкия момент, че не е много по правилата на Facebook. Ако трябва да бъде по правилата трябва да бъде приложение което потребителя с OAuth да упълномощи да извърши няколко дейности включително промяна на статуса.
За моя радост използвам скрипта САМО за лично ползване и то не и под основния ми акаунт. Ако имате въпроси ще бъда радостен да ви отговоря.
 
Re: Автоматично обновяване на Facebook статуса

Браво! Погледнах и блога ти и там публикуваш полезни неща. Аз наскоро мъча нещо подобно за svejo че не ми се занимава с други полу-автоматични решения. Прати на лично един скайп да съберем опит ;)
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

Много готина идея и кода ти си е съвсем приличен.
Браво.
Още по-голямо браво, че си го споделил тука.
И от Facebook, наистина може да изпищят :)
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

В момента fork-вам кода за др. платформи. Сравнително лесно се модифицира и се чете.

Както казах - аз го използвам за лични нужди просто го споделям с вас. Можете да си го модифицирате за ваши си. Една от идеите ми е да си направя linux сървърен модул който да използва twitter за системен статус през 5 минути (примерно). Правя отделен акаунт за сървър1, заключвам го и правя моя акаунт follower на сървърния акаунт. Така ако нещо се случи ще мога да видя кога се е случило само чрез twitter. Примерно захранванията, напреженията, мрежовия трафик, натоварване на процесора и т.н. И това ще може да се вижда без да се логваш и с прости действия... Идеята не е моя! Просто четох за ботнет мрежи управлявани чрез twitter и ме впечатли. Реших си - щом се използва за лоши дела, значи може да се впрегне и за добри такива!
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

mobilio,
Промени енкондинга на файла на UTF-8 (без BOM) и кирилицата ще се оправи. Тествано.
Каква е причината да не го правиш това през API-то на фейсбук ? (сигурно е глупав въпрос но .. :) )
Поздрави,
Константин.
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

API-то на СуратТефтера е супер, но OAuth не е създаден като цяло за десктоп приложения, а за скриптове изобщо!

Само кода за оторизиране и кода за смятане на signed request ще е няколко пъти по-дълъг от моя скрипт по-горе и ще трябва да се записват някъде стойностите (най-вече token-a) и т.н. Което на този етап ми се вижда безмислена хамалогия за нещо толкова просто и лесно.

Но това е едната страна на медала, другата страна е че скрипта е лесен и гъвкав. Може много лесно да се промени да извършва различни действия за които даже не сме си и мислили. Примерно да влезе в Svejo и да добави линк ИЛИ да публикува автоматично в разни групи в буука и т.н. и т.н.

Важен е самия механизъм на автоматизация на работата... доколкото всички тук сме запознати до някакъв начин с HTML, form, cookies, etc. дори е възможно новак да си автоматизира неговите дейности.
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

Здравейте,
по въпроса за АПИ-то на ФБ - реално ако се ползват библиотеките, които дават (от ФБ) кода е на половина по-малък, но си прав за останалото. Аз лично ползвам хибрид, час от нещата през апи-то, което не може със него - curl.
Неудобството на вторият метод, е че ако сменят нещо по html-a най-вероятно скрипта ще умре. Исках да дам един код за публикуване в свежо, но уви оказасе, че вече не работи поради горната причина. Все пак скалъпих нещо на 2 на 3 ако има мераклии да го пробват.
Има какво да се довърши по него, като прикачване на изображение например.
Поздрави,
Константин
Код:
<?php
//линк, който искате да споделите
$storyURL = "http://ььь-ььь.com";
//Потребител в свежо
$user = "xxxx";
//Парола за свежо
$password = "xxxx";


$loginURL = 'http://svejo.net/user/login/';
$publishURL = 'http://svejo.net/publish/';
/* '/tmp/svejo.dat' - Път до файла, в който се записват кукитата. В зависимост от с-мата (windows/unix/linux/mac/dos) може да е различен. */
$bot = new Spider('/tmp/svejo.dat');
//взема логин формата
$login = $bot->GetData($loginURL);
//извлича скритите полета (authenticity_token)
$postData = GetHiddens($login);
$postData['user[email_or_username]'] = $user;
$postData['user[password]'] = $password;
//логин
$htmlResponce = $bot->PostData($postData, $loginURL);
if (strpos($htmlResponce, "/user/logout") !== false) {
	echo "Логин: Ок\n";	
	//взема формата за публикуване
	$publisFormHtml = $bot->GetData($publishURL);
	//извлича скритите полета (authenticity_token)
	$publishPostData = GetHiddens($publisFormHtml);
	$publishPostData['story[url]'] = $storyURL;
	$publishPostData['commit'] = 'Добави';
	$htmlResponce = $bot->PostData($publishPostData, $publishURL . 'submit/');
	$matches = array();	
	if (preg_match('/manage\/([0-9]+)/is', $htmlResponce, $matches)) {
		//TODO: определя ллинка за редакция на обявата и добавя снимка		
		echo "Публикуване: Ок\n";					
	} else {
		echo "Възникна грешка при публикуване.";	
	}
} else {
	echo 'Неуспешен логин';
}

function GetHiddens($htmlContent) {
	$hiddens = array();
	$doc = new DomDocument();
	if (@$doc->loadHTML($htmlContent)) {
		$xPath = new DOMXPath($doc);
		$query = "//input[@type='hidden']";	
		$entries = $xPath->query($query);
		$hiddens = array();
		foreach ($entries as $entry) {
			if ($value = (string)$entry->getAttribute('value')) {
				$hiddens[(string)$entry->getAttribute('name')] = $value;
			}
		}		
	}
	return $hiddens;	
}

class Spider {
	protected $ch;
	protected $headers;
	public function __construct($cookies = '/tmp/spider.dat') {
		set_time_limit(0);
		$this->ch = curl_init();
		curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookies);
		if (!defined('__BOT_USER_AGENT')) {
			curl_setopt($this->ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060830 Firefox/1.5.0.7 (Debian-1.5.dfsg+1.5.0.7-2)');
		} else {
			curl_setopt($this->ch, CURLOPT_USERAGENT, __BOT_USER_AGENT);
		}		
		curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1);
	}
	public function PostData($data, $url) {		
		$post_array = Array();
		foreach($data as $key=>$value) {			    
			$post_array[] = urlencode($key) . '=' . urlencode($value);					
		}							
		curl_setopt($this->ch, CURLOPT_POST, TRUE);		
		curl_setopt($this->ch, CURLOPT_POSTFIELDS, implode('&',$post_array));		
		curl_setopt($this->ch, CURLOPT_URL, $url);		
		return curl_exec($this->ch);
	}
	public function GetData($url) {						
		curl_setopt($this->ch, CURLOPT_URL, $url);			
		curl_setopt($this->ch, CURLOPT_POST, FALSE);		
		curl_setopt($this->ch, CURLOPT_HTTPGET, TRUE);
		return curl_exec($this->ch);    			    			        			
	}	
}
?>
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

Kak moga da obnovq facebook
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

Статуса може да се обнови с горния код. Но е създадено за програмисти, а не за крайни потребители.

Идеята е да се вземе кода и да се внедри в по-голяма система. Например магазин - днес има артикули на промоция и магазина на всеки час си обновява статуса автоматично като сподели един артикул... просто пример.
 
Re: Автоматично обновяване на Facebook статуса

Това с показването на новите продукти от магазина във FB си има готово приложение.
 
За: Автоматично обновяване на Facebook статуса

За: Автоматично обновяване на Facebook статуса

Това е един от примерите... Може да се направи приложение което да показва температурата, влажността и вятъра в дадена точка например и автоматично да се обновява.

Може да се покажат борсовите котировки, може да се покаже нивото на река Дунав в сантиметри, може да се покаже колко дена остават до Коледа, може да се покаже какъв е курса долар/лев за деня, може да се покаже колко мегабайта трафик е направил сайта и т.н. и т.н.

Общо взето само въображението ви ограничава!
 

Горе