ジャンル不定の日記です。

KDE関連の問題・・・

先日Arch LinuxにKDE関連のアップデートが来てから色々おかしくなってたんだが、今日新たにアップデート来てて、それと設定見直しで位だいたい解決した。

先日以降に発生した問題は、
  1. パッケージマネージャのApperがおかしい。
  2. テキストエディタのKateの設定が初期化された。
  3. Kateで文字コード指定保存ができない。
  4. Konsoleで表示がずれる。
  5. DolphinからKate開くとDolphinがフリーズしたり。
ってな感じだったんだが、

Dolphinのフリーズは今回のアップデートで治ったぽい。

Apperに関しては、長いこと更新されていないようでリポジトリから消えてた。
他に良さ気なGUIのpacmanフロントエンドもないんで困るが、Apperは消した。

Kateの設定が初期化されてたのは直ぐに設定したが、
Konsoleの表示がずれるのも同じ原因だった。
以前にもこの症状あったんだが、フォントは梅フォントを使っていたが、Konsoleは英字フォント優先で使わないとダメぽい。
一旦Dejavuフォントを使うように設定したが、ちょっと前に登場したAdobeのSource Code Proが良さ気なんでadobe-source-code-pro-fontsを入れた。

以前から
梅フォントが、
0とO
iとj
Iとl
gとq
とか半角英数字の識別が困難で困ってたんだが、
Adobeのフォントは識別しやすいんで、梅フォント使うのやめてAdobeにした。
今は2chはタブレットで見るからAAフォントはほぼ要らないし、
JDのフォントだけ梅使えば、AAはほぼ問題ないと思う。


Kateで文字コード指定保存ができないのは、まだ困ってる。
以前は「名前をつけて保存」の時に文字コードの選択ができたはずなんだが・・・

Gmail APIできた

メール(Gmail)の自動処理スクリプトがGoogleの2段階認証で機能してなかったので、IMAP使わずにGmail APIを使うように修正した。

Gmail APIの使い方だが、
  1. Google Developer Consoleでプロジェクトを作成。
  2. APIと認証のAPIでGmail APIをオンにする。
  3. 認証情報で新しいクライアントIDを作成する。(ネイティブアプリケーションにした)
そうすると、
[クライアント ID],[クライアント シークレット],[リダイレクト URI]
の3つのパラメータが取得できる。

https://accounts.google.com/o/oauth2/auth?client_id=[クライアント ID]&redirect_uri=[リダイレクト URI]&scope=https://mail.google.com/&response_type=code&approval_prompt=force&access_type=offline
にブラウザで接続するとアクセストークン取得用のコードが表示される。
scopeはGoogleアカウントから取得する権限だが、
https://www.googleapis.com/auth/gmail.modify読み書き
https://www.googleapis.com/auth/gmail.readonly読みのみ
https://www.googleapis.com/auth/gmail.compose送信できる
https://mail.google.com/全権限
の4つがあり、modifyでも良かったのかもしれないが、削除ができないようなことが書かれてたので全権にした。

今度は上の手順で取得したコードを使ってアクセストークンを取得するが、GETではなくPOSTする必要がある。
curl -d client_id=[クライアント ID] -d client_secret=[クライアント シークレット] -d redirect_uri=[リダイレクト URI] -d grant_type=authorization_code -d code=[ブラウザで取得したコード] https://accounts.google.com/o/oauth2/token
こんな感じでコンソールからcurlコマンドでPOSTした。
JSON形式でアクセストークン等が返ってくるが、トークンには有効期限があるので、必要なのはaccess_tokenではなくrefresh_tokenの方。
レスポンスは全部JSONで返ってくるね。

ここまでで取得できた、
[クライアント ID],[クライアント シークレット],[リフレッシュトークン]
の3つをアプリ(スクリプト)で使う。

https://www.googleapis.com/oauth2/v3/token
にPOSTで、
client_id=[クライアント ID]
client_secret=[クライアント シークレット]
refresh_token=[リフレッシュトークン]
grant_type=refresh_token
の4個のパラメータをContent-Type: application/x-www-form-urlencodedでリクエストする。
そうするとアクセストークンが返ってくる。


以下のリクエストはOAuthなんで、リクエストヘッダに、
Authorization: OAuth [アクセストークン]
が必要。

メール一覧の取得は、
https://www.googleapis.com/gmail/v1/users/[Google ID]/messages
にGETで取得できる。メールのメッセージIDがJSONで返ってくる。
[Google ID]はGoogleにログインする時のメールアドレスね。
パラメータ(クエリ)にlabelIdsでラベルを指定したり、qで検索条件を指定したりして取得するメールを絞れる。

メール本体の取得は、
https://www.googleapis.com/gmail/v1/users/[Google ID]/messages/[メッセージID]
にGETで取得でき、bodyはBase64された本文なんだが、ここでちょっとハマった。
Base64のデコードにMIME::Base64を使ったんだが、ここで取得できるBase64はURLセーフになってる。
$body=~s/-/+/g;
$body=~s/_/\//g;
こんな感じでURLセーフのBase64を通常のBase64に変換しないとMIME::Base64でデコードできない。
bodyの文字コードはUTF-8になってるんで文字コード変換は不要。

メールの削除は、取得と同じURLにGETではなくDELETEメソッドで接続すればできるようなんだが、
ゴミ箱への移動は、
https://www.googleapis.com/gmail/v1/users/[Google ID]/messages/[メッセージID]/trash
にGET。
削除方法はゴミ箱にした。


こんな感じ。
ちょっとハマったけど、シグネチャとか要らないからTwitterのOAuthよりは簡単かな。