SQLの窓

2015年01月13日


GitHub の google-api-php-client( PHP ) を使って、Gmail でメールを送る

google-api-php-client
Client ID と Client secret と Redirect URIs が必要です ( APIs Console )



Users.messages: send

google-api-php-client は Google のあらゆる API にアクセスする為に数多くのクラスが用意されており、かつ標準化されています。examples フォルダの内容は、Google ドライブで作成されていますが、よくよく各クラスの内容を読んで、Google の英文ドキュメントを参考にしながら世の中の記事を参考にすればなんとかなりそうなものです。

今回、Gmail を使ってのメール送信は以下の英文記事を参考にしました。

Using Gmail API to Send Rich Text Emails

このコードは、利用するには不完全ですが、クラスと Google のドキュメントを読み解く資料としては十分の内容でした。

また、ここで使われる Base64URL というエンコードは、なかなか興味深い内容ですが、そもそもメールはそういう仕様の集合体なので、基本知識が無い場合はそのままただ使うといいと思います。( ここが最も参考になりました )

send メソッドが所属するのは、Google_Service_Gmail_UsersMessages_Resource というクラスで、Google_Service_Gmail のコンストラクタでプロパティとして設定されるものです。よって、実行が $service->users_messages->send("me", $msg); という形になるわけです。
<?php
/*
 * Copyright 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
include_once "templates/base.php";
session_start();

header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

require_once realpath(dirname(__FILE__) . '/../autoload.php');

/************************************************
  $redirect_uri はこのスクリプトの URL
 ************************************************/
$client_id = '';
$client_secret = '';
$redirect_uri = 'http://localhost/gapi/examples/gmail-send.php';

/************************************************
  クライアントの作成
 ************************************************/
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);

/************************************************
  サービスの作成
 ************************************************/
// https://developers.google.com/gmail/api/auth/scopes
// https://developers.google.com/gmail/api/v1/reference/users/messages/send
$client->addScope("https://mail.google.com/");
$service = new Google_Service_Gmail($client);

/************************************************
  アクセストークンの取得プロセス
 ************************************************/
if (isset($_REQUEST['logout'])) {
  unset($_SESSION['access_token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
  if ($client->isAccessTokenExpired()) {
    unset($_SESSION['access_token']);
  }
} else {
  $authUrl = $client->createAuthUrl();
}

/************************************************
  アクセストークンが取得できた時の処理
 ************************************************/
if ($client->getAccessToken() && $_POST['send'] != '' && $_POST['body'] != '') {

  // メール送信
  $subject = mb_convert_encoding( $_POST['subject'], "JIS", "UTF-8" );
  $subject = "Subject: =?ISO-2022-JP?B?" . base64_encode($subject) . "?=";
  $to = "To: {$_POST['to']}";
  $body = $_POST['body'];

  $send_data = "$subject\n$to\n\n$body";
  // Base64URL
  $send_data = rtrim(strtr(base64_encode($send_data), '+/', '-_'), '=');
  $msg = new Google_Service_Gmail_Message();
  $msg->setRaw($send_data);
  $result = $service->users_messages->send("me", $msg);

}

echo pageHeader("Gmail メール送信");
if ($client->getAccessToken()) {
?>
<div style='width:300px;margin:auto'>
<form method="post" >
<input type="text" name="to"><br>
<input type="text" name="subject"><br>
<textarea name="body" style='height:100px;'></textarea><br>
<input type="submit" name="send" value="送信">
</form>
</div>
<?php
}
?>
<div class="box">
  <div class="request">
<?php 
if (isset($authUrl)) {
  echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
}
?>
  </div>

  <pre class="shortened" style='width:100%;height:500px;'>
<?php 
if (isset($result) && $result) {
  print_r($result);
}
?>
  </pre>
</div>

スコープとして、https://mail.google.com/ を使用していますが、これは最も権限の大きいスコープで、メール送信はこれを使う必要は必ずしも無いはずです。

関連する記事


タグ:gmail google API
posted by lightbox at 2015-01-13 00:08 | Google | このブログの読者になる | 更新情報をチェックする

2015年01月12日


Google で追加の保存容量

現在お持ちの保存容量



Google ドライブと Google+ フォト
無料の保存容量の上限に達するか、この上限を超えると、新しいファイルを同期、アップロードできなくなります。また、Google ドライブ フォルダとウェブ上のドライブの同期は完全に停止します。Google ドキュメントは保存容量を使用しないので引き続き作成できます。Google+ フォトの場合は、特定のサイズ(2,048x2,048 ピクセル)制限以下であれば、新しい写真や動画をアップロードできます。
Gmail
15 GB の無料の保存容量の上限に達した場合、メールを受信できなくなるまで問題を修復するための猶予期間がありますが、できるだけ早く行うようにしてください。問題を修復するには、メールの削除、保存容量の購入、管理者への問い合わせのいずれかを行って使用容量を解放します。
追加の保存容量 •100 GB($4.99/月)$1.99/月 •200 GB($9.99/月) •400 GB($19.99/月) •1 TB($49.99/月)$9.99/月 •2 TB($99.99/月) •4 TB($199.99/月) •8 TB($399.99/月) •10 TB($99.99/月) •16 TB($799.99/月) •20 TB($199.99/月) •30 TB($299.99/月) ※ 取り消し線のデータは 2014-01-08 時点でした ストレージ プランの購入と管理 購入のポリシーと条件 ※ 支払方法はクレジットカードですが、デビットカードも使えます。 ※ デフォルトでは、保存容量の購入は契約期間の終了時に自動更新するよう設定されます。 関連するリンク NAVER Visa デビットカード と楽天銀行と「J-Debit」との違い OneDrive 容量追加 Google ヘルプ Google ウォレットのお支払い方法 ITmedia ニュース Googleドライブの有料版が大幅値下げ 1TBは月額50ドルが10ドルに
posted by lightbox at 2015-01-12 08:15 | Google | このブログの読者になる | 更新情報をチェックする

2015年01月10日


GitHub の google-api-php-client( PHP ) を使って、Google Drive の指定フォルダ内に比較的小さいファイルをアップロードする

google-api-php-client
Client ID と Client secret と Redirect URIs が必要です ( APIs Console )


(リダイレクト URL は複数指定できます)

アップロードしたいフォルダの ID が必要ですが、テストなので Google ドライブの管理画面の URL から取得しています。親フォルダは複数指定できる仕様になっており、いくつでも指定できるようです。
<?php
/*
 * Copyright 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
include_once "templates/base.php";
session_start();

header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

require_once realpath(dirname(__FILE__) . '/../autoload.php');

/************************************************
  $redirect_uri はこのスクリプトの URL
 ************************************************/
$client_id = '';
$client_secret = '';
$redirect_uri = 'http://localhost/gapi/examples/simplefileupload.php';

/************************************************
  クライアントの作成
 ************************************************/
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
$service = new Google_Service_Drive($client);

/************************************************
  アクセストークンの取得プロセス
 ************************************************/
if (isset($_REQUEST['logout'])) {
  unset($_SESSION['upload_token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['upload_token'] = $client->getAccessToken();
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

if (isset($_SESSION['upload_token']) && $_SESSION['upload_token']) {
  $client->setAccessToken($_SESSION['upload_token']);
  if ($client->isAccessTokenExpired()) {
    unset($_SESSION['upload_token']);
  }
} else {
  $authUrl = $client->createAuthUrl();
}

/************************************************
  アクセストークンが取得できた時の処理
 ************************************************/
if ($client->getAccessToken()) {

  // ファイルのインスタンスを作成
  $file = new Google_Service_Drive_DriveFile();
  $file->setTitle("比較的小さいファイルのアップロード");

  $parent1 = new Google_Service_Drive_ParentReference();
  // Google ドライブの管理画面のURL から ID を取得
  $parent1->setId('0B9Jymqpro6gSVXBUb1N6RXAtVGc');

  $parent2 = new Google_Service_Drive_ParentReference();
  // Google ドライブの管理画面のURL から ID を取得
  $parent2->setId('0B9Jymqpro6gSRWQ3a0VYUXFEc0U');

  // 二つのフォルダ内から参照しますが、実体は一つで片方から変更すると、
  // もう片方から見ても変更されています
  $file->setParents(array($parent1, $parent2));
  $result = $service->files->insert(
      $file,
      array(
        // file_get_contents を使っているので、データは一括渡しになって
        // 大きいファイルで使うとメモリが大量に必要になるので、その場合
        // は、examples/fileupload.php を参考にします。
        'data' => file_get_contents("./simplefileupload.php"),
        'mimeType' => 'text/plain',
        'uploadType' => 'multipart'
      )
  );
}

echo pageHeader("File Upload - Uploading a small file");
?>
<div class="box">
  <div class="request">
<?php 
if (isset($authUrl)) {
  echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
}
?>
  </div>

  <div class="shortened" style='width:100%;height:400px;'>
<?php 
if (isset($result) && $result) {
  var_dump($result->title);
}
?>
  </div>
</div>


関連する記事





posted by lightbox at 2015-01-10 21:24 | Google | このブログの読者になる | 更新情報をチェックする

2015年01月09日


GitHub の yahoojapan/yconnect-php-sdk( PHP ) を使用して、Yahoo! にログインさせてユーザ情報を取得する( OPENID )

Yahoo! ID連携 PHP SDK

ダウンロードして sample.php を動かすだけなのですが、そのままでは動作しないので、必ず1行追加する必要があります
<?php
/**
 * The MIT License (MIT)
 *
 * Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

require("autoload.php");

use YConnect\Constant\OIDConnectDisplay;
use YConnect\Constant\OIDConnectPrompt;
use YConnect\Constant\OIDConnectScope;
use YConnect\Constant\ResponseType;
use YConnect\Credential\ClientCredential;
use YConnect\YConnectClient;

header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// アプリケーションID, シークレット
$client_id     = "";
$client_secret = "";

// 各パラメータ初期化
$redirect_uri = "http://localhost/yconnect/sample.php";

// リクエストとコールバック間の検証用のランダムな文字列を指定してください
$state = "44Oq44Ki5YWF44Gr5L+644Gv44Gq44KL77yB";
// リプレイアタック対策のランダムな文字列を指定してください
$nonce = "5YOV44Go5aWR57SE44GX44GmSUTljqjjgavjgarjgaPjgabjgog=";

$response_type = ResponseType::CODE_IDTOKEN;
$scope = array(
    OIDConnectScope::OPENID,
    OIDConnectScope::PROFILE,
    OIDConnectScope::EMAIL,
    OIDConnectScope::ADDRESS
);
$display = OIDConnectDisplay::DEFAULT_DISPLAY;
$prompt = array(
    OIDConnectPrompt::DEFAULT_PROMPT
);

// クレデンシャルインスタンス生成
$cred = new ClientCredential( $client_id, $client_secret );
// YConnectクライアントインスタンス生成
$client = new YConnectClient( $cred );

$client->disableSSLCheck();

// デバッグ用ログ出力
$client->enableDebugMode();

try {

    // Authorization Codeを取得
    $code_result = $client->getAuthorizationCode( $state );

    if( !$code_result ) {

        /*****************************
             Authorization Request
        *****************************/

        // Authorizationエンドポイントにリクエスト
        $client->requestAuth(
            $redirect_uri,
            $state,
            $nonce,
            $response_type,
            $scope,
            $display,
            $prompt
        );

    } else {

        /****************************
             Access Token Request
        ****************************/

        // Tokenエンドポイントにリクエスト
        $client->requestAccessToken(
            $redirect_uri,
            $code_result
        );

        echo "<h1>Access Token Request</h1>";
        // アクセストークン, リフレッシュトークン, IDトークンを取得
        echo "ACCESS TOKEN : " . $client->getAccessToken() . "<br/><br/>";
        echo "REFRESH TOKEN: " . $client->getRefreshToken() . "<br/><br/>";
        echo "EXPIRATION   : " . $client->getAccessTokenExpiration() . "<br/><br/>";

        /*****************************
             Verification ID Token
        *****************************/

        // IDトークンを検証
        $client->verifyIdToken( $nonce );
        echo "ID TOKEN: <br/>";
        echo "<pre>" . print_r( $client->getIdToken(), true ) . "</pre>";

        /************************
             UserInfo Request
        ************************/

        // UserInfoエンドポイントにリクエスト
        $client->requestUserInfo( $client->getAccessToken() );
        echo "<h1>UserInfo Request</h1>";
        echo "UserInfo: <br/>";
        // UserInfo情報を取得
        echo "<pre>" . print_r( $client->getUserInfo(), true ) . "</pre>";

    }

} catch ( ApiException $ae ) {

    // アクセストークンが有効期限切れであるかチェック
    if( $ae->invalidToken() ) {

        /************************************
             Refresh Access Token Request
        ************************************/

        try {

            // 保存していたリフレッシュトークンを指定してください
            $refresh_token = "STORED_REFRESH_TOKEN";

            // Tokenエンドポイントにリクエストしてアクセストークンを更新
            $client->refreshAccessToken( $refresh_token );
            echo "<h1>Refresh Access Token Request</h1>";
            echo "ACCESS TOKEN : " . $client->getAccessToken() . "<br/><br/>";
            echo "EXPIRATION   : " . $client->getAccessTokenExpiration();

        } catch ( TokenException $te ) {

            // リフレッシュトークンが有効期限切れであるかチェック
            if( $te->invalidGrant() ) {
                // はじめのAuthorizationエンドポイントリクエストからやり直してください
                echo "<h1>Refresh Token has Expired</h1>";
            }

            echo "<pre>" . print_r( $te, true ) . "</pre>";

        } catch ( \Exception $e ) {
            echo "<pre>" . print_r( $e, true ) . "</pre>";
        }

    } else if( $ae->invalidRequest() ) {
        echo "<h1>Invalid Request</h1>";
        echo "<pre>" . print_r( $ae, true ) . "</pre>";
    } else {
        echo "<h1>Other Error</h1>";
        echo "<pre>" . print_r( $ae, true ) . "</pre>";
    }

} catch ( \Exception $e ) {
    echo "<pre>" . print_r( $e, true ) . "</pre>";
}

ヘッダー出力は、ユーザ情報が UTF-8 なので設定しています。

アプリケーションID, シークレットは、アプリケーションの管理から取得して下さい

Yahoo! のログインボタンをクリックすると、最終的にはユーザ情報が表示されます。

1) Yahoo! のログインボタンをクリック
2) ログイン( ログイン済みでは表示されない )
3) アプリケーション認証

4) ユーザ情報

補足情報

本来なら、ここから Yahoo! ボックスの API にアクセスしていけるはずなのですが、どうも現在はまともに動いていないようです。WEB で調べてもリリース当時( 2014/02 ) に2件ほどテストが成功したような記事がありましたが、現状全く動作したという情報がありません。自分でも、いろいろやってみましたが、無理でした。ドキュメントも中途半端にお茶を濁した感がありますので、チャレンジしないほうがいいです。



posted by lightbox at 2015-01-09 21:43 | API | このブログの読者になる | 更新情報をチェックする

GitHub の google-api-php-client( PHP ) を使って、Google Drive のファイル(フォルダ)の一覧を具体的に検索する為の3つのオプションの指定方法

google-api-php-client
Client ID と Client secret と Redirect URIs が必要です ( APIs Console )

前回、idtoken.php を使用してファイルのダウンロードを行いましたが、そもそも、どのファイルをダウンロードするかという事を決める為に、ファイルの一覧を取得する必要がありますが、Google のドキュメントを読むだけではなかなか解りにくいのです。なので、おそらくほとんどこれでまかなえると思われるオプションの指定方法を3種類ご紹介します。
<?php
/*
 * Copyright 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
include_once "templates/base.php";
session_start();

header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

require_once realpath(dirname(__FILE__) . '/../autoload.php');

$client_id = '';
$client_secret = '';
$redirect_uri = 'http://localhost/gapi/examples/idtoken.php';

$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->setScopes('https://www.googleapis.com/auth/drive');

/************************************************
  If we're logging out we just need to clear our
  local access token in this case
 ************************************************/
if (isset($_REQUEST['logout'])) {
  unset($_SESSION['access_token']);
}

/************************************************
  If we have a code back from the OAuth 2.0 flow,
  we need to exchange that with the authenticate()
  function. We store the resultant access token
  bundle in the session, and redirect to ourself.
 ************************************************/
if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

/************************************************
  If we have an access token, we can make
  requests, else we generate an authentication URL.
 ************************************************/
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
} else {
  $authUrl = $client->createAuthUrl();
}

/************************************************
  If we're signed in we can go ahead and retrieve
  the ID token, which is part of the bundle of
  data that is exchange in the authenticate step
  - we only need to do a network call if we have
  to retrieve the Google certificate to verify it,
  and that can be cached.
 ************************************************/
if ($client->getAccessToken()) {
  $_SESSION['access_token'] = $client->getAccessToken();
//  $token_data = $client->verifyIdToken()->getAttributes();
}

echo pageHeader("User Query - Retrieving An Id Token");
?>
<div class="box" style='width:100%'>
  <div class="request">
<?php
// 接続用リンク
if (isset($authUrl)) {
  echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
} 
// ログアウト用リンク
else {
  echo "<a class='logout' href='?logout'>Logout</a>";
}
?>
  </div>

  <pre class="data">
<?php 

if ( isset($_SESSION['access_token']) ) {

	print "セッションの内容\n";
	print_r($_SESSION);

	// 内容が JSON なのでデコード
	$obj = json_decode($_SESSION['access_token']);

	print "JSON の内容\n";
	print_r($obj);

	print "アクセストークン\n";
	print "{$obj->{'access_token'}}\n";

	$dr_service = new Google_Service_Drive($client);

	// 有効な画像ファイルを 10 エントリを取得する
	$dr_results = $dr_service->files->listFiles(array('q' => 'mimeType contains "image/" and trashed != true and hidden != true', 'maxResults' => 10 ));
//	$dr_results = $dr_service->files->listFiles(array('q' => '"0B9Jymqpro6gSb2w3bHZXU2dYUmM" in parents'));
//	$dr_results = $dr_service->files->listFiles(array('q' => 'mimeType = "application/vnd.google-apps.folder"'));


	// ファイルのインスタンスの配列を取得
	$files = $dr_results->getItems();

	print_r($files);

}

?>
  </pre>
</div>

Search for Files

コメント行も含めて3つあります。maxResults の条件は特殊ですが、'q' => 条件 の指定に関しては、条件部分には and が使えていろいろ組み合す事ができます。

mimeType contains "image/" は、画像ファイルを検索します。
trashed != true は削除されていないファイルです。
( これを指定しないと、30日間は削除されても残っているようなので必須です )
hidden != true これは、システム側のファイルの属性のようなのですが、ドキュメントには無かったですが、指定したら動作しました。

"0B9Jymqpro6gSb2w3bHZXU2dYUmM" in parents は、フォルダID(この場合は、0B9Jymqpro6gSb2w3bHZXU2dYUmM) で示されるフォルダ内の一覧になります。フォルダID は、Google ドライブの管理画面の URL から直接取り出す事もできます。

mimeType = "application/vnd.google-apps.folder" は、単純にフォルダの一覧になるようです。

まだまだ、細かく検証はしていませんが、これがあると無いとではかなりの違いがあると思います。

関連する記事



posted by lightbox at 2015-01-09 21:04 | Google | このブログの読者になる | 更新情報をチェックする

2015年01月08日


自分のサイトのファイルをユーザの所有する Google Drive に保存するボタン( IE は動作しませんでした )

Save to Drive Button

Google Drive Web APIs の一つですが、設置するほうは誰でも使えるようです。Google Drive にアップロードするほうでアカウントが必要です。ただ、同一ドメインでないとダメなようなので、今は IFRAME で設置しています。( Google のドキュメントでは、ヘッダを返せば他からもできそうな事を書いてましたが、うまくいきませんでした )

あと、保存するファイル名に日本語がつかえませんでした( 動くフリをしますが、前へ進みませんでした )

IE は、ドキュメントの記述に従って X-UA-Compatible を使っていろいろやってみましたがダメでした。


ボタンクリックでウインドウ



フォルダを選択できます



選択後



完了



▼ IFRAME の中
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<link rel="shortcut icon" href="http://winofsql.jp/WinOfSql.ico" />
</head>
<body>
<script src="https://apis.google.com/js/platform.js" async defer></script>
<div class="g-savetodrive"
   data-src="http://toolbox.winofsql.jp/image/142005544245221985225.jpg"
   data-filename="sworc.jpg"
   data-sitename="sworc">
</div></body>
</html>


関連する記事



posted by lightbox at 2015-01-08 01:44 | Google | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり