Sample code for 30+ languages & platforms
Delphi DLL

Twitter - Tweet with Multiple Images

Example to post a status update with multiple associated images/photos (or videos).

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, OAuth1, Rest, JsonObject;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
json: HCkJsonObject;
rest: HCkRest;
oauth1: HCkOAuth1;
bAutoReconnect: Boolean;
tweetContent: PWideChar;
resp: PWideChar;
jsonResponse: HCkJsonObject;

begin
success := False;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

// ----------------------------------------------------------------------
// This initial setup, which involves setting the OAuth1 properties and connecting
// to api.twitter.com, is only required once at the beginning.  Once connected, the same
// object instance may be re-used, and if necessary, it will automatically reconnect
// as needed.

// Assume we've previously obtained an access token and saved it to a JSON file..
json := CkJsonObject_Create();
success := CkJsonObject_LoadFile(json,'qa_data/tokens/twitter.json');

rest := CkRest_Create();
oauth1 := CkOAuth1_Create();

CkOAuth1_putConsumerKey(oauth1,'TWITTER_CONSUMER_KEY');
CkOAuth1_putConsumerSecret(oauth1,'TWITTER_CONSUMER_SECRET');
CkOAuth1_putToken(oauth1,CkJsonObject__stringOf(json,'oauth_token'));
CkOAuth1_putTokenSecret(oauth1,CkJsonObject__stringOf(json,'oauth_token_secret'));
CkOAuth1_putSignatureMethod(oauth1,'HMAC-SHA1');
CkOAuth1_GenNonce(oauth1,16);

CkRest_SetAuthOAuth1(rest,oauth1,False);

bAutoReconnect := True;
success := CkRest_Connect(rest,'api.twitter.com',443,True,bAutoReconnect);
if (success <> True) then
  begin
    Memo1.Lines.Add(CkRest__lastErrorText(rest));
    Exit;
  end;

// This ends the initial setup...
// ----------------------------------------------------------------------

tweetContent := 'This is a test tweet with multiple images.';

// Send a tweet...
CkRest_ClearAllQueryParams(rest);
CkRest_AddQueryParam(rest,'status',tweetContent);

// Add list of comma separated media_ids to associate with the Tweet. 
// You may include up to 4 photos or 1 animated GIF or 1 video in a Tweet.
// The image needs to have been previously uploaded.  The upload response gave us
// the media ID we'll use to associate this tweet with the image (or video)
// See Twitter Upload Media for sample code.
CkRest_AddQueryParam(rest,'media_ids','793137045996646400,793192201392041984');

resp := CkRest__fullRequestFormUrlEncoded(rest,'POST','/1.1/statuses/update.json');
if (CkRest_getLastMethodSuccess(rest) <> True) then
  begin
    Memo1.Lines.Add(CkRest__lastErrorText(rest));
    Exit;
  end;

jsonResponse := CkJsonObject_Create();
CkJsonObject_putEmitCompact(jsonResponse,False);
CkJsonObject_Load(jsonResponse,resp);

if (CkRest_getResponseStatusCode(rest) <> 200) then
  begin
    Memo1.Lines.Add(CkJsonObject__emit(jsonResponse));
    Exit;
  end;

// Show the successful response:
Memo1.Lines.Add(CkJsonObject__emit(jsonResponse));
Memo1.Lines.Add('Success.');

CkJsonObject_Dispose(json);
CkRest_Dispose(rest);
CkOAuth1_Dispose(oauth1);
CkJsonObject_Dispose(jsonResponse);

end;