コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

DSからtwitterに投稿するには(1)

ツイッタ(twitter)が流行っているので、DSからtwitterに投稿するプログラムを考えてみます。昨日のブログに少し書いたのですが、twitterの投稿するのは、httpプロトコルでPOSTすればいいだけのようです。

twitterの認証

twitterはユーザとパスワードで認証することにより、ログインできます。それでは、DS等のクライアントから自動投稿するにはどうするのかというと、twitterでは、現在、BASIC認証をサポートしています。現在と書いたのは、2010年6月以降はサポートしなくなる予定なのだそうです。とりあえず、今はBASIC認証が使えるので、これを使います。

BASIC認証

BASIC認証はhttpプロトコルを送信するときのヘッダに、Authorizationヘッダを付ければ認証してもらえるようです。書式は下記です。

  • Authorization: BASIC "認証コード"

認証コードというのは、IDとパスワードをコロン":"で繋いだものをBase64エンコードしたものになります。
例えば、ID: momoonga、パスワード: aabbcc だとすると、認証コードは、bW9tb29uZ2E6YWFiYmNj となります。

Base64エンコード

Base64エンコードは、バイナリコードを64個のテキストコード(A〜Z, a〜z, 0〜9, +, / )で表すための変換方法です。簡単に説明すると、バイナリコードの並びをビット列にして、先頭から6ビットずつ取って、64個のテキストコードに変換していきます。変換テーブルは、上のカッコ内の並びの順番そのままです。00000bが'A'で、111111bが'/'になります。データのビット量が6で割り切れないときは、6の倍数となるように0を追加して変換します。
また、変換したコードの長さは4の倍数となる必要があるので、4の倍数にならないときには、'='を追加して4の倍数となるようにします。
下記に自作したBase64エンコードプログラムを書きます。

//**************************************************************
// Base64エンコード
// sdadta: 変換元データ, dText: 変換後データ, 変換元データサイズ
//**************************************************************
void  eBase64( char *sdata, char *dText, int byte )
{
int    htbl[64];
int    i, j;
unsigned char un;
int    cnum;
int    bnum;

  //テーブル作成
  for( i=0; i<26; i++ ){
    htbl[i] = 0x41+i;  
    htbl[i+26] = 0x61+i;
    if( i<10 ){  htbl[52+i] = 0x30+i;  }
  }
  htbl[62] = '+';
  htbl[63] = '/';

  //エンコード開始
  cnum = byte*8 / 6;
  for( j=0; j<cnum; j++ ){
    if( (j%4)==0 ){
      dText[j] = (char)htbl[*sdata>>2];
    }
    else if( (j%4)==1 ){
      un = *sdata<<4;
      sdata++;
      dText[j] = (char)htbl[(un + (*sdata>>4)) & 0x3f];
    }
    else if( (j%4)==2 ){
      un = *sdata<<2;
      sdata++;
      dText[j] = (char)htbl[(un + (*sdata>>6)) & 0x3f];
    }
    else if( (j%4)==3 ){
      dText[j] = (char)htbl[*sdata & 0x3f];
      sdata++;
    }
  }

  if( (j%4)!=0 ){
    if( (j%4)==1 ){
      dText[j] = (char)htbl[(*sdata<<4) & 0x3f];
    }
    else if( (j%4)==2 ){
      dText[j] = (char)htbl[(*sdata<<2) & 0x3f];
    }
    else if( (j%4)==3 ){
      dText[j] = (char)htbl[*sdata & 0x3f];
    }
    j++;
  }
  dText[j] = 0;

  //4の倍数となるように'='を追加する
  bnum = 4 - (j%4);
  if( bnum<4 ){
    for( i=0; i<bnum; i++ ){  dText[j+i] = '=';  }
    dText[j+i] = 0;
  }
}


続きは、明日にします。今日はこの辺で・・・。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム