やったこと

webサービスを作るときに考えたことを垂れ流します

【PHP】ライブドアブログに「AtomPub API 」使って記事投稿・画像投稿!

PHPを使ってライブドアブログに記事を投稿する方法です!

「AtomPub API 」というのを使ってリモートのサーバーから投稿します!
投稿処理には「HTTP_Request2」が必要なので、あらかじめサーバーにインストールしておいてください!

HTTP_Request2のインストールの仕方:
PEARをインストールしないでHTTP_Request2を使う方法 - やったこと


①画像投稿の仕方
画像投稿のコードは以下のとおりです、ライブドアのブログに「hogege.jpg」という画像をアップロードしています!$userや$rootEndPointや$passには、自分のブログに設定されている情報をセットしてね!

  require_once(dirname(__FILE__)."/lib/HTTP/Request2.php");

  $user = "hogegege";
  $rootEndPoint = "https://livedoor.blogcms.jp/atompub/hogegege";
  $pass = "ABCDEFG";

  $time = gmdate("Y-m-d\TH:i:s\Z");
  $nonce = pack('H*', sha1(md5(time())));
  $digest = base64_encode(pack('H*', sha1($nonce.$time.$pass)));

  $img_dir = dirname(__FILE__)."/";
  $imgfile  = $img_dir.'hogege.jpg';
  $imgdata = file_get_contents('./hogege.jpg', true);
  $content_type = image_type_to_mime_type(exif_imagetype($imgfile));
  $url = 'http://livedoor.blogcms.jp/atom/blog/'.$user.'/image';

  $wsse =
    'UsernameToken Username="'.$user.'", '.
    'PasswordDigest="'.$digest.'", '.
    'Nonce="'.base64_encode($nonce).'", '.
    'Created="'.$time.'"';

  $headers = array(
    'X-WSSE: ' . $wsse,
    'Content-Type: ' . $content_type,
    'Expect:'
  );

  try{
    $req = new HTTP_Request2();
    $req->setUrl($url);
    $req->setMethod(HTTP_Request2::METHOD_POST);
    $req->setHeader($headers);
    $req->setBody($imgdata);
    $response = $req->send();
    $xml = simplexml_load_string($response->getBody());
    $src = $xml->content['src'];
    $thumbnail = $xml->content['thumbnail'];
  } catch (HTTP_Request2_Exception $e) {
    die($e->getMessage());
  } catch (Exception $e) {
    die($e->getMessage());
  }


②記事投稿の仕方
お次は記事の投稿です!上記とだいたい同じ感じで投稿できます!

  require_once(dirname(__FILE__)."/lib/HTTP/Request2.php");

   $user = 'hogege';
  $rootEndPoint = 'https://livedoor.blogcms.jp/atompub/hogege';
  $pass = 'ABCEDFG';

  $time = gmdate("Y-m-d\TH:i:s\Z");
  $nonce = pack('H*', sha1(md5(time())));
  $digest = base64_encode(pack('H*', sha1($nonce.$time.$pass)));

  $url = 'http://livedoor.blogcms.jp/atom/blog/'.$user.'/article';

  $title = 'ここにタイトル';
  $description = 'ここに本文';
  $description2 = 'ここに追記';
  $category = 'ここにカテゴリー';
  $created = date('Y-m-d\TH:i:s\Z');

  $wsse =
    'UsernameToken Username="'.$user.'", '.
    'PasswordDigest="'.$digest.'", '.
    'Nonce="'.$nonce.'", '.
    'Created="'.$time.'"';
  $rawdata =
    '<?xml version="1.0" encoding="utf-8"?>'.
    '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns:blogcms="http://blogcms.jp/-/spec/atompub/1.0/">'.
    '<title>'.$title.'</title>'.
    '<category term="'.$category.'" />'.
    '<blogcms:source>'.
    '<blogcms:body><![CDATA['.$description.']]></blogcms:body>'.
    '<blogcms:more><![CDATA['.$description2.']]></blogcms:more>'.
    '</blogcms:source>'.
    '</entry>';

  $headers = array('X-WSSE: '.$wsse, 'Expect:');

  try{
    $req = new HTTP_Request2();
    $req->setUrl($url);
    $req->setMethod(HTTP_Request2::METHOD_POST);
    $req->setHeader($headers);
    $req->setBody($rawdata);
    $response = $req->send();
  } catch (HTTP_Request2_Exception $e) {
      die($e->getMessage());
  } catch (Exception $e) {
      die($e->getMessage());
  }

コードは下記のブログを参考にさせていただきました!ありがと~!

参考ブログ:
http://pixieslalala.blog.jp/archives/1038269324.html
http://webpaprika.com/498.html

skypeでいきなり「チャットはご利用いただけません」と表示されチャットできなくなった!

先日Skypeでチャットをしていたら、いきなり入力欄に「チャットはご利用いただけません」と表示されて、チャットが不能になってしまいました・・(Windows版のスカイプです)

つい昨日までは当たり前のように使えていたのに、今日PCを起動したらこのような状態になってしまった・・。

マイクロソフトの質問欄にも、似たような相談があるようですが、あまり明確な答えが出ていない様子です・・。
相手がオンラインの状態で、通話もチャットの受信もできるのにチャットの送信だけができない。 - マイクロソフト コミュニティ

しょうがないので、スカイプの公式ページに直接アクセスしてチャットをすることにしました。
こちらの方から一回チャットを送信したところ、アプリ版のSkypeでもチャットが可能になりました。
Skype

いったいなんなんでしょうかね、何かの不具合なのでしょうか・・。発生の仕方の意味不明だし直り方も意味不明ですね・・。

■結論
Skypeのアプリで「チャットはご利用いただけません」と表示されたら、公式ページで一回チャットを行うと直るかも。

以上!

JavascriptでURLエンコードした文字列がPHPでデコードできない!

タイトルそのままの不具合です・・。

javascript側でURLエンコードした文字列がPHP側でデコードできない・・。

javascript側では「escape()」という関数でエンコードしました。
そして、PHP側では「urldecode()」という関数でデコードしました。
でも、これではちゃんとデコードできない!

どうもjavascript側にはいろいろなエンコードの形式があって「escape()」という関数はPHPとあまり相性がよろしくないみたい・・。なので、代わりに「encodeURIComponent()」という関数を使うことにしました。

この形式でエンコードすれば、ちゃんとPHPの「urldecode()」でデコードができます!

下記ページに、双方の対応関係がとても詳しくのっていますね…。
Javascript と PHP の URLエンコード について | Lonely Mobiler

以上!

Font Awesomeを使ってツイッターのアイコンを作る!

いろんなWebアイコンフォントが無料で使える便利なライブラリ「Font Awesome」を使って、ツイッターの青い鳥のアイコンを作ってみましょう。

①ライブラリの読み込み!
まずはFont Awesomeのcssのライブラリを読み込みます。下記ページのCDNで提供されているものを利用してしまいましょう。
Quick Start · BootstrapCDN by StackPath

HTMLにこんな風に記述してcssを読み込みます。

<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css" rel="stylesheet">


②アイコン設置!
そしてアイコンを設置します。文章中にこんな風に記述すると、ツイッターの青い鳥の文字アイコンが表示されます。

<i class="fa fa-twitter" aria-hidden="true" style="color: #00aced;"></i>

簡単にできましたね、以上です!

【PHP】AWSでhtmlをphpとして実行したいんだけどできない!

この前借りたAWSサーバーで「index.html」というページを「index.php」として実行したかったんですが、なかなか設定がうまくいきませんでした・・。

(ちなみにPHPのバージョンは5.6です・・)

これをやるときの典型的な方法は「.htaccess」に以下のような設定を追加するというもの。

AddType application/x-httpd-php .html


しかし、これを追加しても全然PHPが実行されません・・。

仕方がないので、「httpd.conf」(/etc/httpd/confのディレクトリにあります)に、上記の設定を直接書き込むことにしました。

そして設定追加後「sudo service httpd restart」を打ってhttpdを再起動。

これでhtmlがphpとして動作するようになりました。

AWSのサーバーは「.htaccess」に直接書き込む方法は、禁止されているんですかね。

まあとりあえず動いたので、これでよしとします・・。

【CakePHP3】APIを作ろうとしてエラーが出て混乱の極み…。

CakePHP3でAPIを作ろうと思ってちょっと苦労をしてしまいました・・。

クライアンからajaxでリクエストを送ると、なにかデータを返してくれるという簡単なものを作ろうとしたんですが、
CakePHPのエラーログに「Controller action can only return an instance of Response」と出てきて、どうしても処理に失敗していまいます・・。

↓公式ページの例文どうりに作ってるはずなんですが、どうもエラーの原因が分かりません・・。
https://book.cakephp.org/3.0/ja/views/json-and-xml-views.html

散々悩んだ挙句にとてもくだらない理由が判明しました・・。

以下のコードの「$array[$i]」の箇所ですが、$iが存在しない配列を参照していたためでした・・。

class HogegeController extends AppController
{
    public function api()
    {
      ・・・
      $hoge_id = $array[$i];

      //結果を返却
      $result['status'] = "ok";
      $result['id"] = $hoge_id;
      $this->set(compact('result'));
      $this->set('_serialize', ['result']);
    }

なんだかすごいエラーログが出てきて「データビューの使い方を間違っているのか?」などと混乱してしまったんですが、結局その手前でしくじっていたということなんですね・・。

あ~くだらな。

【PHP】ツイッターのテキスト内の「@ユーザー名」の文字列を削除する!

PHP正規表現置換関数「preg_replace」を使ってつぶやきテキスト内の「@ユーザー名」を削除する方法です。

コードは以下のような感じ。「@hogehoge(+空白)」や「@fagafaga(+空白)」の文字列を置換によって削除します。

$test_str = "@hogehoge @fagafaga ツイッターってAPIで取得したテキストに@リプライが入ってるのがうざいよね~。";
$test_str = preg_replace('/.*@[0-9a-zA-Z_]+\s/', '', $test_str);
echo $test_str;

以上!