blogger data api ve delphi win32

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

blogger data api ve delphi win32

Mesaj gönderen sadettinpolat »

Google'un , http://code.google.com/apis/blogger adresinde Blogger data api adli blogger.com sunucularinda yer alan blogunuz ile ilgili bazi islemler yapmaniza imkan saglayan bir takim apileri mevcut.

http://code.google.com/apis/blogger/dev ... tocol.html adresinde bazi programlama dilleri icin gelistirilmis hazir kutuphaneler de mevcut. .net , java, php vs... bu kutuphaneler ile kolay bi sekilde bu apileri kullanabiliyorsunuz. delphi for .net icin de .net kutuphanesi kullanilabilir fakat ben simdilik bu islemi delphi for win32 ile yapmaya calistigimdan bu hazir kutuphanelerden pek fazla yararlanamiyorum.
herseyi adim adim kendim yapmam gerekiyor.


burdaki bilgilere gore login olma islemini basarili bir sekilde yapiyorum fakat is yeni bir yazi gondermek/silmek/duzenlemek olunca burda anlatilanlara gore herseyi yapmama ragmen HTTP 1.0 400 Bad Request
hatasi almaktan kurtulamiyorum.

turlu seyler denememe ragmen header bilgilerini kabul etmedi gitti su gugil :)

Kod: Tümünü seç

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdTCPConnection, IdTCPClient, IdHTTP, IdBaseComponent,
  IdComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
  IdSSLOpenSSL,IdObjs;

type
  TForm2 = class(TForm)
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    Memo1: TMemo;
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
 var
  stringStream: TIdStringStream;
  postStrings: TidStringList;
  postResults: string;
begin
  idhttp1.ReadTimeout :=5000;
  postStrings := TIdStringList.Create;
  try
    postStrings.LineBreak := '&';
    postStrings.Values['accountType'] := 'GOOGLE';
    postStrings.Values['Email'] := 'xxxxxxxxxxxx@gmail.com';
    postStrings.Values['Passwd'] := 'yyyyyyyy';
    postStrings.Values['service'] := 'blogger';
    postStrings.Values['source'] := 'bbbbb-aaaaa-1';

    stringStream := TIdStringStream.Create(postStrings.Text);
    try
      IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
      postResults := IdHTTP1.Post('https://www.google.com/accounts/ClientLogin', stringStream);
      Memo1.Lines.Add(postResults);
    finally
      stringStream.Free;
    end;
  finally
    postStrings.Free;
  end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
postResults:TStringStream;
params:TStringList;
myAuthorizationKey:String;
begin
 postResults :=TStringStream.Create('');
 params :=TStringList.Create;
 myAuthorizationKey := copy(memo1.Text,pos('Auth=',memo1.Text),length(memo1.text));
 idhttp1.Request.Clear;
 idhttp1.Request.ContentType := 'application/atom+xml';
 idhttp1.Request.CustomHeaders.Add('Authorization: GoogleLogin ' + myAuthorizationKey);
 params.LoadFromFile('post.xml');
 try
 idhttp1.Post('http://www.blogger.com/feeds/myBlogID/posts/default', params,postResults);
 memo1.Text:= postResults.DataString;
  finally
    FreeAndNil(postResults);
    FreeAndNil(params);
  end;
 //HTTP 1.0 Bad Request
end;
end.



dfm dosyasi

Kod: Tümünü seç

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 318
  ClientWidth = 517
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    Left = 8
    Top = 39
    Width = 501
    Height = 271
    Lines.Strings = (
      'Memo1')
    TabOrder = 0
  end
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'login ol'
    TabOrder = 1
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 89
    Top = 8
    Width = 75
    Height = 25
    Caption = 'post gonder'
    TabOrder = 2
    OnClick = Button2Click
  end
  object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
    MaxLineAction = maException
    Port = 0
    DefaultPort = 0
    SSLOptions.Method = sslvSSLv2
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 424
    Top = 8
  end
  object IdHTTP1: TIdHTTP
    IOHandler = IdSSLIOHandlerSocketOpenSSL1
    AllowCookies = True
    ProxyParams.BasicAuthentication = False
    ProxyParams.ProxyPort = 0
    Request.ContentLength = -1
    Request.Accept = 'text/html, */*'
    Request.BasicAuthentication = False
    Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
    HTTPOptions = [hoForceEncodeParams]
    Left = 456
    Top = 8
  end
end





post.xml

Kod: Tümünü seç

<entry xmlns='http://www.w3.org/2005/Atom'>
  <title type='text'>Marriage!</title>
  <content type='xhtml'>
    <div xmlns="http://www.w3.org/1999/xhtml">
      <p>Mr. Darcy has <em>proposed marriage</em> to me!</p>
      <p>He is the last man on earth I would ever desire to marry.</p>
      <p>Whatever shall I do?</p>
    </div>
  </content>
  <author>
    <name>sade</name>
    <email>mailadresi@gmail.com</email>
  </author>
</entry>
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

http://indy.fulgan.com/SSL/indy_openssl096.zip linkinden direkt edineceğin iki adet SSL DLL kütüphanesini programınla aynı klasöre kopyala sorun kalmaz. HTTPS ile erişim yapıldığı yerde akla ilk gelecek unsur ilgili bu kütüphaneleri aynı klasöre kopyalamak.

Başarılar.
Resim
Resim ....Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

muharrem hocam tesekkurler..
adi gecen dosyalardan soz etmeyi unutmusum. dosyalar uygulama ile ayni dizinde yer aliyorlar. https kisminda bir sorunum yok aslinda. https ile gerekli olan Authorization key bilgisini alabiliyorum lakin is post gondermeye gelince hata veriyor.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Hocam hata 400 bad request adres ile ilgili...

Kod: Tümünü seç

 idhttp1.Post('http://www.blogger.com/feeds/myBlogID/posts/default', params,postResults); 
demişsin ya, buradaki myBlogID yazan yere BLOG adını yazmayı ihmal etmedin değil mi ? Hani http://benimblog.blogspot.com ise oraya benimblog şeklinde bildirmen gerekiyor ya o bakımdan...
Resim
Resim ....Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

mrmarman yazdı: buradaki myBlogID yazan yere BLOG adını yazmayı ihmal etmedin değil mi ?
myBLOGID 7701400 gibi bir rakam. post ederken url yi o sekilde yaziyorum.

Kod: Tümünü seç

idhttp1.Post('http://www.blogger.com/feeds/7701400/posts/default', params,postResults); 
gibi..

google in verdigi hata kodlarinda, 400 hatasi aliyorsaniz ya url hatalidir ya da header/post bilgileri yanlistir diye aciklama yapmis. url dogru olduguna gore gonderdigim bilgilerin formatindan kaynaklanan bir sikinti var sanirim.

Kod: Tümünü seç

Invalid request URI or header, or unsupported nonstandard parameter.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

adresinde ayni sorunla karsilasan bi eleman olmus, gonderilen parametreyi encode ettikten sonra sorunun cozuldugunden bahsetmis ama neyle encode ettigini soylememis. utf8 olarak ya da httpencode ile denedim ama sonuc degismedi.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

base64 encode/decode olabilir. bir de onu dene istersen
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

t-hex yazdı:base64 encode/decode olabilir. bir de onu dene istersen
mesajini okuduktan sonra base64 ile denedim ama sonuc yine http 400 hatasi oldu.

dun bu mesele uzerine epey bi siteye girdim ciktim, rastlanti sonucu baska bir ornekte gordugum parametreleri Stream olarak gondermeyi denedim birde. sonuc http 201 oldu. yani basarili.

Kod: Tümünü seç

procedure TForm2.Button2Click(Sender: TObject);
var
myAuthorizationKey:String;
stringStream: TIdStringStream;
postStrings: TidStringList;

begin
 postStrings := TIdStringList.Create;
 myAuthorizationKey := copy(memo1.Text,pos('Auth=',memo1.Text)+5,length(memo1.text));
 idhttp1.ReadTimeout := 10000;
 idhttp1.Request.ContentType := 'application/atom+xml';
 idhttp1.Request.CustomHeaders.Add('Authorization: GoogleLogin auth=' + myAuthorizationKey);
 postStrings.LoadFromFile('post.xml');
 stringStream := TIdStringStream.Create(postStrings.Text);
 try
  try
 idhttp1.Post('http://www.blogger.com/feeds/xxxxxxxx/posts/default', stringStream);
 except  on e:Exception do
 begin
     memo1.Lines.Add(inttostr(idhttp1.ResponseCode));
 end;
 end;
  finally
    FreeAndNil(postStrings);
    FreeAndNil(stringStream);
  end;
 //HTTP 1.0 201 post created
end;

oncelikle StringList olarak neden calismiyor hala merak ediyorum ve sebebini bulmadan rahat edecegimi sanmiyorum. post islemi yaptigim zaman benim bilgisayar ile google arasinda gidip gelen degerleri gormenin bir yolu var mi acaba ?

ikinci mesele ise yaptigim post isleminin sonucu ne olursa olsun -kodda da gorulecegi uzere- program Exception a dusuyor. yani geriye donen 201 islem basarili mesajini dahi exception icerisinde yakalayabiliyorum. bana biraz tuhaf geldi :)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla