SQLの窓

2016年03月23日


ドコモ デベロッパーサポートで API使いたいと思ってサインアップしようとしたら・・・・。法人情報は後から登録しましょう


新規アカウント登録 | docomo Developer support | NTTドコモ

法人情報を登録すると、API の制限が緩いとあります。普通に授業に使いたいので学校の情報を入力しました。それはいいです。で、文字認証があり、直感的に入力して間違ってしまいました。

しかたないなぁ・・・と思ってもう一度文字認証すると、『入力されていません』と。

法人情報が全て無くなっていましたいまどきこんなバカな WEB アプリ作るとは、笑ってしまいました( 嘘。本当は誰でもなんかその場で発する )

というくだらない記事ですが、人によっては、サインアップやめてしまうか、チェックボックス外して登録するでしょう。

そこで。

チェックボックス外してサインアップしましょう。法人情報登録は後からできます。





タグ:API トラブル
posted by lightbox at 2016-03-23 13:42 | API | このブログの読者になる | 更新情報をチェックする

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 | このブログの読者になる | 更新情報をチェックする

2013年12月07日


手動で Facebook API の 60日間の アクセストークンを取得する

以下で実際に投稿できます(本文の手順でアクセストークンを取得して下さい)
▼ 簡易的なので、日本語は不可です ( ここは Shift_JIS なので。UTF-8 のページなら日本語可です )

▼ 自分のみになる設定です
▼ リンク設定
▼ 画像設定
( 投稿時のパラメータの日本語訳ドキュメント )
とにかくアクセストークンがすぐ欲しい場合

App ID を取得しているという前提で、Graph API Explorer にアクセスして、自分のアプリを選択してから権限を選択(通常デフォルトで十分です)してアクセストークンを取得します。

▼ プログラムを書いてそこから投稿がアプリ名



▼『アクセストークンを取得』をクリックすると、ウインドウが開いて必要なパーミッションを選択します



▲ その後、『Get Access Token』をクリックすると、アクセストークンが『アクセストークンを取得』ボタンの左に表示されます


ブラウザを使う(現在 IE でしか取得できません)


ブラウザを使って手動で60間有効なアクセストークンを取得します。Google Chrome でテストしました( IE では結果がうまく戻りません )

まず以下の 文字列を作成してアドレスバーに入力します。すると、ログインされていない場合はログインページが表示され、ログイン済の場合は Success とだけ表示されて、アドレスバーに 2時間有効なアクセストークンが表示されます。そのアクセストークンを取得して下さい

現在、blank.html が表示されますが、Google Chrome のデベロッパーツールで、Network を開いて実行すると、『login_success.html#access_token=2時間有効なアクセストークン』という形式での URL を確認することができます。

結果的に、IE でのみ左端で右クリックして URL のコピーを行う事で取得できる事を確認しています

▼ 2時間有効なアクセストークンを取得する URL

( ログインしていない場合は、ログイン画面が表示されます )
https://www.facebook.com/dialog/oauth/?redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token&client_id=APIキー&scope=user_about_me,user_photos,read_stream,publish_stream
以下で実際に取得できます(IEで事前にFacebook をログオフしておく)


▼ ここだけ変更します

Facebook をログオフしておいて、上のフォームを実行すると、ログイン画面が表示されるので、そこで開発者ツールを開いてネットワークキャプチャを有効にしてログインします。



▲ この画像は、IE11 ですが、IE10 でも動作は確認しました。

▼ この時取得した URL は以下のようになります
http://www.facebook.com/connect/login_success.html#access_token=アクセストークン&expires_in=6047
その2時間有効なアクセストークンを60日間有効なアクセストークンに交換する為に以下の文字列を作成します。
https://graph.facebook.com/oauth/access_token?client_id=APIキー&client_secret=アプリのシークレットキー&grant_type=fb_exchange_token&fb_exchange_token=2時間有効なアクセストークン
以下で実際に取得できます(ここはどのブラウザでも OK です)

▼ ここを変更します
▼ ここを変更します
▼ ここを変更します
▲ 上のフォームから送信すると、ページ内にアクセストークンが表示されます

一般的には、この文字列をブラウザのアドレスバーに入力すると、テキストとして以下のような文字列が帰って来ます。
access_token=60日間有効なアクセストークン&expires=残り時間


ここから以降は再検証していないので参考程度

これらは、offline_access パラメータの廃止に関するドキュメントに書かれてある手順を試してみたものです。ですから、アプリの詳細設定の『移行』で Remove offline_access permission が on になっている必要があります。まだ アプリケーションから試したわけではありませんが、2時間限定のアクセスならば、APIキーのみでシークレットは必要とせずに Graph API にアクセスする事ができます。

※ graph.facebook.com/me/home でテストしました

2時間のアクセストークンだけならば、Windows8(C#) の WebView でテストして動作しています。WebView の URL の取得は以下のようにして処理しています。
( イベントで取り出すのがセオリーですが、この方法はいろいろな場面で利用可能なので )
// 取得した文字列から、任意の処理で
// アクセストークンを取り出します
string url = (webView.InvokeScript("eval", new String[] { "(function(){return location.href})();" })).ToString();
関連する Facebook ドキュメント

Extended Permissions




タグ:Facebook Windows8 C#
posted by lightbox at 2013-12-07 18:57 | API | このブログの読者になる | 更新情報をチェックする

2013年11月18日


Facebook Graph API Explorer でカスタムプライバシー設定をした投稿を行う

基本は以下の3つですが、それ以外に CUSTOM があります。

1) privacy={'value':'ALL_FRIENDS'}
2) privacy={'value':'EVERYONE'}
3) privacy={'value':'SELF'}

Graph API Explorer

アクセストークンを必要なスコープで設定して取得して以下のように実行します。



すると以下のように投稿されて



個別に allow されています



For CUSTOM settings, a comma-separated list of user IDs とありますが、これのフォーマットは以下のようになっています。

{'value':'CUSTOM','allow': '999999999999999,999999999999999'}

その他にも、同時に投稿できる内容はたくさんありますが、特に、画像(picture)やリンク(link)の URL は簡単で便利です。

オリジナルの Post に関するページ

日本語訳されたページ


※ 友人の id の一覧は、me/friends で取得できます。


API の投稿先は、https://graph.facebook.com/me/feed
必要なフィールドは、message、access_token、privacy( 省略可ですが、テスト投稿では SELF にしたほうがいいです )。追加で使い勝手がいいのは、他に picture と link です。



posted by lightbox at 2013-11-18 23:45 | API | このブログの読者になる | 更新情報をチェックする

2013年08月29日


C#(.NET) : Google Spreadsheets API version 3.0でGoogleスプレッドシートを参照

Google Spreadsheet は、Google ドライブに作成する事ができる Excel のような仕様の WEB アプリケーションです。WEB 上でデータを保存しておいて、インターネット経由で参照や更新が可能なのが Google Spreadsheets API です。( 他の API では、JavaScript より参照できるものもあます )

Google Spreadsheets API version 3.0

.NET ライブラリのダウンロード
( その他全てへのリンク )



ダウンロードしたライブラリは、直接参照する必要があります。本来 XML データでやりとりするものをライブラリ化しているので、あまり便利なものにはなっていませんが、『スプレッドシート』『ワークシート』を順々に一覧より取得するようにはなっていますので、後から解りやすい仕様ではあります。

ここでは、Dictionary を使って保存する手順を行っていますが、使いやすくするには最初に全てのワークシートまでを Dictionary に保存しておいて、名前で取得できるクラスを作成するといいと思います。

▼ で使った『In Googleドライブ』を公開したもの ( 取引先名は VLOOKUP を シート2から行っています )
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Google.GData.Client;
using Google.GData.Spreadsheets;
using System.Diagnostics;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {

        public SpreadsheetsService service = null;
        public Dictionary<string, SpreadsheetEntry> db_Spread = new Dictionary<string, SpreadsheetEntry>();
        public Dictionary<string, WorksheetEntry> table_Spread = null;

        public Form1()
        {
            InitializeComponent();
        }

        // ********************************************************
        // ログインデータを設定
        // ********************************************************
        private void button1_Click(object sender, EventArgs e)
        {
            service = new SpreadsheetsService("MySpreadsheetIntegration-v1");
            service.setUserCredentials(this.textBox1.Text, this.textBox2.Text);

            Debug.WriteLine(service.ServiceIdentifier.ToString());
            
        }

        // ********************************************************
        // Google Spreadsheet 一覧をディクショナリに保存
        // ********************************************************
        private void button2_Click(object sender, EventArgs e)
        {
            this.listBox1.Items.Clear();

            SpreadsheetQuery query = new SpreadsheetQuery();

            try
            {
                SpreadsheetFeed feed = service.Query(query);
                foreach (SpreadsheetEntry entry in feed.Entries)
                {
                    Debug.WriteLine(entry.Title.Text);
                    this.listBox1.Items.Add(entry.Title.Text);
                    db_Spread.Add(entry.Title.Text, entry);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        // ********************************************************
        // ListBox の対象行をダブルクリックしてディクショナリにシートを保存
        // ********************************************************
        private void listBox1_DoubleClick(object sender, EventArgs e)
        {
            string target = this.listBox1.SelectedItem.ToString();
            Debug.WriteLine(target);

            try
            {
                SpreadsheetEntry target_Spread = db_Spread[target];

                table_Spread = new Dictionary<string, WorksheetEntry>();
                WorksheetFeed wsFeed = target_Spread.Worksheets;
                foreach (WorksheetEntry entry in wsFeed.Entries)
                {
                    table_Spread.Add(entry.Title.Text, entry);
                    Debug.WriteLine(entry.Title.Text);
                }

                // 先頭シートからデータを取得
                CellQuery cellQuery = new CellQuery(((WorksheetEntry)wsFeed.Entries[0]).CellFeedLink);
                CellFeed cellFeed = service.Query(cellQuery);

                uint nRow = 1;
                string strResult = "";
                foreach (CellEntry cell in cellFeed.Entries)
                {
                    if (nRow == cell.Row)
                    {
                        if (strResult == "")
                        {
                            strResult += cell.Value;
                        }
                        else
                        {
                            strResult += "," + cell.Value;
                        }
                    }
                    else
                    {
                        strResult += "\r\n" + cell.Value;
                    }
                    Debug.WriteLine(cell.Value);

                    nRow = cell.Row;
                }

                this.textBox3.Text = strResult;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
    }
}




posted by lightbox at 2013-08-29 01:18 | API | このブログの読者になる | 更新情報をチェックする

2011年12月11日


Twitpic の画像URLを取得する API が変わっているようなのですが

2011年12月06日 時点で表示されていたものが、数日前から表示されないので
おかしいと思い、Twitter で正しく表示されている画像の URL を開発者ツール
で見てみると、以前付加されていた .jpg の拡張子が消えていました。

Twitpic の右サイドにある埋め込みコードもまだ拡張子が付いているので画像
は表示されていません。たぶん仕様変更だとは思いますが、拡張子が無いと、
Twitpic 側にメリットがあるのでこのままだとは思います。

.jpg が付いたままだと、参照してそのままポストするタイプのサイトでは、
リンクバックが欠落するので、利用者が意図的にリンクをするように、心理
的な面からの設計かと。

ま、考えすぎかもしれませんが。

TwitPic Developers - API Documentation - Thumbnails

上のページは API のサムルイルに関する仕様が説明されたページですが、
やはり、拡張子はありません。前がどうかかれていたかは、もう確認する
方法はありませんが、今でも右サイドの埋め込みコードは .jpg が付いた
ままです。( 当然使えません )

で、.jpg を外すと以下のように。

Share photos on twitter with Twitpic

ちなみに、この仕様では、http://twitpic.com/show/thumb/7kgupc なのです
が、Twitter で使われているのは thumb では無く large です。この仕様って
どこにあるのでしょう。

以下は large です。

Share photos on twitter with Twitpic

※ 参考( 以下は mini です )

Share photos on twitter with Twitpic



posted by lightbox at 2011-12-11 13:58 | API | このブログの読者になる | 更新情報をチェックする
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 終わり