9 Ekim 2014 Perşembe

Facebook’dan Bilgi alma Api’si

Mühendislik her zaman olanı kullanmak ve değiştirmek değil; bazen özel ihtiyaçlara özel çözümler sunabilmektedir. Bu makalede Facebook’a gelen bir mesajın nasıl sms olarak cep telefonuna iletilebileceğini katmanları ile anlatmaya çalışacağım.
Bir özel ihtiyaçtan ortaya çıkmış bir projemi anlatacağım. Facebook gençlerde kullanım oranı yüksek olan bir sosyal paylaşım platformu. Bu platform aracılığı ile mesaj gelince bundan mümkün oldukça hızlı haberdar olmak istiyorum. Ama Cep Telefonun Nokia 1100 olduğundan değil facebook uygulaması internet vb girmesi bile hayal.
O zaman ilk planımı yaptım; Facebook’dan bilgiyi alıp, bir gsm firmasının api’sini kullanarak sms atmak olacak.
Aşama1 ) Facebook’dan bilgi alma (Projenin 1.Katmanı)
Facebook developer, facebook api vb hiç bir şekilde size kullanıcının mesajlarına ulaşma izni vermiyor. Sonuçta merak ettiğim kişinin tüm mesajların toplandığı bir sayfa var;https://www.facebook.com/messages/?action=read&tid=ojYNadNdHT4tBXaADADAKA benim kullandığım bu sayfa gibiydi. sayfanın içinde kaynak kodlarını incelediğinizde her mesaj için belli bir sıra olduğunu görmüş olmalısınız.div+ mesajid+/div +div + mesaj +/div şeklinde gidiyor.  o zaman regular expression kullanarak mesaj id ve mesajları çekebilebilirsiniz. Tabi ben regular expression yerine basit bir substring indexof birleşimi kullandım. sonuçta sadece son mesaj beni ilgilendirdiği için.
İlgili sayfanın kaynak kodunu nasıl alabiliriz? Bu kullandığınz dil ile ilgili birşey, java herzaman önde olsada javanın ilgili kütüphanesini öğrenmek ile uğraşacağıma hazır kaynağı daha bol olan php’yi kullanmayı uygun gördüm. Php’de Curl diye bir kütüphane var. Bu kütüphane insan gibi davranıp tarayıcıyı kullanabiliyor. Örneğin login yapabiliyor ki tam benim istediğim şey…
Facebook’un login sistemi
$a = cURL(“https://login.facebook.com/login.php?login_attempt=1″,true,null,”email=$EMAIL&pass=$PASSWORD”);
şeklinde çalışıyor olsa bile; siz bunu denedinizde çalışmadığını göreceksiniz. Çünkü bü tur bot’lara karşı facebook her girişde cookie desteği istemekte ve birçok ayar yapmanız gerekmektedir. DaniWeb’den* bulduğum php curl ile facebooK’a bağlanma kodu epey işime yaradı. Tamamı şudur;
/* EDIT EMAIL AND PASSWORD */
$EMAIL = “faceemail”;
$PASSWORD = “şifre”;
function cURL($url, $header=NULL, $cookie=NULL, $p=NULL)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, $header);
curl_setopt($ch, CURLOPT_NOBODY, $header);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, ‘ISO-8859-9′);
if ($p) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, “POST”);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $p);
}
$result = curl_exec($ch);
if ($result) {
return $result;
} else {
return curl_error($ch);
}
curl_close($ch);
}
$a = cURL(“https://login.facebook.com/login.php?login_attempt=1″,true,null,”email=$EMAIL&pass=$PASSWORD”);
preg_match(‘%Set-Cookie: ([^;]+);%’,$a,$b);
$c = cURL(“https://login.facebook.com/login.php?login_attempt=1″,true,$b[1],”email=$EMAIL&pass=$PASSWORD”);
preg_match_all(‘%Set-Cookie: ([^;]+);%’,$c,$d);
for($i=0;$i<count($d[0]);$i++)
$cookie.=$d[1][$i].”;”;
/*
NOW TO JUST OPEN ANOTHER URL EDIT THE FIRST ARGUMENT OF THE FOLLOWING FUNCTION.
TO SEND SOME DATA EDIT THE LAST ARGUMENT.
*/
$bizimhttp= cURL(“https://www.facebook.com/messages/?action=read&tid=ojadadadDAiiwxKA&#8221;,null,$cookie,null);
$bizimhttp dediğim mesajların bulunduğu sayfanın kendisi. şimdi ise bana son mesaj lazımdı. Her kullanıcının unique bir id’si var ve ben bunu kullanarak aşağıdaki kod ile kullanıcını son attığı mesajı ve id’sini buldum.
$pos = strripos($bizimhttp, “100001x64287_id”);
$pos2 = substr($bizimhttp,$pos);
$pos3 = substr($pos2,0,30); //mesaj id’si
$pos4 = substr($pos2,232,270); //mesajın kendisi
Aşama 2 ) Mesaj Yeni mi?
Görüldüğü gibi Facebook’dan son mesajı ve id’sini alma işlemi bitmiştir. Proje periyodik olarak(her 10dk’da bir) facebook sayfasına bakacak ve son mesajın id’sini alacak. burada bir database oluşturup aldığı mesajı db’de kontrol ediyor; daha önce gördüğü bir mesaj ise sms atacak mekanizmaya girmiyor. yok yeni bir mesaj ise sms atıyor.
$con = mysql_connect(“localhost”,”dbname”,”şifre”);
if(!$con)
{
die(‘Veritabani Baglanti Hatasi’);
}else{
mysql_select_db(“dbname”,$con);
$kontrol = true;
$getrecodr =”Select record from register where record=’$pos3′”;
$result = mysql_query($getrecodr);
while($row = mysql_fetch_array($result))
{
$kontrol=false;
}
if($kontrol==true){
//yeni mesaj gelmiş
$insertregister =”INSERT INTO register (record) VALUES(‘$pos3′)”;
mysql_query($insertregister);
echo “yeni mesaj var”;
Aşama 3 ) SMS Gönderme (Projenin 2. Katmanı)
Web’den sms atma meselesini IBM projem için araştırıp netgsm şirketine abone olmuştum. Şirket size api desteği veriyor; yani webservis, http post veya xml post ederek sms gönderebiliyorsunuz. webservis oluşturmak böyle bir proje için mantıklı değildi bende xml ile gönderemeyi düşündüm.  Şirketin verdiği Api Dökümanının yardımı ile şöyle oldu;
function XMLPOST($PostAddress,$xmlData)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$PostAddress);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array(“Content-Type: text/xml”));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlData);
$result = curl_exec($ch);
return $result;
}
$xml='<?xml version=”1.0″ encoding=”iso-8859-9″?>
<mainbody>
<header>
<company>NETGSM</company>
<usercode>telefonno</usercode>
<password>şifre</password>
<startdate></startdate>
<stopdate></stopdate>
<type>1:n</type>
<msgheader>AHMETMUNGEN</msgheader>
</header>
<body>
<msg><![CDATA[Mesaj VAR! Mesaja bak! ]]></msg>
<no>gidecekno</no>
</body>
</mainbody>';
$gelen=XMLPOST(‘http://api.netgsm.com.tr/xmlbulkhttppost.asp&#8217;,$xml);
Aşama 4 ) Sistemi Tetikleme (Projenin 3.katmanı)
 
Üsteki 3 aşamanın yapılması birkaç günümü almıştı. Asıl sorun olan kısma geldik; bilgisayarımız her daim açık değil; Açık olsa böyle bir sisteme ihtiyaç duymazdık. Bu sistemi düzenli tetikleyecek bir sisteme ihtiyacımız var. Eğer Reel dünyada çalışan bir Sunucu veya Sanal Sunucu gibi bir çözümünüz varsa bir uygulama yazarak bu sorunu çözebilirsiniz. Masaüstü uygulamasını aktif hale getirir bir timer ile yaptığını php sayfasını çalıştırırsınız. Ama benim gibi sunucunuz yoksa? Bu konuda “web cron”** siteleri işinizi görecektir. Sistemleri şöyle çalışır. Belli periyodlarda ilgili url’ye bağlanacaktır. Bu tetikleme ihtiyacınız olan son noktadır. En azından ben öyle düşünüyordum.
Bu noktada sonra proje  yaklaşık 1 ay kadar uzadı; Bunun bir nedeni ilgilenemem diğer nedeni ise çıkan sorundu.
Şöyleki yazdığımız cookie api’si webcrown’un sisteminde aktif hale gelmiyor; çünkü webcrown program ile post atıyor. Tarayıcı tanınamadı diye facebook cookie vermiyor ve sisteme giriş yapılamıyordu.
Aşama 5 ) Sistemi Tetikleme’de yardımcı etken (Projenin 4.katmanı)
Bu noktada aklıma gelen ilk şey browsershots  gibi gerçekten browser kullanan bir sistemin benim ilgili sayfamı çalıştırması ile tetiklenmesi idi. yani crow browsershoot’u oda benim php sayfamı tetiklyecek ve böylece hepsi sorunsuz çalışacaktı. bunun için en popüler olan http://browsershots.org/’dur ama browsershots dışardan post veya get ile herhangi bir tetikleme almamakta. Almadığı içinde işimizi görmemektedir. Bir başka browser gösterim sitesi netrenderer’dir *** sadece ie sürümleri için destek veren bu site ise dışardna post alabilmekteidi. webcrown’a komut olarak şunu verdim
böylece netrendered benim webistemdeki index-h2.php isimli dosyayı çalıştırıyordu ve tetikleme gerçekleştirilmiş oluyor.
Projenin testi ise bu yazı yazıldığı gün yapıldı ve çalışmaktadır.  Projeye ise IBM staj günlerimde başlamıştım.
Projede Halen Geliştirilecek Noktalar
  • Facebook’dan seri olarak onun ve benim mesajlaştığım zamanda sms atacak mı? (şuan itibari ile 15 dk içinde max tek sms attığı için çok etkilemesede sorun
  • Mesajın içeriği ile ilgili bilgi verilebilir mi?
Teşekkürler
Proje’de sona ulaşmak önemlidir. ve Allah nasip etti ve bende ulaştım. Bu proje bundan sonra kullanılsın veya kullanılmasın proje sürecinde öğrendiklerim benle kalacaktır.
Kaynakça
**Benim kullandığım http://www.mywebcron.com/
***http://netrenderer.com (browse shoots sitesi) (hayatımı kurtardın!)
***Alıntıdır.amungen.wordpress.com

Hiç yorum yok:

Yorum Gönder