YouTube API(その2)

2007/04/12 | XML

YouTube APIの使用法は思ったより簡単だった。
APIの利用方法はRESTでもXML-RPCでもどちらでも可能だが、返ってくる結果はどちらも同じなので、今回はお手軽なRESTを使った。
必要なクエリをつなげて以下の要領でXMLを取得すればいい。

$xml=file_get_contents(‘http://www.youtube.com/……’);

XMLそのままでは扱いにくいので、これを配列に格納してしまえばあとは如何様にでも料理できる。やり方は以前に書いた以下の記事参照。

http://php.tekmemo.com/?eid=288722

PHP5ではXML系関数が充実しているが、PHP4が多い現在は上記のページの手法で配列に格納してから使うのが簡単と思う。ゆくゆくはPHP5の記述を理解していかねば・・・

YouTube API

2007/04/10 | XML

最近はXML-RPCというか、マッシュアップというか、Web2.0というか・・・。いまどきのサイトを作ることにはまっている。既存のAPIを使ったり、APIを自作したり。
一からサイトを作るわけではないので非常にお手軽簡単で、後は見せ方だけのような勝負になっている。ちょっと他力本願的で「すばらしい」ということはないのだが、何とかコレに自分なりのコンテンツを加えれば、比較的いいサイトになるのでは?、と思ったりもしている今日この頃。

YouTube利用登録その1さて本題。YouTubeもAPIを提供し、自サイト内のビデオを検索できるようになっている。これもおさえておきたいAPIの一つだ。今回はAPIを利用するための準備段階をメモしておく。

(1) ユーザ登録をする
まずユーザ登録が必要。特別な開発者向けユーザ登録ではなく、一般ユーザ(動画をアップロードする)としての登録をする必要がある。右の画面イメージの赤枠で囲んだあたりからSign Upする。登録後、確認メールが送られてくるので、記載されたURLをクリックして登録が完了する。
YouTube利用登録その2
(2) 開発者向け登録をする
(1)の手順から登録し、ログインすると、同じく(1)の画像の赤枠のあたりにMy Accountというのが出るので、ここをクリックすると左の画面になる。
ここで赤枠内にDeveloper Profileというリンクはあるので、ここから開発者IDを取得する。

ここまでの手順で準備は完了する。YouTubeはXML-RPCだけでなくRESTも使えるので、非常に簡単にAPIを使用することができる。使用例についてはまた後日メモすることにする。

metaweblog.newPostでMTにタグを渡す

2007/03/22 | XML

だんだんPHPの話題から遠のきそうなので、XMLに記事を投稿。
MovableTypeにXML-RPCを使って記事を投稿する際に「タグ」も送信できないか、と思案してみた。公式のマニュアルを見ても、そのような記述はないから半ばあきらめてはいたのだが・・・(「追記」や「概要」などは送ることができる)。Perlのソースまで読んでしまった。

そしたらありました「mt_tags」。
これをtitleやdescriptionに追加して送信すればいいみたい。複数のタグを送りたいときはカンマ区切りで。

トラックバックの送受信

2007/03/18 | XML

XMLとは関係ないけれど、ブログ関連の話題が続いたので、ついでにトラックバックも取り上げてみた。トラックバックの機能はXMLとはまったく関係ない仕組みだ。送信側は指定されたトラックバックURLに、フォームからpostする要領でデータをpostする。サーバからpostするわけだから(ブラウザがpostするのではないのだから)、少しだけ工夫が必要。postメソッドで送信するために、ローレベルにfsockopenで直接相手先ホストとお話しするか、curlを使うか、あとPEARのライブラリも使えるはずだ(工夫が必要なのはここだけ)。
受信する側はもっと簡単。フォームで内容を受け取るのと同様で、単にPOSTを受けるだけ。$_POSTでいいわけだ。

トラックバックURLはどうもPATH_INFOを使って記事番号の受け渡しをすることが一般的らしい。当然何らかの記事に対してトラックバックがおこなわれるわけだが、記事には固有の番号がついている。トラックバックが送られてきたら、どの記事に対して送られてきたのか判別する必要があり、その記事番号の受け取り方でPATH_INFOを使用する、ということだ。
例えばトラックバックを受け付けるプログラムのURLと記事番号が以下のような場合、

URL: http://hogehoge.com/trackback.php
記事番号: 24

トラックバックURLは以下のようにする、ということだ。

http://hogehoge.com/trackback.php/24

でもって、trackback.php内でPATH_INFOから記事番号を判別する。ちなみにPOSTで受け渡しされる情報は以下のとおり。

blog_name:ブログ名
title:言及記事のタイトル
url:言及記事のURL
excerpt:言及記事の概要

どこかで一度試してみるとしよう。

XML-RPCによるブログ操作のサンプル

2007/03/17 | XML

XML-RPCを使って、ブログを操作するためのPHPスクリプトをクラス化してみた。全部の機能が正しく動いているかどうかは確認していないけれど、いちおういくつかの正しく動いているので、公開してみることにする。

もし万一、業務用途で使いたい方という方がいらっしゃったら、コメント欄からでもご一報お願いできますか。

xmlrpc.incを使っているのでダウンロードしてパスの通っているところにおく必要あり(ダウンロードはここから)。

使い方:
最初にオブジェクトを生成して、prepareで接続を初期化してから使う。

<?php
  /*
  | Copyright (c) 2007 kaorun. All rights reserved.
  | http://php.tekmemo.com
  */
  
  require_once(‘xmlrpc.inc’);
  $GLOBALS[‘xmlrpc_internalencoding’]=’UTF-8′;
  class xmlrpc_weblog
  {
    /**
     * XML-RPC client object
     *
     * @var object
     * @access public
     */
    var $client;
    
    /**
     * Target path for XML-RPC connections
     *
     * @var string
     * @access public
     */
    var $apipath;
    
    /**
     * Target host for XML-RPC connections
     *
     * @var string
     * @access public
     */
    var $apihost;
    
    /**
     * Target port for XML-RPC connections
     *
     * @var integer
     * @access public
     */
    var $apiport;
    
    /**
     * Application key for XML-RPC connections (usually ignored)
     *
     * @var integer
     * @access public
     */
    var $appkey;
    
    /**
     * Blog ID for the target
     *
     * @var integer
     * @access public
     */
    var $blogid;
    
    /**
     * User ID for login
     *
     * @var string
     * @access public
     */
    var $userid;
    
    /**
     * Password for login
     *
     * @var string
     * @access public
     */
    var $password;
    
    /**
     * Prepare for the connection to XML-RPC client.
     *
     * @param string $path
     * @param string $host
     * @param integer $port
     * @param integer $appkey
     * @param integer $blogid
     * @param string $userid
     * @param string $password
     * @return boolean
     * @access public
     */
    function prepare($path,$host,$port,$appkey,$blogid,$userid,$password)
    {
      $this->client  =new xmlrpc_client($path,$host,$port);
      $this->appkey  =new xmlrpcval($appkey,’int’);
      $this->blogid  =new xmlrpcval($blogid,’int’);
      $this->userid  =new xmlrpcval($userid,’string’);
      $this->password  =new xmlrpcval($password,’string’);
      return true;
    }
    
    /**
     * Send XML-RPC message as "blogger.getUserInfo".
     *
     * @return mixed (successed:user information array, failed:false)
     * @access public
     */
    function blogger_getuserinfo()
    {
      $msg=new xmlrpcmsg(‘blogger.getUserInfo’,
          array(
            $this->appkey,
            $this->userid,
            $this->password
          )
        );
      $result=$this->client->send($msg);
      if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
    
    /**
     * Send XML-RPC message as "blogger.getUsersBlogs".
     *
     * @return mixed (successed:user blog array, failed:false)
     * @access public
     */
    function blogger_getusersblogs()
    {
      $msg=new xmlrpcmsg(‘blogger.getUsersBlogs’,
          array(
            $this->appkey,
            $this->userid,
            $this->password
          )
        );
      $result=$this->client->send($msg);
&nbs
p;     if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
    
    /**
     * Send XML-RPC message as "blogger.newPost".
     *
     * @param string $content, blog body
     * @param boolean $publish, re-build blog instantly or not
     * @return mixed (successed:posted article number, failed:false)
     * @access public
     */
    function blogger_newpost($content,$publish)
    {
      $msg=new xmlrpcmsg(‘blogger.newPost’,
          array(
            $this->appkey,
            $this->blogid,
            $this->userid,
            $this->password,
            new xmlrpcval($content,’string’),
            new xmlrpcval($publish,’boolean’)
          )
        );
      $result=$this->client->send($msg);
      if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
    
    /**
     * Send XML-RPC message as "metaWeblog.newPost".
     *
     * @param array $article, blog title, body, and so on
     * @param boolean $publish, re-build blog instantly or not
     * @return mixed (successed:posted article number, failed:false)
     * @access public
     */
    function metaweblog_newpost($article,$publish)
    {
      $struct=array();
      foreach($article as $tmpKey => $tmpValue){
        $struct[$tmpKey]=new xmlrpcval($tmpValue,’string’);
      }
      $msg=new xmlrpcmsg(‘metaWeblog.newPost’,
          array(
            $this->blogid,
            $this->userid,
            $this->password,
            new xmlrpcval($struct,’struct’),
            new xmlrpcval($publish,’boolean’)
          )
        );
      $result=$this->client->send($msg);
      if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
    
    /**
     * Send XML-RPC message as "metaWeblog.editPost".
     *
     * @param integer $postid, target article id
     * @param array $article, blog title, body, and so on
     * @param boolean $publish, re-build blog instantly or not
     * @return boolean
     * @access public
     */
    function metaweblog_editpost($postid,$article,$publish)
    {
      $struct=array();
      foreach($article as $tmpKey => $tmpValue){
        $struct[$tmpKey]=new xmlrpcval($tmpValue,’string’);
      }
      $msg=new xmlrpcmsg(‘metaWeblog.editPost’,
          array(
            new xmlrpcval($postid,’int’),
            $this->userid,
            $this->password,
            new xmlrpcval($struct,’struct’),
            new xmlrpcval($publish,’boolean’)
          )
        );
      $result=$this->client->send($msg);
      if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
    
    /**
     * Send XML-RPC message as "metaWeblog.setPostCategories".
     *
     * @param integer $postid, target article id
   &n
bsp; * @param array $categories, array(array(int $category_id => bool $isPrimary),array(—),…)
     * @return boolean
     * @access public
     */
    function mt_setpostcategories($postid,$categories)
    {
      $myArray=array();
      foreach($categories as $tmpKey => $tmpValue){
        $tmpArray=array();
        $tmpArray[‘categoryId’]  =new xmlrpcval($tmpKey,’string’);
        $tmpArray[‘isPrimary’]  =new xmlrpcval($tmpValue,’boolean’);
        $myArray[]=new xmlrpcval($tmpArray,’struct’);
      }
      
      $msg=new xmlrpcmsg(‘mt.setPostCategories’,
          array(
            new xmlrpcval($postid,’int’),
            $this->userid,
            $this->password,
            new xmlrpcval($myArray,’array’)
          )
        );
      $result=$this->client->send($msg);
      if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
    
    /**
     * Send XML-RPC message as "mt.publishPost".
     *
     * @param integer $postid, target article id
     * @return boolean
     * @access public
     */
    function mt_publishpost($postid)
    {
      $msg=new xmlrpcmsg(‘mt.setPostCategories’,
          array(
            new xmlrpcval($postid,’int’),
            $this->userid,
            $this->password
          )
        );
      $result=$this->client->send($msg);
      if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
    
    /**
     * Send XML-RPC message as "mt.supportedMethod".
     *
     * @return mixed (successed:method array, failed:false)
     * @access public
     */
    function mt_supportedmethods()
    {
      $struct=array();
      foreach($article as $tmpKey => $tmpValue){
        $struct[$tmpKey]=new xmlrpcval($tmpValue,’string’);
      }
      $msg=new xmlrpcmsg(‘mt.supportedMethods’);
      $result=$this->client->send($msg);
      if(!$result){
        return false;
      }elseif($result->faultCode()){
        return false;
      }else{
        $tmpObj=$result->value();
        return $tmpObj->scalarval();
      }
    }
  }
?>


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net