блогът на belogradchik.biz

Фейсбок(Facebook) АПИ(API) - за ъплоад на снимки

August 5th, 2008 zetxxx

След дълга липса на писания в този блог поради липсата на свободно време реших да запечатамедин код които ми отне 3 часа от живота и както винаги се оказва проблемът е бил в — ( 2-те тиренца ) :(.

Идеята на този класс е да може някои девел. за напред ако има проблем с ъплоад на снимки в фейсбоок да го види да си го копне - да попълни липсващите параметри и наий-вече да му спести работа :).

Лиценза е гну, държа само да се спомене че е моя работа …

ето го и кода

  1. <?php
  2. /**
  3.  * @author Elin Ahmedov
  4.  * @category facebook image upload api
  5.  * @copyright GNU
  6.  * @since 06.08.2008
  7.  * @version 0.1
  8.  */
  9. require_once './client/facebook.php';
  10. class fbPhotoUpload
  11. {
  12.  private $namespace = array();
  13.  
  14.  /**
  15.   * class constructor
  16.   * @return fbPhotoUpload
  17.   */
  18.  
  19.  public function fbPhotoUpload()
  20.  {
  21.   return $this;
  22.  }
  23.  
  24.  /**
  25.   * setting external variables
  26.   *
  27.   * @param string $name
  28.   * @param string $value
  29.   */
  30.  
  31.  public function setVars( $name, $value )
  32.  {
  33.   $this->namespace[$name] = $value;
  34.  }
  35.  
  36.  /**
  37.   * collecting arguments for later signature generation
  38.   *
  39.   * @param string $sig__name
  40.   * @param string $sig__value
  41.   */
  42.  
  43.  private function collect__sig__( $sig__name, $sig__value )
  44.  {
  45.   $this->namespace['__sig__'][$sig__name] = $sig__value;
  46.  }
  47.  
  48.  /**
  49.   * signature generation
  50.   *
  51.   * @param string $text
  52.   * @return string
  53.   */
  54.  
  55.  private function set__sig__( $text )
  56.  {
  57.   $sig = '';
  58.   ksort( $this->namespace['__sig__'] );
  59.   foreach( $this->namespace['__sig__'] as $name=>$value )
  60.    $sig .= $name.'='.$value;
  61.   $this->namespace['__sig__']['sig'] = md5( $sig.$this->namespace['__secret__'] );
  62.   return preg_replace( '/__sig__/i', $this->namespace['__sig__']['sig'], $text );
  63.  }
  64.  
  65.  /**
  66.   * create top headers
  67.   *
  68.   */
  69.  
  70.  private function setReqsHeaders()
  71.  {
  72.   $this->namespace['headers'] = "POST ".$this->namespace['request_file']." HTTP/1.1\r\n";
  73.   $this->namespace['headers'] .= "Host: ".$this->namespace['domain']."\r\n";
  74.   $this->namespace['headers'] .= "User-Agent: Facebook Photo API PHP5 Client 1.0 ".phpversion()."\r\n";
  75.   $this->namespace['headers'] .= "Connection: close\r\n";
  76.   $this->namespace['headers'] .= "Content-type: multipart/form-data, boundary=".$this->namespace['boundary']."\r\n";
  77.   $this->namespace['headers'] .= "Content-Length: __cont_lenght__\r\n";
  78.   $this->namespace['headers'] .= "MIME-version: 1.0\r\n\r\n";
  79.   $this->namespace['headers'] = preg_replace( '/__cont_lenght__/i', strlen( $this->namespace['add.headers'] ), $this->namespace['headers'] ).$this->namespace['add.headers'];
  80.  }
  81.  
  82.  /**
  83.   * create additional headers
  84.   *
  85.   * @param string $content
  86.   */
  87.  
  88.  private function setAdditonalHeaders( $content )
  89.  {
  90.   preg_match( '/(?P<fname>[^\/]*?(?P<fext>[^\.]*))$/i', $this->namespace['file_name'], $matches );
  91.   $this->namespace['add.headers'] = '–'.$this->namespace['boundary']."\r\n";
  92.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"method\"\r\n\r\n";
  93.   $this->namespace['add.headers'] .= "facebook.photos.upload\r\n";
  94.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  95.   $this->collect__sig__( 'method', 'facebook.photos.upload' );
  96.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"v\"\r\n\r\n";
  97.   $this->namespace['add.headers'] .= "1.0\r\n";
  98.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  99.   $this->collect__sig__( 'v', '1.0' );
  100.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"api_key\"\r\n\r\n";
  101.   $this->namespace['add.headers'] .= $this->namespace['__api_key__']."\r\n";
  102.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  103.   $this->collect__sig__( 'api_key', $this->namespace['__api_key__'] );
  104.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"session_key\"\r\n\r\n";
  105.   $this->namespace['add.headers'] .= $this->namespace['__session_key__']."\r\n";
  106.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  107.   $this->collect__sig__( 'session_key', $this->namespace['__session_key__'] );
  108.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"call_id\"\r\n\r\n";
  109.   $this->namespace['add.headers'] .= $this->namespace['call_id']."\r\n";
  110.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  111.   $this->collect__sig__( 'call_id', $this->namespace['call_id'] );
  112.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"caption\"\r\n\r\n";
  113.   $this->namespace['add.headers'] .= $this->namespace['__caption__']."\r\n";
  114.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  115.   $this->collect__sig__( 'caption', $this->namespace['__caption__'] );
  116.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"aid\"\r\n\r\n";
  117.   $this->namespace['add.headers'] .= $this->namespace['__aid__']."\r\n";
  118.   $this->collect__sig__( 'aid', $this->namespace['__aid__'] );
  119.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  120.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; name=\"sig\"\r\n\r\n";
  121.   $this->namespace['add.headers'] .= "__sig__\r\n";
  122.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."\r\n";
  123.   $this->namespace['add.headers'] .= "Content-Disposition: form-data; filename=\"".$matches['fname']."\"\r\n";
  124.   $this->namespace['add.headers'] .= "Content-Type: image/".$matches['fext']."\r\n";
  125.   $this->namespace['add.headers'] .= "Content-Transfer-Encoding: binary\r\n\r\n";
  126.   $this->namespace['add.headers'] .= "$content\r\n";
  127.   $this->namespace['add.headers'] .= '–'.$this->namespace['boundary']."–\r\n";
  128.   $this->namespace['add.headers'] = $this->set__sig__( $this->namespace['add.headers'] );
  129.  
  130.  }
  131.  
  132.  /**
  133.   *
  134.   * @param string $url
  135.   * @return string
  136.   */
  137.  
  138.  public function upload( $url )
  139.  {
  140.   $this->namespace['domain'] = 'api.facebook.com';
  141.   $this->namespace['request_file'] = '/restserver.php';
  142.   $this->namespace['file_name'] = $url;
  143.   $this->namespace['call_id'] = microtime( true );
  144.   $this->namespace['boundary'] = md5( $this->namespace['call_id'] );
  145.   $content = file_get_contents( $this->namespace['file_name'] );
  146.   $this->setAdditonalHeaders( $content );
  147.   $this->setReqsHeaders();
  148. //  print "——————————————-\n";
  149. //  print $this->namespace['headers'];
  150. //  print "——————————————-\n";
  151.   $fh = fsockopen( $this->namespace['domain'], 80, $er1, $er2, 30 );
  152.   fwrite( $fh, $this->namespace['headers'] );
  153.   $answer = '';
  154.   while ( !feof( $fh ) )
  155.    $answer .= fgets( $fh, 1024 );
  156.   fclose( $fh );
  157. //  print $answer;
  158. //  print "——————————————-\n";
  159.   return '{my_fimages_ok}';
  160.  }
  161.  
  162.  private function __destruct()
  163.  {
  164.   unset( $this );
  165.  }
  166. }
  167. header( 'Content-type: text/plain' );
  168. $appapikey = 'your_api_key';
  169. $appsecret = 'your_api_secret';
  170. $facebook = new Facebook($appapikey, $appsecret);
  171. $user_id = $facebook->require_login();
  172. $fbphu = new fbPhotoUpload;
  173. $fbphu->setVars( '__api_key__', $appapikey );
  174. $fbphu->setVars( '__secret__', $appsecret );
  175. $fbphu->setVars( '__session_key__', $facebook->api_client->session_key );
  176. $fbphu->setVars( '__aid__', '__album_id__' );
  177. $fbphu->setVars( '__caption__', '__image_title__' );
  178. print $fbphu->upload( 'http://'__image_address__ );
  179. ?>

За бирарията на езерото Ариана София

June 23rd, 2008 zetxxx

Преди седмица решаваме да се поразмърдаме малко, решаваме че ще е а бирарията на езерото “Ариана“. На мястото сме около 9 вечерта, препълнено е, аз си поръвам супичка моита приятелка и неината приятелка решават да си поръчат нещо голямо, спират се на артикул които не помня как се казваше вече. Поръчваме си и гокгато полъчката пристига започват изненадите. 1-во доставката не одговаря на поръчаното, 2-ро сервитиора ни моли да изядеме неговата грешка, ха на дали, все пак няма да дам 20 - лв. за нещо което не съм си поръчвал а тои казва “Аиде да си го изядете”, що за сервитиор, след още 30 мин. чакане най-накрая поръчката ни пристига с малки промени по нея защото се оказва че няма свински ребърца и трябва да допълнят поръчката с кюфтета .. ха 1 свиско ребърце = 1 кюфте .. и това не е всичко, кухнята е отвратителна на вкус за парите които и искат … порцията е далеч от грамажа които е обявен гордо ( !1 кг.! ) и накрая НЕ ХОДЕТЕ В БИРАРИЯТА НЕ СИ ЗАСЛУЖАВА ДА ПЛАТИТЕ 2 х цената на градски билет за да можете да ядете скара която на вкус наподобява далечна кварталска кръчма, за мен това посещение беше огромна грешка която ще ми послужи за добър урок.

Религия, Цвят, Пол ?

June 23rd, 2008 zetxxx

Женски проблеми?, Религиозни конфликти?, Дискриминация?! няма такова нещо всичко това е в малката човешка тъпа главичка и изчезва чак в края, там кадето нищо не остава

Нов дизайн

June 15th, 2008 zetxxx

Тъй, изцяло променен дизаин, хтмл елементите са подредени по по спецялен начин,допълнително сео съм включил тоест: менютата реално са в края като съдържание .. така търсачките стигат директно до текстовото съдържание което е по важното за тях.

Добавен е модул за времето в момента, трябва да се разшири до + 3-дневна прогноза но това по нататък. Сега  съм седнал да вградя гоогле мапс за да могат хората да се ориентират по добре в маршрута до Белоградчик. Надявам се новия дизаин да се хареса на всички. въпроси, желания и т.н. тук :)

Платен отпуск за обучение - интересна информация

June 5th, 2008 zetxxx

http://www.az.government.bg/Legislation/KT.html

след което ctrl+f “Платен отпуск за обучение” и се стига до

Чл. 169. (Изм. - ДВ, бр. 100 от 1992 г.) (1) (Изм. - ДВ, бр. 25 от 2001 г., в сила от 31.03.2001 г.) Работник или служител, който учи в средно или висше училище без откъсване от производството със съгласието на работодателя, има право на платен отпуск в размер 25 работни дни за всяка учебна година.
(2) (Изм. - ДВ, бр. 100 от 1992 г., изм. - ДВ, бр. 25 от 2001 г., в сила от 31.03.2001 г.) Отпускът по ал. 1 се ползва независимо от всички останали видове отпуски. Той може да се ползва наведнъж или на части и не се предоставя на работник или служител, който повтаря учебната година по неуважителни причини.
(3) (Изм. - ДВ, бр. 100 от 1992 г.) Учащите се по ал. 1 имат право еднократно и на платен отпуск от 30 работни дни за подготовка и явяване на зрелостен или държавен изпит, включително и за подготовка и защита на дипломна работа, дипломен проект или дисертация.
(4) (Изм. - ДВ, бр. 100 от 1992 г., изм. и доп. - ДВ, бр. 25 от 2001 г., в сила от 31.03.2001 г.) За подготовка на дисертационен труд за получаване на научна степен “доктор” работниците и служителите, зачислени на задочна или на докторантура на самостоятелна подготовка, имат право еднократно на 6 месеца платен отпуск, а за подготовка на дисертационен труд за получаване на научна степен “доктор на науките” - 12 месеца. Това право се ползва със съгласието на работодателя.
(5) (Изм. - ДВ, бр. 100 от 1992 г., доп. - ДВ, бр. 25 от 2001 г., в сила от 31.03.2001 г.) Работниците и служителите, които учат във вечерни учебни заведения със съгласието на работодателя, освен тези, които работят при намален работен ден от 7 или по-малко часа, се освобождават 1 час по-рано от работа всеки учебен ден.

Една страхотна окуражаваща реч на Steve Jobs

May 20th, 2008 zetxxx

Елица Тодорова - Вода

May 16th, 2008 zetxxx

Докато писах допреди малко един js ми потрябва html от youtube , влизам в Г пи6а youtube, разбира се цъкам на първия резултат и попадам на следния линк http://www.youtube.com/watch?v=xTP9Ysl6yKA . Оказа се че съм  пропуснал да чуя една страхотна песен още повече българска .. все пак по добре късно от колкото никога.

Име на изпълните: Елица Тодорова

Песен:  Вода

п.с. Страхотна си, давай все така

Малката синя точка

May 14th, 2008 zetxxx

Подобрения по галерията

May 12th, 2008 zetxxx

Има някои подобрения които съм направил по-галерията.

Структурирани албуми

Албумите са по структурирани, тоест подредени са в категории и подкатегории с имената на авторите на съответните албуми.

mod_rewrite

мода- за пренаписване на урл-тата е пуснат, тоест в адрес бара ще се виждат по приятелски урл-та, пример: Белоградчик фото галерия първо езика след което идва Белоградчик. Приемам идеи евентуално за пипане и по кода на глаерията .

За Гората

May 12th, 2008 zetxxx

i`m back - след дълго и упорито правене на нищо, и още по упорито мързелуване…. Но да се върна на темата, преди малко четох една статия, вече не си спомням за какво ставаше на въпрос но коментарите бяха интересни, коментарите бяха относно горите и как те се изсичат, не знам за местните в Белоградчик но когато аз се прибирам и виждам нещо странно точно от гледна точка на изсичането на горите, понеже пребивавам ( по-празници ) не само в Белоградчик но и в Боровица което село е някак си по близко до природата .. все пак не е град и е някак си по спокоино, а пък имам и спомени от по-малък какво е било и как е изглеждало и сега като се прибирам по веднъж на 6 м. мога да отсея промените които само ме натъжават, ако преди 1 г. съм се прибирал за лека почивка и съм виждал опожарената гора то след 6м. тя вече не съществува … изсечена е, и някой е с пълна гушка, и всичко почва по старата позната схема, скапва се няква инфраструктура ( ако приемем гората като такава ), след което се разпродава … щот е по лесно, щото държавата вече не се интересува за/от скапаната инфраструктура. Имаше една песен

Хубава си моя горо

дано не стане така  че да забравим тази песен защото гората е наше наследство и ние трябва да се грижим за него а не да го пилеем. И накрая но не на последно място пожелавам на хората които секат за лична облага след време пръстите да му се изрязват бавно и постепенно …. ( angry )